/** * Copyright (c) 2016-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ 'use strict'; /*eslint no-console-disallow: "off"*/ /*global React ReactDOM Table StringInterner StackRegistry AggrowData Aggrow preLoadedCapture:true*/ function RefVisitor(refs,id){ this.refs=refs; this.id=id; } RefVisitor.prototype={ moveToEdge:function moveToEdge(name){ var ref=this.refs[this.id]; if(ref&&ref.edges){ var edges=ref.edges; for(var edgeId in edges){ if(edges[edgeId]===name){ this.id=edgeId; return this; } } } this.id=undefined; return this; }, moveToFirst:function moveToFirst(callback){ var ref=this.refs[this.id]; if(ref&&ref.edges){ var edges=ref.edges; for(var edgeId in edges){ this.id=edgeId; if(callback(edges[edgeId],this)){ return this; } } } this.id=undefined; return this; }, forEachEdge:function forEachEdge(callback){ var ref=this.refs[this.id]; if(ref&&ref.edges){ var edges=ref.edges; var visitor=new RefVisitor(this.refs,undefined); for(var edgeId in edges){ visitor.id=edgeId; callback(edges[edgeId],visitor); } } }, getType:function getType(){ var ref=this.refs[this.id]; if(ref){ return ref.type; } return undefined; }, getRef:function getRef(){ return this.refs[this.id]; }, clone:function clone(){ return new RefVisitor(this.refs,this.id); }, isDefined:function isDefined(){ return!!this.id; }, getValue:function getValue(){var _this=this; var ref=this.refs[this.id]; if(ref){ if(ref.type==='string'){ if(ref.value){ return ref.value; }else{var _ret=function(){ var rope=[]; _this.forEachEdge(function(name,visitor){ if(name&&name.startsWith('[')&&name.endsWith(']')){ var index=parseInt(name.substring(1,name.length-1),10); rope[index]=visitor.getValue(); } }); return{v:rope.join('')};}();if(typeof _ret==="object")return _ret.v; } }else if(ref.type==='ScriptExecutable'|| ref.type==='EvalExecutable'|| ref.type==='ProgramExecutable'){ return ref.value.url+':'+ref.value.line+':'+ref.value.col; }else if(ref.type==='FunctionExecutable'){ return ref.value.name+'@'+ref.value.url+':'+ref.value.line+':'+ref.value.col; }else if(ref.type==='NativeExecutable'){ return ref.value.function+' '+ref.value.constructor+' '+ref.value.name; }else if(ref.type==='Function'){ var executable=this.clone().moveToEdge('@Executable'); if(executable.id){ return executable.getRef().type+' '+executable.getValue(); } } } return'#none'; }}; function forEachRef(refs,callback){ var visitor=new RefVisitor(refs,undefined); for(var id in refs){ visitor.id=id; callback(visitor); } } function firstRef(refs,callback){ for(var id in refs){ var ref=refs[id]; if(callback(id,ref)){ return new RefVisitor(refs,id); } } return new RefVisitor(refs,undefined); } function getInternalInstanceName(visitor){ var type=visitor.clone().moveToEdge('_currentElement').moveToEdge('type'); if(type.getType()==='string'){// element.type is string return type.getValue(); }else if(type.getType()==='Function'){// element.type is function var displayName=type.clone().moveToEdge('displayName'); if(displayName.isDefined()){ return displayName.getValue();// element.type.displayName } var name=type.clone().moveToEdge('name'); if(name.isDefined()){ return name.getValue();// element.type.name } type.moveToEdge('@Executable'); if(type.getType()==='FunctionExecutable'){ return type.getRef().value.name;// element.type symbolicated name } } return'#unknown'; } function buildReactComponentTree(visitor,registry,strings){ var ref=visitor.getRef(); if(ref.reactTree||ref.reactParent===undefined){ return;// has one or doesn't need one } var parentVisitor=ref.reactParent; if(parentVisitor===null){ ref.reactTree=registry.insert(registry.root,strings.intern(getInternalInstanceName(visitor))); }else if(parentVisitor){ var parentRef=parentVisitor.getRef(); buildReactComponentTree(parentVisitor,registry,strings); var relativeName=getInternalInstanceName(visitor); if(ref.reactKey){ relativeName=ref.reactKey+': '+relativeName; } ref.reactTree=registry.insert(parentRef.reactTree,strings.intern(relativeName)); }else{ throw'non react instance parent of react instance'; } } function markReactComponentTree(refs,registry,strings){ // annotate all refs that are react internal instances with their parent and name // ref.reactParent = visitor that points to parent instance, // null if we know it's an instance, but don't have a parent yet // ref.reactKey = if a key is used to distinguish siblings forEachRef(refs,function(visitor){ var visitorClone=visitor.clone();// visitor will get stomped on next iteration var ref=visitor.getRef(); visitor.forEachEdge(function(edgeName,edgeVisitor){ var edgeRef=edgeVisitor.getRef(); if(edgeRef){ if(edgeName==='_renderedChildren'){ if(ref.reactParent===undefined){ // ref is react component, even if we don't have a parent yet ref.reactParent=null; } edgeVisitor.forEachEdge(function(childName,childVisitor){ var childRef=childVisitor.getRef(); if(childRef&&childName.startsWith('.')){ childRef.reactParent=visitorClone; childRef.reactKey=childName; } }); }else if(edgeName==='_renderedComponent'){ if(ref.reactParent===undefined){ ref.reactParent=null; } edgeRef.reactParent=visitorClone; } } }); }); // build tree of react internal instances (since that's what has the structure) // fill in ref.reactTree = path registry node forEachRef(refs,function(visitor){ buildReactComponentTree(visitor,registry,strings); }); // hook in components by looking at their _reactInternalInstance fields forEachRef(refs,function(visitor){ var ref=visitor.getRef(); var instanceRef=visitor.moveToEdge('_reactInternalInstance').getRef(); if(instanceRef){ ref.reactTree=instanceRef.reactTree; } }); } function functionUrlFileName(visitor){ var executable=visitor.clone().moveToEdge('@Executable'); var ref=executable.getRef(); if(ref&&ref.value&&ref.value.url){ var url=ref.value.url; var file=url.substring(url.lastIndexOf('/')+1); if(file.endsWith('.js')){ file=file.substring(0,file.length-3); } return file; } return undefined; } function markModules(refs){ var modules=firstRef(refs,function(id,ref){return ref.type==='CallbackGlobalObject';}); modules.moveToEdge('require'); modules.moveToFirst(function(name,visitor){return visitor.getType()==='JSActivation';}); modules.moveToEdge('modules'); modules.forEachEdge(function(name,visitor){ var ref=visitor.getRef(); visitor.moveToEdge('exports'); if(visitor.getType()==='Object'){ visitor.moveToFirst(function(memberName,member){return member.getType()==='Function';}); if(visitor.isDefined()){ ref.module=functionUrlFileName(visitor); } }else if(visitor.getType()==='Function'){ var displayName=visitor.clone().moveToEdge('displayName'); if(displayName.isDefined()){ ref.module=displayName.getValue(); } ref.module=functionUrlFileName(visitor); } if(ref&&!ref.module){ ref.module='#unknown '+name; } }); } function registerPathToRoot(refs,registry,strings){ markReactComponentTree(refs,registry,strings); markModules(refs); var breadth=[]; forEachRef(refs,function(visitor){ var ref=visitor.getRef(); if(ref.type==='CallbackGlobalObject'){ ref.rootPath=registry.insert(registry.root,strings.intern(ref.type)); breadth.push(visitor.clone()); } });var _loop=function _loop(){ var nextBreadth=[];var _loop2=function _loop2( i){ var visitor=breadth[i]; var ref=visitor.getRef(); visitor.forEachEdge(function(edgeName,edgeVisitor){ var edgeRef=edgeVisitor.getRef(); if(edgeRef&&edgeRef.rootPath===undefined){ var pathName=edgeRef.type; if(edgeName){ pathName=edgeName+': '+pathName; } edgeRef.rootPath=registry.insert(ref.rootPath,strings.intern(pathName)); nextBreadth.push(edgeVisitor.clone()); // copy module and react tree forward if(edgeRef.module===undefined){ edgeRef.module=ref.module; } if(edgeRef.reactTree===undefined){ edgeRef.reactTree=ref.reactTree; } } });};for(var i=0;i0){_loop(); } } function registerCapture(data,captureId,capture,stacks,strings){ // NB: capture.refs is potentially VERY large, so we try to avoid making // copies, even if iteration is a bit more annoying. var rowCount=0; for(var id in capture.refs){// eslint-disable-line no-unused-vars rowCount++; } for(var _id in capture.markedBlocks){// eslint-disable-line no-unused-vars rowCount++; } var inserter=data.rowInserter(rowCount); registerPathToRoot(capture.refs,stacks,strings); var noneString=strings.intern('#none'); var noneStack=stacks.insert(stacks.root,noneString); forEachRef(capture.refs,function(visitor){ // want to data.append(value, value, value), not IDs var ref=visitor.getRef(); var id=visitor.id; inserter.insertRow( parseInt(id,16), ref.type, ref.size, captureId, ref.rootPath===undefined?noneStack:ref.rootPath, ref.reactTree===undefined?noneStack:ref.reactTree, visitor.getValue(), ref.module===undefined?'#none':ref.module); }); for(var _id2 in capture.markedBlocks){ var block=capture.markedBlocks[_id2]; inserter.insertRow( parseInt(_id2,16), 'Marked Block Overhead', block.capacity-block.size, captureId, noneStack, noneStack, 'capacity: '+block.capacity+', size: '+block.size+', granularity: '+block.cellSize, '#none'); } inserter.done(); } if(preLoadedCapture){ var strings=StringInterner(); var stacks=new StackRegistry(); var columns=[ {name:'id',type:'int'}, {name:'type',type:'string',strings:strings}, {name:'size',type:'int'}, {name:'trace',type:'string',strings:strings}, {name:'path',type:'stack',stacks:stacks}, {name:'react',type:'stack',stacks:stacks}, {name:'value',type:'string',strings:strings}, {name:'module',type:'string',strings:strings}]; var data=new AggrowData(columns); registerCapture(data,'trace',preLoadedCapture,stacks,strings); preLoadedCapture=undefined;// let GG clean up the capture var aggrow=new Aggrow(data); aggrow.addPointerExpander('Id','id'); var typeExpander=aggrow.addStringExpander('Type','type'); aggrow.addNumberExpander('Size','size'); aggrow.addStringExpander('Trace','trace'); var pathExpander=aggrow.addStackExpander('Path','path',strings.get); var reactExpander=aggrow.addStackExpander('React Tree','react',strings.get); var valueExpander=aggrow.addStringExpander('Value','value'); var moduleExpander=aggrow.addStringExpander('Module','module'); aggrow.expander.setActiveExpanders([ pathExpander, reactExpander, moduleExpander, typeExpander, valueExpander]); var sizeAggregator=aggrow.addSumAggregator('Size','size'); var countAggregator=aggrow.addCountAggregator('Count'); aggrow.expander.setActiveAggregators([ sizeAggregator, countAggregator]); ReactDOM.render(React.createElement(Table,{aggrow:aggrow.expander}),document.body); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9oZWFwQ2FwdHVyZS5qcyJdLCJuYW1lcyI6WyJSZWZWaXNpdG9yIiwicmVmcyIsImlkIiwicHJvdG90eXBlIiwibW92ZVRvRWRnZSIsIm5hbWUiLCJyZWYiLCJlZGdlcyIsImVkZ2VJZCIsInVuZGVmaW5lZCIsIm1vdmVUb0ZpcnN0IiwiY2FsbGJhY2siLCJmb3JFYWNoRWRnZSIsInZpc2l0b3IiLCJnZXRUeXBlIiwidHlwZSIsImdldFJlZiIsImNsb25lIiwiaXNEZWZpbmVkIiwiZ2V0VmFsdWUiLCJ2YWx1ZSIsInJvcGUiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJpbmRleCIsInBhcnNlSW50Iiwic3Vic3RyaW5nIiwibGVuZ3RoIiwiam9pbiIsInVybCIsImxpbmUiLCJjb2wiLCJmdW5jdGlvbiIsImNvbnN0cnVjdG9yIiwiZXhlY3V0YWJsZSIsImZvckVhY2hSZWYiLCJmaXJzdFJlZiIsImdldEludGVybmFsSW5zdGFuY2VOYW1lIiwiZGlzcGxheU5hbWUiLCJidWlsZFJlYWN0Q29tcG9uZW50VHJlZSIsInJlZ2lzdHJ5Iiwic3RyaW5ncyIsInJlYWN0VHJlZSIsInJlYWN0UGFyZW50IiwicGFyZW50VmlzaXRvciIsImluc2VydCIsInJvb3QiLCJpbnRlcm4iLCJwYXJlbnRSZWYiLCJyZWxhdGl2ZU5hbWUiLCJyZWFjdEtleSIsIm1hcmtSZWFjdENvbXBvbmVudFRyZWUiLCJ2aXNpdG9yQ2xvbmUiLCJlZGdlTmFtZSIsImVkZ2VWaXNpdG9yIiwiZWRnZVJlZiIsImNoaWxkTmFtZSIsImNoaWxkVmlzaXRvciIsImNoaWxkUmVmIiwiaW5zdGFuY2VSZWYiLCJmdW5jdGlvblVybEZpbGVOYW1lIiwiZmlsZSIsImxhc3RJbmRleE9mIiwibWFya01vZHVsZXMiLCJtb2R1bGVzIiwibWVtYmVyTmFtZSIsIm1lbWJlciIsIm1vZHVsZSIsInJlZ2lzdGVyUGF0aFRvUm9vdCIsImJyZWFkdGgiLCJyb290UGF0aCIsInB1c2giLCJuZXh0QnJlYWR0aCIsImkiLCJwYXRoTmFtZSIsInJlZ2lzdGVyQ2FwdHVyZSIsImRhdGEiLCJjYXB0dXJlSWQiLCJjYXB0dXJlIiwic3RhY2tzIiwicm93Q291bnQiLCJtYXJrZWRCbG9ja3MiLCJpbnNlcnRlciIsInJvd0luc2VydGVyIiwibm9uZVN0cmluZyIsIm5vbmVTdGFjayIsImluc2VydFJvdyIsInNpemUiLCJibG9jayIsImNhcGFjaXR5IiwiY2VsbFNpemUiLCJkb25lIiwicHJlTG9hZGVkQ2FwdHVyZSIsIlN0cmluZ0ludGVybmVyIiwiU3RhY2tSZWdpc3RyeSIsImNvbHVtbnMiLCJBZ2dyb3dEYXRhIiwiYWdncm93IiwiQWdncm93IiwiYWRkUG9pbnRlckV4cGFuZGVyIiwidHlwZUV4cGFuZGVyIiwiYWRkU3RyaW5nRXhwYW5kZXIiLCJhZGROdW1iZXJFeHBhbmRlciIsInBhdGhFeHBhbmRlciIsImFkZFN0YWNrRXhwYW5kZXIiLCJnZXQiLCJyZWFjdEV4cGFuZGVyIiwidmFsdWVFeHBhbmRlciIsIm1vZHVsZUV4cGFuZGVyIiwiZXhwYW5kZXIiLCJzZXRBY3RpdmVFeHBhbmRlcnMiLCJzaXplQWdncmVnYXRvciIsImFkZFN1bUFnZ3JlZ2F0b3IiLCJjb3VudEFnZ3JlZ2F0b3IiLCJhZGRDb3VudEFnZ3JlZ2F0b3IiLCJzZXRBY3RpdmVBZ2dyZWdhdG9ycyIsIlJlYWN0RE9NIiwicmVuZGVyIiwiZG9jdW1lbnQiLCJib2R5Il0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7O0FBRUEsUUFBU0EsV0FBVCxDQUFvQkMsSUFBcEIsQ0FBMEJDLEVBQTFCLENBQThCO0FBQzVCLEtBQUtELElBQUwsQ0FBWUEsSUFBWjtBQUNBLEtBQUtDLEVBQUwsQ0FBVUEsRUFBVjtBQUNEOztBQUVERixXQUFXRyxTQUFYLENBQXVCO0FBQ3JCQyxXQUFZLFFBQVNBLFdBQVQsQ0FBb0JDLElBQXBCLENBQTBCO0FBQ3BDLEdBQU1DLEtBQU0sS0FBS0wsSUFBTCxDQUFVLEtBQUtDLEVBQWYsQ0FBWjtBQUNB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UCxDQUF5QixNQUF6QixDQUFpQyxNQUFqQztBQUNBTCxPQUFPSSxpQkFBUCxDQUF5QixPQUF6QixDQUFrQyxPQUFsQztBQUNBLEdBQU1FLGNBQWVOLE9BQU9PLGdCQUFQLENBQXdCLE1BQXhCLENBQWdDLE1BQWhDLENBQXdDL0QsUUFBUWdFLEdBQWhELENBQXJCO0FBQ0EsR0FBTUMsZUFBZ0JULE9BQU9PLGdCQUFQLENBQXdCLFlBQXhCLENBQXNDLE9BQXRDLENBQStDL0QsUUFBUWdFLEdBQXZELENBQXRCO0FBQ0EsR0FBTUUsZUFBZ0JWLE9BQU9JLGlCQUFQLENBQXlCLE9BQXpCLENBQWtDLE9BQWxDLENBQXRCO0FBQ0EsR0FBTU8sZ0JBQWlCWCxPQUFPSSxpQkFBUCxDQUF5QixRQUF6QixDQUFtQyxRQUFuQyxDQUF2QjtBQUNBSixPQUFPWSxRQUFQLENBQWdCQyxrQkFBaEIsQ0FBbUM7QUFDakNQLFlBRGlDO0FBRWpDRyxhQUZpQztBQUdqQ0UsY0FIaUM7QUFJakNSLFlBSmlDO0FBS2pDTyxhQUxpQyxDQUFuQzs7QUFPQSxHQUFNSSxnQkFBaUJkLE9BQU9lLGdCQUFQLENBQXdCLE1BQXhCLENBQWdDLE1BQWhDLENBQXZCO0FBQ0EsR0FBTUMsaUJBQWtCaEIsT0FBT2lCLGtCQUFQLENBQTBCLE9BQTFCLENBQXhCO0FBQ0FqQixPQUFPWSxRQUFQLENBQWdCTSxvQkFBaEIsQ0FBcUM7QUFDbkNKLGNBRG1DO0FBRW5DRSxlQUZtQyxDQUFyQzs7QUFJQUcsU0FBU0MsTUFBVCxDQUFnQixvQkFBQyxLQUFELEVBQU8sT0FBUXBCLE9BQU9ZLFFBQXRCLEVBQWhCLENBQW9EUyxTQUFTQyxJQUE3RDtBQUNEIiwiZmlsZSI6ImhlYXBDYXB0dXJlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG4ndXNlIHN0cmljdCc7XG4vKmVzbGludCBuby1jb25zb2xlLWRpc2FsbG93OiBcIm9mZlwiKi9cbi8qZ2xvYmFsIFJlYWN0IFJlYWN0RE9NIFRhYmxlIFN0cmluZ0ludGVybmVyIFN0YWNrUmVnaXN0cnkgQWdncm93RGF0YSBBZ2dyb3cgcHJlTG9hZGVkQ2FwdHVyZTp0cnVlKi9cblxuZnVuY3Rpb24gUmVmVmlzaXRvcihyZWZzLCBpZCkge1xuICB0aGlzLnJlZnMgPSByZWZzO1xuICB0aGlzLmlkID0gaWQ7XG59XG5cblJlZlZpc2l0b3IucHJvdG90eXBlID0ge1xuICBtb3ZlVG9FZGdlOiBmdW5jdGlvbiBtb3ZlVG9FZGdlKG5hbWUpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLnJlZnNbdGhpcy5pZF07XG4gICAgaWYgKHJlZiAmJiByZWYuZWRnZXMpIHtcbiAgICAgIGNvbnN0IGVkZ2VzID0gcmVmLmVkZ2VzO1xuICAgICAgZm9yIChjb25zdCBlZGdlSWQgaW4gZWRnZXMpIHtcbiAgICAgICAgaWYgKGVkZ2VzW2VkZ2VJZF0gPT09IG5hbWUpIHtcbiAgICAgICAgICB0aGlzLmlkID0gZWRnZUlkO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaWQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG1vdmVUb0ZpcnN0OiBmdW5jdGlvbiBtb3ZlVG9GaXJzdChjYWxsYmFjaykge1xuICAgIGNvbnN0IHJlZiA9IHRoaXMucmVmc1t0aGlzLmlkXTtcbiAgICBpZiAocmVmICYmIHJlZi5lZGdlcykge1xuICAgICAgY29uc3QgZWRnZXMgPSByZWYuZWRnZXM7XG4gICAgICBmb3IgKGNvbnN0IGVkZ2VJZCBpbiBlZGdlcykge1xuICAgICAgICB0aGlzLmlkID0gZWRnZUlkO1xuICAgICAgICBpZiAoY2FsbGJhY2soZWRnZXNbZWRnZUlkXSwgdGhpcykpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmlkID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBmb3JFYWNoRWRnZTogZnVuY3Rpb24gZm9yRWFjaEVkZ2UoY2FsbGJhY2spIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLnJlZnNbdGhpcy5pZF07XG4gICAgaWYgKHJlZiAmJiByZWYuZWRnZXMpIHtcbiAgICAgIGNvbnN0IGVkZ2VzID0gcmVmLmVkZ2VzO1xuICAgICAgY29uc3QgdmlzaXRvciA9IG5ldyBSZWZWaXNpdG9yKHRoaXMucmVmcywgdW5kZWZpbmVkKTtcbiAgICAgIGZvciAoY29uc3QgZWRnZUlkIGluIGVkZ2VzKSB7XG4gICAgICAgIHZpc2l0b3IuaWQgPSBlZGdlSWQ7XG4gICAgICAgIGNhbGxiYWNrKGVkZ2VzW2VkZ2VJZF0sIHZpc2l0b3IpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZ2V0VHlwZTogZnVuY3Rpb24gZ2V0VHlwZSgpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLnJlZnNbdGhpcy5pZF07XG4gICAgaWYgKHJlZikge1xuICAgICAgcmV0dXJuIHJlZi50eXBlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9LFxuICBnZXRSZWY6IGZ1bmN0aW9uIGdldFJlZigpIHtcbiAgICByZXR1cm4gdGhpcy5yZWZzW3RoaXMuaWRdO1xuICB9LFxuICBjbG9uZTogZnVuY3Rpb24gY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBSZWZWaXNpdG9yKHRoaXMucmVmcywgdGhpcy5pZCk7XG4gIH0sXG4gIGlzRGVmaW5lZDogZnVuY3Rpb24gaXNEZWZpbmVkKCkge1xuICAgIHJldHVybiAhIXRoaXMuaWQ7XG4gIH0sXG4gIGdldFZhbHVlOiBmdW5jdGlvbiBnZXRWYWx1ZSgpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLnJlZnNbdGhpcy5pZF07XG4gICAgaWYgKHJlZikge1xuICAgICAgaWYgKHJlZi50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAocmVmLnZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIHJlZi52YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByb3BlID0gW107XG4gICAgICAgICAgdGhpcy5mb3JFYWNoRWRnZSgobmFtZSwgdmlzaXRvcikgPT4ge1xuICAgICAgICAgICAgaWYgKG5hbWUgJiYgbmFtZS5zdGFydHNXaXRoKCdbJykgJiYgbmFtZS5lbmRzV2l0aCgnXScpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQobmFtZS5zdWJzdHJpbmcoMSwgbmFtZS5sZW5ndGggLSAxKSwgMTApO1xuICAgICAgICAgICAgICByb3BlW2luZGV4XSA9IHZpc2l0b3IuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcm9wZS5qb2luKCcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZWYudHlwZSA9PT0gJ1NjcmlwdEV4ZWN1dGFibGUnXG4gICAgICAgICAgICAgIHx8IHJlZi50eXBlID09PSAnRXZhbEV4ZWN1dGFibGUnXG4gICAgICAgICAgICAgIHx8IHJlZi50eXBlID09PSAnUHJvZ3JhbUV4ZWN1dGFibGUnKSB7XG4gICAgICAgIHJldHVybiByZWYudmFsdWUudXJsICsgJzonICsgcmVmLnZhbHVlLmxpbmUgKyAnOicgKyByZWYudmFsdWUuY29sO1xuICAgICAgfSBlbHNlIGlmIChyZWYudHlwZSA9PT0gJ0Z1bmN0aW9uRXhlY3V0YWJsZScpIHtcbiAgICAgICAgcmV0dXJuIHJlZi52YWx1ZS5uYW1lICsgJ0AnICsgcmVmLnZhbHVlLnVybCArICc6JyArIHJlZi52YWx1ZS5saW5lICsgJzonICsgcmVmLnZhbHVlLmNvbDtcbiAgICAgIH0gZWxzZSBpZiAocmVmLnR5cGUgPT09ICdOYXRpdmVFeGVjdXRhYmxlJykge1xuICAgICAgICByZXR1cm4gcmVmLnZhbHVlLmZ1bmN0aW9uICsgJyAnICsgcmVmLnZhbHVlLmNvbnN0cnVjdG9yICsgJyAnICsgcmVmLnZhbHVlLm5hbWU7XG4gICAgICB9IGVsc2UgaWYgKHJlZi50eXBlID09PSAnRnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGFibGUgPSB0aGlzLmNsb25lKCkubW92ZVRvRWRnZSgnQEV4ZWN1dGFibGUnKTtcbiAgICAgICAgaWYgKGV4ZWN1dGFibGUuaWQpIHtcbiAgICAgICAgICByZXR1cm4gZXhlY3V0YWJsZS5nZXRSZWYoKS50eXBlICsgJyAnICsgZXhlY3V0YWJsZS5nZXRWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnI25vbmUnO1xuICB9XG59O1xuXG5mdW5jdGlvbiBmb3JFYWNoUmVmKHJlZnMsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHZpc2l0b3IgPSBuZXcgUmVmVmlzaXRvcihyZWZzLCB1bmRlZmluZWQpO1xuICBmb3IgKGNvbnN0IGlkIGluIHJlZnMpIHtcbiAgICB2aXNpdG9yLmlkID0gaWQ7XG4gICAgY2FsbGJhY2sodmlzaXRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmlyc3RSZWYocmVmcywgY2FsbGJhY2spIHtcbiAgZm9yIChjb25zdCBpZCBpbiByZWZzKSB7XG4gICAgY29uc3QgcmVmID0gcmVmc1tpZF07XG4gICAgaWYgKGNhbGxiYWNrKGlkLCByZWYpKSB7XG4gICAgICByZXR1cm4gbmV3IFJlZlZpc2l0b3IocmVmcywgaWQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IFJlZlZpc2l0b3IocmVmcywgdW5kZWZpbmVkKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW50ZXJuYWxJbnN0YW5jZU5hbWUodmlzaXRvcikge1xuICBjb25zdCB0eXBlID0gdmlzaXRvci5jbG9uZSgpLm1vdmVUb0VkZ2UoJ19jdXJyZW50RWxlbWVudCcpLm1vdmVUb0VkZ2UoJ3R5cGUnKTtcbiAgaWYgKHR5cGUuZ2V0VHlwZSgpID09PSAnc3RyaW5nJykgeyAvLyBlbGVtZW50LnR5cGUgaXMgc3RyaW5nXG4gICAgcmV0dXJuIHR5cGUuZ2V0VmFsdWUoKTtcbiAgfSBlbHNlIGlmICh0eXBlLmdldFR5cGUoKSA9PT0gJ0Z1bmN0aW9uJykgeyAvLyBlbGVtZW50LnR5cGUgaXMgZnVuY3Rpb25cbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IHR5cGUuY2xvbmUoKS5tb3ZlVG9FZGdlKCdkaXNwbGF5TmFtZScpO1xuICAgIGlmIChkaXNwbGF5TmFtZS5pc0RlZmluZWQoKSkge1xuICAgICAgcmV0dXJuIGRpc3BsYXlOYW1lLmdldFZhbHVlKCk7IC8vIGVsZW1lbnQudHlwZS5kaXNwbGF5TmFtZVxuICAgIH1cbiAgICBjb25zdCBuYW1lID0gdHlwZS5jbG9uZSgpLm1vdmVUb0VkZ2UoJ25hbWUnKTtcbiAgICBpZiAobmFtZS5pc0RlZmluZWQoKSkge1xuICAgICAgcmV0dXJuIG5hbWUuZ2V0VmFsdWUoKTsgLy8gZWxlbWVudC50eXBlLm5hbWVcbiAgICB9XG4gICAgdHlwZS5tb3ZlVG9FZGdlKCdARXhlY3V0YWJsZScpO1xuICAgIGlmICh0eXBlLmdldFR5cGUoKSA9PT0gJ0Z1bmN0aW9uRXhlY3V0YWJsZScpIHtcbiAgICAgIHJldHVybiB0eXBlLmdldFJlZigpLnZhbHVlLm5hbWU7ICAvLyBlbGVtZW50LnR5cGUgc3ltYm9saWNhdGVkIG5hbWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcjdW5rbm93bic7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVhY3RDb21wb25lbnRUcmVlKHZpc2l0b3IsIHJlZ2lzdHJ5LCBzdHJpbmdzKSB7XG4gIGNvbnN0IHJlZiA9IHZpc2l0b3IuZ2V0UmVmKCk7XG4gIGlmIChyZWYucmVhY3RUcmVlIHx8IHJlZi5yZWFjdFBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuOyAvLyBoYXMgb25lIG9yIGRvZXNuJ3QgbmVlZCBvbmVcbiAgfVxuICBjb25zdCBwYXJlbnRWaXNpdG9yID0gcmVmLnJlYWN0UGFyZW50O1xuICBpZiAocGFyZW50VmlzaXRvciA9PT0gbnVsbCkge1xuICAgIHJlZi5yZWFjdFRyZWUgPSByZWdpc3RyeS5pbnNlcnQocmVnaXN0cnkucm9vdCwgc3RyaW5ncy5pbnRlcm4oZ2V0SW50ZXJuYWxJbnN0YW5jZU5hbWUodmlzaXRvcikpKTtcbiAgfSBlbHNlIGlmIChwYXJlbnRWaXNpdG9yKSB7XG4gICAgY29uc3QgcGFyZW50UmVmID0gcGFyZW50VmlzaXRvci5nZXRSZWYoKTtcbiAgICBidWlsZFJlYWN0Q29tcG9uZW50VHJlZShwYXJlbnRWaXNpdG9yLCByZWdpc3RyeSwgc3RyaW5ncyk7XG4gICAgbGV0IHJlbGF0aXZlTmFtZSA9IGdldEludGVybmFsSW5zdGFuY2VOYW1lKHZpc2l0b3IpO1xuICAgIGlmIChyZWYucmVhY3RLZXkpIHtcbiAgICAgIHJlbGF0aXZlTmFtZSA9IHJlZi5yZWFjdEtleSArICc6ICcgKyByZWxhdGl2ZU5hbWU7XG4gICAgfVxuICAgIHJlZi5yZWFjdFRyZWUgPSByZWdpc3RyeS5pbnNlcnQocGFyZW50UmVmLnJlYWN0VHJlZSwgc3RyaW5ncy5pbnRlcm4ocmVsYXRpdmVOYW1lKSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgJ25vbiByZWFjdCBpbnN0YW5jZSBwYXJlbnQgb2YgcmVhY3QgaW5zdGFuY2UnO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWFjdENvbXBvbmVudFRyZWUocmVmcywgcmVnaXN0cnksIHN0cmluZ3MpIHtcbiAgLy8gYW5ub3RhdGUgYWxsIHJlZnMgdGhhdCBhcmUgcmVhY3QgaW50ZXJuYWwgaW5zdGFuY2VzIHdpdGggdGhlaXIgcGFyZW50IGFuZCBuYW1lXG4gIC8vIHJlZi5yZWFjdFBhcmVudCA9IHZpc2l0b3IgdGhhdCBwb2ludHMgdG8gcGFyZW50IGluc3RhbmNlLFxuICAvLyAgIG51bGwgaWYgd2Uga25vdyBpdCdzIGFuIGluc3RhbmNlLCBidXQgZG9uJ3QgaGF2ZSBhIHBhcmVudCB5ZXRcbiAgLy8gcmVmLnJlYWN0S2V5ID0gaWYgYSBrZXkgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBzaWJsaW5nc1xuICBmb3JFYWNoUmVmKHJlZnMsICh2aXNpdG9yKSA9PiB7XG4gICAgY29uc3QgdmlzaXRvckNsb25lID0gdmlzaXRvci5jbG9uZSgpOyAvLyB2aXNpdG9yIHdpbGwgZ2V0IHN0b21wZWQgb24gbmV4dCBpdGVyYXRpb25cbiAgICBjb25zdCByZWYgPSB2aXNpdG9yLmdldFJlZigpO1xuICAgIHZpc2l0b3IuZm9yRWFjaEVkZ2UoKGVkZ2VOYW1lLCBlZGdlVmlzaXRvcikgPT4ge1xuICAgICAgY29uc3QgZWRnZVJlZiA9IGVkZ2VWaXNpdG9yLmdldFJlZigpO1xuICAgICAgaWYgKGVkZ2VSZWYpIHtcbiAgICAgICAgaWYgKGVkZ2VOYW1lID09PSAnX3JlbmRlcmVkQ2hpbGRyZW4nKSB7XG4gICAgICAgICAgaWYgKHJlZi5yZWFjdFBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyByZWYgaXMgcmVhY3QgY29tcG9uZW50LCBldmVuIGlmIHdlIGRvbid0IGhhdmUgYSBwYXJlbnQgeWV0XG4gICAgICAgICAgICByZWYucmVhY3RQYXJlbnQgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlZGdlVmlzaXRvci5mb3JFYWNoRWRnZSgoY2hpbGROYW1lLCBjaGlsZFZpc2l0b3IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkUmVmID0gY2hpbGRWaXNpdG9yLmdldFJlZigpO1xuICAgICAgICAgICAgaWYgKGNoaWxkUmVmICYmIGNoaWxkTmFtZS5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICAgICAgY2hpbGRSZWYucmVhY3RQYXJlbnQgPSB2aXNpdG9yQ2xvbmU7XG4gICAgICAgICAgICAgIGNoaWxkUmVmLnJlYWN0S2V5ID0gY2hpbGROYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGVkZ2VOYW1lID09PSAnX3JlbmRlcmVkQ29tcG9uZW50Jykge1xuICAgICAgICAgIGlmIChyZWYucmVhY3RQYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVmLnJlYWN0UGFyZW50ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWRnZVJlZi5yZWFjdFBhcmVudCA9IHZpc2l0b3JDbG9uZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgLy8gYnVpbGQgdHJlZSBvZiByZWFjdCBpbnRlcm5hbCBpbnN0YW5jZXMgKHNpbmNlIHRoYXQncyB3aGF0IGhhcyB0aGUgc3RydWN0dXJlKVxuICAvLyBmaWxsIGluIHJlZi5yZWFjdFRyZWUgPSBwYXRoIHJlZ2lzdHJ5IG5vZGVcbiAgZm9yRWFjaFJlZihyZWZzLCAodmlzaXRvcikgPT4ge1xuICAgIGJ1aWxkUmVhY3RDb21wb25lbnRUcmVlKHZpc2l0b3IsIHJlZ2lzdHJ5LCBzdHJpbmdzKTtcbiAgfSk7XG4gIC8vIGhvb2sgaW4gY29tcG9uZW50cyBieSBsb29raW5nIGF0IHRoZWlyIF9yZWFjdEludGVybmFsSW5zdGFuY2UgZmllbGRzXG4gIGZvckVhY2hSZWYocmVmcywgKHZpc2l0b3IpID0+IHtcbiAgICBjb25zdCByZWYgPSB2aXNpdG9yLmdldFJlZigpO1xuICAgIGNvbnN0IGluc3RhbmNlUmVmID0gdmlzaXRvci5tb3ZlVG9FZGdlKCdfcmVhY3RJbnRlcm5hbEluc3RhbmNlJykuZ2V0UmVmKCk7XG4gICAgaWYgKGluc3RhbmNlUmVmKSB7XG4gICAgICByZWYucmVhY3RUcmVlID0gaW5zdGFuY2VSZWYucmVhY3RUcmVlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uVXJsRmlsZU5hbWUodmlzaXRvcikge1xuICBjb25zdCBleGVjdXRhYmxlID0gdmlzaXRvci5jbG9uZSgpLm1vdmVUb0VkZ2UoJ0BFeGVjdXRhYmxlJyk7XG4gIGNvbnN0IHJlZiA9IGV4ZWN1dGFibGUuZ2V0UmVmKCk7XG4gIGlmIChyZWYgJiYgcmVmLnZhbHVlICYmIHJlZi52YWx1ZS51cmwpIHtcbiAgICBjb25zdCB1cmwgPSByZWYudmFsdWUudXJsO1xuICAgIGxldCBmaWxlID0gdXJsLnN1YnN0cmluZyh1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpO1xuICAgIGlmIChmaWxlLmVuZHNXaXRoKCcuanMnKSkge1xuICAgICAgZmlsZSA9IGZpbGUuc3Vic3RyaW5nKDAsIGZpbGUubGVuZ3RoIC0gMyk7XG4gICAgfVxuICAgIHJldHVybiBmaWxlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtNb2R1bGVzKHJlZnMpIHtcbiAgY29uc3QgbW9kdWxlcyA9IGZpcnN0UmVmKHJlZnMsIChpZCwgcmVmKSA9PiByZWYudHlwZSA9PT0gJ0NhbGxiYWNrR2xvYmFsT2JqZWN0Jyk7XG4gIG1vZHVsZXMubW92ZVRvRWRnZSgncmVxdWlyZScpO1xuICBtb2R1bGVzLm1vdmVUb0ZpcnN0KChuYW1lLCB2aXNpdG9yKSA9PiB2aXNpdG9yLmdldFR5cGUoKSA9PT0gJ0pTQWN0aXZhdGlvbicpO1xuICBtb2R1bGVzLm1vdmVUb0VkZ2UoJ21vZHVsZXMnKTtcbiAgbW9kdWxlcy5mb3JFYWNoRWRnZSgobmFtZSwgdmlzaXRvcikgPT4ge1xuICAgIGNvbnN0IHJlZiA9IHZpc2l0b3IuZ2V0UmVmKCk7XG4gICAgdmlzaXRvci5tb3ZlVG9FZGdlKCdleHBvcnRzJyk7XG4gICAgaWYgKHZpc2l0b3IuZ2V0VHlwZSgpID09PSAnT2JqZWN0Jykge1xuICAgICAgdmlzaXRvci5tb3ZlVG9GaXJzdCgobWVtYmVyTmFtZSwgbWVtYmVyKSA9PiBtZW1iZXIuZ2V0VHlwZSgpID09PSAnRnVuY3Rpb24nKTtcbiAgICAgIGlmICh2aXNpdG9yLmlzRGVmaW5lZCgpKSB7XG4gICAgICAgIHJlZi5tb2R1bGUgPSBmdW5jdGlvblVybEZpbGVOYW1lKHZpc2l0b3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmlzaXRvci5nZXRUeXBlKCkgPT09ICdGdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gdmlzaXRvci5jbG9uZSgpLm1vdmVUb0VkZ2UoJ2Rpc3BsYXlOYW1lJyk7XG4gICAgICBpZiAoZGlzcGxheU5hbWUuaXNEZWZpbmVkKCkpIHtcbiAgICAgICAgcmVmLm1vZHVsZSA9IGRpc3BsYXlOYW1lLmdldFZhbHVlKCk7XG4gICAgICB9XG4gICAgICByZWYubW9kdWxlID0gZnVuY3Rpb25VcmxGaWxlTmFtZSh2aXNpdG9yKTtcbiAgICB9XG4gICAgaWYgKHJlZiAmJiAhcmVmLm1vZHVsZSkge1xuICAgICAgcmVmLm1vZHVsZSA9ICcjdW5rbm93biAnICsgbmFtZTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlclBhdGhUb1Jvb3QocmVmcywgcmVnaXN0cnksIHN0cmluZ3MpIHtcbiAgbWFya1JlYWN0Q29tcG9uZW50VHJlZShyZWZzLCByZWdpc3RyeSwgc3RyaW5ncyk7XG4gIG1hcmtNb2R1bGVzKHJlZnMpO1xuICBsZXQgYnJlYWR0aCA9IFtdO1xuICBmb3JFYWNoUmVmKHJlZnMsICh2aXNpdG9yKSA9PiB7XG4gICAgY29uc3QgcmVmID0gdmlzaXRvci5nZXRSZWYoKTtcbiAgICBpZiAocmVmLnR5cGUgPT09ICdDYWxsYmFja0dsb2JhbE9iamVjdCcpIHtcbiAgICAgIHJlZi5yb290UGF0aCA9IHJlZ2lzdHJ5Lmluc2VydChyZWdpc3RyeS5yb290LCBzdHJpbmdzLmludGVybihyZWYudHlwZSkpO1xuICAgICAgYnJlYWR0aC5wdXNoKHZpc2l0b3IuY2xvbmUoKSk7XG4gICAgfVxuICB9KTtcbiAgd2hpbGUgKGJyZWFkdGgubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG5leHRCcmVhZHRoID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBicmVhZHRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB2aXNpdG9yID0gYnJlYWR0aFtpXTtcbiAgICAgIGNvbnN0IHJlZiA9IHZpc2l0b3IuZ2V0UmVmKCk7XG4gICAgICB2aXNpdG9yLmZvckVhY2hFZGdlKChlZGdlTmFtZSwgZWRnZVZpc2l0b3IpID0+IHtcbiAgICAgICAgY29uc3QgZWRnZVJlZiA9IGVkZ2VWaXNpdG9yLmdldFJlZigpO1xuICAgICAgICBpZiAoZWRnZVJlZiAmJiBlZGdlUmVmLnJvb3RQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBsZXQgcGF0aE5hbWUgPSBlZGdlUmVmLnR5cGU7XG4gICAgICAgICAgaWYgKGVkZ2VOYW1lKSB7XG4gICAgICAgICAgICBwYXRoTmFtZSA9IGVkZ2VOYW1lICsgJzogJyArIHBhdGhOYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlZGdlUmVmLnJvb3RQYXRoID0gcmVnaXN0cnkuaW5zZXJ0KHJlZi5yb290UGF0aCwgc3RyaW5ncy5pbnRlcm4ocGF0aE5hbWUpKTtcbiAgICAgICAgICBuZXh0QnJlYWR0aC5wdXNoKGVkZ2VWaXNpdG9yLmNsb25lKCkpO1xuICAgICAgICAgIC8vIGNvcHkgbW9kdWxlIGFuZCByZWFjdCB0cmVlIGZvcndhcmRcbiAgICAgICAgICBpZiAoZWRnZVJlZi5tb2R1bGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRnZVJlZi5tb2R1bGUgPSByZWYubW9kdWxlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWRnZVJlZi5yZWFjdFRyZWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRnZVJlZi5yZWFjdFRyZWUgPSByZWYucmVhY3RUcmVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGJyZWFkdGggPSBuZXh0QnJlYWR0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWdpc3RlckNhcHR1cmUoZGF0YSwgY2FwdHVyZUlkLCBjYXB0dXJlLCBzdGFja3MsIHN0cmluZ3MpIHtcbiAgLy8gTkI6IGNhcHR1cmUucmVmcyBpcyBwb3RlbnRpYWxseSBWRVJZIGxhcmdlLCBzbyB3ZSB0cnkgdG8gYXZvaWQgbWFraW5nXG4gIC8vIGNvcGllcywgZXZlbiBpZiBpdGVyYXRpb24gaXMgYSBiaXQgbW9yZSBhbm5veWluZy5cbiAgbGV0IHJvd0NvdW50ID0gMDtcbiAgZm9yIChjb25zdCBpZCBpbiBjYXB0dXJlLnJlZnMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHJvd0NvdW50Kys7XG4gIH1cbiAgZm9yIChjb25zdCBpZCBpbiBjYXB0dXJlLm1hcmtlZEJsb2NrcykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgcm93Q291bnQrKztcbiAgfVxuICBjb25zdCBpbnNlcnRlciA9IGRhdGEucm93SW5zZXJ0ZXIocm93Q291bnQpO1xuICByZWdpc3RlclBhdGhUb1Jvb3QoY2FwdHVyZS5yZWZzLCBzdGFja3MsIHN0cmluZ3MpO1xuICBjb25zdCBub25lU3RyaW5nID0gc3RyaW5ncy5pbnRlcm4oJyNub25lJyk7XG4gIGNvbnN0IG5vbmVTdGFjayA9IHN0YWNrcy5pbnNlcnQoc3RhY2tzLnJvb3QsIG5vbmVTdHJpbmcpO1xuICBmb3JFYWNoUmVmKGNhcHR1cmUucmVmcywgKHZpc2l0b3IpID0+IHtcbiAgICAvLyB3YW50IHRvIGRhdGEuYXBwZW5kKHZhbHVlLCB2YWx1ZSwgdmFsdWUpLCBub3QgSURzXG4gICAgY29uc3QgcmVmID0gdmlzaXRvci5nZXRSZWYoKTtcbiAgICBjb25zdCBpZCA9IHZpc2l0b3IuaWQ7XG4gICAgaW5zZXJ0ZXIuaW5zZXJ0Um93KFxuICAgICAgcGFyc2VJbnQoaWQsIDE2KSxcbiAgICAgIHJlZi50eXBlLFxuICAgICAgcmVmLnNpemUsXG4gICAgICBjYXB0dXJlSWQsXG4gICAgICByZWYucm9vdFBhdGggPT09IHVuZGVmaW5lZCA/IG5vbmVTdGFjayA6IHJlZi5yb290UGF0aCxcbiAgICAgIHJlZi5yZWFjdFRyZWUgPT09IHVuZGVmaW5lZCA/IG5vbmVTdGFjayA6IHJlZi5yZWFjdFRyZWUsXG4gICAgICB2aXNpdG9yLmdldFZhbHVlKCksXG4gICAgICByZWYubW9kdWxlID09PSB1bmRlZmluZWQgPyAnI25vbmUnIDogcmVmLm1vZHVsZSxcbiAgICApO1xuICB9KTtcbiAgZm9yIChjb25zdCBpZCBpbiBjYXB0dXJlLm1hcmtlZEJsb2Nrcykge1xuICAgIGNvbnN0IGJsb2NrID0gY2FwdHVyZS5tYXJrZWRCbG9ja3NbaWRdO1xuICAgIGluc2VydGVyLmluc2VydFJvdyhcbiAgICAgIHBhcnNlSW50KGlkLCAxNiksXG4gICAgICAnTWFya2VkIEJsb2NrIE92ZXJoZWFkJyxcbiAgICAgIGJsb2NrLmNhcGFjaXR5IC0gYmxvY2suc2l6ZSxcbiAgICAgIGNhcHR1cmVJZCxcbiAgICAgIG5vbmVTdGFjayxcbiAgICAgIG5vbmVTdGFjayxcbiAgICAgICdjYXBhY2l0eTogJyArIGJsb2NrLmNhcGFjaXR5ICsgJywgc2l6ZTogJyArIGJsb2NrLnNpemUgKyAnLCBncmFudWxhcml0eTogJyArIGJsb2NrLmNlbGxTaXplLFxuICAgICAgJyNub25lJyxcbiAgICApO1xuICB9XG4gIGluc2VydGVyLmRvbmUoKTtcbn1cblxuaWYgKHByZUxvYWRlZENhcHR1cmUpIHtcbiAgY29uc3Qgc3RyaW5ncyA9IFN0cmluZ0ludGVybmVyKCk7XG4gIGNvbnN0IHN0YWNrcyA9ICBuZXcgU3RhY2tSZWdpc3RyeSgpO1xuICBjb25zdCBjb2x1bW5zID0gW1xuICAgIHsgbmFtZTogJ2lkJywgdHlwZTogJ2ludCcgfSxcbiAgICB7IG5hbWU6ICd0eXBlJywgdHlwZTogJ3N0cmluZycsIHN0cmluZ3M6IHN0cmluZ3MgfSxcbiAgICB7IG5hbWU6ICdzaXplJywgdHlwZTogJ2ludCcgfSxcbiAgICB7IG5hbWU6ICd0cmFjZScsIHR5cGU6ICdzdHJpbmcnLCBzdHJpbmdzOiBzdHJpbmdzIH0sXG4gICAgeyBuYW1lOiAncGF0aCcsIHR5cGU6ICdzdGFjaycsIHN0YWNrczogc3RhY2tzIH0sXG4gICAgeyBuYW1lOiAncmVhY3QnLCB0eXBlOiAnc3RhY2snLCBzdGFja3M6IHN0YWNrcyB9LFxuICAgIHsgbmFtZTogJ3ZhbHVlJywgdHlwZTogJ3N0cmluZycsIHN0cmluZ3M6IHN0cmluZ3MgfSxcbiAgICB7IG5hbWU6ICdtb2R1bGUnLCB0eXBlOiAnc3RyaW5nJywgc3RyaW5nczogc3RyaW5ncyB9LFxuICBdO1xuICBjb25zdCBkYXRhID0gbmV3IEFnZ3Jvd0RhdGEoY29sdW1ucyk7XG4gIHJlZ2lzdGVyQ2FwdHVyZShkYXRhLCAndHJhY2UnLCBwcmVMb2FkZWRDYXB0dXJlLCBzdGFja3MsIHN0cmluZ3MpO1xuICBwcmVMb2FkZWRDYXB0dXJlID0gdW5kZWZpbmVkOyAvLyBsZXQgR0cgY2xlYW4gdXAgdGhlIGNhcHR1cmVcbiAgY29uc3QgYWdncm93ID0gbmV3IEFnZ3JvdyhkYXRhKTtcbiAgYWdncm93LmFkZFBvaW50ZXJFeHBhbmRlcignSWQnLCAnaWQnKTtcbiAgY29uc3QgdHlwZUV4cGFuZGVyID0gYWdncm93LmFkZFN0cmluZ0V4cGFuZGVyKCdUeXBlJywgJ3R5cGUnKTtcbiAgYWdncm93LmFkZE51bWJlckV4cGFuZGVyKCdTaXplJywgJ3NpemUnKTtcbiAgYWdncm93LmFkZFN0cmluZ0V4cGFuZGVyKCdUcmFjZScsICd0cmFjZScpO1xuICBjb25zdCBwYXRoRXhwYW5kZXIgPSBhZ2dyb3cuYWRkU3RhY2tFeHBhbmRlcignUGF0aCcsICdwYXRoJywgc3RyaW5ncy5nZXQpO1xuICBjb25zdCByZWFjdEV4cGFuZGVyID0gYWdncm93LmFkZFN0YWNrRXhwYW5kZXIoJ1JlYWN0IFRyZWUnLCAncmVhY3QnLCBzdHJpbmdzLmdldCk7XG4gIGNvbnN0IHZhbHVlRXhwYW5kZXIgPSBhZ2dyb3cuYWRkU3RyaW5nRXhwYW5kZXIoJ1ZhbHVlJywgJ3ZhbHVlJyk7XG4gIGNvbnN0IG1vZHVsZUV4cGFuZGVyID0gYWdncm93LmFkZFN0cmluZ0V4cGFuZGVyKCdNb2R1bGUnLCAnbW9kdWxlJyk7XG4gIGFnZ3Jvdy5leHBhbmRlci5zZXRBY3RpdmVFeHBhbmRlcnMoW1xuICAgIHBhdGhFeHBhbmRlcixcbiAgICByZWFjdEV4cGFuZGVyLFxuICAgIG1vZHVsZUV4cGFuZGVyLFxuICAgIHR5cGVFeHBhbmRlcixcbiAgICB2YWx1ZUV4cGFuZGVyLFxuICBdKTtcbiAgY29uc3Qgc2l6ZUFnZ3JlZ2F0b3IgPSBhZ2dyb3cuYWRkU3VtQWdncmVnYXRvcignU2l6ZScsICdzaXplJyk7XG4gIGNvbnN0IGNvdW50QWdncmVnYXRvciA9IGFnZ3Jvdy5hZGRDb3VudEFnZ3JlZ2F0b3IoJ0NvdW50Jyk7XG4gIGFnZ3Jvdy5leHBhbmRlci5zZXRBY3RpdmVBZ2dyZWdhdG9ycyhbXG4gICAgc2l6ZUFnZ3JlZ2F0b3IsXG4gICAgY291bnRBZ2dyZWdhdG9yLFxuICBdKTtcbiAgUmVhY3RET00ucmVuZGVyKDxUYWJsZSBhZ2dyb3c9e2FnZ3Jvdy5leHBhbmRlcn0gLz4sIGRvY3VtZW50LmJvZHkpO1xufVxuIl19 // @generated