Spaces:
Running
Running
| (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.dagre=f()}})(function(){var define,module,exports;return function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r}()({1:[function(require,module,exports){ | |
| /* | |
| Copyright (c) 2012-2014 Chris Pettitt | |
| 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. | |
| */ | |
| module.exports={graphlib:require("./lib/graphlib"),layout:require("./lib/layout"),debug:require("./lib/debug"),util:{time:require("./lib/util").time,notime:require("./lib/util").notime},version:require("./lib/version")}},{"./lib/debug":6,"./lib/graphlib":7,"./lib/layout":9,"./lib/util":29,"./lib/version":30}],2:[function(require,module,exports){"use strict";var _=require("./lodash");var greedyFAS=require("./greedy-fas");module.exports={run:run,undo:undo};function run(g){var fas=g.graph().acyclicer==="greedy"?greedyFAS(g,weightFn(g)):dfsFAS(g);_.forEach(fas,function(e){var label=g.edge(e);g.removeEdge(e);label.forwardName=e.name;label.reversed=true;g.setEdge(e.w,e.v,label,_.uniqueId("rev"))});function weightFn(g){return function(e){return g.edge(e).weight}}}function dfsFAS(g){var fas=[];var stack={};var visited={};function dfs(v){if(_.has(visited,v)){return}visited[v]=true;stack[v]=true;_.forEach(g.outEdges(v),function(e){if(_.has(stack,e.w)){fas.push(e)}else{dfs(e.w)}});delete stack[v]}_.forEach(g.nodes(),dfs);return fas}function undo(g){_.forEach(g.edges(),function(e){var label=g.edge(e);if(label.reversed){g.removeEdge(e);var forwardName=label.forwardName;delete label.reversed;delete label.forwardName;g.setEdge(e.w,e.v,label,forwardName)}})}},{"./greedy-fas":8,"./lodash":10}],3:[function(require,module,exports){var _=require("./lodash");var util=require("./util");module.exports=addBorderSegments;function addBorderSegments(g){function dfs(v){var children=g.children(v);var node=g.node(v);if(children.length){_.forEach(children,dfs)}if(_.has(node,"minRank")){node.borderLeft=[];node.borderRight=[];for(var rank=node.minRank,maxRank=node.maxRank+1;rank<maxRank;++rank){addBorderNode(g,"borderLeft","_bl",v,node,rank);addBorderNode(g,"borderRight","_br",v,node,rank)}}}_.forEach(g.children(),dfs)}function addBorderNode(g,prop,prefix,sg,sgNode,rank){var label={width:0,height:0,rank:rank,borderType:prop};var prev=sgNode[prop][rank-1];var curr=util.addDummyNode(g,"border",label,prefix);sgNode[prop][rank]=curr;g.setParent(curr,sg);if(prev){g.setEdge(prev,curr,{weight:1})}}},{"./lodash":10,"./util":29}],4:[function(require,module,exports){"use strict";var _=require("./lodash");module.exports={adjust:adjust,undo:undo};function adjust(g){var rankDir=g.graph().rankdir.toLowerCase();if(rankDir==="lr"||rankDir==="rl"){swapWidthHeight(g)}}function undo(g){var rankDir=g.graph().rankdir.toLowerCase();if(rankDir==="bt"||rankDir==="rl"){reverseY(g)}if(rankDir==="lr"||rankDir==="rl"){swapXY(g);swapWidthHeight(g)}}function swapWidthHeight(g){_.forEach(g.nodes(),function(v){swapWidthHeightOne(g.node(v))});_.forEach(g.edges(),function(e){swapWidthHeightOne(g.edge(e))})}function swapWidthHeightOne(attrs){var w=attrs.width;attrs.width=attrs.height;attrs.height=w}function reverseY(g){_.forEach(g.nodes(),function(v){reverseYOne(g.node(v))});_.forEach(g.edges(),function(e){var edge=g.edge(e);_.forEach(edge.points,reverseYOne);if(_.has(edge,"y")){reverseYOne(edge)}})}function reverseYOne(attrs){attrs.y=-attrs.y}function swapXY(g){_.forEach(g.nodes(),function(v){swapXYOne(g.node(v))});_.forEach(g.edges(),function(e){var edge=g.edge(e);_.forEach(edge.points,swapXYOne);if(_.has(edge,"x")){swapXYOne(edge)}})}function swapXYOne(attrs){var x=attrs.x;attrs.x=attrs.y;attrs.y=x}},{"./lodash":10}],5:[function(require,module,exports){ | |
| /* | |
| * Simple doubly linked list implementation derived from Cormen, et al., | |
| * "Introduction to Algorithms". | |
| */ | |
| module.exports=List;function List(){var sentinel={};sentinel._next=sentinel._prev=sentinel;this._sentinel=sentinel}List.prototype.dequeue=function(){var sentinel=this._sentinel;var entry=sentinel._prev;if(entry!==sentinel){unlink(entry);return entry}};List.prototype.enqueue=function(entry){var sentinel=this._sentinel;if(entry._prev&&entry._next){unlink(entry)}entry._next=sentinel._next;sentinel._next._prev=entry;sentinel._next=entry;entry._prev=sentinel};List.prototype.toString=function(){var strs=[];var sentinel=this._sentinel;var curr=sentinel._prev;while(curr!==sentinel){strs.push(JSON.stringify(curr,filterOutLinks));curr=curr._prev}return"["+strs.join(", ")+"]"};function unlink(entry){entry._prev._next=entry._next;entry._next._prev=entry._prev;delete entry._next;delete entry._prev}function filterOutLinks(k,v){if(k!=="_next"&&k!=="_prev"){return v}}},{}],6:[function(require,module,exports){var _=require("./lodash");var util=require("./util");var Graph=require("./graphlib").Graph;module.exports={debugOrdering:debugOrdering}; | |
| /* istanbul ignore next */function debugOrdering(g){var layerMatrix=util.buildLayerMatrix(g);var h=new Graph({compound:true,multigraph:true}).setGraph({});_.forEach(g.nodes(),function(v){h.setNode(v,{label:v});h.setParent(v,"layer"+g.node(v).rank)});_.forEach(g.edges(),function(e){h.setEdge(e.v,e.w,{},e.name)});_.forEach(layerMatrix,function(layer,i){var layerV="layer"+i;h.setNode(layerV,{rank:"same"});_.reduce(layer,function(u,v){h.setEdge(u,v,{style:"invis"});return v})});return h}},{"./graphlib":7,"./lodash":10,"./util":29}],7:[function(require,module,exports){ | |
| /* global window */ | |
| var graphlib;if(typeof require==="function"){try{graphlib=require("graphlib")}catch(e){ | |
| // continue regardless of error | |
| }}if(!graphlib){graphlib=window.graphlib}module.exports=graphlib},{graphlib:31}],8:[function(require,module,exports){var _=require("./lodash");var Graph=require("./graphlib").Graph;var List=require("./data/list"); | |
| /* | |
| * A greedy heuristic for finding a feedback arc set for a graph. A feedback | |
| * arc set is a set of edges that can be removed to make a graph acyclic. | |
| * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, "A fast and | |
| * effective heuristic for the feedback arc set problem." This implementation | |
| * adjusts that from the paper to allow for weighted edges. | |
| */module.exports=greedyFAS;var DEFAULT_WEIGHT_FN=_.constant(1);function greedyFAS(g,weightFn){if(g.nodeCount()<=1){return[]}var state=buildState(g,weightFn||DEFAULT_WEIGHT_FN);var results=doGreedyFAS(state.graph,state.buckets,state.zeroIdx); | |
| // Expand multi-edges | |
| return _.flatten(_.map(results,function(e){return g.outEdges(e.v,e.w)}),true)}function doGreedyFAS(g,buckets,zeroIdx){var results=[];var sources=buckets[buckets.length-1];var sinks=buckets[0];var entry;while(g.nodeCount()){while(entry=sinks.dequeue()){removeNode(g,buckets,zeroIdx,entry)}while(entry=sources.dequeue()){removeNode(g,buckets,zeroIdx,entry)}if(g.nodeCount()){for(var i=buckets.length-2;i>0;--i){entry=buckets[i].dequeue();if(entry){results=results.concat(removeNode(g,buckets,zeroIdx,entry,true));break}}}}return results}function removeNode(g,buckets,zeroIdx,entry,collectPredecessors){var results=collectPredecessors?[]:undefined;_.forEach(g.inEdges(entry.v),function(edge){var weight=g.edge(edge);var uEntry=g.node(edge.v);if(collectPredecessors){results.push({v:edge.v,w:edge.w})}uEntry.out-=weight;assignBucket(buckets,zeroIdx,uEntry)});_.forEach(g.outEdges(entry.v),function(edge){var weight=g.edge(edge);var w=edge.w;var wEntry=g.node(w);wEntry["in"]-=weight;assignBucket(buckets,zeroIdx,wEntry)});g.removeNode(entry.v);return results}function buildState(g,weightFn){var fasGraph=new Graph;var maxIn=0;var maxOut=0;_.forEach(g.nodes(),function(v){fasGraph.setNode(v,{v:v,in:0,out:0})}); | |
| // Aggregate weights on nodes, but also sum the weights across multi-edges | |
| // into a single edge for the fasGraph. | |
| _.forEach(g.edges(),function(e){var prevWeight=fasGraph.edge(e.v,e.w)||0;var weight=weightFn(e);var edgeWeight=prevWeight+weight;fasGraph.setEdge(e.v,e.w,edgeWeight);maxOut=Math.max(maxOut,fasGraph.node(e.v).out+=weight);maxIn=Math.max(maxIn,fasGraph.node(e.w)["in"]+=weight)});var buckets=_.range(maxOut+maxIn+3).map(function(){return new List});var zeroIdx=maxIn+1;_.forEach(fasGraph.nodes(),function(v){assignBucket(buckets,zeroIdx,fasGraph.node(v))});return{graph:fasGraph,buckets:buckets,zeroIdx:zeroIdx}}function assignBucket(buckets,zeroIdx,entry){if(!entry.out){buckets[0].enqueue(entry)}else if(!entry["in"]){buckets[buckets.length-1].enqueue(entry)}else{buckets[entry.out-entry["in"]+zeroIdx].enqueue(entry)}}},{"./data/list":5,"./graphlib":7,"./lodash":10}],9:[function(require,module,exports){"use strict";var _=require("./lodash");var acyclic=require("./acyclic");var normalize=require("./normalize");var rank=require("./rank");var normalizeRanks=require("./util").normalizeRanks;var parentDummyChains=require("./parent-dummy-chains");var removeEmptyRanks=require("./util").removeEmptyRanks;var nestingGraph=require("./nesting-graph");var addBorderSegments=require("./add-border-segments");var coordinateSystem=require("./coordinate-system");var order=require("./order");var position=require("./position");var util=require("./util");var Graph=require("./graphlib").Graph;module.exports=layout;function layout(g,opts){var time=opts&&opts.debugTiming?util.time:util.notime;time("layout",function(){var layoutGraph=time(" buildLayoutGraph",function(){return buildLayoutGraph(g)});time(" runLayout",function(){runLayout(layoutGraph,time)});time(" updateInputGraph",function(){updateInputGraph(g,layoutGraph)})})}function runLayout(g,time){time(" makeSpaceForEdgeLabels",function(){makeSpaceForEdgeLabels(g)});time(" removeSelfEdges",function(){removeSelfEdges(g)});time(" acyclic",function(){acyclic.run(g)});time(" nestingGraph.run",function(){nestingGraph.run(g)});time(" rank",function(){rank(util.asNonCompoundGraph(g))});time(" injectEdgeLabelProxies",function(){injectEdgeLabelProxies(g)});time(" removeEmptyRanks",function(){removeEmptyRanks(g)});time(" nestingGraph.cleanup",function(){nestingGraph.cleanup(g)});time(" normalizeRanks",function(){normalizeRanks(g)});time(" assignRankMinMax",function(){assignRankMinMax(g)});time(" removeEdgeLabelProxies",function(){removeEdgeLabelProxies(g)});time(" normalize.run",function(){normalize.run(g)});time(" parentDummyChains",function(){parentDummyChains(g)});time(" addBorderSegments",function(){addBorderSegments(g)});time(" order",function(){order(g)});time(" insertSelfEdges",function(){insertSelfEdges(g)});time(" adjustCoordinateSystem",function(){coordinateSystem.adjust(g)});time(" position",function(){position(g)});time(" positionSelfEdges",function(){positionSelfEdges(g)});time(" removeBorderNodes",function(){removeBorderNodes(g)});time(" normalize.undo",function(){normalize.undo(g)});time(" fixupEdgeLabelCoords",function(){fixupEdgeLabelCoords(g)});time(" undoCoordinateSystem",function(){coordinateSystem.undo(g)});time(" translateGraph",function(){translateGraph(g)});time(" assignNodeIntersects",function(){assignNodeIntersects(g)});time(" reversePoints",function(){reversePointsForReversedEdges(g)});time(" acyclic.undo",function(){acyclic.undo(g)})} | |
| /* | |
| * Copies final layout information from the layout graph back to the input | |
| * graph. This process only copies whitelisted attributes from the layout graph | |
| * to the input graph, so it serves as a good place to determine what | |
| * attributes can influence layout. | |
| */function updateInputGraph(inputGraph,layoutGraph){_.forEach(inputGraph.nodes(),function(v){var inputLabel=inputGraph.node(v);var layoutLabel=layoutGraph.node(v);if(inputLabel){inputLabel.x=layoutLabel.x;inputLabel.y=layoutLabel.y;if(layoutGraph.children(v).length){inputLabel.width=layoutLabel.width;inputLabel.height=layoutLabel.height}}});_.forEach(inputGraph.edges(),function(e){var inputLabel=inputGraph.edge(e);var layoutLabel=layoutGraph.edge(e);inputLabel.points=layoutLabel.points;if(_.has(layoutLabel,"x")){inputLabel.x=layoutLabel.x;inputLabel.y=layoutLabel.y}});inputGraph.graph().width=layoutGraph.graph().width;inputGraph.graph().height=layoutGraph.graph().height}var graphNumAttrs=["nodesep","edgesep","ranksep","marginx","marginy"];var graphDefaults={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"};var graphAttrs=["acyclicer","ranker","rankdir","align"];var nodeNumAttrs=["width","height"];var nodeDefaults={width:0,height:0};var edgeNumAttrs=["minlen","weight","width","height","labeloffset"];var edgeDefaults={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"};var edgeAttrs=["labelpos"]; | |
| /* | |
| * Constructs a new graph from the input graph, which can be used for layout. | |
| * This process copies only whitelisted attributes from the input graph to the | |
| * layout graph. Thus this function serves as a good place to determine what | |
| * attributes can influence layout. | |
| */function buildLayoutGraph(inputGraph){var g=new Graph({multigraph:true,compound:true});var graph=canonicalize(inputGraph.graph());g.setGraph(_.merge({},graphDefaults,selectNumberAttrs(graph,graphNumAttrs),_.pick(graph,graphAttrs)));_.forEach(inputGraph.nodes(),function(v){var node=canonicalize(inputGraph.node(v));g.setNode(v,_.defaults(selectNumberAttrs(node,nodeNumAttrs),nodeDefaults));g.setParent(v,inputGraph.parent(v))});_.forEach(inputGraph.edges(),function(e){var edge=canonicalize(inputGraph.edge(e));g.setEdge(e,_.merge({},edgeDefaults,selectNumberAttrs(edge,edgeNumAttrs),_.pick(edge,edgeAttrs)))});return g} | |
| /* | |
| * This idea comes from the Gansner paper: to account for edge labels in our | |
| * layout we split each rank in half by doubling minlen and halving ranksep. | |
| * Then we can place labels at these mid-points between nodes. | |
| * | |
| * We also add some minimal padding to the width to push the label for the edge | |
| * away from the edge itself a bit. | |
| */function makeSpaceForEdgeLabels(g){var graph=g.graph();graph.ranksep/=2;_.forEach(g.edges(),function(e){var edge=g.edge(e);edge.minlen*=2;if(edge.labelpos.toLowerCase()!=="c"){if(graph.rankdir==="TB"||graph.rankdir==="BT"){edge.width+=edge.labeloffset}else{edge.height+=edge.labeloffset}}})} | |
| /* | |
| * Creates temporary dummy nodes that capture the rank in which each edge's | |
| * label is going to, if it has one of non-zero width and height. We do this | |
| * so that we can safely remove empty ranks while preserving balance for the | |
| * label's position. | |
| */function injectEdgeLabelProxies(g){_.forEach(g.edges(),function(e){var edge=g.edge(e);if(edge.width&&edge.height){var v=g.node(e.v);var w=g.node(e.w);var label={rank:(w.rank-v.rank)/2+v.rank,e:e};util.addDummyNode(g,"edge-proxy",label,"_ep")}})}function assignRankMinMax(g){var maxRank=0;_.forEach(g.nodes(),function(v){var node=g.node(v);if(node.borderTop){node.minRank=g.node(node.borderTop).rank;node.maxRank=g.node(node.borderBottom).rank;maxRank=_.max(maxRank,node.maxRank)}});g.graph().maxRank=maxRank}function removeEdgeLabelProxies(g){_.forEach(g.nodes(),function(v){var node=g.node(v);if(node.dummy==="edge-proxy"){g.edge(node.e).labelRank=node.rank;g.removeNode(v)}})}function translateGraph(g){var minX=Number.POSITIVE_INFINITY;var maxX=0;var minY=Number.POSITIVE_INFINITY;var maxY=0;var graphLabel=g.graph();var marginX=graphLabel.marginx||0;var marginY=graphLabel.marginy||0;function getExtremes(attrs){var x=attrs.x;var y=attrs.y;var w=attrs.width;var h=attrs.height;minX=Math.min(minX,x-w/2);maxX=Math.max(maxX,x+w/2);minY=Math.min(minY,y-h/2);maxY=Math.max(maxY,y+h/2)}_.forEach(g.nodes(),function(v){getExtremes(g.node(v))});_.forEach(g.edges(),function(e){var edge=g.edge(e);if(_.has(edge,"x")){getExtremes(edge)}});minX-=marginX;minY-=marginY;_.forEach(g.nodes(),function(v){var node=g.node(v);node.x-=minX;node.y-=minY});_.forEach(g.edges(),function(e){var edge=g.edge(e);_.forEach(edge.points,function(p){p.x-=minX;p.y-=minY});if(_.has(edge,"x")){edge.x-=minX}if(_.has(edge,"y")){edge.y-=minY}});graphLabel.width=maxX-minX+marginX;graphLabel.height=maxY-minY+marginY}function assignNodeIntersects(g){_.forEach(g.edges(),function(e){var edge=g.edge(e);var nodeV=g.node(e.v);var nodeW=g.node(e.w);var p1,p2;if(!edge.points){edge.points=[];p1=nodeW;p2=nodeV}else{p1=edge.points[0];p2=edge.points[edge.points.length-1]}edge.points.unshift(util.intersectRect(nodeV,p1));edge.points.push(util.intersectRect(nodeW,p2))})}function fixupEdgeLabelCoords(g){_.forEach(g.edges(),function(e){var edge=g.edge(e);if(_.has(edge,"x")){if(edge.labelpos==="l"||edge.labelpos==="r"){edge.width-=edge.labeloffset}switch(edge.labelpos){case"l":edge.x-=edge.width/2+edge.labeloffset;break;case"r":edge.x+=edge.width/2+edge.labeloffset;break}}})}function reversePointsForReversedEdges(g){_.forEach(g.edges(),function(e){var edge=g.edge(e);if(edge.reversed){edge.points.reverse()}})}function removeBorderNodes(g){_.forEach(g.nodes(),function(v){if(g.children(v).length){var node=g.node(v);var t=g.node(node.borderTop);var b=g.node(node.borderBottom);var l=g.node(_.last(node.borderLeft));var r=g.node(_.last(node.borderRight));node.width=Math.abs(r.x-l.x);node.height=Math.abs(b.y-t.y);node.x=l.x+node.width/2;node.y=t.y+node.height/2}});_.forEach(g.nodes(),function(v){if(g.node(v).dummy==="border"){g.removeNode(v)}})}function removeSelfEdges(g){_.forEach(g.edges(),function(e){if(e.v===e.w){var node=g.node(e.v);if(!node.selfEdges){node.selfEdges=[]}node.selfEdges.push({e:e,label:g.edge(e)});g.removeEdge(e)}})}function insertSelfEdges(g){var layers=util.buildLayerMatrix(g);_.forEach(layers,function(layer){var orderShift=0;_.forEach(layer,function(v,i){var node=g.node(v);node.order=i+orderShift;_.forEach(node.selfEdges,function(selfEdge){util.addDummyNode(g,"selfedge",{width:selfEdge.label.width,height:selfEdge.label.height,rank:node.rank,order:i+ ++orderShift,e:selfEdge.e,label:selfEdge.label},"_se")});delete node.selfEdges})})}function positionSelfEdges(g){_.forEach(g.nodes(),function(v){var node=g.node(v);if(node.dummy==="selfedge"){var selfNode=g.node(node.e.v);var x=selfNode.x+selfNode.width/2;var y=selfNode.y;var dx=node.x-x;var dy=selfNode.height/2;g.setEdge(node.e,node.label);g.removeNode(v);node.label.points=[{x:x+2*dx/3,y:y-dy},{x:x+5*dx/6,y:y-dy},{x:x+dx,y:y},{x:x+5*dx/6,y:y+dy},{x:x+2*dx/3,y:y+dy}];node.label.x=node.x;node.label.y=node.y}})}function selectNumberAttrs(obj,attrs){return _.mapValues(_.pick(obj,attrs),Number)}function canonicalize(attrs){var newAttrs={};_.forEach(attrs,function(v,k){newAttrs[k.toLowerCase()]=v});return newAttrs}},{"./acyclic":2,"./add-border-segments":3,"./coordinate-system":4,"./graphlib":7,"./lodash":10,"./nesting-graph":11,"./normalize":12,"./order":17,"./parent-dummy-chains":22,"./position":24,"./rank":26,"./util":29}],10:[function(require,module,exports){ | |
| /* global window */ | |
| var lodash;if(typeof require==="function"){try{lodash={cloneDeep:require("lodash/cloneDeep"),constant:require("lodash/constant"),defaults:require("lodash/defaults"),each:require("lodash/each"),filter:require("lodash/filter"),find:require("lodash/find"),flatten:require("lodash/flatten"),forEach:require("lodash/forEach"),forIn:require("lodash/forIn"),has:require("lodash/has"),isUndefined:require("lodash/isUndefined"),last:require("lodash/last"),map:require("lodash/map"),mapValues:require("lodash/mapValues"),max:require("lodash/max"),merge:require("lodash/merge"),min:require("lodash/min"),minBy:require("lodash/minBy"),now:require("lodash/now"),pick:require("lodash/pick"),range:require("lodash/range"),reduce:require("lodash/reduce"),sortBy:require("lodash/sortBy"),uniqueId:require("lodash/uniqueId"),values:require("lodash/values"),zipObject:require("lodash/zipObject")}}catch(e){ | |
| // continue regardless of error | |
| }}if(!lodash){lodash=window._}module.exports=lodash},{"lodash/cloneDeep":227,"lodash/constant":228,"lodash/defaults":229,"lodash/each":230,"lodash/filter":232,"lodash/find":233,"lodash/flatten":235,"lodash/forEach":236,"lodash/forIn":237,"lodash/has":239,"lodash/isUndefined":258,"lodash/last":261,"lodash/map":262,"lodash/mapValues":263,"lodash/max":264,"lodash/merge":266,"lodash/min":267,"lodash/minBy":268,"lodash/now":270,"lodash/pick":271,"lodash/range":273,"lodash/reduce":274,"lodash/sortBy":276,"lodash/uniqueId":286,"lodash/values":287,"lodash/zipObject":288}],11:[function(require,module,exports){var _=require("./lodash");var util=require("./util");module.exports={run:run,cleanup:cleanup}; | |
| /* | |
| * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs, | |
| * adds appropriate edges to ensure that all cluster nodes are placed between | |
| * these boundries, and ensures that the graph is connected. | |
| * | |
| * In addition we ensure, through the use of the minlen property, that nodes | |
| * and subgraph border nodes to not end up on the same rank. | |
| * | |
| * Preconditions: | |
| * | |
| * 1. Input graph is a DAG | |
| * 2. Nodes in the input graph has a minlen attribute | |
| * | |
| * Postconditions: | |
| * | |
| * 1. Input graph is connected. | |
| * 2. Dummy nodes are added for the tops and bottoms of subgraphs. | |
| * 3. The minlen attribute for nodes is adjusted to ensure nodes do not | |
| * get placed on the same rank as subgraph border nodes. | |
| * | |
| * The nesting graph idea comes from Sander, "Layout of Compound Directed | |
| * Graphs." | |
| */function run(g){var root=util.addDummyNode(g,"root",{},"_root");var depths=treeDepths(g);var height=_.max(_.values(depths))-1;// Note: depths is an Object not an array | |
| var nodeSep=2*height+1;g.graph().nestingRoot=root; | |
| // Multiply minlen by nodeSep to align nodes on non-border ranks. | |
| _.forEach(g.edges(),function(e){g.edge(e).minlen*=nodeSep}); | |
| // Calculate a weight that is sufficient to keep subgraphs vertically compact | |
| var weight=sumWeights(g)+1; | |
| // Create border nodes and link them up | |
| _.forEach(g.children(),function(child){dfs(g,root,nodeSep,weight,height,depths,child)}); | |
| // Save the multiplier for node layers for later removal of empty border | |
| // layers. | |
| g.graph().nodeRankFactor=nodeSep}function dfs(g,root,nodeSep,weight,height,depths,v){var children=g.children(v);if(!children.length){if(v!==root){g.setEdge(root,v,{weight:0,minlen:nodeSep})}return}var top=util.addBorderNode(g,"_bt");var bottom=util.addBorderNode(g,"_bb");var label=g.node(v);g.setParent(top,v);label.borderTop=top;g.setParent(bottom,v);label.borderBottom=bottom;_.forEach(children,function(child){dfs(g,root,nodeSep,weight,height,depths,child);var childNode=g.node(child);var childTop=childNode.borderTop?childNode.borderTop:child;var childBottom=childNode.borderBottom?childNode.borderBottom:child;var thisWeight=childNode.borderTop?weight:2*weight;var minlen=childTop!==childBottom?1:height-depths[v]+1;g.setEdge(top,childTop,{weight:thisWeight,minlen:minlen,nestingEdge:true});g.setEdge(childBottom,bottom,{weight:thisWeight,minlen:minlen,nestingEdge:true})});if(!g.parent(v)){g.setEdge(root,top,{weight:0,minlen:height+depths[v]})}}function treeDepths(g){var depths={};function dfs(v,depth){var children=g.children(v);if(children&&children.length){_.forEach(children,function(child){dfs(child,depth+1)})}depths[v]=depth}_.forEach(g.children(),function(v){dfs(v,1)});return depths}function sumWeights(g){return _.reduce(g.edges(),function(acc,e){return acc+g.edge(e).weight},0)}function cleanup(g){var graphLabel=g.graph();g.removeNode(graphLabel.nestingRoot);delete graphLabel.nestingRoot;_.forEach(g.edges(),function(e){var edge=g.edge(e);if(edge.nestingEdge){g.removeEdge(e)}})}},{"./lodash":10,"./util":29}],12:[function(require,module,exports){"use strict";var _=require("./lodash");var util=require("./util");module.exports={run:run,undo:undo}; | |
| /* | |
| * Breaks any long edges in the graph into short segments that span 1 layer | |
| * each. This operation is undoable with the denormalize function. | |
| * | |
| * Pre-conditions: | |
| * | |
| * 1. The input graph is a DAG. | |
| * 2. Each node in the graph has a "rank" property. | |
| * | |
| * Post-condition: | |
| * | |
| * 1. All edges in the graph have a length of 1. | |
| * 2. Dummy nodes are added where edges have been split into segments. | |
| * 3. The graph is augmented with a "dummyChains" attribute which contains | |
| * the first dummy in each chain of dummy nodes produced. | |
| */function run(g){g.graph().dummyChains=[];_.forEach(g.edges(),function(edge){normalizeEdge(g,edge)})}function normalizeEdge(g,e){var v=e.v;var vRank=g.node(v).rank;var w=e.w;var wRank=g.node(w).rank;var name=e.name;var edgeLabel=g.edge(e);var labelRank=edgeLabel.labelRank;if(wRank===vRank+1)return;g.removeEdge(e);var dummy,attrs,i;for(i=0,++vRank;vRank<wRank;++i,++vRank){edgeLabel.points=[];attrs={width:0,height:0,edgeLabel:edgeLabel,edgeObj:e,rank:vRank};dummy=util.addDummyNode(g,"edge",attrs,"_d");if(vRank===labelRank){attrs.width=edgeLabel.width;attrs.height=edgeLabel.height;attrs.dummy="edge-label";attrs.labelpos=edgeLabel.labelpos}g.setEdge(v,dummy,{weight:edgeLabel.weight},name);if(i===0){g.graph().dummyChains.push(dummy)}v=dummy}g.setEdge(v,w,{weight:edgeLabel.weight},name)}function undo(g){_.forEach(g.graph().dummyChains,function(v){var node=g.node(v);var origLabel=node.edgeLabel;var w;g.setEdge(node.edgeObj,origLabel);while(node.dummy){w=g.successors(v)[0];g.removeNode(v);origLabel.points.push({x:node.x,y:node.y});if(node.dummy==="edge-label"){origLabel.x=node.x;origLabel.y=node.y;origLabel.width=node.width;origLabel.height=node.height}v=w;node=g.node(v)}})}},{"./lodash":10,"./util":29}],13:[function(require,module,exports){var _=require("../lodash");module.exports=addSubgraphConstraints;function addSubgraphConstraints(g,cg,vs){var prev={},rootPrev;_.forEach(vs,function(v){var child=g.parent(v),parent,prevChild;while(child){parent=g.parent(child);if(parent){prevChild=prev[parent];prev[parent]=child}else{prevChild=rootPrev;rootPrev=child}if(prevChild&&prevChild!==child){cg.setEdge(prevChild,child);return}child=parent}}); | |
| /* | |
| function dfs(v) { | |
| var children = v ? g.children(v) : g.children(); | |
| if (children.length) { | |
| var min = Number.POSITIVE_INFINITY, | |
| subgraphs = []; | |
| _.each(children, function(child) { | |
| var childMin = dfs(child); | |
| if (g.children(child).length) { | |
| subgraphs.push({ v: child, order: childMin }); | |
| } | |
| min = Math.min(min, childMin); | |
| }); | |
| _.reduce(_.sortBy(subgraphs, "order"), function(prev, curr) { | |
| cg.setEdge(prev.v, curr.v); | |
| return curr; | |
| }); | |
| return min; | |
| } | |
| return g.node(v).order; | |
| } | |
| dfs(undefined); | |
| */}},{"../lodash":10}],14:[function(require,module,exports){var _=require("../lodash");module.exports=barycenter;function barycenter(g,movable){return _.map(movable,function(v){var inV=g.inEdges(v);if(!inV.length){return{v:v}}else{var result=_.reduce(inV,function(acc,e){var edge=g.edge(e),nodeU=g.node(e.v);return{sum:acc.sum+edge.weight*nodeU.order,weight:acc.weight+edge.weight}},{sum:0,weight:0});return{v:v,barycenter:result.sum/result.weight,weight:result.weight}}})}},{"../lodash":10}],15:[function(require,module,exports){var _=require("../lodash");var Graph=require("../graphlib").Graph;module.exports=buildLayerGraph; | |
| /* | |
| * Constructs a graph that can be used to sort a layer of nodes. The graph will | |
| * contain all base and subgraph nodes from the request layer in their original | |
| * hierarchy and any edges that are incident on these nodes and are of the type | |
| * requested by the "relationship" parameter. | |
| * | |
| * Nodes from the requested rank that do not have parents are assigned a root | |
| * node in the output graph, which is set in the root graph attribute. This | |
| * makes it easy to walk the hierarchy of movable nodes during ordering. | |
| * | |
| * Pre-conditions: | |
| * | |
| * 1. Input graph is a DAG | |
| * 2. Base nodes in the input graph have a rank attribute | |
| * 3. Subgraph nodes in the input graph has minRank and maxRank attributes | |
| * 4. Edges have an assigned weight | |
| * | |
| * Post-conditions: | |
| * | |
| * 1. Output graph has all nodes in the movable rank with preserved | |
| * hierarchy. | |
| * 2. Root nodes in the movable layer are made children of the node | |
| * indicated by the root attribute of the graph. | |
| * 3. Non-movable nodes incident on movable nodes, selected by the | |
| * relationship parameter, are included in the graph (without hierarchy). | |
| * 4. Edges incident on movable nodes, selected by the relationship | |
| * parameter, are added to the output graph. | |
| * 5. The weights for copied edges are aggregated as need, since the output | |
| * graph is not a multi-graph. | |
| */function buildLayerGraph(g,rank,relationship){var root=createRootNode(g),result=new Graph({compound:true}).setGraph({root:root}).setDefaultNodeLabel(function(v){return g.node(v)});_.forEach(g.nodes(),function(v){var node=g.node(v),parent=g.parent(v);if(node.rank===rank||node.minRank<=rank&&rank<=node.maxRank){result.setNode(v);result.setParent(v,parent||root); | |
| // This assumes we have only short edges! | |
| _.forEach(g[relationship](v),function(e){var u=e.v===v?e.w:e.v,edge=result.edge(u,v),weight=!_.isUndefined(edge)?edge.weight:0;result.setEdge(u,v,{weight:g.edge(e).weight+weight})});if(_.has(node,"minRank")){result.setNode(v,{borderLeft:node.borderLeft[rank],borderRight:node.borderRight[rank]})}}});return result}function createRootNode(g){var v;while(g.hasNode(v=_.uniqueId("_root")));return v}},{"../graphlib":7,"../lodash":10}],16:[function(require,module,exports){"use strict";var _=require("../lodash");module.exports=crossCount; | |
| /* | |
| * A function that takes a layering (an array of layers, each with an array of | |
| * ordererd nodes) and a graph and returns a weighted crossing count. | |
| * | |
| * Pre-conditions: | |
| * | |
| * 1. Input graph must be simple (not a multigraph), directed, and include | |
| * only simple edges. | |
| * 2. Edges in the input graph must have assigned weights. | |
| * | |
| * Post-conditions: | |
| * | |
| * 1. The graph and layering matrix are left unchanged. | |
| * | |
| * This algorithm is derived from Barth, et al., "Bilayer Cross Counting." | |
| */function crossCount(g,layering){var cc=0;for(var i=1;i<layering.length;++i){cc+=twoLayerCrossCount(g,layering[i-1],layering[i])}return cc}function twoLayerCrossCount(g,northLayer,southLayer){ | |
| // Sort all of the edges between the north and south layers by their position | |
| // in the north layer and then the south. Map these edges to the position of | |
| // their head in the south layer. | |
| var southPos=_.zipObject(southLayer,_.map(southLayer,function(v,i){return i}));var southEntries=_.flatten(_.map(northLayer,function(v){return _.sortBy(_.map(g.outEdges(v),function(e){return{pos:southPos[e.w],weight:g.edge(e).weight}}),"pos")}),true); | |
| // Build the accumulator tree | |
| var firstIndex=1;while(firstIndex<southLayer.length)firstIndex<<=1;var treeSize=2*firstIndex-1;firstIndex-=1;var tree=_.map(new Array(treeSize),function(){return 0}); | |
| // Calculate the weighted crossings | |
| var cc=0;_.forEach(southEntries.forEach(function(entry){var index=entry.pos+firstIndex;tree[index]+=entry.weight;var weightSum=0;while(index>0){if(index%2){weightSum+=tree[index+1]}index=index-1>>1;tree[index]+=entry.weight}cc+=entry.weight*weightSum}));return cc}},{"../lodash":10}],17:[function(require,module,exports){"use strict";var _=require("../lodash");var initOrder=require("./init-order");var crossCount=require("./cross-count");var sortSubgraph=require("./sort-subgraph");var buildLayerGraph=require("./build-layer-graph");var addSubgraphConstraints=require("./add-subgraph-constraints");var Graph=require("../graphlib").Graph;var util=require("../util");module.exports=order; | |
| /* | |
| * Applies heuristics to minimize edge crossings in the graph and sets the best | |
| * order solution as an order attribute on each node. | |
| * | |
| * Pre-conditions: | |
| * | |
| * 1. Graph must be DAG | |
| * 2. Graph nodes must be objects with a "rank" attribute | |
| * 3. Graph edges must have the "weight" attribute | |
| * | |
| * Post-conditions: | |
| * | |
| * 1. Graph nodes will have an "order" attribute based on the results of the | |
| * algorithm. | |
| */function order(g){var maxRank=util.maxRank(g),downLayerGraphs=buildLayerGraphs(g,_.range(1,maxRank+1),"inEdges"),upLayerGraphs=buildLayerGraphs(g,_.range(maxRank-1,-1,-1),"outEdges");var layering=initOrder(g);assignOrder(g,layering);var bestCC=Number.POSITIVE_INFINITY,best;for(var i=0,lastBest=0;lastBest<4;++i,++lastBest){sweepLayerGraphs(i%2?downLayerGraphs:upLayerGraphs,i%4>=2);layering=util.buildLayerMatrix(g);var cc=crossCount(g,layering);if(cc<bestCC){lastBest=0;best=_.cloneDeep(layering);bestCC=cc}}assignOrder(g,best)}function buildLayerGraphs(g,ranks,relationship){return _.map(ranks,function(rank){return buildLayerGraph(g,rank,relationship)})}function sweepLayerGraphs(layerGraphs,biasRight){var cg=new Graph;_.forEach(layerGraphs,function(lg){var root=lg.graph().root;var sorted=sortSubgraph(lg,root,cg,biasRight);_.forEach(sorted.vs,function(v,i){lg.node(v).order=i});addSubgraphConstraints(lg,cg,sorted.vs)})}function assignOrder(g,layering){_.forEach(layering,function(layer){_.forEach(layer,function(v,i){g.node(v).order=i})})}},{"../graphlib":7,"../lodash":10,"../util":29,"./add-subgraph-constraints":13,"./build-layer-graph":15,"./cross-count":16,"./init-order":18,"./sort-subgraph":20}],18:[function(require,module,exports){"use strict";var _=require("../lodash");module.exports=initOrder; | |
| /* | |
| * Assigns an initial order value for each node by performing a DFS search | |
| * starting from nodes in the first rank. Nodes are assigned an order in their | |
| * rank as they are first visited. | |
| * | |
| * This approach comes from Gansner, et al., "A Technique for Drawing Directed | |
| * Graphs." | |
| * | |
| * Returns a layering matrix with an array per layer and each layer sorted by | |
| * the order of its nodes. | |
| */function initOrder(g){var visited={};var simpleNodes=_.filter(g.nodes(),function(v){return!g.children(v).length});var maxRank=_.max(_.map(simpleNodes,function(v){return g.node(v).rank}));var layers=_.map(_.range(maxRank+1),function(){return[]});function dfs(v){if(_.has(visited,v))return;visited[v]=true;var node=g.node(v);layers[node.rank].push(v);_.forEach(g.successors(v),dfs)}var orderedVs=_.sortBy(simpleNodes,function(v){return g.node(v).rank});_.forEach(orderedVs,dfs);return layers}},{"../lodash":10}],19:[function(require,module,exports){"use strict";var _=require("../lodash");module.exports=resolveConflicts; | |
| /* | |
| * Given a list of entries of the form {v, barycenter, weight} and a | |
| * constraint graph this function will resolve any conflicts between the | |
| * constraint graph and the barycenters for the entries. If the barycenters for | |
| * an entry would violate a constraint in the constraint graph then we coalesce | |
| * the nodes in the conflict into a new node that respects the contraint and | |
| * aggregates barycenter and weight information. | |
| * | |
| * This implementation is based on the description in Forster, "A Fast and | |
| * Simple Hueristic for Constrained Two-Level Crossing Reduction," thought it | |
| * differs in some specific details. | |
| * | |
| * Pre-conditions: | |
| * | |
| * 1. Each entry has the form {v, barycenter, weight}, or if the node has | |
| * no barycenter, then {v}. | |
| * | |
| * Returns: | |
| * | |
| * A new list of entries of the form {vs, i, barycenter, weight}. The list | |
| * `vs` may either be a singleton or it may be an aggregation of nodes | |
| * ordered such that they do not violate constraints from the constraint | |
| * graph. The property `i` is the lowest original index of any of the | |
| * elements in `vs`. | |
| */function resolveConflicts(entries,cg){var mappedEntries={};_.forEach(entries,function(entry,i){var tmp=mappedEntries[entry.v]={indegree:0,in:[],out:[],vs:[entry.v],i:i};if(!_.isUndefined(entry.barycenter)){tmp.barycenter=entry.barycenter;tmp.weight=entry.weight}});_.forEach(cg.edges(),function(e){var entryV=mappedEntries[e.v];var entryW=mappedEntries[e.w];if(!_.isUndefined(entryV)&&!_.isUndefined(entryW)){entryW.indegree++;entryV.out.push(mappedEntries[e.w])}});var sourceSet=_.filter(mappedEntries,function(entry){return!entry.indegree});return doResolveConflicts(sourceSet)}function doResolveConflicts(sourceSet){var entries=[];function handleIn(vEntry){return function(uEntry){if(uEntry.merged){return}if(_.isUndefined(uEntry.barycenter)||_.isUndefined(vEntry.barycenter)||uEntry.barycenter>=vEntry.barycenter){mergeEntries(vEntry,uEntry)}}}function handleOut(vEntry){return function(wEntry){wEntry["in"].push(vEntry);if(--wEntry.indegree===0){sourceSet.push(wEntry)}}}while(sourceSet.length){var entry=sourceSet.pop();entries.push(entry);_.forEach(entry["in"].reverse(),handleIn(entry));_.forEach(entry.out,handleOut(entry))}return _.map(_.filter(entries,function(entry){return!entry.merged}),function(entry){return _.pick(entry,["vs","i","barycenter","weight"])})}function mergeEntries(target,source){var sum=0;var weight=0;if(target.weight){sum+=target.barycenter*target.weight;weight+=target.weight}if(source.weight){sum+=source.barycenter*source.weight;weight+=source.weight}target.vs=source.vs.concat(target.vs);target.barycenter=sum/weight;target.weight=weight;target.i=Math.min(source.i,target.i);source.merged=true}},{"../lodash":10}],20:[function(require,module,exports){var _=require("../lodash");var barycenter=require("./barycenter");var resolveConflicts=require("./resolve-conflicts");var sort=require("./sort");module.exports=sortSubgraph;function sortSubgraph(g,v,cg,biasRight){var movable=g.children(v);var node=g.node(v);var bl=node?node.borderLeft:undefined;var br=node?node.borderRight:undefined;var subgraphs={};if(bl){movable=_.filter(movable,function(w){return w!==bl&&w!==br})}var barycenters=barycenter(g,movable);_.forEach(barycenters,function(entry){if(g.children(entry.v).length){var subgraphResult=sortSubgraph(g,entry.v,cg,biasRight);subgraphs[entry.v]=subgraphResult;if(_.has(subgraphResult,"barycenter")){mergeBarycenters(entry,subgraphResult)}}});var entries=resolveConflicts(barycenters,cg);expandSubgraphs(entries,subgraphs);var result=sort(entries,biasRight);if(bl){result.vs=_.flatten([bl,result.vs,br],true);if(g.predecessors(bl).length){var blPred=g.node(g.predecessors(bl)[0]),brPred=g.node(g.predecessors(br)[0]);if(!_.has(result,"barycenter")){result.barycenter=0;result.weight=0}result.barycenter=(result.barycenter*result.weight+blPred.order+brPred.order)/(result.weight+2);result.weight+=2}}return result}function expandSubgraphs(entries,subgraphs){_.forEach(entries,function(entry){entry.vs=_.flatten(entry.vs.map(function(v){if(subgraphs[v]){return subgraphs[v].vs}return v}),true)})}function mergeBarycenters(target,other){if(!_.isUndefined(target.barycenter)){target.barycenter=(target.barycenter*target.weight+other.barycenter*other.weight)/(target.weight+other.weight);target.weight+=other.weight}else{target.barycenter=other.barycenter;target.weight=other.weight}}},{"../lodash":10,"./barycenter":14,"./resolve-conflicts":19,"./sort":21}],21:[function(require,module,exports){var _=require("../lodash");var util=require("../util");module.exports=sort;function sort(entries,biasRight){var parts=util.partition(entries,function(entry){return _.has(entry,"barycenter")});var sortable=parts.lhs,unsortable=_.sortBy(parts.rhs,function(entry){return-entry.i}),vs=[],sum=0,weight=0,vsIndex=0;sortable.sort(compareWithBias(!!biasRight));vsIndex=consumeUnsortable(vs,unsortable,vsIndex);_.forEach(sortable,function(entry){vsIndex+=entry.vs.length;vs.push(entry.vs);sum+=entry.barycenter*entry.weight;weight+=entry.weight;vsIndex=consumeUnsortable(vs,unsortable,vsIndex)});var result={vs:_.flatten(vs,true)};if(weight){result.barycenter=sum/weight;result.weight=weight}return result}function consumeUnsortable(vs,unsortable,index){var last;while(unsortable.length&&(last=_.last(unsortable)).i<=index){unsortable.pop();vs.push(last.vs);index++}return index}function compareWithBias(bias){return function(entryV,entryW){if(entryV.barycenter<entryW.barycenter){return-1}else if(entryV.barycenter>entryW.barycenter){return 1}return!bias?entryV.i-entryW.i:entryW.i-entryV.i}}},{"../lodash":10,"../util":29}],22:[function(require,module,exports){var _=require("./lodash");module.exports=parentDummyChains;function parentDummyChains(g){var postorderNums=postorder(g);_.forEach(g.graph().dummyChains,function(v){var node=g.node(v);var edgeObj=node.edgeObj;var pathData=findPath(g,postorderNums,edgeObj.v,edgeObj.w);var path=pathData.path;var lca=pathData.lca;var pathIdx=0;var pathV=path[pathIdx];var ascending=true;while(v!==edgeObj.w){node=g.node(v);if(ascending){while((pathV=path[pathIdx])!==lca&&g.node(pathV).maxRank<node.rank){pathIdx++}if(pathV===lca){ascending=false}}if(!ascending){while(pathIdx<path.length-1&&g.node(pathV=path[pathIdx+1]).minRank<=node.rank){pathIdx++}pathV=path[pathIdx]}g.setParent(v,pathV);v=g.successors(v)[0]}})} | |
| // Find a path from v to w through the lowest common ancestor (LCA). Return the | |
| // full path and the LCA. | |
| function findPath(g,postorderNums,v,w){var vPath=[];var wPath=[];var low=Math.min(postorderNums[v].low,postorderNums[w].low);var lim=Math.max(postorderNums[v].lim,postorderNums[w].lim);var parent;var lca; | |
| // Traverse up from v to find the LCA | |
| parent=v;do{parent=g.parent(parent);vPath.push(parent)}while(parent&&(postorderNums[parent].low>low||lim>postorderNums[parent].lim));lca=parent; | |
| // Traverse from w to LCA | |
| parent=w;while((parent=g.parent(parent))!==lca){wPath.push(parent)}return{path:vPath.concat(wPath.reverse()),lca:lca}}function postorder(g){var result={};var lim=0;function dfs(v){var low=lim;_.forEach(g.children(v),dfs);result[v]={low:low,lim:lim++}}_.forEach(g.children(),dfs);return result}},{"./lodash":10}],23:[function(require,module,exports){"use strict";var _=require("../lodash");var Graph=require("../graphlib").Graph;var util=require("../util"); | |
| /* | |
| * This module provides coordinate assignment based on Brandes and Köpf, "Fast | |
| * and Simple Horizontal Coordinate Assignment." | |
| */module.exports={positionX:positionX,findType1Conflicts:findType1Conflicts,findType2Conflicts:findType2Conflicts,addConflict:addConflict,hasConflict:hasConflict,verticalAlignment:verticalAlignment,horizontalCompaction:horizontalCompaction,alignCoordinates:alignCoordinates,findSmallestWidthAlignment:findSmallestWidthAlignment,balance:balance}; | |
| /* | |
| * Marks all edges in the graph with a type-1 conflict with the "type1Conflict" | |
| * property. A type-1 conflict is one where a non-inner segment crosses an | |
| * inner segment. An inner segment is an edge with both incident nodes marked | |
| * with the "dummy" property. | |
| * | |
| * This algorithm scans layer by layer, starting with the second, for type-1 | |
| * conflicts between the current layer and the previous layer. For each layer | |
| * it scans the nodes from left to right until it reaches one that is incident | |
| * on an inner segment. It then scans predecessors to determine if they have | |
| * edges that cross that inner segment. At the end a final scan is done for all | |
| * nodes on the current rank to see if they cross the last visited inner | |
| * segment. | |
| * | |
| * This algorithm (safely) assumes that a dummy node will only be incident on a | |
| * single node in the layers being scanned. | |
| */function findType1Conflicts(g,layering){var conflicts={};function visitLayer(prevLayer,layer){var | |
| // last visited node in the previous layer that is incident on an inner | |
| // segment. | |
| k0=0, | |
| // Tracks the last node in this layer scanned for crossings with a type-1 | |
| // segment. | |
| scanPos=0,prevLayerLength=prevLayer.length,lastNode=_.last(layer);_.forEach(layer,function(v,i){var w=findOtherInnerSegmentNode(g,v),k1=w?g.node(w).order:prevLayerLength;if(w||v===lastNode){_.forEach(layer.slice(scanPos,i+1),function(scanNode){_.forEach(g.predecessors(scanNode),function(u){var uLabel=g.node(u),uPos=uLabel.order;if((uPos<k0||k1<uPos)&&!(uLabel.dummy&&g.node(scanNode).dummy)){addConflict(conflicts,u,scanNode)}})});scanPos=i+1;k0=k1}});return layer}_.reduce(layering,visitLayer);return conflicts}function findType2Conflicts(g,layering){var conflicts={};function scan(south,southPos,southEnd,prevNorthBorder,nextNorthBorder){var v;_.forEach(_.range(southPos,southEnd),function(i){v=south[i];if(g.node(v).dummy){_.forEach(g.predecessors(v),function(u){var uNode=g.node(u);if(uNode.dummy&&(uNode.order<prevNorthBorder||uNode.order>nextNorthBorder)){addConflict(conflicts,u,v)}})}})}function visitLayer(north,south){var prevNorthPos=-1,nextNorthPos,southPos=0;_.forEach(south,function(v,southLookahead){if(g.node(v).dummy==="border"){var predecessors=g.predecessors(v);if(predecessors.length){nextNorthPos=g.node(predecessors[0]).order;scan(south,southPos,southLookahead,prevNorthPos,nextNorthPos);southPos=southLookahead;prevNorthPos=nextNorthPos}}scan(south,southPos,south.length,nextNorthPos,north.length)});return south}_.reduce(layering,visitLayer);return conflicts}function findOtherInnerSegmentNode(g,v){if(g.node(v).dummy){return _.find(g.predecessors(v),function(u){return g.node(u).dummy})}}function addConflict(conflicts,v,w){if(v>w){var tmp=v;v=w;w=tmp}var conflictsV=conflicts[v];if(!conflictsV){conflicts[v]=conflictsV={}}conflictsV[w]=true}function hasConflict(conflicts,v,w){if(v>w){var tmp=v;v=w;w=tmp}return _.has(conflicts[v],w)} | |
| /* | |
| * Try to align nodes into vertical "blocks" where possible. This algorithm | |
| * attempts to align a node with one of its median neighbors. If the edge | |
| * connecting a neighbor is a type-1 conflict then we ignore that possibility. | |
| * If a previous node has already formed a block with a node after the node | |
| * we're trying to form a block with, we also ignore that possibility - our | |
| * blocks would be split in that scenario. | |
| */function verticalAlignment(g,layering,conflicts,neighborFn){var root={},align={},pos={}; | |
| // We cache the position here based on the layering because the graph and | |
| // layering may be out of sync. The layering matrix is manipulated to | |
| // generate different extreme alignments. | |
| _.forEach(layering,function(layer){_.forEach(layer,function(v,order){root[v]=v;align[v]=v;pos[v]=order})});_.forEach(layering,function(layer){var prevIdx=-1;_.forEach(layer,function(v){var ws=neighborFn(v);if(ws.length){ws=_.sortBy(ws,function(w){return pos[w]});var mp=(ws.length-1)/2;for(var i=Math.floor(mp),il=Math.ceil(mp);i<=il;++i){var w=ws[i];if(align[v]===v&&prevIdx<pos[w]&&!hasConflict(conflicts,v,w)){align[w]=v;align[v]=root[v]=root[w];prevIdx=pos[w]}}}})});return{root:root,align:align}}function horizontalCompaction(g,layering,root,align,reverseSep){ | |
| // This portion of the algorithm differs from BK due to a number of problems. | |
| // Instead of their algorithm we construct a new block graph and do two | |
| // sweeps. The first sweep places blocks with the smallest possible | |
| // coordinates. The second sweep removes unused space by moving blocks to the | |
| // greatest coordinates without violating separation. | |
| var xs={},blockG=buildBlockGraph(g,layering,root,reverseSep),borderType=reverseSep?"borderLeft":"borderRight";function iterate(setXsFunc,nextNodesFunc){var stack=blockG.nodes();var elem=stack.pop();var visited={};while(elem){if(visited[elem]){setXsFunc(elem)}else{visited[elem]=true;stack.push(elem);stack=stack.concat(nextNodesFunc(elem))}elem=stack.pop()}} | |
| // First pass, assign smallest coordinates | |
| function pass1(elem){xs[elem]=blockG.inEdges(elem).reduce(function(acc,e){return Math.max(acc,xs[e.v]+blockG.edge(e))},0)} | |
| // Second pass, assign greatest coordinates | |
| function pass2(elem){var min=blockG.outEdges(elem).reduce(function(acc,e){return Math.min(acc,xs[e.w]-blockG.edge(e))},Number.POSITIVE_INFINITY);var node=g.node(elem);if(min!==Number.POSITIVE_INFINITY&&node.borderType!==borderType){xs[elem]=Math.max(xs[elem],min)}}iterate(pass1,blockG.predecessors.bind(blockG));iterate(pass2,blockG.successors.bind(blockG)); | |
| // Assign x coordinates to all nodes | |
| _.forEach(align,function(v){xs[v]=xs[root[v]]});return xs}function buildBlockGraph(g,layering,root,reverseSep){var blockGraph=new Graph,graphLabel=g.graph(),sepFn=sep(graphLabel.nodesep,graphLabel.edgesep,reverseSep);_.forEach(layering,function(layer){var u;_.forEach(layer,function(v){var vRoot=root[v];blockGraph.setNode(vRoot);if(u){var uRoot=root[u],prevMax=blockGraph.edge(uRoot,vRoot);blockGraph.setEdge(uRoot,vRoot,Math.max(sepFn(g,v,u),prevMax||0))}u=v})});return blockGraph} | |
| /* | |
| * Returns the alignment that has the smallest width of the given alignments. | |
| */function findSmallestWidthAlignment(g,xss){return _.minBy(_.values(xss),function(xs){var max=Number.NEGATIVE_INFINITY;var min=Number.POSITIVE_INFINITY;_.forIn(xs,function(x,v){var halfWidth=width(g,v)/2;max=Math.max(x+halfWidth,max);min=Math.min(x-halfWidth,min)});return max-min})} | |
| /* | |
| * Align the coordinates of each of the layout alignments such that | |
| * left-biased alignments have their minimum coordinate at the same point as | |
| * the minimum coordinate of the smallest width alignment and right-biased | |
| * alignments have their maximum coordinate at the same point as the maximum | |
| * coordinate of the smallest width alignment. | |
| */function alignCoordinates(xss,alignTo){var alignToVals=_.values(alignTo),alignToMin=_.min(alignToVals),alignToMax=_.max(alignToVals);_.forEach(["u","d"],function(vert){_.forEach(["l","r"],function(horiz){var alignment=vert+horiz,xs=xss[alignment],delta;if(xs===alignTo)return;var xsVals=_.values(xs);delta=horiz==="l"?alignToMin-_.min(xsVals):alignToMax-_.max(xsVals);if(delta){xss[alignment]=_.mapValues(xs,function(x){return x+delta})}})})}function balance(xss,align){return _.mapValues(xss.ul,function(ignore,v){if(align){return xss[align.toLowerCase()][v]}else{var xs=_.sortBy(_.map(xss,v));return(xs[1]+xs[2])/2}})}function positionX(g){var layering=util.buildLayerMatrix(g);var conflicts=_.merge(findType1Conflicts(g,layering),findType2Conflicts(g,layering));var xss={};var adjustedLayering;_.forEach(["u","d"],function(vert){adjustedLayering=vert==="u"?layering:_.values(layering).reverse();_.forEach(["l","r"],function(horiz){if(horiz==="r"){adjustedLayering=_.map(adjustedLayering,function(inner){return _.values(inner).reverse()})}var neighborFn=(vert==="u"?g.predecessors:g.successors).bind(g);var align=verticalAlignment(g,adjustedLayering,conflicts,neighborFn);var xs=horizontalCompaction(g,adjustedLayering,align.root,align.align,horiz==="r");if(horiz==="r"){xs=_.mapValues(xs,function(x){return-x})}xss[vert+horiz]=xs})});var smallestWidth=findSmallestWidthAlignment(g,xss);alignCoordinates(xss,smallestWidth);return balance(xss,g.graph().align)}function sep(nodeSep,edgeSep,reverseSep){return function(g,v,w){var vLabel=g.node(v);var wLabel=g.node(w);var sum=0;var delta;sum+=vLabel.width/2;if(_.has(vLabel,"labelpos")){switch(vLabel.labelpos.toLowerCase()){case"l":delta=-vLabel.width/2;break;case"r":delta=vLabel.width/2;break}}if(delta){sum+=reverseSep?delta:-delta}delta=0;sum+=(vLabel.dummy?edgeSep:nodeSep)/2;sum+=(wLabel.dummy?edgeSep:nodeSep)/2;sum+=wLabel.width/2;if(_.has(wLabel,"labelpos")){switch(wLabel.labelpos.toLowerCase()){case"l":delta=wLabel.width/2;break;case"r":delta=-wLabel.width/2;break}}if(delta){sum+=reverseSep?delta:-delta}delta=0;return sum}}function width(g,v){return g.node(v).width}},{"../graphlib":7,"../lodash":10,"../util":29}],24:[function(require,module,exports){"use strict";var _=require("../lodash");var util=require("../util");var positionX=require("./bk").positionX;module.exports=position;function position(g){g=util.asNonCompoundGraph(g);positionY(g);_.forEach(positionX(g),function(x,v){g.node(v).x=x})}function positionY(g){var layering=util.buildLayerMatrix(g);var rankSep=g.graph().ranksep;var prevY=0;_.forEach(layering,function(layer){var maxHeight=_.max(_.map(layer,function(v){return g.node(v).height}));_.forEach(layer,function(v){g.node(v).y=prevY+maxHeight/2});prevY+=maxHeight+rankSep})}},{"../lodash":10,"../util":29,"./bk":23}],25:[function(require,module,exports){"use strict";var _=require("../lodash");var Graph=require("../graphlib").Graph;var slack=require("./util").slack;module.exports=feasibleTree; | |
| /* | |
| * Constructs a spanning tree with tight edges and adjusted the input node's | |
| * ranks to achieve this. A tight edge is one that is has a length that matches | |
| * its "minlen" attribute. | |
| * | |
| * The basic structure for this function is derived from Gansner, et al., "A | |
| * Technique for Drawing Directed Graphs." | |
| * | |
| * Pre-conditions: | |
| * | |
| * 1. Graph must be a DAG. | |
| * 2. Graph must be connected. | |
| * 3. Graph must have at least one node. | |
| * 5. Graph nodes must have been previously assigned a "rank" property that | |
| * respects the "minlen" property of incident edges. | |
| * 6. Graph edges must have a "minlen" property. | |
| * | |
| * Post-conditions: | |
| * | |
| * - Graph nodes will have their rank adjusted to ensure that all edges are | |
| * tight. | |
| * | |
| * Returns a tree (undirected graph) that is constructed using only "tight" | |
| * edges. | |
| */function feasibleTree(g){var t=new Graph({directed:false}); | |
| // Choose arbitrary node from which to start our tree | |
| var start=g.nodes()[0];var size=g.nodeCount();t.setNode(start,{});var edge,delta;while(tightTree(t,g)<size){edge=findMinSlackEdge(t,g);delta=t.hasNode(edge.v)?slack(g,edge):-slack(g,edge);shiftRanks(t,g,delta)}return t} | |
| /* | |
| * Finds a maximal tree of tight edges and returns the number of nodes in the | |
| * tree. | |
| */function tightTree(t,g){function dfs(v){_.forEach(g.nodeEdges(v),function(e){var edgeV=e.v,w=v===edgeV?e.w:edgeV;if(!t.hasNode(w)&&!slack(g,e)){t.setNode(w,{});t.setEdge(v,w,{});dfs(w)}})}_.forEach(t.nodes(),dfs);return t.nodeCount()} | |
| /* | |
| * Finds the edge with the smallest slack that is incident on tree and returns | |
| * it. | |
| */function findMinSlackEdge(t,g){return _.minBy(g.edges(),function(e){if(t.hasNode(e.v)!==t.hasNode(e.w)){return slack(g,e)}})}function shiftRanks(t,g,delta){_.forEach(t.nodes(),function(v){g.node(v).rank+=delta})}},{"../graphlib":7,"../lodash":10,"./util":28}],26:[function(require,module,exports){"use strict";var rankUtil=require("./util");var longestPath=rankUtil.longestPath;var feasibleTree=require("./feasible-tree");var networkSimplex=require("./network-simplex");module.exports=rank; | |
| /* | |
| * Assigns a rank to each node in the input graph that respects the "minlen" | |
| * constraint specified on edges between nodes. | |
| * | |
| * This basic structure is derived from Gansner, et al., "A Technique for | |
| * Drawing Directed Graphs." | |
| * | |
| * Pre-conditions: | |
| * | |
| * 1. Graph must be a connected DAG | |
| * 2. Graph nodes must be objects | |
| * 3. Graph edges must have "weight" and "minlen" attributes | |
| * | |
| * Post-conditions: | |
| * | |
| * 1. Graph nodes will have a "rank" attribute based on the results of the | |
| * algorithm. Ranks can start at any index (including negative), we'll | |
| * fix them up later. | |
| */function rank(g){switch(g.graph().ranker){case"network-simplex":networkSimplexRanker(g);break;case"tight-tree":tightTreeRanker(g);break;case"longest-path":longestPathRanker(g);break;default:networkSimplexRanker(g)}} | |
| // A fast and simple ranker, but results are far from optimal. | |
| var longestPathRanker=longestPath;function tightTreeRanker(g){longestPath(g);feasibleTree(g)}function networkSimplexRanker(g){networkSimplex(g)}},{"./feasible-tree":25,"./network-simplex":27,"./util":28}],27:[function(require,module,exports){"use strict";var _=require("../lodash");var feasibleTree=require("./feasible-tree");var slack=require("./util").slack;var initRank=require("./util").longestPath;var preorder=require("../graphlib").alg.preorder;var postorder=require("../graphlib").alg.postorder;var simplify=require("../util").simplify;module.exports=networkSimplex; | |
| // Expose some internals for testing purposes | |
| networkSimplex.initLowLimValues=initLowLimValues;networkSimplex.initCutValues=initCutValues;networkSimplex.calcCutValue=calcCutValue;networkSimplex.leaveEdge=leaveEdge;networkSimplex.enterEdge=enterEdge;networkSimplex.exchangeEdges=exchangeEdges; | |
| /* | |
| * The network simplex algorithm assigns ranks to each node in the input graph | |
| * and iteratively improves the ranking to reduce the length of edges. | |
| * | |
| * Preconditions: | |
| * | |
| * 1. The input graph must be a DAG. | |
| * 2. All nodes in the graph must have an object value. | |
| * 3. All edges in the graph must have "minlen" and "weight" attributes. | |
| * | |
| * Postconditions: | |
| * | |
| * 1. All nodes in the graph will have an assigned "rank" attribute that has | |
| * been optimized by the network simplex algorithm. Ranks start at 0. | |
| * | |
| * | |
| * A rough sketch of the algorithm is as follows: | |
| * | |
| * 1. Assign initial ranks to each node. We use the longest path algorithm, | |
| * which assigns ranks to the lowest position possible. In general this | |
| * leads to very wide bottom ranks and unnecessarily long edges. | |
| * 2. Construct a feasible tight tree. A tight tree is one such that all | |
| * edges in the tree have no slack (difference between length of edge | |
| * and minlen for the edge). This by itself greatly improves the assigned | |
| * rankings by shorting edges. | |
| * 3. Iteratively find edges that have negative cut values. Generally a | |
| * negative cut value indicates that the edge could be removed and a new | |
| * tree edge could be added to produce a more compact graph. | |
| * | |
| * Much of the algorithms here are derived from Gansner, et al., "A Technique | |
| * for Drawing Directed Graphs." The structure of the file roughly follows the | |
| * structure of the overall algorithm. | |
| */function networkSimplex(g){g=simplify(g);initRank(g);var t=feasibleTree(g);initLowLimValues(t);initCutValues(t,g);var e,f;while(e=leaveEdge(t)){f=enterEdge(t,g,e);exchangeEdges(t,g,e,f)}} | |
| /* | |
| * Initializes cut values for all edges in the tree. | |
| */function initCutValues(t,g){var vs=postorder(t,t.nodes());vs=vs.slice(0,vs.length-1);_.forEach(vs,function(v){assignCutValue(t,g,v)})}function assignCutValue(t,g,child){var childLab=t.node(child);var parent=childLab.parent;t.edge(child,parent).cutvalue=calcCutValue(t,g,child)} | |
| /* | |
| * Given the tight tree, its graph, and a child in the graph calculate and | |
| * return the cut value for the edge between the child and its parent. | |
| */function calcCutValue(t,g,child){var childLab=t.node(child);var parent=childLab.parent; | |
| // True if the child is on the tail end of the edge in the directed graph | |
| var childIsTail=true; | |
| // The graph's view of the tree edge we're inspecting | |
| var graphEdge=g.edge(child,parent); | |
| // The accumulated cut value for the edge between this node and its parent | |
| var cutValue=0;if(!graphEdge){childIsTail=false;graphEdge=g.edge(parent,child)}cutValue=graphEdge.weight;_.forEach(g.nodeEdges(child),function(e){var isOutEdge=e.v===child,other=isOutEdge?e.w:e.v;if(other!==parent){var pointsToHead=isOutEdge===childIsTail,otherWeight=g.edge(e).weight;cutValue+=pointsToHead?otherWeight:-otherWeight;if(isTreeEdge(t,child,other)){var otherCutValue=t.edge(child,other).cutvalue;cutValue+=pointsToHead?-otherCutValue:otherCutValue}}});return cutValue}function initLowLimValues(tree,root){if(arguments.length<2){root=tree.nodes()[0]}dfsAssignLowLim(tree,{},1,root)}function dfsAssignLowLim(tree,visited,nextLim,v,parent){var low=nextLim;var label=tree.node(v);visited[v]=true;_.forEach(tree.neighbors(v),function(w){if(!_.has(visited,w)){nextLim=dfsAssignLowLim(tree,visited,nextLim,w,v)}});label.low=low;label.lim=nextLim++;if(parent){label.parent=parent}else{ | |
| // TODO should be able to remove this when we incrementally update low lim | |
| delete label.parent}return nextLim}function leaveEdge(tree){return _.find(tree.edges(),function(e){return tree.edge(e).cutvalue<0})}function enterEdge(t,g,edge){var v=edge.v;var w=edge.w; | |
| // For the rest of this function we assume that v is the tail and w is the | |
| // head, so if we don't have this edge in the graph we should flip it to | |
| // match the correct orientation. | |
| if(!g.hasEdge(v,w)){v=edge.w;w=edge.v}var vLabel=t.node(v);var wLabel=t.node(w);var tailLabel=vLabel;var flip=false; | |
| // If the root is in the tail of the edge then we need to flip the logic that | |
| // checks for the head and tail nodes in the candidates function below. | |
| if(vLabel.lim>wLabel.lim){tailLabel=wLabel;flip=true}var candidates=_.filter(g.edges(),function(edge){return flip===isDescendant(t,t.node(edge.v),tailLabel)&&flip!==isDescendant(t,t.node(edge.w),tailLabel)});return _.minBy(candidates,function(edge){return slack(g,edge)})}function exchangeEdges(t,g,e,f){var v=e.v;var w=e.w;t.removeEdge(v,w);t.setEdge(f.v,f.w,{});initLowLimValues(t);initCutValues(t,g);updateRanks(t,g)}function updateRanks(t,g){var root=_.find(t.nodes(),function(v){return!g.node(v).parent});var vs=preorder(t,root);vs=vs.slice(1);_.forEach(vs,function(v){var parent=t.node(v).parent,edge=g.edge(v,parent),flipped=false;if(!edge){edge=g.edge(parent,v);flipped=true}g.node(v).rank=g.node(parent).rank+(flipped?edge.minlen:-edge.minlen)})} | |
| /* | |
| * Returns true if the edge is in the tree. | |
| */function isTreeEdge(tree,u,v){return tree.hasEdge(u,v)} | |
| /* | |
| * Returns true if the specified node is descendant of the root node per the | |
| * assigned low and lim attributes in the tree. | |
| */function isDescendant(tree,vLabel,rootLabel){return rootLabel.low<=vLabel.lim&&vLabel.lim<=rootLabel.lim}},{"../graphlib":7,"../lodash":10,"../util":29,"./feasible-tree":25,"./util":28}],28:[function(require,module,exports){"use strict";var _=require("../lodash");module.exports={longestPath:longestPath,slack:slack}; | |
| /* | |
| * Initializes ranks for the input graph using the longest path algorithm. This | |
| * algorithm scales well and is fast in practice, it yields rather poor | |
| * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom | |
| * ranks wide and leaving edges longer than necessary. However, due to its | |
| * speed, this algorithm is good for getting an initial ranking that can be fed | |
| * into other algorithms. | |
| * | |
| * This algorithm does not normalize layers because it will be used by other | |
| * algorithms in most cases. If using this algorithm directly, be sure to | |
| * run normalize at the end. | |
| * | |
| * Pre-conditions: | |
| * | |
| * 1. Input graph is a DAG. | |
| * 2. Input graph node labels can be assigned properties. | |
| * | |
| * Post-conditions: | |
| * | |
| * 1. Each node will be assign an (unnormalized) "rank" property. | |
| */function longestPath(g){var visited={};function dfs(v){var label=g.node(v);if(_.has(visited,v)){return label.rank}visited[v]=true;var rank=_.min(_.map(g.outEdges(v),function(e){return dfs(e.w)-g.edge(e).minlen}));if(rank===Number.POSITIVE_INFINITY||// return value of _.map([]) for Lodash 3 | |
| rank===undefined||// return value of _.map([]) for Lodash 4 | |
| rank===null){// return value of _.map([null]) | |
| rank=0}return label.rank=rank}_.forEach(g.sources(),dfs)} | |
| /* | |
| * Returns the amount of slack for the given edge. The slack is defined as the | |
| * difference between the length of the edge and its minimum length. | |
| */function slack(g,e){return g.node(e.w).rank-g.node(e.v).rank-g.edge(e).minlen}},{"../lodash":10}],29:[function(require,module,exports){ | |
| /* eslint "no-console": off */ | |
| ;var _=require("./lodash");var Graph=require("./graphlib").Graph;module.exports={addDummyNode:addDummyNode,simplify:simplify,asNonCompoundGraph:asNonCompoundGraph,successorWeights:successorWeights,predecessorWeights:predecessorWeights,intersectRect:intersectRect,buildLayerMatrix:buildLayerMatrix,normalizeRanks:normalizeRanks,removeEmptyRanks:removeEmptyRanks,addBorderNode:addBorderNode,maxRank:maxRank,partition:partition,time:time,notime:notime}; | |
| /* | |
| * Adds a dummy node to the graph and return v. | |
| */function addDummyNode(g,type,attrs,name){var v;do{v=_.uniqueId(name)}while(g.hasNode(v));attrs.dummy=type;g.setNode(v,attrs);return v} | |
| /* | |
| * Returns a new graph with only simple edges. Handles aggregation of data | |
| * associated with multi-edges. | |
| */function simplify(g){var simplified=(new Graph).setGraph(g.graph());_.forEach(g.nodes(),function(v){simplified.setNode(v,g.node(v))});_.forEach(g.edges(),function(e){var simpleLabel=simplified.edge(e.v,e.w)||{weight:0,minlen:1};var label=g.edge(e);simplified.setEdge(e.v,e.w,{weight:simpleLabel.weight+label.weight,minlen:Math.max(simpleLabel.minlen,label.minlen)})});return simplified}function asNonCompoundGraph(g){var simplified=new Graph({multigraph:g.isMultigraph()}).setGraph(g.graph());_.forEach(g.nodes(),function(v){if(!g.children(v).length){simplified.setNode(v,g.node(v))}});_.forEach(g.edges(),function(e){simplified.setEdge(e,g.edge(e))});return simplified}function successorWeights(g){var weightMap=_.map(g.nodes(),function(v){var sucs={};_.forEach(g.outEdges(v),function(e){sucs[e.w]=(sucs[e.w]||0)+g.edge(e).weight});return sucs});return _.zipObject(g.nodes(),weightMap)}function predecessorWeights(g){var weightMap=_.map(g.nodes(),function(v){var preds={};_.forEach(g.inEdges(v),function(e){preds[e.v]=(preds[e.v]||0)+g.edge(e).weight});return preds});return _.zipObject(g.nodes(),weightMap)} | |
| /* | |
| * Finds where a line starting at point ({x, y}) would intersect a rectangle | |
| * ({x, y, width, height}) if it were pointing at the rectangle's center. | |
| */function intersectRect(rect,point){var x=rect.x;var y=rect.y; | |
| // Rectangle intersection algorithm from: | |
| // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes | |
| var dx=point.x-x;var dy=point.y-y;var w=rect.width/2;var h=rect.height/2;if(!dx&&!dy){throw new Error("Not possible to find intersection inside of the rectangle")}var sx,sy;if(Math.abs(dy)*w>Math.abs(dx)*h){ | |
| // Intersection is top or bottom of rect. | |
| if(dy<0){h=-h}sx=h*dx/dy;sy=h}else{ | |
| // Intersection is left or right of rect. | |
| if(dx<0){w=-w}sx=w;sy=w*dy/dx}return{x:x+sx,y:y+sy}} | |
| /* | |
| * Given a DAG with each node assigned "rank" and "order" properties, this | |
| * function will produce a matrix with the ids of each node. | |
| */function buildLayerMatrix(g){var layering=_.map(_.range(maxRank(g)+1),function(){return[]});_.forEach(g.nodes(),function(v){var node=g.node(v);var rank=node.rank;if(!_.isUndefined(rank)){layering[rank][node.order]=v}});return layering} | |
| /* | |
| * Adjusts the ranks for all nodes in the graph such that all nodes v have | |
| * rank(v) >= 0 and at least one node w has rank(w) = 0. | |
| */function normalizeRanks(g){var min=_.min(_.map(g.nodes(),function(v){return g.node(v).rank}));_.forEach(g.nodes(),function(v){var node=g.node(v);if(_.has(node,"rank")){node.rank-=min}})}function removeEmptyRanks(g){ | |
| // Ranks may not start at 0, so we need to offset them | |
| var offset=_.min(_.map(g.nodes(),function(v){return g.node(v).rank}));var layers=[];_.forEach(g.nodes(),function(v){var rank=g.node(v).rank-offset;if(!layers[rank]){layers[rank]=[]}layers[rank].push(v)});var delta=0;var nodeRankFactor=g.graph().nodeRankFactor;_.forEach(layers,function(vs,i){if(_.isUndefined(vs)&&i%nodeRankFactor!==0){--delta}else if(delta){_.forEach(vs,function(v){g.node(v).rank+=delta})}})}function addBorderNode(g,prefix,rank,order){var node={width:0,height:0};if(arguments.length>=4){node.rank=rank;node.order=order}return addDummyNode(g,"border",node,prefix)}function maxRank(g){return _.max(_.map(g.nodes(),function(v){var rank=g.node(v).rank;if(!_.isUndefined(rank)){return rank}}))} | |
| /* | |
| * Partition a collection into two groups: `lhs` and `rhs`. If the supplied | |
| * function returns true for an entry it goes into `lhs`. Otherwise it goes | |
| * into `rhs. | |
| */function partition(collection,fn){var result={lhs:[],rhs:[]};_.forEach(collection,function(value){if(fn(value)){result.lhs.push(value)}else{result.rhs.push(value)}});return result} | |
| /* | |
| * Returns a new function that wraps `fn` with a timer. The wrapper logs the | |
| * time it takes to execute the function. | |
| */function time(name,fn){var start=_.now();try{return fn()}finally{console.log(name+" time: "+(_.now()-start)+"ms")}}function notime(name,fn){return fn()}},{"./graphlib":7,"./lodash":10}],30:[function(require,module,exports){module.exports="0.8.5"},{}],31:[function(require,module,exports){ | |
| /** | |
| * Copyright (c) 2014, Chris Pettitt | |
| * All rights reserved. | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions are met: | |
| * | |
| * 1. Redistributions of source code must retain the above copyright notice, this | |
| * list of conditions and the following disclaimer. | |
| * | |
| * 2. 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. | |
| * | |
| * 3. Neither the name of the copyright holder nor the names of its contributors | |
| * may be used to endorse or promote products derived from this software without | |
| * specific prior written permission. | |
| * | |
| * 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 THE COPYRIGHT HOLDER OR CONTRIBUTORS 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. | |
| */ | |
| var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/json"),alg:require("./lib/alg"),version:lib.version}},{"./lib":47,"./lib/alg":38,"./lib/json":48}],32:[function(require,module,exports){var _=require("../lodash");module.exports=components;function components(g){var visited={};var cmpts=[];var cmpt;function dfs(v){if(_.has(visited,v))return;visited[v]=true;cmpt.push(v);_.each(g.successors(v),dfs);_.each(g.predecessors(v),dfs)}_.each(g.nodes(),function(v){cmpt=[];dfs(v);if(cmpt.length){cmpts.push(cmpt)}});return cmpts}},{"../lodash":49}],33:[function(require,module,exports){var _=require("../lodash");module.exports=dfs; | |
| /* | |
| * A helper that preforms a pre- or post-order traversal on the input graph | |
| * and returns the nodes in the order they were visited. If the graph is | |
| * undirected then this algorithm will navigate using neighbors. If the graph | |
| * is directed then this algorithm will navigate using successors. | |
| * | |
| * Order must be one of "pre" or "post". | |
| */function dfs(g,vs,order){if(!_.isArray(vs)){vs=[vs]}var navigation=(g.isDirected()?g.successors:g.neighbors).bind(g);var acc=[];var visited={};_.each(vs,function(v){if(!g.hasNode(v)){throw new Error("Graph does not have node: "+v)}doDfs(g,v,order==="post",visited,navigation,acc)});return acc}function doDfs(g,v,postorder,visited,navigation,acc){if(!_.has(visited,v)){visited[v]=true;if(!postorder){acc.push(v)}_.each(navigation(v),function(w){doDfs(g,w,postorder,visited,navigation,acc)});if(postorder){acc.push(v)}}}},{"../lodash":49}],34:[function(require,module,exports){var dijkstra=require("./dijkstra");var _=require("../lodash");module.exports=dijkstraAll;function dijkstraAll(g,weightFunc,edgeFunc){return _.transform(g.nodes(),function(acc,v){acc[v]=dijkstra(g,v,weightFunc,edgeFunc)},{})}},{"../lodash":49,"./dijkstra":35}],35:[function(require,module,exports){var _=require("../lodash");var PriorityQueue=require("../data/priority-queue");module.exports=dijkstra;var DEFAULT_WEIGHT_FUNC=_.constant(1);function dijkstra(g,source,weightFn,edgeFn){return runDijkstra(g,String(source),weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runDijkstra(g,source,weightFn,edgeFn){var results={};var pq=new PriorityQueue;var v,vEntry;var updateNeighbors=function(edge){var w=edge.v!==v?edge.v:edge.w;var wEntry=results[w];var weight=weightFn(edge);var distance=vEntry.distance+weight;if(weight<0){throw new Error("dijkstra does not allow negative edge weights. "+"Bad edge: "+edge+" Weight: "+weight)}if(distance<wEntry.distance){wEntry.distance=distance;wEntry.predecessor=v;pq.decrease(w,distance)}};g.nodes().forEach(function(v){var distance=v===source?0:Number.POSITIVE_INFINITY;results[v]={distance:distance};pq.add(v,distance)});while(pq.size()>0){v=pq.removeMin();vEntry=results[v];if(vEntry.distance===Number.POSITIVE_INFINITY){break}edgeFn(v).forEach(updateNeighbors)}return results}},{"../data/priority-queue":45,"../lodash":49}],36:[function(require,module,exports){var _=require("../lodash");var tarjan=require("./tarjan");module.exports=findCycles;function findCycles(g){return _.filter(tarjan(g),function(cmpt){return cmpt.length>1||cmpt.length===1&&g.hasEdge(cmpt[0],cmpt[0])})}},{"../lodash":49,"./tarjan":43}],37:[function(require,module,exports){var _=require("../lodash");module.exports=floydWarshall;var DEFAULT_WEIGHT_FUNC=_.constant(1);function floydWarshall(g,weightFn,edgeFn){return runFloydWarshall(g,weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runFloydWarshall(g,weightFn,edgeFn){var results={};var nodes=g.nodes();nodes.forEach(function(v){results[v]={};results[v][v]={distance:0};nodes.forEach(function(w){if(v!==w){results[v][w]={distance:Number.POSITIVE_INFINITY}}});edgeFn(v).forEach(function(edge){var w=edge.v===v?edge.w:edge.v;var d=weightFn(edge);results[v][w]={distance:d,predecessor:v}})});nodes.forEach(function(k){var rowK=results[k];nodes.forEach(function(i){var rowI=results[i];nodes.forEach(function(j){var ik=rowI[k];var kj=rowK[j];var ij=rowI[j];var altDistance=ik.distance+kj.distance;if(altDistance<ij.distance){ij.distance=altDistance;ij.predecessor=kj.predecessor}})})});return results}},{"../lodash":49}],38:[function(require,module,exports){module.exports={components:require("./components"),dijkstra:require("./dijkstra"),dijkstraAll:require("./dijkstra-all"),findCycles:require("./find-cycles"),floydWarshall:require("./floyd-warshall"),isAcyclic:require("./is-acyclic"),postorder:require("./postorder"),preorder:require("./preorder"),prim:require("./prim"),tarjan:require("./tarjan"),topsort:require("./topsort")}},{"./components":32,"./dijkstra":35,"./dijkstra-all":34,"./find-cycles":36,"./floyd-warshall":37,"./is-acyclic":39,"./postorder":40,"./preorder":41,"./prim":42,"./tarjan":43,"./topsort":44}],39:[function(require,module,exports){var topsort=require("./topsort");module.exports=isAcyclic;function isAcyclic(g){try{topsort(g)}catch(e){if(e instanceof topsort.CycleException){return false}throw e}return true}},{"./topsort":44}],40:[function(require,module,exports){var dfs=require("./dfs");module.exports=postorder;function postorder(g,vs){return dfs(g,vs,"post")}},{"./dfs":33}],41:[function(require,module,exports){var dfs=require("./dfs");module.exports=preorder;function preorder(g,vs){return dfs(g,vs,"pre")}},{"./dfs":33}],42:[function(require,module,exports){var _=require("../lodash");var Graph=require("../graph");var PriorityQueue=require("../data/priority-queue");module.exports=prim;function prim(g,weightFunc){var result=new Graph;var parents={};var pq=new PriorityQueue;var v;function updateNeighbors(edge){var w=edge.v===v?edge.w:edge.v;var pri=pq.priority(w);if(pri!==undefined){var edgeWeight=weightFunc(edge);if(edgeWeight<pri){parents[w]=v;pq.decrease(w,edgeWeight)}}}if(g.nodeCount()===0){return result}_.each(g.nodes(),function(v){pq.add(v,Number.POSITIVE_INFINITY);result.setNode(v)}); | |
| // Start from an arbitrary node | |
| pq.decrease(g.nodes()[0],0);var init=false;while(pq.size()>0){v=pq.removeMin();if(_.has(parents,v)){result.setEdge(v,parents[v])}else if(init){throw new Error("Input graph is not connected: "+g)}else{init=true}g.nodeEdges(v).forEach(updateNeighbors)}return result}},{"../data/priority-queue":45,"../graph":46,"../lodash":49}],43:[function(require,module,exports){var _=require("../lodash");module.exports=tarjan;function tarjan(g){var index=0;var stack=[];var visited={};// node id -> { onStack, lowlink, index } | |
| var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index,index:index++};stack.push(v);g.successors(v).forEach(function(w){if(!_.has(visited,w)){dfs(w);entry.lowlink=Math.min(entry.lowlink,visited[w].lowlink)}else if(visited[w].onStack){entry.lowlink=Math.min(entry.lowlink,visited[w].index)}});if(entry.lowlink===entry.index){var cmpt=[];var w;do{w=stack.pop();visited[w].onStack=false;cmpt.push(w)}while(v!==w);results.push(cmpt)}}g.nodes().forEach(function(v){if(!_.has(visited,v)){dfs(v)}});return results}},{"../lodash":49}],44:[function(require,module,exports){var _=require("../lodash");module.exports=topsort;topsort.CycleException=CycleException;function topsort(g){var visited={};var stack={};var results=[];function visit(node){if(_.has(stack,node)){throw new CycleException}if(!_.has(visited,node)){stack[node]=true;visited[node]=true;_.each(g.predecessors(node),visit);delete stack[node];results.push(node)}}_.each(g.sinks(),visit);if(_.size(visited)!==g.nodeCount()){throw new CycleException}return results}function CycleException(){}CycleException.prototype=new Error;// must be an instance of Error to pass testing | |
| },{"../lodash":49}],45:[function(require,module,exports){var _=require("../lodash");module.exports=PriorityQueue; | |
| /** | |
| * A min-priority queue data structure. This algorithm is derived from Cormen, | |
| * et al., "Introduction to Algorithms". The basic idea of a min-priority | |
| * queue is that you can efficiently (in O(1) time) get the smallest key in | |
| * the queue. Adding and removing elements takes O(log n) time. A key can | |
| * have its priority decreased in O(log n) time. | |
| */function PriorityQueue(){this._arr=[];this._keyIndices={}} | |
| /** | |
| * Returns the number of elements in the queue. Takes `O(1)` time. | |
| */PriorityQueue.prototype.size=function(){return this._arr.length}; | |
| /** | |
| * Returns the keys that are in the queue. Takes `O(n)` time. | |
| */PriorityQueue.prototype.keys=function(){return this._arr.map(function(x){return x.key})}; | |
| /** | |
| * Returns `true` if **key** is in the queue and `false` if not. | |
| */PriorityQueue.prototype.has=function(key){return _.has(this._keyIndices,key)}; | |
| /** | |
| * Returns the priority for **key**. If **key** is not present in the queue | |
| * then this function returns `undefined`. Takes `O(1)` time. | |
| * | |
| * @param {Object} key | |
| */PriorityQueue.prototype.priority=function(key){var index=this._keyIndices[key];if(index!==undefined){return this._arr[index].priority}}; | |
| /** | |
| * Returns the key for the minimum element in this queue. If the queue is | |
| * empty this function throws an Error. Takes `O(1)` time. | |
| */PriorityQueue.prototype.min=function(){if(this.size()===0){throw new Error("Queue underflow")}return this._arr[0].key}; | |
| /** | |
| * Inserts a new key into the priority queue. If the key already exists in | |
| * the queue this function returns `false`; otherwise it will return `true`. | |
| * Takes `O(n)` time. | |
| * | |
| * @param {Object} key the key to add | |
| * @param {Number} priority the initial priority for the key | |
| */PriorityQueue.prototype.add=function(key,priority){var keyIndices=this._keyIndices;key=String(key);if(!_.has(keyIndices,key)){var arr=this._arr;var index=arr.length;keyIndices[key]=index;arr.push({key:key,priority:priority});this._decrease(index);return true}return false}; | |
| /** | |
| * Removes and returns the smallest key in the queue. Takes `O(log n)` time. | |
| */PriorityQueue.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var min=this._arr.pop();delete this._keyIndices[min.key];this._heapify(0);return min.key}; | |
| /** | |
| * Decreases the priority for **key** to **priority**. If the new priority is | |
| * greater than the previous priority, this function will throw an Error. | |
| * | |
| * @param {Object} key the key for which to raise priority | |
| * @param {Number} priority the new priority for the key | |
| */PriorityQueue.prototype.decrease=function(key,priority){var index=this._keyIndices[key];if(priority>this._arr[index].priority){throw new Error("New priority is greater than current priority. "+"Key: "+key+" Old: "+this._arr[index].priority+" New: "+priority)}this._arr[index].priority=priority;this._decrease(index)};PriorityQueue.prototype._heapify=function(i){var arr=this._arr;var l=2*i;var r=l+1;var largest=i;if(l<arr.length){largest=arr[l].priority<arr[largest].priority?l:largest;if(r<arr.length){largest=arr[r].priority<arr[largest].priority?r:largest}if(largest!==i){this._swap(i,largest);this._heapify(largest)}}};PriorityQueue.prototype._decrease=function(index){var arr=this._arr;var priority=arr[index].priority;var parent;while(index!==0){parent=index>>1;if(arr[parent].priority<priority){break}this._swap(index,parent);index=parent}};PriorityQueue.prototype._swap=function(i,j){var arr=this._arr;var keyIndices=this._keyIndices;var origArrI=arr[i];var origArrJ=arr[j];arr[i]=origArrJ;arr[j]=origArrI;keyIndices[origArrJ.key]=i;keyIndices[origArrI.key]=j}},{"../lodash":49}],46:[function(require,module,exports){"use strict";var _=require("./lodash");module.exports=Graph;var DEFAULT_EDGE_NAME="\0";var GRAPH_NODE="\0";var EDGE_KEY_DELIM=""; | |
| // Implementation notes: | |
| // | |
| // * Node id query functions should return string ids for the nodes | |
| // * Edge id query functions should return an "edgeObj", edge object, that is | |
| // composed of enough information to uniquely identify an edge: {v, w, name}. | |
| // * Internally we use an "edgeId", a stringified form of the edgeObj, to | |
| // reference edges. This is because we need a performant way to look these | |
| // edges up and, object properties, which have string keys, are the closest | |
| // we're going to get to a performant hashtable in JavaScript. | |
| function Graph(opts){this._isDirected=_.has(opts,"directed")?opts.directed:true;this._isMultigraph=_.has(opts,"multigraph")?opts.multigraph:false;this._isCompound=_.has(opts,"compound")?opts.compound:false; | |
| // Label for the graph itself | |
| this._label=undefined; | |
| // Defaults to be set when creating a new node | |
| this._defaultNodeLabelFn=_.constant(undefined); | |
| // Defaults to be set when creating a new edge | |
| this._defaultEdgeLabelFn=_.constant(undefined); | |
| // v -> label | |
| this._nodes={};if(this._isCompound){ | |
| // v -> parent | |
| this._parent={}; | |
| // v -> children | |
| this._children={};this._children[GRAPH_NODE]={}} | |
| // v -> edgeObj | |
| this._in={}; | |
| // u -> v -> Number | |
| this._preds={}; | |
| // v -> edgeObj | |
| this._out={}; | |
| // v -> w -> Number | |
| this._sucs={}; | |
| // e -> edgeObj | |
| this._edgeObjs={}; | |
| // e -> label | |
| this._edgeLabels={}} | |
| /* Number of nodes in the graph. Should only be changed by the implementation. */Graph.prototype._nodeCount=0; | |
| /* Number of edges in the graph. Should only be changed by the implementation. */Graph.prototype._edgeCount=0; | |
| /* === Graph functions ========= */Graph.prototype.isDirected=function(){return this._isDirected};Graph.prototype.isMultigraph=function(){return this._isMultigraph};Graph.prototype.isCompound=function(){return this._isCompound};Graph.prototype.setGraph=function(label){this._label=label;return this};Graph.prototype.graph=function(){return this._label}; | |
| /* === Node functions ========== */Graph.prototype.setDefaultNodeLabel=function(newDefault){if(!_.isFunction(newDefault)){newDefault=_.constant(newDefault)}this._defaultNodeLabelFn=newDefault;return this};Graph.prototype.nodeCount=function(){return this._nodeCount};Graph.prototype.nodes=function(){return _.keys(this._nodes)};Graph.prototype.sources=function(){var self=this;return _.filter(this.nodes(),function(v){return _.isEmpty(self._in[v])})};Graph.prototype.sinks=function(){var self=this;return _.filter(this.nodes(),function(v){return _.isEmpty(self._out[v])})};Graph.prototype.setNodes=function(vs,value){var args=arguments;var self=this;_.each(vs,function(v){if(args.length>1){self.setNode(v,value)}else{self.setNode(v)}});return this};Graph.prototype.setNode=function(v,value){if(_.has(this._nodes,v)){if(arguments.length>1){this._nodes[v]=value}return this}this._nodes[v]=arguments.length>1?value:this._defaultNodeLabelFn(v);if(this._isCompound){this._parent[v]=GRAPH_NODE;this._children[v]={};this._children[GRAPH_NODE][v]=true}this._in[v]={};this._preds[v]={};this._out[v]={};this._sucs[v]={};++this._nodeCount;return this};Graph.prototype.node=function(v){return this._nodes[v]};Graph.prototype.hasNode=function(v){return _.has(this._nodes,v)};Graph.prototype.removeNode=function(v){var self=this;if(_.has(this._nodes,v)){var removeEdge=function(e){self.removeEdge(self._edgeObjs[e])};delete this._nodes[v];if(this._isCompound){this._removeFromParentsChildList(v);delete this._parent[v];_.each(this.children(v),function(child){self.setParent(child)});delete this._children[v]}_.each(_.keys(this._in[v]),removeEdge);delete this._in[v];delete this._preds[v];_.each(_.keys(this._out[v]),removeEdge);delete this._out[v];delete this._sucs[v];--this._nodeCount}return this};Graph.prototype.setParent=function(v,parent){if(!this._isCompound){throw new Error("Cannot set parent in a non-compound graph")}if(_.isUndefined(parent)){parent=GRAPH_NODE}else{ | |
| // Coerce parent to string | |
| parent+="";for(var ancestor=parent;!_.isUndefined(ancestor);ancestor=this.parent(ancestor)){if(ancestor===v){throw new Error("Setting "+parent+" as parent of "+v+" would create a cycle")}}this.setNode(parent)}this.setNode(v);this._removeFromParentsChildList(v);this._parent[v]=parent;this._children[parent][v]=true;return this};Graph.prototype._removeFromParentsChildList=function(v){delete this._children[this._parent[v]][v]};Graph.prototype.parent=function(v){if(this._isCompound){var parent=this._parent[v];if(parent!==GRAPH_NODE){return parent}}};Graph.prototype.children=function(v){if(_.isUndefined(v)){v=GRAPH_NODE}if(this._isCompound){var children=this._children[v];if(children){return _.keys(children)}}else if(v===GRAPH_NODE){return this.nodes()}else if(this.hasNode(v)){return[]}};Graph.prototype.predecessors=function(v){var predsV=this._preds[v];if(predsV){return _.keys(predsV)}};Graph.prototype.successors=function(v){var sucsV=this._sucs[v];if(sucsV){return _.keys(sucsV)}};Graph.prototype.neighbors=function(v){var preds=this.predecessors(v);if(preds){return _.union(preds,this.successors(v))}};Graph.prototype.isLeaf=function(v){var neighbors;if(this.isDirected()){neighbors=this.successors(v)}else{neighbors=this.neighbors(v)}return neighbors.length===0};Graph.prototype.filterNodes=function(filter){var copy=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});copy.setGraph(this.graph());var self=this;_.each(this._nodes,function(value,v){if(filter(v)){copy.setNode(v,value)}});_.each(this._edgeObjs,function(e){if(copy.hasNode(e.v)&©.hasNode(e.w)){copy.setEdge(e,self.edge(e))}});var parents={};function findParent(v){var parent=self.parent(v);if(parent===undefined||copy.hasNode(parent)){parents[v]=parent;return parent}else if(parent in parents){return parents[parent]}else{return findParent(parent)}}if(this._isCompound){_.each(copy.nodes(),function(v){copy.setParent(v,findParent(v))})}return copy}; | |
| /* === Edge functions ========== */Graph.prototype.setDefaultEdgeLabel=function(newDefault){if(!_.isFunction(newDefault)){newDefault=_.constant(newDefault)}this._defaultEdgeLabelFn=newDefault;return this};Graph.prototype.edgeCount=function(){return this._edgeCount};Graph.prototype.edges=function(){return _.values(this._edgeObjs)};Graph.prototype.setPath=function(vs,value){var self=this;var args=arguments;_.reduce(vs,function(v,w){if(args.length>1){self.setEdge(v,w,value)}else{self.setEdge(v,w)}return w});return this}; | |
| /* | |
| * setEdge(v, w, [value, [name]]) | |
| * setEdge({ v, w, [name] }, [value]) | |
| */Graph.prototype.setEdge=function(){var v,w,name,value;var valueSpecified=false;var arg0=arguments[0];if(typeof arg0==="object"&&arg0!==null&&"v"in arg0){v=arg0.v;w=arg0.w;name=arg0.name;if(arguments.length===2){value=arguments[1];valueSpecified=true}}else{v=arg0;w=arguments[1];name=arguments[3];if(arguments.length>2){value=arguments[2];valueSpecified=true}}v=""+v;w=""+w;if(!_.isUndefined(name)){name=""+name}var e=edgeArgsToId(this._isDirected,v,w,name);if(_.has(this._edgeLabels,e)){if(valueSpecified){this._edgeLabels[e]=value}return this}if(!_.isUndefined(name)&&!this._isMultigraph){throw new Error("Cannot set a named edge when isMultigraph = false")} | |
| // It didn't exist, so we need to create it. | |
| // First ensure the nodes exist. | |
| this.setNode(v);this.setNode(w);this._edgeLabels[e]=valueSpecified?value:this._defaultEdgeLabelFn(v,w,name);var edgeObj=edgeArgsToObj(this._isDirected,v,w,name); | |
| // Ensure we add undirected edges in a consistent way. | |
| v=edgeObj.v;w=edgeObj.w;Object.freeze(edgeObj);this._edgeObjs[e]=edgeObj;incrementOrInitEntry(this._preds[w],v);incrementOrInitEntry(this._sucs[v],w);this._in[w][e]=edgeObj;this._out[v][e]=edgeObj;this._edgeCount++;return this};Graph.prototype.edge=function(v,w,name){var e=arguments.length===1?edgeObjToId(this._isDirected,arguments[0]):edgeArgsToId(this._isDirected,v,w,name);return this._edgeLabels[e]};Graph.prototype.hasEdge=function(v,w,name){var e=arguments.length===1?edgeObjToId(this._isDirected,arguments[0]):edgeArgsToId(this._isDirected,v,w,name);return _.has(this._edgeLabels,e)};Graph.prototype.removeEdge=function(v,w,name){var e=arguments.length===1?edgeObjToId(this._isDirected,arguments[0]):edgeArgsToId(this._isDirected,v,w,name);var edge=this._edgeObjs[e];if(edge){v=edge.v;w=edge.w;delete this._edgeLabels[e];delete this._edgeObjs[e];decrementOrRemoveEntry(this._preds[w],v);decrementOrRemoveEntry(this._sucs[v],w);delete this._in[w][e];delete this._out[v][e];this._edgeCount--}return this};Graph.prototype.inEdges=function(v,u){var inV=this._in[v];if(inV){var edges=_.values(inV);if(!u){return edges}return _.filter(edges,function(edge){return edge.v===u})}};Graph.prototype.outEdges=function(v,w){var outV=this._out[v];if(outV){var edges=_.values(outV);if(!w){return edges}return _.filter(edges,function(edge){return edge.w===w})}};Graph.prototype.nodeEdges=function(v,w){var inEdges=this.inEdges(v,w);if(inEdges){return inEdges.concat(this.outEdges(v,w))}};function incrementOrInitEntry(map,k){if(map[k]){map[k]++}else{map[k]=1}}function decrementOrRemoveEntry(map,k){if(!--map[k]){delete map[k]}}function edgeArgsToId(isDirected,v_,w_,name){var v=""+v_;var w=""+w_;if(!isDirected&&v>w){var tmp=v;v=w;w=tmp}return v+EDGE_KEY_DELIM+w+EDGE_KEY_DELIM+(_.isUndefined(name)?DEFAULT_EDGE_NAME:name)}function edgeArgsToObj(isDirected,v_,w_,name){var v=""+v_;var w=""+w_;if(!isDirected&&v>w){var tmp=v;v=w;w=tmp}var edgeObj={v:v,w:w};if(name){edgeObj.name=name}return edgeObj}function edgeObjToId(isDirected,edgeObj){return edgeArgsToId(isDirected,edgeObj.v,edgeObj.w,edgeObj.name)}},{"./lodash":49}],47:[function(require,module,exports){ | |
| // Includes only the "core" of graphlib | |
| module.exports={Graph:require("./graph"),version:require("./version")}},{"./graph":46,"./version":50}],48:[function(require,module,exports){var _=require("./lodash");var Graph=require("./graph");module.exports={write:write,read:read};function write(g){var json={options:{directed:g.isDirected(),multigraph:g.isMultigraph(),compound:g.isCompound()},nodes:writeNodes(g),edges:writeEdges(g)};if(!_.isUndefined(g.graph())){json.value=_.clone(g.graph())}return json}function writeNodes(g){return _.map(g.nodes(),function(v){var nodeValue=g.node(v);var parent=g.parent(v);var node={v:v};if(!_.isUndefined(nodeValue)){node.value=nodeValue}if(!_.isUndefined(parent)){node.parent=parent}return node})}function writeEdges(g){return _.map(g.edges(),function(e){var edgeValue=g.edge(e);var edge={v:e.v,w:e.w};if(!_.isUndefined(e.name)){edge.name=e.name}if(!_.isUndefined(edgeValue)){edge.value=edgeValue}return edge})}function read(json){var g=new Graph(json.options).setGraph(json.value);_.each(json.nodes,function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});_.each(json.edges,function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":46,"./lodash":49}],49:[function(require,module,exports){ | |
| /* global window */ | |
| var lodash;if(typeof require==="function"){try{lodash={clone:require("lodash/clone"),constant:require("lodash/constant"),each:require("lodash/each"),filter:require("lodash/filter"),has:require("lodash/has"),isArray:require("lodash/isArray"),isEmpty:require("lodash/isEmpty"),isFunction:require("lodash/isFunction"),isUndefined:require("lodash/isUndefined"),keys:require("lodash/keys"),map:require("lodash/map"),reduce:require("lodash/reduce"),size:require("lodash/size"),transform:require("lodash/transform"),union:require("lodash/union"),values:require("lodash/values")}}catch(e){ | |
| // continue regardless of error | |
| }}if(!lodash){lodash=window._}module.exports=lodash},{"lodash/clone":226,"lodash/constant":228,"lodash/each":230,"lodash/filter":232,"lodash/has":239,"lodash/isArray":243,"lodash/isEmpty":247,"lodash/isFunction":248,"lodash/isUndefined":258,"lodash/keys":259,"lodash/map":262,"lodash/reduce":274,"lodash/size":275,"lodash/transform":284,"lodash/union":285,"lodash/values":287}],50:[function(require,module,exports){module.exports="2.1.8"},{}],51:[function(require,module,exports){var getNative=require("./_getNative"),root=require("./_root"); | |
| /* Built-in method references that are verified to be native. */var DataView=getNative(root,"DataView");module.exports=DataView},{"./_getNative":163,"./_root":208}],52:[function(require,module,exports){var hashClear=require("./_hashClear"),hashDelete=require("./_hashDelete"),hashGet=require("./_hashGet"),hashHas=require("./_hashHas"),hashSet=require("./_hashSet"); | |
| /** | |
| * Creates a hash object. | |
| * | |
| * @private | |
| * @constructor | |
| * @param {Array} [entries] The key-value pairs to cache. | |
| */function Hash(entries){var index=-1,length=entries==null?0:entries.length;this.clear();while(++index<length){var entry=entries[index];this.set(entry[0],entry[1])}} | |
| // Add methods to `Hash`. | |
| Hash.prototype.clear=hashClear;Hash.prototype["delete"]=hashDelete;Hash.prototype.get=hashGet;Hash.prototype.has=hashHas;Hash.prototype.set=hashSet;module.exports=Hash},{"./_hashClear":172,"./_hashDelete":173,"./_hashGet":174,"./_hashHas":175,"./_hashSet":176}],53:[function(require,module,exports){var listCacheClear=require("./_listCacheClear"),listCacheDelete=require("./_listCacheDelete"),listCacheGet=require("./_listCacheGet"),listCacheHas=require("./_listCacheHas"),listCacheSet=require("./_listCacheSet"); | |
| /** | |
| * Creates an list cache object. | |
| * | |
| * @private | |
| * @constructor | |
| * @param {Array} [entries] The key-value pairs to cache. | |
| */function ListCache(entries){var index=-1,length=entries==null?0:entries.length;this.clear();while(++index<length){var entry=entries[index];this.set(entry[0],entry[1])}} | |
| // Add methods to `ListCache`. | |
| ListCache.prototype.clear=listCacheClear;ListCache.prototype["delete"]=listCacheDelete;ListCache.prototype.get=listCacheGet;ListCache.prototype.has=listCacheHas;ListCache.prototype.set=listCacheSet;module.exports=ListCache},{"./_listCacheClear":188,"./_listCacheDelete":189,"./_listCacheGet":190,"./_listCacheHas":191,"./_listCacheSet":192}],54:[function(require,module,exports){var getNative=require("./_getNative"),root=require("./_root"); | |
| /* Built-in method references that are verified to be native. */var Map=getNative(root,"Map");module.exports=Map},{"./_getNative":163,"./_root":208}],55:[function(require,module,exports){var mapCacheClear=require("./_mapCacheClear"),mapCacheDelete=require("./_mapCacheDelete"),mapCacheGet=require("./_mapCacheGet"),mapCacheHas=require("./_mapCacheHas"),mapCacheSet=require("./_mapCacheSet"); | |
| /** | |
| * Creates a map cache object to store key-value pairs. | |
| * | |
| * @private | |
| * @constructor | |
| * @param {Array} [entries] The key-value pairs to cache. | |
| */function MapCache(entries){var index=-1,length=entries==null?0:entries.length;this.clear();while(++index<length){var entry=entries[index];this.set(entry[0],entry[1])}} | |
| // Add methods to `MapCache`. | |
| MapCache.prototype.clear=mapCacheClear;MapCache.prototype["delete"]=mapCacheDelete;MapCache.prototype.get=mapCacheGet;MapCache.prototype.has=mapCacheHas;MapCache.prototype.set=mapCacheSet;module.exports=MapCache},{"./_mapCacheClear":193,"./_mapCacheDelete":194,"./_mapCacheGet":195,"./_mapCacheHas":196,"./_mapCacheSet":197}],56:[function(require,module,exports){var getNative=require("./_getNative"),root=require("./_root"); | |
| /* Built-in method references that are verified to be native. */var Promise=getNative(root,"Promise");module.exports=Promise},{"./_getNative":163,"./_root":208}],57:[function(require,module,exports){var getNative=require("./_getNative"),root=require("./_root"); | |
| /* Built-in method references that are verified to be native. */var Set=getNative(root,"Set");module.exports=Set},{"./_getNative":163,"./_root":208}],58:[function(require,module,exports){var MapCache=require("./_MapCache"),setCacheAdd=require("./_setCacheAdd"),setCacheHas=require("./_setCacheHas"); | |
| /** | |
| * | |
| * Creates an array cache object to store unique values. | |
| * | |
| * @private | |
| * @constructor | |
| * @param {Array} [values] The values to cache. | |
| */function SetCache(values){var index=-1,length=values==null?0:values.length;this.__data__=new MapCache;while(++index<length){this.add(values[index])}} | |
| // Add methods to `SetCache`. | |
| SetCache.prototype.add=SetCache.prototype.push=setCacheAdd;SetCache.prototype.has=setCacheHas;module.exports=SetCache},{"./_MapCache":55,"./_setCacheAdd":210,"./_setCacheHas":211}],59:[function(require,module,exports){var ListCache=require("./_ListCache"),stackClear=require("./_stackClear"),stackDelete=require("./_stackDelete"),stackGet=require("./_stackGet"),stackHas=require("./_stackHas"),stackSet=require("./_stackSet"); | |
| /** | |
| * Creates a stack cache object to store key-value pairs. | |
| * | |
| * @private | |
| * @constructor | |
| * @param {Array} [entries] The key-value pairs to cache. | |
| */function Stack(entries){var data=this.__data__=new ListCache(entries);this.size=data.size} | |
| // Add methods to `Stack`. | |
| Stack.prototype.clear=stackClear;Stack.prototype["delete"]=stackDelete;Stack.prototype.get=stackGet;Stack.prototype.has=stackHas;Stack.prototype.set=stackSet;module.exports=Stack},{"./_ListCache":53,"./_stackClear":215,"./_stackDelete":216,"./_stackGet":217,"./_stackHas":218,"./_stackSet":219}],60:[function(require,module,exports){var root=require("./_root"); | |
| /** Built-in value references. */var Symbol=root.Symbol;module.exports=Symbol},{"./_root":208}],61:[function(require,module,exports){var root=require("./_root"); | |
| /** Built-in value references. */var Uint8Array=root.Uint8Array;module.exports=Uint8Array},{"./_root":208}],62:[function(require,module,exports){var getNative=require("./_getNative"),root=require("./_root"); | |
| /* Built-in method references that are verified to be native. */var WeakMap=getNative(root,"WeakMap");module.exports=WeakMap},{"./_getNative":163,"./_root":208}],63:[function(require,module,exports){ | |
| /** | |
| * A faster alternative to `Function#apply`, this function invokes `func` | |
| * with the `this` binding of `thisArg` and the arguments of `args`. | |
| * | |
| * @private | |
| * @param {Function} func The function to invoke. | |
| * @param {*} thisArg The `this` binding of `func`. | |
| * @param {Array} args The arguments to invoke `func` with. | |
| * @returns {*} Returns the result of `func`. | |
| */ | |
| function apply(func,thisArg,args){switch(args.length){case 0:return func.call(thisArg);case 1:return func.call(thisArg,args[0]);case 2:return func.call(thisArg,args[0],args[1]);case 3:return func.call(thisArg,args[0],args[1],args[2])}return func.apply(thisArg,args)}module.exports=apply},{}],64:[function(require,module,exports){ | |
| /** | |
| * A specialized version of `_.forEach` for arrays without support for | |
| * iteratee shorthands. | |
| * | |
| * @private | |
| * @param {Array} [array] The array to iterate over. | |
| * @param {Function} iteratee The function invoked per iteration. | |
| * @returns {Array} Returns `array`. | |
| */ | |
| function arrayEach(array,iteratee){var index=-1,length=array==null?0:array.length;while(++index<length){if(iteratee(array[index],index,array)===false){break}}return array}module.exports=arrayEach},{}],65:[function(require,module,exports){ | |
| /** | |
| * A specialized version of `_.filter` for arrays without support for | |
| * iteratee shorthands. | |
| * | |
| * @private | |
| * @param {Array} [array] The array to iterate over. | |
| * @param {Function} predicate The function invoked per iteration. | |
| * @returns {Array} Returns the new filtered array. | |
| */ | |
| function arrayFilter(array,predicate){var index=-1,length=array==null?0:array.length,resIndex=0,result=[];while(++index<length){var value=array[index];if(predicate(value,index,array)){result[resIndex++]=value}}return result}module.exports=arrayFilter},{}],66:[function(require,module,exports){var baseIndexOf=require("./_baseIndexOf"); | |
| /** | |
| * A specialized version of `_.includes` for arrays without support for | |
| * specifying an index to search from. | |
| * | |
| * @private | |
| * @param {Array} [array] The array to inspect. | |
| * @param {*} target The value to search for. | |
| * @returns {boolean} Returns `true` if `target` is found, else `false`. | |
| */function arrayIncludes(array,value){var length=array==null?0:array.length;return!!length&&baseIndexOf(array,value,0)>-1}module.exports=arrayIncludes},{"./_baseIndexOf":95}],67:[function(require,module,exports){ | |
| /** | |
| * This function is like `arrayIncludes` except that it accepts a comparator. | |
| * | |
| * @private | |
| * @param {Array} [array] The array to inspect. | |
| * @param {*} target The value to search for. | |
| * @param {Function} comparator The comparator invoked per element. | |
| * @returns {boolean} Returns `true` if `target` is found, else `false`. | |
| */ | |
| function arrayIncludesWith(array,value,comparator){var index=-1,length=array==null?0:array.length;while(++index<length){if(comparator(value,array[index])){return true}}return false}module.exports=arrayIncludesWith},{}],68:[function(require,module,exports){var baseTimes=require("./_baseTimes"),isArguments=require("./isArguments"),isArray=require("./isArray"),isBuffer=require("./isBuffer"),isIndex=require("./_isIndex"),isTypedArray=require("./isTypedArray"); | |
| /** Used for built-in method references. */var objectProto=Object.prototype; | |
| /** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty; | |
| /** | |
| * Creates an array of the enumerable property names of the array-like `value`. | |
| * | |
| * @private | |
| * @param {*} value The value to query. | |
| * @param {boolean} inherited Specify returning inherited property names. | |
| * @returns {Array} Returns the array of property names. | |
| */function arrayLikeKeys(value,inherited){var isArr=isArray(value),isArg=!isArr&&isArguments(value),isBuff=!isArr&&!isArg&&isBuffer(value),isType=!isArr&&!isArg&&!isBuff&&isTypedArray(value),skipIndexes=isArr||isArg||isBuff||isType,result=skipIndexes?baseTimes(value.length,String):[],length=result.length;for(var key in value){if((inherited||hasOwnProperty.call(value,key))&&!(skipIndexes&&( | |
| // Safari 9 has enumerable `arguments.length` in strict mode. | |
| key=="length"|| | |
| // Node.js 0.10 has enumerable non-index properties on buffers. | |
| isBuff&&(key=="offset"||key=="parent")|| | |
| // PhantomJS 2 has enumerable non-index properties on typed arrays. | |
| isType&&(key=="buffer"||key=="byteLength"||key=="byteOffset")|| | |
| // Skip index properties. | |
| isIndex(key,length)))){result.push(key)}}return result}module.exports=arrayLikeKeys},{"./_baseTimes":125,"./_isIndex":181,"./isArguments":242,"./isArray":243,"./isBuffer":246,"./isTypedArray":257}],69:[function(require,module,exports){ | |
| /** | |
| * A specialized version of `_.map` for arrays without support for iteratee | |
| * shorthands. | |
| * | |
| * @private | |
| * @param {Array} [array] The array to iterate over. | |
| * @param {Function} iteratee The function invoked per iteration. | |
| * @returns {Array} Returns the new mapped array. | |
| */ | |
| function arrayMap(array,iteratee){var index=-1,length=array==null?0:array.length,result=Array(length);while(++index<length){result[index]=iteratee(array[index],index,array)}return result}module.exports=arrayMap},{}],70:[function(require,module,exports){ | |
| /** | |
| * Appends the elements of `values` to `array`. | |
| * | |
| * @private | |
| * @param {Array} array The array to modify. | |
| * @param {Array} values The values to append. | |
| * @returns {Array} Returns `array`. | |
| */ | |
| function arrayPush(array,values){var index=-1,length=values.length,offset=array.length;while(++index<length){array[offset+index]=values[index]}return array}module.exports=arrayPush},{}],71:[function(require,module,exports){ | |
| /** | |
| * A specialized version of `_.reduce` for arrays without support for | |
| * iteratee shorthands. | |
| * | |
| * @private | |
| * @param {Array} [array] The array to iterate over. | |
| * @param {Function} iteratee The function invoked per iteration. | |
| * @param {*} [accumulator] The initial value. | |
| * @param {boolean} [initAccum] Specify using the first element of `array` as | |
| * the initial value. | |
| * @returns {*} Returns the accumulated value. | |
| */ | |
| function arrayReduce(array,iteratee,accumulator,initAccum){var index=-1,length=array==null?0:array.length;if(initAccum&&length){accumulator=array[++index]}while(++index<length){accumulator=iteratee(accumulator,array[index],index,array)}return accumulator}module.exports=arrayReduce},{}],72:[function(require,module,exports){ | |
| /** | |
| * A specialized version of `_.some` for arrays without support for iteratee | |
| * shorthands. | |
| * | |
| * @private | |
| * @param {Array} [array] The array to iterate over. | |
| * @param {Function} predicate The function invoked per iteration. | |
| * @returns {boolean} Returns `true` if any element passes the predicate check, | |
| * else `false`. | |
| */ | |
| function arraySome(array,predicate){var index=-1,length=array==null?0:array.length;while(++index<length){if(predicate(array[index],index,array)){return true}}return false}module.exports=arraySome},{}],73:[function(require,module,exports){var baseProperty=require("./_baseProperty"); | |
| /** | |
| * Gets the size of an ASCII `string`. | |
| * | |
| * @private | |
| * @param {string} string The string inspect. | |
| * @returns {number} Returns the string size. | |
| */var asciiSize=baseProperty("length");module.exports=asciiSize},{"./_baseProperty":117}],74:[function(require,module,exports){var baseAssignValue=require("./_baseAssignValue"),eq=require("./eq"); | |
| /** | |
| * This function is like `assignValue` except that it doesn't assign | |
| * `undefined` values. | |
| * | |
| * @private | |
| * @param {Object} object The object to modify. | |
| * @param {string} key The key of the property to assign. | |
| * @param {*} value The value to assign. | |
| */function assignMergeValue(object,key,value){if(value!==undefined&&!eq(object[key],value)||value===undefined&&!(key in object)){baseAssignValue(object,key,value)}}module.exports=assignMergeValue},{"./_baseAssignValue":79,"./eq":231}],75:[function(require,module,exports){var baseAssignValue=require("./_baseAssignValue"),eq=require("./eq"); | |
| /** Used for built-in method references. */var objectProto=Object.prototype; | |
| /** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty; | |
| /** | |
| * Assigns `value` to `key` of `object` if the existing value is not equivalent | |
| * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) | |
| * for equality comparisons. | |
| * | |
| * @private | |
| * @param {Object} object The object to modify. | |
| * @param {string} key The key of the property to assign. | |
| * @param {*} value The value to assign. | |
| */function assignValue(object,key,value){var objValue=object[key];if(!(hasOwnProperty.call(object,key)&&eq(objValue,value))||value===undefined&&!(key in object)){baseAssignValue(object,key,value)}}module.exports=assignValue},{"./_baseAssignValue":79,"./eq":231}],76:[function(require,module,exports){var eq=require("./eq"); | |
| /** | |
| * Gets the index at which the `key` is found in `array` of key-value pairs. | |
| * | |
| * @private | |
| * @param {Array} array The array to inspect. | |
| * @param {*} key The key to search for. | |
| * @returns {number} Returns the index of the matched value, else `-1`. | |
| */function assocIndexOf(array,key){var length=array.length;while(length--){if(eq(array[length][0],key)){return length}}return-1}module.exports=assocIndexOf},{"./eq":231}],77:[function(require,module,exports){var copyObject=require("./_copyObject"),keys=require("./keys"); | |
| /** | |
| * The base implementation of `_.assign` without support for multiple sources | |
| * or `customizer` functions. | |
| * | |
| * @private | |
| * @param {Object} object The destination object. | |
| * @param {Object} source The source object. | |
| * @returns {Object} Returns `object`. | |
| */function baseAssign(object,source){return object&©Object(source,keys(source),object)}module.exports=baseAssign},{"./_copyObject":143,"./keys":259}],78:[function(require,module,exports){var copyObject=require("./_copyObject"),keysIn=require("./keysIn"); | |
| /** | |
| * The base implementation of `_.assignIn` without support for multiple sources | |
| * or `customizer` functions. | |
| * | |
| * @private | |
| * @param {Object} object The destination object. | |
| * @param {Object} source The source object. | |
| * @returns {Object} Returns `object`. | |
| */function baseAssignIn(object,source){return object&©Object(source,keysIn(source),object)}module.exports=baseAssignIn},{"./_copyObject":143,"./keysIn":260}],79:[function(require,module,exports){var defineProperty=require("./_defineProperty"); | |
| /** | |
| * The base implementation of `assignValue` and `assignMergeValue` without | |
| * value checks. | |
| * | |
| * @private | |
| * @param {Object} object The object to modify. | |
| * @param {string} key The key of the property to assign. | |
| * @param {*} value The value to assign. | |
| */function baseAssignValue(object,key,value){if(key=="__proto__"&&defineProperty){defineProperty(object,key,{configurable:true,enumerable:true,value:value,writable:true})}else{object[key]=value}}module.exports=baseAssignValue},{"./_defineProperty":153}],80:[function(require,module,exports){var Stack=require("./_Stack"),arrayEach=require("./_arrayEach"),assignValue=require("./_assignValue"),baseAssign=require("./_baseAssign"),baseAssignIn=require("./_baseAssignIn"),cloneBuffer=require("./_cloneBuffer"),copyArray=require("./_copyArray"),copySymbols=require("./_copySymbols"),copySymbolsIn=require("./_copySymbolsIn"),getAllKeys=require("./_getAllKeys"),getAllKeysIn=require("./_getAllKeysIn"),getTag=require("./_getTag"),initCloneArray=require("./_initCloneArray"),initCloneByTag=require("./_initCloneByTag"),initCloneObject=require("./_initCloneObject"),isArray=require("./isArray"),isBuffer=require("./isBuffer"),isMap=require("./isMap"),isObject=require("./isObject"),isSet=require("./isSet"),keys=require("./keys"); | |
| /** Used to compose bitmasks for cloning. */var CLONE_DEEP_FLAG=1,CLONE_FLAT_FLAG=2,CLONE_SYMBOLS_FLAG=4; | |
| /** `Object#toString` result references. */var argsTag="[object Arguments]",arrayTag="[object Array]",boolTag="[object Boolean]",dateTag="[object Date]",errorTag="[object Error]",funcTag="[object Function]",genTag="[object GeneratorFunction]",mapTag="[object Map]",numberTag="[object Number]",objectTag="[object Object]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",symbolTag="[object Symbol]",weakMapTag="[object WeakMap]";var arrayBufferTag="[object ArrayBuffer]",dataViewTag="[object DataView]",float32Tag="[object Float32Array]",float64Tag="[object Float64Array]",int8Tag="[object Int8Array]",int16Tag="[object Int16Array]",int32Tag="[object Int32Array]",uint8Tag="[object Uint8Array]",uint8ClampedTag="[object Uint8ClampedArray]",uint16Tag="[object Uint16Array]",uint32Tag="[object Uint32Array]"; | |
| /** Used to identify `toStringTag` values supported by `_.clone`. */var cloneableTags={};cloneableTags[argsTag]=cloneableTags[arrayTag]=cloneableTags[arrayBufferTag]=cloneableTags[dataViewTag]=cloneableTags[boolTag]=cloneableTags[dateTag]=cloneableTags[float32Tag]=cloneableTags[float64Tag]=cloneableTags[int8Tag]=cloneableTags[int16Tag]=cloneableTags[int32Tag]=cloneableTags[mapTag]=cloneableTags[numberTag]=cloneableTags[objectTag]=cloneableTags[regexpTag]=cloneableTags[setTag]=cloneableTags[stringTag]=cloneableTags[symbolTag]=cloneableTags[uint8Tag]=cloneableTags[uint8ClampedTag]=cloneableTags[uint16Tag]=cloneableTags[uint32Tag]=true;cloneableTags[errorTag]=cloneableTags[funcTag]=cloneableTags[weakMapTag]=false; | |
| /** | |
| * The base implementation of `_.clone` and `_.cloneDeep` which tracks | |
| * traversed objects. | |
| * | |
| * @private | |
| * @param {*} value The value to clone. | |
| * @param {boolean} bitmask The bitmask flags. | |
| * 1 - Deep clone | |
| * 2 - Flatten inherited properties | |
| * 4 - Clone symbols | |
| * @param {Function} [customizer] The function to customize cloning. | |
| * @param {string} [key] The key of `value`. | |
| * @param {Object} [object] The parent object of `value`. | |
| * @param {Object} [stack] Tracks traversed objects and their clone counterparts. | |
| * @returns {*} Returns the cloned value. | |
| */function baseClone(value,bitmask,customizer,key,object,stack){var result,isDeep=bitmask&CLONE_DEEP_FLAG,isFlat=bitmask&CLONE_FLAT_FLAG,isFull=bitmask&CLONE_SYMBOLS_FLAG;if(customizer){result=object?customizer(value,key,object,stack):customizer(value)}if(result!==undefined){return result}if(!isObject(value)){return value}var isArr=isArray(value);if(isArr){result=initCloneArray(value);if(!isDeep){return copyArray(value,result)}}else{var tag=getTag(value),isFunc=tag==funcTag||tag==genTag;if(isBuffer(value)){return cloneBuffer(value,isDeep)}if(tag==objectTag||tag==argsTag||isFunc&&!object){result=isFlat||isFunc?{}:initCloneObject(value);if(!isDeep){return isFlat?copySymbolsIn(value,baseAssignIn(result,value)):copySymbols(value,baseAssign(result,value))}}else{if(!cloneableTags[tag]){return object?value:{}}result=initCloneByTag(value,tag,isDeep)}} | |
| // Check for circular references and return its corresponding clone. | |
| stack||(stack=new Stack);var stacked=stack.get(value);if(stacked){return stacked}stack.set(value,result);if(isSet(value)){value.forEach(function(subValue){result.add(baseClone(subValue,bitmask,customizer,subValue,value,stack))})}else if(isMap(value)){value.forEach(function(subValue,key){result.set(key,baseClone(subValue,bitmask,customizer,key,value,stack))})}var keysFunc=isFull?isFlat?getAllKeysIn:getAllKeys:isFlat?keysIn:keys;var props=isArr?undefined:keysFunc(value);arrayEach(props||value,function(subValue,key){if(props){key=subValue;subValue=value[key]} | |
| // Recursively populate clone (susceptible to call stack limits). | |
| assignValue(result,key,baseClone(subValue,bitmask,customizer,key,value,stack))});return result}module.exports=baseClone},{"./_Stack":59,"./_arrayEach":64,"./_assignValue":75,"./_baseAssign":77,"./_baseAssignIn":78,"./_cloneBuffer":135,"./_copyArray":142,"./_copySymbols":144,"./_copySymbolsIn":145,"./_getAllKeys":159,"./_getAllKeysIn":160,"./_getTag":168,"./_initCloneArray":177,"./_initCloneByTag":178,"./_initCloneObject":179,"./isArray":243,"./isBuffer":246,"./isMap":250,"./isObject":251,"./isSet":254,"./keys":259}],81:[function(require,module,exports){var isObject=require("./isObject"); | |
| /** Built-in value references. */var objectCreate=Object.create; | |
| /** | |
| * The base implementation of `_.create` without support for assigning | |
| * properties to the created object. | |
| * | |
| * @private | |
| * @param {Object} proto The object to inherit from. | |
| * @returns {Object} Returns the new object. | |
| */var baseCreate=function(){function object(){}return function(proto){if(!isObject(proto)){return{}}if(objectCreate){return objectCreate(proto)}object.prototype=proto;var result=new object;object.prototype=undefined;return result}}();module.exports=baseCreate},{"./isObject":251}],82:[function(require,module,exports){var baseForOwn=require("./_baseForOwn"),createBaseEach=require("./_createBaseEach"); | |
| /** | |
| * The base implementation of `_.forEach` without support for iteratee shorthands. | |
| * | |
| * @private | |
| * @param {Array|Object} collection The collection to iterate over. | |
| * @param {Function} iteratee The function invoked per iteration. | |
| * @returns {Array|Object} Returns `collection`. | |
| */var baseEach=createBaseEach(baseForOwn);module.exports=baseEach},{"./_baseForOwn":88,"./_createBaseEach":148}],83:[function(require,module,exports){var isSymbol=require("./isSymbol"); | |
| /** | |
| * The base implementation of methods like `_.max` and `_.min` which accepts a | |
| * `comparator` to determine the extremum value. | |
| * | |
| * @private | |
| * @param {Array} array The array to iterate over. | |
| * @param {Function} iteratee The iteratee invoked per iteration. | |
| * @param {Function} comparator The comparator used to compare values. | |
| * @returns {*} Returns the extremum value. | |
| */function baseExtremum(array,iteratee,comparator){var index=-1,length=array.length;while(++index<length){var value=array[index],current=iteratee(value);if(current!=null&&(computed===undefined?current===current&&!isSymbol(current):comparator(current,computed))){var computed=current,result=value}}return result}module.exports=baseExtremum},{"./isSymbol":256}],84:[function(require,module,exports){var baseEach=require("./_baseEach"); | |
| /** | |
| * The base implementation of `_.filter` without support for iteratee shorthands. | |
| * | |
| * @private | |
| * @param {Array|Object} collection The collection to iterate over. | |
| * @param {Function} predicate The function invoked per iteration. | |
| * @returns {Array} Returns the new filtered array. | |
| */function baseFilter(collection,predicate){var result=[];baseEach(collection,function(value,index,collection){if(predicate(value,index,collection)){result.push(value)}});return result}module.exports=baseFilter},{"./_baseEach":82}],85:[function(require,module,exports){ | |
| /** | |
| * The base implementation of `_.findIndex` and `_.findLastIndex` without | |
| * support for iteratee shorthands. | |
| * | |
| * @private | |
| * @param {Array} array The array to inspect. | |
| * @param {Function} predicate The function invoked per iteration. | |
| * @param {number} fromIndex The index to search from. | |
| * @param {boolean} [fromRight] Specify iterating from right to left. | |
| * @returns {number} Returns the index of the matched value, else `-1`. | |
| */ | |
| function baseFindIndex(array,predicate,fromIndex,fromRight){var length=array.length,index=fromIndex+(fromRight?1:-1);while(fromRight?index--:++index<length){if(predicate(array[index],index,array)){return index}}return-1}module.exports=baseFindIndex},{}],86:[function(require,module,exports){var arrayPush=require("./_arrayPush"),isFlattenable=require("./_isFlattenable"); | |
| /** | |
| * The base implementation of `_.flatten` with support for restricting flattening. | |
| * | |
| * @private | |
| * @param {Array} array The array to flatten. | |
| * @param {number} depth The maximum recursion depth. | |
| * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. | |
| * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. | |
| * @param {Array} [result=[]] The initial result value. | |
| * @returns {Array} Returns the new flattened array. | |
| */function baseFlatten(array,depth,predicate,isStrict,result){var index=-1,length=array.length;predicate||(predicate=isFlattenable);result||(result=[]);while(++index<length){var value=array[index];if(depth>0&&predicate(value)){if(depth>1){ | |
| // Recursively flatten arrays (susceptible to call stack limits). | |
| baseFlatten(value,depth-1,predicate,isStrict,result)}else{arrayPush(result,value)}}else if(!isStrict){result[result.length]=value}}return result}module.exports=baseFlatten},{"./_arrayPush":70,"./_isFlattenable":180}],87:[function(require,module,exports){var createBaseFor=require("./_createBaseFor"); | |
| /** | |
| * The base implementation of `baseForOwn` which iterates over `object` | |
| * properties returned by `keysFunc` and invokes `iteratee` for each property. | |
| * Iteratee functions may exit iteration early by explicitly returning `false`. | |
| * | |
| * @private | |
| * @param {Object} object The object to iterate over. | |
| * @param {Function} iteratee The function invoked per iteration. | |
| * @param {Function} keysFunc The function to get the keys of `object`. | |
| * @returns {Object} Returns `object`. | |
| */var baseFor=createBaseFor();module.exports=baseFor},{"./_createBaseFor":149}],88:[function(require,module,exports){var baseFor=require("./_baseFor"),keys=require("./keys"); | |
| /** | |
| * The base implementation of `_.forOwn` without support for iteratee shorthands. | |
| * | |
| * @private | |
| * @param {Object} object The object to iterate over. | |
| * @param {Function} iteratee The function invoked per iteration. | |
| * @returns {Object} Returns `object`. | |
| */function baseForOwn(object,iteratee){return object&&baseFor(object,iteratee,keys)}module.exports=baseForOwn},{"./_baseFor":87,"./keys":259}],89:[function(require,module,exports){var castPath=require("./_castPath"),toKey=require("./_toKey"); | |
| /** | |
| * The base implementation of `_.get` without support for default values. | |
| * | |
| * @private | |
| * @param {Object} object The object to query. | |
| * @param {Array|string} path The path of the property to get. | |
| * @returns {*} Returns the resolved value. | |
| */function baseGet(object,path){path=castPath(path,object);var index=0,length=path.length;while(object!=null&&index<length){object=object[toKey(path[index++])]}return index&&index==length?object:undefined}module.exports=baseGet},{"./_castPath":133,"./_toKey":223}],90:[function(require,module,exports){var arrayPush=require("./_arrayPush"),isArray=require("./isArray"); | |
| /** | |
| * The base implementation of `getAllKeys` and `getAllKeysIn` which uses | |
| * `keysFunc` and `symbolsFunc` to get the enumerable property names and | |
| * symbols of `object`. | |
| * | |
| * @private | |
| * @param {Object} object The object to query. | |
| * @param {Function} keysFunc The function to get the keys of `object`. | |
| * @param {Function} symbolsFunc The function to get the symbols of `object`. | |
| * @returns {Array} Returns the array of property names and symbols. | |
| */function baseGetAllKeys(object,keysFunc,symbolsFunc){var result=keysFunc(object);return isArray(object)?result:arrayPush(result,symbolsFunc(object))}module.exports=baseGetAllKeys},{"./_arrayPush":70,"./isArray":243}],91:[function(require,module,exports){var Symbol=require("./_Symbol"),getRawTag=require("./_getRawTag"),objectToString=require("./_objectToString"); | |
| /** `Object#toString` result references. */var nullTag="[object Null]",undefinedTag="[object Undefined]"; | |
| /** Built-in value references. */var symToStringTag=Symbol?Symbol.toStringTag:undefined; | |
| /** | |
| * The base implementation of `getTag` without fallbacks for buggy environments. | |
| * | |
| * @private | |
| * @param {*} value The value to query. | |
| * @returns {string} Returns the `toStringTag`. | |
| */function baseGetTag(value){if(value==null){return value===undefined?undefinedTag:nullTag}return symToStringTag&&symToStringTag in Object(value)?getRawTag(value):objectToString(value)}module.exports=baseGetTag},{"./_Symbol":60,"./_getRawTag":165,"./_objectToString":205}],92:[function(require,module,exports){ | |
| /** | |
| * The base implementation of `_.gt` which doesn't coerce arguments. | |
| * | |
| * @private | |
| * @param {*} value The value to compare. | |
| * @param {*} other The other value to compare. | |
| * @returns {boolean} Returns `true` if `value` is greater than `other`, | |
| * else `false`. | |
| */ | |
| function baseGt(value,other){return value>other}module.exports=baseGt},{}],93:[function(require,module,exports){ | |
| /** Used for built-in method references. */ | |
| var objectProto=Object.prototype; | |
| /** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty; | |
| /** | |
| * The base implementation of `_.has` without support for deep paths. | |
| * | |
| * @private | |
| * @param {Object} [object] The object to query. | |
| * @param {Array|string} key The key to check. | |
| * @returns {boolean} Returns `true` if `key` exists, else `false`. | |
| */function baseHas(object,key){return object!=null&&hasOwnProperty.call(object,key)}module.exports=baseHas},{}],94:[function(require,module,exports){ | |
| /** | |
| * The base implementation of `_.hasIn` without support for deep paths. | |
| * | |
| * @private | |
| * @param {Object} [object] The object to query. | |
| * @param {Array|string} key The key to check. | |
| * @returns {boolean} Returns `true` if `key` exists, else `false`. | |
| */ | |
| function baseHasIn(object,key){return object!=null&&key in Object(object)}module.exports=baseHasIn},{}],95:[function(require,module,exports){var baseFindIndex=require("./_baseFindIndex"),baseIsNaN=require("./_baseIsNaN"),strictIndexOf=require("./_strictIndexOf"); | |
| /** | |
| * The base implementation of `_.indexOf` without `fromIndex` bounds checks. | |
| * | |
| * @private | |
| * @param {Array} array The array to inspect. | |
| * @param {*} value The value to search for. | |
| * @param {number} fromIndex The index to search from. | |
| * @returns {number} Returns the index of the matched value, else `-1`. | |
| */function baseIndexOf(array,value,fromIndex){return value===value?strictIndexOf(array,value,fromIndex):baseFindIndex(array,baseIsNaN,fromIndex)}module.exports=baseIndexOf},{"./_baseFindIndex":85,"./_baseIsNaN":101,"./_strictIndexOf":220}],96:[function(require,module,exports){var baseGetTag=require("./_baseGetTag"),isObjectLike=require("./isObjectLike"); | |
| /** `Object#toString` result references. */var argsTag="[object Arguments]"; | |
| /** | |
| * The base implementation of `_.isArguments`. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is an `arguments` object, | |
| */function baseIsArguments(value){return isObjectLike(value)&&baseGetTag(value)==argsTag}module.exports=baseIsArguments},{"./_baseGetTag":91,"./isObjectLike":252}],97:[function(require,module,exports){var baseIsEqualDeep=require("./_baseIsEqualDeep"),isObjectLike=require("./isObjectLike"); | |
| /** | |
| * The base implementation of `_.isEqual` which supports partial comparisons | |
| * and tracks traversed objects. | |
| * | |
| * @private | |
| * @param {*} value The value to compare. | |
| * @param {*} other The other value to compare. | |
| * @param {boolean} bitmask The bitmask flags. | |
| * 1 - Unordered comparison | |
| * 2 - Partial comparison | |
| * @param {Function} [customizer] The function to customize comparisons. | |
| * @param {Object} [stack] Tracks traversed `value` and `other` objects. | |
| * @returns {boolean} Returns `true` if the values are equivalent, else `false`. | |
| */function baseIsEqual(value,other,bitmask,customizer,stack){if(value===other){return true}if(value==null||other==null||!isObjectLike(value)&&!isObjectLike(other)){return value!==value&&other!==other}return baseIsEqualDeep(value,other,bitmask,customizer,baseIsEqual,stack)}module.exports=baseIsEqual},{"./_baseIsEqualDeep":98,"./isObjectLike":252}],98:[function(require,module,exports){var Stack=require("./_Stack"),equalArrays=require("./_equalArrays"),equalByTag=require("./_equalByTag"),equalObjects=require("./_equalObjects"),getTag=require("./_getTag"),isArray=require("./isArray"),isBuffer=require("./isBuffer"),isTypedArray=require("./isTypedArray"); | |
| /** Used to compose bitmasks for value comparisons. */var COMPARE_PARTIAL_FLAG=1; | |
| /** `Object#toString` result references. */var argsTag="[object Arguments]",arrayTag="[object Array]",objectTag="[object Object]"; | |
| /** Used for built-in method references. */var objectProto=Object.prototype; | |
| /** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty; | |
| /** | |
| * A specialized version of `baseIsEqual` for arrays and objects which performs | |
| * deep comparisons and tracks traversed objects enabling objects with circular | |
| * references to be compared. | |
| * | |
| * @private | |
| * @param {Object} object The object to compare. | |
| * @param {Object} other The other object to compare. | |
| * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. | |
| * @param {Function} customizer The function to customize comparisons. | |
| * @param {Function} equalFunc The function to determine equivalents of values. | |
| * @param {Object} [stack] Tracks traversed `object` and `other` objects. | |
| * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. | |
| */function baseIsEqualDeep(object,other,bitmask,customizer,equalFunc,stack){var objIsArr=isArray(object),othIsArr=isArray(other),objTag=objIsArr?arrayTag:getTag(object),othTag=othIsArr?arrayTag:getTag(other);objTag=objTag==argsTag?objectTag:objTag;othTag=othTag==argsTag?objectTag:othTag;var objIsObj=objTag==objectTag,othIsObj=othTag==objectTag,isSameTag=objTag==othTag;if(isSameTag&&isBuffer(object)){if(!isBuffer(other)){return false}objIsArr=true;objIsObj=false}if(isSameTag&&!objIsObj){stack||(stack=new Stack);return objIsArr||isTypedArray(object)?equalArrays(object,other,bitmask,customizer,equalFunc,stack):equalByTag(object,other,objTag,bitmask,customizer,equalFunc,stack)}if(!(bitmask&COMPARE_PARTIAL_FLAG)){var objIsWrapped=objIsObj&&hasOwnProperty.call(object,"__wrapped__"),othIsWrapped=othIsObj&&hasOwnProperty.call(other,"__wrapped__");if(objIsWrapped||othIsWrapped){var objUnwrapped=objIsWrapped?object.value():object,othUnwrapped=othIsWrapped?other.value():other;stack||(stack=new Stack);return equalFunc(objUnwrapped,othUnwrapped,bitmask,customizer,stack)}}if(!isSameTag){return false}stack||(stack=new Stack);return equalObjects(object,other,bitmask,customizer,equalFunc,stack)}module.exports=baseIsEqualDeep},{"./_Stack":59,"./_equalArrays":154,"./_equalByTag":155,"./_equalObjects":156,"./_getTag":168,"./isArray":243,"./isBuffer":246,"./isTypedArray":257}],99:[function(require,module,exports){var getTag=require("./_getTag"),isObjectLike=require("./isObjectLike"); | |
| /** `Object#toString` result references. */var mapTag="[object Map]"; | |
| /** | |
| * The base implementation of `_.isMap` without Node.js optimizations. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a map, else `false`. | |
| */function baseIsMap(value){return isObjectLike(value)&&getTag(value)==mapTag}module.exports=baseIsMap},{"./_getTag":168,"./isObjectLike":252}],100:[function(require,module,exports){var Stack=require("./_Stack"),baseIsEqual=require("./_baseIsEqual"); | |
| /** Used to compose bitmasks for value comparisons. */var COMPARE_PARTIAL_FLAG=1,COMPARE_UNORDERED_FLAG=2; | |
| /** | |
| * The base implementation of `_.isMatch` without support for iteratee shorthands. | |
| * | |
| * @private | |
| * @param {Object} object The object to inspect. | |
| * @param {Object} source The object of property values to match. | |
| * @param {Array} matchData The property names, values, and compare flags to match. | |
| * @param {Function} [customizer] The function to customize comparisons. | |
| * @returns {boolean} Returns `true` if `object` is a match, else `false`. | |
| */function baseIsMatch(object,source,matchData,customizer){var index=matchData.length,length=index,noCustomizer=!customizer;if(object==null){return!length}object=Object(object);while(index--){var data=matchData[index];if(noCustomizer&&data[2]?data[1]!==object[data[0]]:!(data[0]in object)){return false}}while(++index<length){data=matchData[index];var key=data[0],objValue=object[key],srcValue=data[1];if(noCustomizer&&data[2]){if(objValue===undefined&&!(key in object)){return false}}else{var stack=new Stack;if(customizer){var result=customizer(objValue,srcValue,key,object,source,stack)}if(!(result===undefined?baseIsEqual(srcValue,objValue,COMPARE_PARTIAL_FLAG|COMPARE_UNORDERED_FLAG,customizer,stack):result)){return false}}}return true}module.exports=baseIsMatch},{"./_Stack":59,"./_baseIsEqual":97}],101:[function(require,module,exports){ | |
| /** | |
| * The base implementation of `_.isNaN` without support for number objects. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. | |
| */ | |
| function baseIsNaN(value){return value!==value}module.exports=baseIsNaN},{}],102:[function(require,module,exports){var isFunction=require("./isFunction"),isMasked=require("./_isMasked"),isObject=require("./isObject"),toSource=require("./_toSource"); | |
| /** | |
| * Used to match `RegExp` | |
| * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). | |
| */var reRegExpChar=/[\\^$.*+?()[\]{}|]/g; | |
| /** Used to detect host constructors (Safari). */var reIsHostCtor=/^\[object .+?Constructor\]$/; | |
| /** Used for built-in method references. */var funcProto=Function.prototype,objectProto=Object.prototype; | |
| /** Used to resolve the decompiled source of functions. */var funcToString=funcProto.toString; | |
| /** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty; | |
| /** Used to detect if a method is native. */var reIsNative=RegExp("^"+funcToString.call(hasOwnProperty).replace(reRegExpChar,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"); | |
| /** | |
| * The base implementation of `_.isNative` without bad shim checks. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a native function, | |
| * else `false`. | |
| */function baseIsNative(value){if(!isObject(value)||isMasked(value)){return false}var pattern=isFunction(value)?reIsNative:reIsHostCtor;return pattern.test(toSource(value))}module.exports=baseIsNative},{"./_isMasked":185,"./_toSource":224,"./isFunction":248,"./isObject":251}],103:[function(require,module,exports){var getTag=require("./_getTag"),isObjectLike=require("./isObjectLike"); | |
| /** `Object#toString` result references. */var setTag="[object Set]"; | |
| /** | |
| * The base implementation of `_.isSet` without Node.js optimizations. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a set, else `false`. | |
| */function baseIsSet(value){return isObjectLike(value)&&getTag(value)==setTag}module.exports=baseIsSet},{"./_getTag":168,"./isObjectLike":252}],104:[function(require,module,exports){var baseGetTag=require("./_baseGetTag"),isLength=require("./isLength"),isObjectLike=require("./isObjectLike"); | |
| /** `Object#toString` result references. */var argsTag="[object Arguments]",arrayTag="[object Array]",boolTag="[object Boolean]",dateTag="[object Date]",errorTag="[object Error]",funcTag="[object Function]",mapTag="[object Map]",numberTag="[object Number]",objectTag="[object Object]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",weakMapTag="[object WeakMap]";var arrayBufferTag="[object ArrayBuffer]",dataViewTag="[object DataView]",float32Tag="[object Float32Array]",float64Tag="[object Float64Array]",int8Tag="[object Int8Array]",int16Tag="[object Int16Array]",int32Tag="[object Int32Array]",uint8Tag="[object Uint8Array]",uint8ClampedTag="[object Uint8ClampedArray]",uint16Tag="[object Uint16Array]",uint32Tag="[object Uint32Array]"; | |
| /** Used to identify `toStringTag` values of typed arrays. */var typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=true;typedArrayTags[argsTag]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dataViewTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=false; | |
| /** | |
| * The base implementation of `_.isTypedArray` without Node.js optimizations. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. | |
| */function baseIsTypedArray(value){return isObjectLike(value)&&isLength(value.length)&&!!typedArrayTags[baseGetTag(value)]}module.exports=baseIsTypedArray},{"./_baseGetTag":91,"./isLength":249,"./isObjectLike":252}],105:[function(require,module,exports){var baseMatches=require("./_baseMatches"),baseMatchesProperty=require("./_baseMatchesProperty"),identity=require("./identity"),isArray=require("./isArray"),property=require("./property"); | |
| /** | |
| * The base implementation of `_.iteratee`. | |
| * | |
| * @private | |
| * @param {*} [value=_.identity] The value to convert to an iteratee. | |
| * @returns {Function} Returns the iteratee. | |
| */function baseIteratee(value){ | |
| // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. | |
| // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. | |
| if(typeof value=="function"){return value}if(value==null){return identity}if(typeof value=="object"){return isArray(value)?baseMatchesProperty(value[0],value[1]):baseMatches(value)}return property(value)}module.exports=baseIteratee},{"./_baseMatches":110,"./_baseMatchesProperty":111,"./identity":241,"./isArray":243,"./property":272}],106:[function(require,module,exports){var isPrototype=require("./_isPrototype"),nativeKeys=require("./_nativeKeys"); | |
| /** Used for built-in method references. */var objectProto=Object.prototype; | |
| /** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty; | |
| /** | |
| * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. | |
| * | |
| * @private | |
| * @param {Object} object The object to query. | |
| * @returns {Array} Returns the array of property names. | |
| */function baseKeys(object){if(!isPrototype(object)){return nativeKeys(object)}var result=[];for(var key in Object(object)){if(hasOwnProperty.call(object,key)&&key!="constructor"){result.push(key)}}return result}module.exports=baseKeys},{"./_isPrototype":186,"./_nativeKeys":202}],107:[function(require,module,exports){var isObject=require("./isObject"),isPrototype=require("./_isPrototype"),nativeKeysIn=require("./_nativeKeysIn"); | |
| /** Used for built-in method references. */var objectProto=Object.prototype; | |
| /** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty; | |
| /** | |
| * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. | |
| * | |
| * @private | |
| * @param {Object} object The object to query. | |
| * @returns {Array} Returns the array of property names. | |
| */function baseKeysIn(object){if(!isObject(object)){return nativeKeysIn(object)}var isProto=isPrototype(object),result=[];for(var key in object){if(!(key=="constructor"&&(isProto||!hasOwnProperty.call(object,key)))){result.push(key)}}return result}module.exports=baseKeysIn},{"./_isPrototype":186,"./_nativeKeysIn":203,"./isObject":251}],108:[function(require,module,exports){ | |
| /** | |
| * The base implementation of `_.lt` which doesn't coerce arguments. | |
| * | |
| * @private | |
| * @param {*} value The value to compare. | |
| * @param {*} other The other value to compare. | |
| * @returns {boolean} Returns `true` if `value` is less than `other`, | |
| * else `false`. | |
| */ | |
| function baseLt(value,other){return value<other}module.exports=baseLt},{}],109:[function(require,module,exports){var baseEach=require("./_baseEach"),isArrayLike=require("./isArrayLike"); | |
| /** | |
| * The base implementation of `_.map` without support for iteratee shorthands. | |
| * | |
| * @private | |
| * @param {Array|Object} collection The collection to iterate over. | |
| * @param {Function} iteratee The function invoked per iteration. | |
| * @returns {Array} Returns the new mapped array. | |
| */function baseMap(collection,iteratee){var index=-1,result=isArrayLike(collection)?Array(collection.length):[];baseEach(collection,function(value,key,collection){result[++index]=iteratee(value,key,collection)});return result}module.exports=baseMap},{"./_baseEach":82,"./isArrayLike":244}],110:[function(require,module,exports){var baseIsMatch=require("./_baseIsMatch"),getMatchData=require("./_getMatchData"),matchesStrictComparable=require("./_matchesStrictComparable"); | |
| /** | |
| * The base implementation of `_.matches` which doesn't clone `source`. | |
| * | |
| * @private | |
| * @param {Object} source The object of property values to match. | |
| * @returns {Function} Returns the new spec function. | |
| */function baseMatches(source){var matchData=getMatchData(source);if(matchData.length==1&&matchData[0][2]){return matchesStrictComparable(matchData[0][0],matchData[0][1])}return function(object){return object===source||baseIsMatch(object,source,matchData)}}module.exports=baseMatches},{"./_baseIsMatch":100,"./_getMatchData":162,"./_matchesStrictComparable":199}],111:[function(require,module,exports){var baseIsEqual=require("./_baseIsEqual"),get=require("./get"),hasIn=require("./hasIn"),isKey=require("./_isKey"),isStrictComparable=require("./_isStrictComparable"),matchesStrictComparable=require("./_matchesStrictComparable"),toKey=require("./_toKey"); | |
| /** Used to compose bitmasks for value comparisons. */var COMPARE_PARTIAL_FLAG=1,COMPARE_UNORDERED_FLAG=2; | |
| /** | |
| * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. | |
| * | |
| * @private | |
| * @param {string} path The path of the property to get. | |
| * @param {*} srcValue The value to match. | |
| * @returns {Function} Returns the new spec function. | |
| */function baseMatchesProperty(path,srcValue){if(isKey(path)&&isStrictComparable(srcValue)){return matchesStrictComparable(toKey(path),srcValue)}return function(object){var objValue=get(object,path);return objValue===undefined&&objValue===srcValue?hasIn(object,path):baseIsEqual(srcValue,objValue,COMPARE_PARTIAL_FLAG|COMPARE_UNORDERED_FLAG)}}module.exports=baseMatchesProperty},{"./_baseIsEqual":97,"./_isKey":183,"./_isStrictComparable":187,"./_matchesStrictComparable":199,"./_toKey":223,"./get":238,"./hasIn":240}],112:[function(require,module,exports){var Stack=require("./_Stack"),assignMergeValue=require("./_assignMergeValue"),baseFor=require("./_baseFor"),baseMergeDeep=require("./_baseMergeDeep"),isObject=require("./isObject"),keysIn=require("./keysIn"),safeGet=require("./_safeGet"); | |
| /** | |
| * The base implementation of `_.merge` without support for multiple sources. | |
| * | |
| * @private | |
| * @param {Object} object The destination object. | |
| * @param {Object} source The source object. | |
| * @param {number} srcIndex The index of `source`. | |
| * @param {Function} [customizer] The function to customize merged values. | |
| * @param {Object} [stack] Tracks traversed source values and their merged | |
| * counterparts. | |
| */function baseMerge(object,source,srcIndex,customizer,stack){if(object===source){return}baseFor(source,function(srcValue,key){stack||(stack=new Stack);if(isObject(srcValue)){baseMergeDeep(object,source,key,srcIndex,baseMerge,customizer,stack)}else{var newValue=customizer?customizer(safeGet(object,key),srcValue,key+"",object,source,stack):undefined;if(newValue===undefined){newValue=srcValue}assignMergeValue(object,key,newValue)}},keysIn)}module.exports=baseMerge},{"./_Stack":59,"./_assignMergeValue":74,"./_baseFor":87,"./_baseMergeDeep":113,"./_safeGet":209,"./isObject":251,"./keysIn":260}],113:[function(require,module,exports){var assignMergeValue=require("./_assignMergeValue"),cloneBuffer=require("./_cloneBuffer"),cloneTypedArray=require("./_cloneTypedArray"),copyArray=require("./_copyArray"),initCloneObject=require("./_initCloneObject"),isArguments=require("./isArguments"),isArray=require("./isArray"),isArrayLikeObject=require("./isArrayLikeObject"),isBuffer=require("./isBuffer"),isFunction=require("./isFunction"),isObject=require("./isObject"),isPlainObject=require("./isPlainObject"),isTypedArray=require("./isTypedArray"),safeGet=require("./_safeGet"),toPlainObject=require("./toPlainObject"); | |
| /** | |
| * A specialized version of `baseMerge` for arrays and objects which performs | |
| * deep merges and tracks traversed objects enabling objects with circular | |
| * references to be merged. | |
| * | |
| * @private | |
| * @param {Object} object The destination object. | |
| * @param {Object} source The source object. | |
| * @param {string} key The key of the value to merge. | |
| * @param {number} srcIndex The index of `source`. | |
| * @param {Function} mergeFunc The function to merge values. | |
| * @param {Function} [customizer] The function to customize assigned values. | |
| * @param {Object} [stack] Tracks traversed source values and their merged | |
| * counterparts. | |
| */function baseMergeDeep(object,source,key,srcIndex,mergeFunc,customizer,stack){var objValue=safeGet(object,key),srcValue=safeGet(source,key),stacked=stack.get(srcValue);if(stacked){assignMergeValue(object,key,stacked);return}var newValue=customizer?customizer(objValue,srcValue,key+"",object,source,stack):undefined;var isCommon=newValue===undefined;if(isCommon){var isArr=isArray(srcValue),isBuff=!isArr&&isBuffer(srcValue),isTyped=!isArr&&!isBuff&&isTypedArray(srcValue);newValue=srcValue;if(isArr||isBuff||isTyped){if(isArray(objValue)){newValue=objValue}else if(isArrayLikeObject(objValue)){newValue=copyArray(objValue)}else if(isBuff){isCommon=false;newValue=cloneBuffer(srcValue,true)}else if(isTyped){isCommon=false;newValue=cloneTypedArray(srcValue,true)}else{newValue=[]}}else if(isPlainObject(srcValue)||isArguments(srcValue)){newValue=objValue;if(isArguments(objValue)){newValue=toPlainObject(objValue)}else if(!isObject(objValue)||isFunction(objValue)){newValue=initCloneObject(srcValue)}}else{isCommon=false}}if(isCommon){ | |
| // Recursively merge objects and arrays (susceptible to call stack limits). | |
| stack.set(srcValue,newValue);mergeFunc(newValue,srcValue,srcIndex,customizer,stack);stack["delete"](srcValue)}assignMergeValue(object,key,newValue)}module.exports=baseMergeDeep},{"./_assignMergeValue":74,"./_cloneBuffer":135,"./_cloneTypedArray":139,"./_copyArray":142,"./_initCloneObject":179,"./_safeGet":209,"./isArguments":242,"./isArray":243,"./isArrayLikeObject":245,"./isBuffer":246,"./isFunction":248,"./isObject":251,"./isPlainObject":253,"./isTypedArray":257,"./toPlainObject":282}],114:[function(require,module,exports){var arrayMap=require("./_arrayMap"),baseIteratee=require("./_baseIteratee"),baseMap=require("./_baseMap"),baseSortBy=require("./_baseSortBy"),baseUnary=require("./_baseUnary"),compareMultiple=require("./_compareMultiple"),identity=require("./identity"); | |
| /** | |
| * The base implementation of `_.orderBy` without param guards. | |
| * | |
| * @private | |
| * @param {Array|Object} collection The collection to iterate over. | |
| * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. | |
| * @param {string[]} orders The sort orders of `iteratees`. | |
| * @returns {Array} Returns the new sorted array. | |
| */function baseOrderBy(collection,iteratees,orders){var index=-1;iteratees=arrayMap(iteratees.length?iteratees:[identity],baseUnary(baseIteratee));var result=baseMap(collection,function(value,key,collection){var criteria=arrayMap(iteratees,function(iteratee){return iteratee(value)});return{criteria:criteria,index:++index,value:value}});return baseSortBy(result,function(object,other){return compareMultiple(object,other,orders)})}module.exports=baseOrderBy},{"./_arrayMap":69,"./_baseIteratee":105,"./_baseMap":109,"./_baseSortBy":124,"./_baseUnary":127,"./_compareMultiple":141,"./identity":241}],115:[function(require,module,exports){var basePickBy=require("./_basePickBy"),hasIn=require("./hasIn"); | |
| /** | |
| * The base implementation of `_.pick` without support for individual | |
| * property identifiers. | |
| * | |
| * @private | |
| * @param {Object} object The source object. | |
| * @param {string[]} paths The property paths to pick. | |
| * @returns {Object} Returns the new object. | |
| */function basePick(object,paths){return basePickBy(object,paths,function(value,path){return hasIn(object,path)})}module.exports=basePick},{"./_basePickBy":116,"./hasIn":240}],116:[function(require,module,exports){var baseGet=require("./_baseGet"),baseSet=require("./_baseSet"),castPath=require("./_castPath"); | |
| /** | |
| * The base implementation of `_.pickBy` without support for iteratee shorthands. | |
| * | |
| * @private | |
| * @param {Object} object The source object. | |
| * @param {string[]} paths The property paths to pick. | |
| * @param {Function} predicate The function invoked per property. | |
| * @returns {Object} Returns the new object. | |
| */function basePickBy(object,paths,predicate){var index=-1,length=paths.length,result={};while(++index<length){var path=paths[index],value=baseGet(object,path);if(predicate(value,path)){baseSet(result,castPath(path,object),value)}}return result}module.exports=basePickBy},{"./_baseGet":89,"./_baseSet":122,"./_castPath":133}],117:[function(require,module,exports){ | |
| /** | |
| * The base implementation of `_.property` without support for deep paths. | |
| * | |
| * @private | |
| * @param {string} key The key of the property to get. | |
| * @returns {Function} Returns the new accessor function. | |
| */ | |
| function baseProperty(key){return function(object){return object==null?undefined:object[key]}}module.exports=baseProperty},{}],118:[function(require,module,exports){var baseGet=require("./_baseGet"); | |
| /** | |
| * A specialized version of `baseProperty` which supports deep paths. | |
| * | |
| * @private | |
| * @param {Array|string} path The path of the property to get. | |
| * @returns {Function} Returns the new accessor function. | |
| */function basePropertyDeep(path){return function(object){return baseGet(object,path)}}module.exports=basePropertyDeep},{"./_baseGet":89}],119:[function(require,module,exports){ | |
| /* Built-in method references for those with the same name as other `lodash` methods. */ | |
| var nativeCeil=Math.ceil,nativeMax=Math.max; | |
| /** | |
| * The base implementation of `_.range` and `_.rangeRight` which doesn't | |
| * coerce arguments. | |
| * | |
| * @private | |
| * @param {number} start The start of the range. | |
| * @param {number} end The end of the range. | |
| * @param {number} step The value to increment or decrement by. | |
| * @param {boolean} [fromRight] Specify iterating from right to left. | |
| * @returns {Array} Returns the range of numbers. | |
| */function baseRange(start,end,step,fromRight){var index=-1,length=nativeMax(nativeCeil((end-start)/(step||1)),0),result=Array(length);while(length--){result[fromRight?length:++index]=start;start+=step}return result}module.exports=baseRange},{}],120:[function(require,module,exports){ | |
| /** | |
| * The base implementation of `_.reduce` and `_.reduceRight`, without support | |
| * for iteratee shorthands, which iterates over `collection` using `eachFunc`. | |
| * | |
| * @private | |
| * @param {Array|Object} collection The collection to iterate over. | |
| * @param {Function} iteratee The function invoked per iteration. | |
| * @param {*} accumulator The initial value. | |
| * @param {boolean} initAccum Specify using the first or last element of | |
| * `collection` as the initial value. | |
| * @param {Function} eachFunc The function to iterate over `collection`. | |
| * @returns {*} Returns the accumulated value. | |
| */ | |
| function baseReduce(collection,iteratee,accumulator,initAccum,eachFunc){eachFunc(collection,function(value,index,collection){accumulator=initAccum?(initAccum=false,value):iteratee(accumulator,value,index,collection)});return accumulator}module.exports=baseReduce},{}],121:[function(require,module,exports){var identity=require("./identity"),overRest=require("./_overRest"),setToString=require("./_setToString"); | |
| /** | |
| * The base implementation of `_.rest` which doesn't validate or coerce arguments. | |
| * | |
| * @private | |
| * @param {Function} func The function to apply a rest parameter to. | |
| * @param {number} [start=func.length-1] The start position of the rest parameter. | |
| * @returns {Function} Returns the new function. | |
| */function baseRest(func,start){return setToString(overRest(func,start,identity),func+"")}module.exports=baseRest},{"./_overRest":207,"./_setToString":213,"./identity":241}],122:[function(require,module,exports){var assignValue=require("./_assignValue"),castPath=require("./_castPath"),isIndex=require("./_isIndex"),isObject=require("./isObject"),toKey=require("./_toKey"); | |
| /** | |
| * The base implementation of `_.set`. | |
| * | |
| * @private | |
| * @param {Object} object The object to modify. | |
| * @param {Array|string} path The path of the property to set. | |
| * @param {*} value The value to set. | |
| * @param {Function} [customizer] The function to customize path creation. | |
| * @returns {Object} Returns `object`. | |
| */function baseSet(object,path,value,customizer){if(!isObject(object)){return object}path=castPath(path,object);var index=-1,length=path.length,lastIndex=length-1,nested=object;while(nested!=null&&++index<length){var key=toKey(path[index]),newValue=value;if(index!=lastIndex){var objValue=nested[key];newValue=customizer?customizer(objValue,key,nested):undefined;if(newValue===undefined){newValue=isObject(objValue)?objValue:isIndex(path[index+1])?[]:{}}}assignValue(nested,key,newValue);nested=nested[key]}return object}module.exports=baseSet},{"./_assignValue":75,"./_castPath":133,"./_isIndex":181,"./_toKey":223,"./isObject":251}],123:[function(require,module,exports){var constant=require("./constant"),defineProperty=require("./_defineProperty"),identity=require("./identity"); | |
| /** | |
| * The base implementation of `setToString` without support for hot loop shorting. | |
| * | |
| * @private | |
| * @param {Function} func The function to modify. | |
| * @param {Function} string The `toString` result. | |
| * @returns {Function} Returns `func`. | |
| */var baseSetToString=!defineProperty?identity:function(func,string){return defineProperty(func,"toString",{configurable:true,enumerable:false,value:constant(string),writable:true})};module.exports=baseSetToString},{"./_defineProperty":153,"./constant":228,"./identity":241}],124:[function(require,module,exports){ | |
| /** | |
| * The base implementation of `_.sortBy` which uses `comparer` to define the | |
| * sort order of `array` and replaces criteria objects with their corresponding | |
| * values. | |
| * | |
| * @private | |
| * @param {Array} array The array to sort. | |
| * @param {Function} comparer The function to define sort order. | |
| * @returns {Array} Returns `array`. | |
| */ | |
| function baseSortBy(array,comparer){var length=array.length;array.sort(comparer);while(length--){array[length]=array[length].value}return array}module.exports=baseSortBy},{}],125:[function(require,module,exports){ | |
| /** | |
| * The base implementation of `_.times` without support for iteratee shorthands | |
| * or max array length checks. | |
| * | |
| * @private | |
| * @param {number} n The number of times to invoke `iteratee`. | |
| * @param {Function} iteratee The function invoked per iteration. | |
| * @returns {Array} Returns the array of results. | |
| */ | |
| function baseTimes(n,iteratee){var index=-1,result=Array(n);while(++index<n){result[index]=iteratee(index)}return result}module.exports=baseTimes},{}],126:[function(require,module,exports){var Symbol=require("./_Symbol"),arrayMap=require("./_arrayMap"),isArray=require("./isArray"),isSymbol=require("./isSymbol"); | |
| /** Used as references for various `Number` constants. */var INFINITY=1/0; | |
| /** Used to convert symbols to primitives and strings. */var symbolProto=Symbol?Symbol.prototype:undefined,symbolToString=symbolProto?symbolProto.toString:undefined; | |
| /** | |
| * The base implementation of `_.toString` which doesn't convert nullish | |
| * values to empty strings. | |
| * | |
| * @private | |
| * @param {*} value The value to process. | |
| * @returns {string} Returns the string. | |
| */function baseToString(value){ | |
| // Exit early for strings to avoid a performance hit in some environments. | |
| if(typeof value=="string"){return value}if(isArray(value)){ | |
| // Recursively convert values (susceptible to call stack limits). | |
| return arrayMap(value,baseToString)+""}if(isSymbol(value)){return symbolToString?symbolToString.call(value):""}var result=value+"";return result=="0"&&1/value==-INFINITY?"-0":result}module.exports=baseToString},{"./_Symbol":60,"./_arrayMap":69,"./isArray":243,"./isSymbol":256}],127:[function(require,module,exports){ | |
| /** | |
| * The base implementation of `_.unary` without support for storing metadata. | |
| * | |
| * @private | |
| * @param {Function} func The function to cap arguments for. | |
| * @returns {Function} Returns the new capped function. | |
| */ | |
| function baseUnary(func){return function(value){return func(value)}}module.exports=baseUnary},{}],128:[function(require,module,exports){var SetCache=require("./_SetCache"),arrayIncludes=require("./_arrayIncludes"),arrayIncludesWith=require("./_arrayIncludesWith"),cacheHas=require("./_cacheHas"),createSet=require("./_createSet"),setToArray=require("./_setToArray"); | |
| /** Used as the size to enable large array optimizations. */var LARGE_ARRAY_SIZE=200; | |
| /** | |
| * The base implementation of `_.uniqBy` without support for iteratee shorthands. | |
| * | |
| * @private | |
| * @param {Array} array The array to inspect. | |
| * @param {Function} [iteratee] The iteratee invoked per element. | |
| * @param {Function} [comparator] The comparator invoked per element. | |
| * @returns {Array} Returns the new duplicate free array. | |
| */function baseUniq(array,iteratee,comparator){var index=-1,includes=arrayIncludes,length=array.length,isCommon=true,result=[],seen=result;if(comparator){isCommon=false;includes=arrayIncludesWith}else if(length>=LARGE_ARRAY_SIZE){var set=iteratee?null:createSet(array);if(set){return setToArray(set)}isCommon=false;includes=cacheHas;seen=new SetCache}else{seen=iteratee?[]:result}outer:while(++index<length){var value=array[index],computed=iteratee?iteratee(value):value;value=comparator||value!==0?value:0;if(isCommon&&computed===computed){var seenIndex=seen.length;while(seenIndex--){if(seen[seenIndex]===computed){continue outer}}if(iteratee){seen.push(computed)}result.push(value)}else if(!includes(seen,computed,comparator)){if(seen!==result){seen.push(computed)}result.push(value)}}return result}module.exports=baseUniq},{"./_SetCache":58,"./_arrayIncludes":66,"./_arrayIncludesWith":67,"./_cacheHas":131,"./_createSet":152,"./_setToArray":212}],129:[function(require,module,exports){var arrayMap=require("./_arrayMap"); | |
| /** | |
| * The base implementation of `_.values` and `_.valuesIn` which creates an | |
| * array of `object` property values corresponding to the property names | |
| * of `props`. | |
| * | |
| * @private | |
| * @param {Object} object The object to query. | |
| * @param {Array} props The property names to get values for. | |
| * @returns {Object} Returns the array of property values. | |
| */function baseValues(object,props){return arrayMap(props,function(key){return object[key]})}module.exports=baseValues},{"./_arrayMap":69}],130:[function(require,module,exports){ | |
| /** | |
| * This base implementation of `_.zipObject` which assigns values using `assignFunc`. | |
| * | |
| * @private | |
| * @param {Array} props The property identifiers. | |
| * @param {Array} values The property values. | |
| * @param {Function} assignFunc The function to assign values. | |
| * @returns {Object} Returns the new object. | |
| */ | |
| function baseZipObject(props,values,assignFunc){var index=-1,length=props.length,valsLength=values.length,result={};while(++index<length){var value=index<valsLength?values[index]:undefined;assignFunc(result,props[index],value)}return result}module.exports=baseZipObject},{}],131:[function(require,module,exports){ | |
| /** | |
| * Checks if a `cache` value for `key` exists. | |
| * | |
| * @private | |
| * @param {Object} cache The cache to query. | |
| * @param {string} key The key of the entry to check. | |
| * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | |
| */ | |
| function cacheHas(cache,key){return cache.has(key)}module.exports=cacheHas},{}],132:[function(require,module,exports){var identity=require("./identity"); | |
| /** | |
| * Casts `value` to `identity` if it's not a function. | |
| * | |
| * @private | |
| * @param {*} value The value to inspect. | |
| * @returns {Function} Returns cast function. | |
| */function castFunction(value){return typeof value=="function"?value:identity}module.exports=castFunction},{"./identity":241}],133:[function(require,module,exports){var isArray=require("./isArray"),isKey=require("./_isKey"),stringToPath=require("./_stringToPath"),toString=require("./toString"); | |
| /** | |
| * Casts `value` to a path array if it's not one. | |
| * | |
| * @private | |
| * @param {*} value The value to inspect. | |
| * @param {Object} [object] The object to query keys on. | |
| * @returns {Array} Returns the cast property path array. | |
| */function castPath(value,object){if(isArray(value)){return value}return isKey(value,object)?[value]:stringToPath(toString(value))}module.exports=castPath},{"./_isKey":183,"./_stringToPath":222,"./isArray":243,"./toString":283}],134:[function(require,module,exports){var Uint8Array=require("./_Uint8Array"); | |
| /** | |
| * Creates a clone of `arrayBuffer`. | |
| * | |
| * @private | |
| * @param {ArrayBuffer} arrayBuffer The array buffer to clone. | |
| * @returns {ArrayBuffer} Returns the cloned array buffer. | |
| */function cloneArrayBuffer(arrayBuffer){var result=new arrayBuffer.constructor(arrayBuffer.byteLength);new Uint8Array(result).set(new Uint8Array(arrayBuffer));return result}module.exports=cloneArrayBuffer},{"./_Uint8Array":61}],135:[function(require,module,exports){var root=require("./_root"); | |
| /** Detect free variable `exports`. */var freeExports=typeof exports=="object"&&exports&&!exports.nodeType&&exports; | |
| /** Detect free variable `module`. */var freeModule=freeExports&&typeof module=="object"&&module&&!module.nodeType&&module; | |
| /** Detect the popular CommonJS extension `module.exports`. */var moduleExports=freeModule&&freeModule.exports===freeExports; | |
| /** Built-in value references. */var Buffer=moduleExports?root.Buffer:undefined,allocUnsafe=Buffer?Buffer.allocUnsafe:undefined; | |
| /** | |
| * Creates a clone of `buffer`. | |
| * | |
| * @private | |
| * @param {Buffer} buffer The buffer to clone. | |
| * @param {boolean} [isDeep] Specify a deep clone. | |
| * @returns {Buffer} Returns the cloned buffer. | |
| */function cloneBuffer(buffer,isDeep){if(isDeep){return buffer.slice()}var length=buffer.length,result=allocUnsafe?allocUnsafe(length):new buffer.constructor(length);buffer.copy(result);return result}module.exports=cloneBuffer},{"./_root":208}],136:[function(require,module,exports){var cloneArrayBuffer=require("./_cloneArrayBuffer"); | |
| /** | |
| * Creates a clone of `dataView`. | |
| * | |
| * @private | |
| * @param {Object} dataView The data view to clone. | |
| * @param {boolean} [isDeep] Specify a deep clone. | |
| * @returns {Object} Returns the cloned data view. | |
| */function cloneDataView(dataView,isDeep){var buffer=isDeep?cloneArrayBuffer(dataView.buffer):dataView.buffer;return new dataView.constructor(buffer,dataView.byteOffset,dataView.byteLength)}module.exports=cloneDataView},{"./_cloneArrayBuffer":134}],137:[function(require,module,exports){ | |
| /** Used to match `RegExp` flags from their coerced string values. */ | |
| var reFlags=/\w*$/; | |
| /** | |
| * Creates a clone of `regexp`. | |
| * | |
| * @private | |
| * @param {Object} regexp The regexp to clone. | |
| * @returns {Object} Returns the cloned regexp. | |
| */function cloneRegExp(regexp){var result=new regexp.constructor(regexp.source,reFlags.exec(regexp));result.lastIndex=regexp.lastIndex;return result}module.exports=cloneRegExp},{}],138:[function(require,module,exports){var Symbol=require("./_Symbol"); | |
| /** Used to convert symbols to primitives and strings. */var symbolProto=Symbol?Symbol.prototype:undefined,symbolValueOf=symbolProto?symbolProto.valueOf:undefined; | |
| /** | |
| * Creates a clone of the `symbol` object. | |
| * | |
| * @private | |
| * @param {Object} symbol The symbol object to clone. | |
| * @returns {Object} Returns the cloned symbol object. | |
| */function cloneSymbol(symbol){return symbolValueOf?Object(symbolValueOf.call(symbol)):{}}module.exports=cloneSymbol},{"./_Symbol":60}],139:[function(require,module,exports){var cloneArrayBuffer=require("./_cloneArrayBuffer"); | |
| /** | |
| * Creates a clone of `typedArray`. | |
| * | |
| * @private | |
| * @param {Object} typedArray The typed array to clone. | |
| * @param {boolean} [isDeep] Specify a deep clone. | |
| * @returns {Object} Returns the cloned typed array. | |
| */function cloneTypedArray(typedArray,isDeep){var buffer=isDeep?cloneArrayBuffer(typedArray.buffer):typedArray.buffer;return new typedArray.constructor(buffer,typedArray.byteOffset,typedArray.length)}module.exports=cloneTypedArray},{"./_cloneArrayBuffer":134}],140:[function(require,module,exports){var isSymbol=require("./isSymbol"); | |
| /** | |
| * Compares values to sort them in ascending order. | |
| * | |
| * @private | |
| * @param {*} value The value to compare. | |
| * @param {*} other The other value to compare. | |
| * @returns {number} Returns the sort order indicator for `value`. | |
| */function compareAscending(value,other){if(value!==other){var valIsDefined=value!==undefined,valIsNull=value===null,valIsReflexive=value===value,valIsSymbol=isSymbol(value);var othIsDefined=other!==undefined,othIsNull=other===null,othIsReflexive=other===other,othIsSymbol=isSymbol(other);if(!othIsNull&&!othIsSymbol&&!valIsSymbol&&value>other||valIsSymbol&&othIsDefined&&othIsReflexive&&!othIsNull&&!othIsSymbol||valIsNull&&othIsDefined&&othIsReflexive||!valIsDefined&&othIsReflexive||!valIsReflexive){return 1}if(!valIsNull&&!valIsSymbol&&!othIsSymbol&&value<other||othIsSymbol&&valIsDefined&&valIsReflexive&&!valIsNull&&!valIsSymbol||othIsNull&&valIsDefined&&valIsReflexive||!othIsDefined&&valIsReflexive||!othIsReflexive){return-1}}return 0}module.exports=compareAscending},{"./isSymbol":256}],141:[function(require,module,exports){var compareAscending=require("./_compareAscending"); | |
| /** | |
| * Used by `_.orderBy` to compare multiple properties of a value to another | |
| * and stable sort them. | |
| * | |
| * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, | |
| * specify an order of "desc" for descending or "asc" for ascending sort order | |
| * of corresponding values. | |
| * | |
| * @private | |
| * @param {Object} object The object to compare. | |
| * @param {Object} other The other object to compare. | |
| * @param {boolean[]|string[]} orders The order to sort by for each property. | |
| * @returns {number} Returns the sort order indicator for `object`. | |
| */function compareMultiple(object,other,orders){var index=-1,objCriteria=object.criteria,othCriteria=other.criteria,length=objCriteria.length,ordersLength=orders.length;while(++index<length){var result=compareAscending(objCriteria[index],othCriteria[index]);if(result){if(index>=ordersLength){return result}var order=orders[index];return result*(order=="desc"?-1:1)}} | |
| // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications | |
| // that causes it, under certain circumstances, to provide the same value for | |
| // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 | |
| // for more details. | |
| // | |
| // This also ensures a stable sort in V8 and other engines. | |
| // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. | |
| return object.index-other.index}module.exports=compareMultiple},{"./_compareAscending":140}],142:[function(require,module,exports){ | |
| /** | |
| * Copies the values of `source` to `array`. | |
| * | |
| * @private | |
| * @param {Array} source The array to copy values from. | |
| * @param {Array} [array=[]] The array to copy values to. | |
| * @returns {Array} Returns `array`. | |
| */ | |
| function copyArray(source,array){var index=-1,length=source.length;array||(array=Array(length));while(++index<length){array[index]=source[index]}return array}module.exports=copyArray},{}],143:[function(require,module,exports){var assignValue=require("./_assignValue"),baseAssignValue=require("./_baseAssignValue"); | |
| /** | |
| * Copies properties of `source` to `object`. | |
| * | |
| * @private | |
| * @param {Object} source The object to copy properties from. | |
| * @param {Array} props The property identifiers to copy. | |
| * @param {Object} [object={}] The object to copy properties to. | |
| * @param {Function} [customizer] The function to customize copied values. | |
| * @returns {Object} Returns `object`. | |
| */function copyObject(source,props,object,customizer){var isNew=!object;object||(object={});var index=-1,length=props.length;while(++index<length){var key=props[index];var newValue=customizer?customizer(object[key],source[key],key,object,source):undefined;if(newValue===undefined){newValue=source[key]}if(isNew){baseAssignValue(object,key,newValue)}else{assignValue(object,key,newValue)}}return object}module.exports=copyObject},{"./_assignValue":75,"./_baseAssignValue":79}],144:[function(require,module,exports){var copyObject=require("./_copyObject"),getSymbols=require("./_getSymbols"); | |
| /** | |
| * Copies own symbols of `source` to `object`. | |
| * | |
| * @private | |
| * @param {Object} source The object to copy symbols from. | |
| * @param {Object} [object={}] The object to copy symbols to. | |
| * @returns {Object} Returns `object`. | |
| */function copySymbols(source,object){return copyObject(source,getSymbols(source),object)}module.exports=copySymbols},{"./_copyObject":143,"./_getSymbols":166}],145:[function(require,module,exports){var copyObject=require("./_copyObject"),getSymbolsIn=require("./_getSymbolsIn"); | |
| /** | |
| * Copies own and inherited symbols of `source` to `object`. | |
| * | |
| * @private | |
| * @param {Object} source The object to copy symbols from. | |
| * @param {Object} [object={}] The object to copy symbols to. | |
| * @returns {Object} Returns `object`. | |
| */function copySymbolsIn(source,object){return copyObject(source,getSymbolsIn(source),object)}module.exports=copySymbolsIn},{"./_copyObject":143,"./_getSymbolsIn":167}],146:[function(require,module,exports){var root=require("./_root"); | |
| /** Used to detect overreaching core-js shims. */var coreJsData=root["__core-js_shared__"];module.exports=coreJsData},{"./_root":208}],147:[function(require,module,exports){var baseRest=require("./_baseRest"),isIterateeCall=require("./_isIterateeCall"); | |
| /** | |
| * Creates a function like `_.assign`. | |
| * | |
| * @private | |
| * @param {Function} assigner The function to assign values. | |
| * @returns {Function} Returns the new assigner function. | |
| */function createAssigner(assigner){return baseRest(function(object,sources){var index=-1,length=sources.length,customizer=length>1?sources[length-1]:undefined,guard=length>2?sources[2]:undefined;customizer=assigner.length>3&&typeof customizer=="function"?(length--,customizer):undefined;if(guard&&isIterateeCall(sources[0],sources[1],guard)){customizer=length<3?undefined:customizer;length=1}object=Object(object);while(++index<length){var source=sources[index];if(source){assigner(object,source,index,customizer)}}return object})}module.exports=createAssigner},{"./_baseRest":121,"./_isIterateeCall":182}],148:[function(require,module,exports){var isArrayLike=require("./isArrayLike"); | |
| /** | |
| * Creates a `baseEach` or `baseEachRight` function. | |
| * | |
| * @private | |
| * @param {Function} eachFunc The function to iterate over a collection. | |
| * @param {boolean} [fromRight] Specify iterating from right to left. | |
| * @returns {Function} Returns the new base function. | |
| */function createBaseEach(eachFunc,fromRight){return function(collection,iteratee){if(collection==null){return collection}if(!isArrayLike(collection)){return eachFunc(collection,iteratee)}var length=collection.length,index=fromRight?length:-1,iterable=Object(collection);while(fromRight?index--:++index<length){if(iteratee(iterable[index],index,iterable)===false){break}}return collection}}module.exports=createBaseEach},{"./isArrayLike":244}],149:[function(require,module,exports){ | |
| /** | |
| * Creates a base function for methods like `_.forIn` and `_.forOwn`. | |
| * | |
| * @private | |
| * @param {boolean} [fromRight] Specify iterating from right to left. | |
| * @returns {Function} Returns the new base function. | |
| */ | |
| function createBaseFor(fromRight){return function(object,iteratee,keysFunc){var index=-1,iterable=Object(object),props=keysFunc(object),length=props.length;while(length--){var key=props[fromRight?length:++index];if(iteratee(iterable[key],key,iterable)===false){break}}return object}}module.exports=createBaseFor},{}],150:[function(require,module,exports){var baseIteratee=require("./_baseIteratee"),isArrayLike=require("./isArrayLike"),keys=require("./keys"); | |
| /** | |
| * Creates a `_.find` or `_.findLast` function. | |
| * | |
| * @private | |
| * @param {Function} findIndexFunc The function to find the collection index. | |
| * @returns {Function} Returns the new find function. | |
| */function createFind(findIndexFunc){return function(collection,predicate,fromIndex){var iterable=Object(collection);if(!isArrayLike(collection)){var iteratee=baseIteratee(predicate,3);collection=keys(collection);predicate=function(key){return iteratee(iterable[key],key,iterable)}}var index=findIndexFunc(collection,predicate,fromIndex);return index>-1?iterable[iteratee?collection[index]:index]:undefined}}module.exports=createFind},{"./_baseIteratee":105,"./isArrayLike":244,"./keys":259}],151:[function(require,module,exports){var baseRange=require("./_baseRange"),isIterateeCall=require("./_isIterateeCall"),toFinite=require("./toFinite"); | |
| /** | |
| * Creates a `_.range` or `_.rangeRight` function. | |
| * | |
| * @private | |
| * @param {boolean} [fromRight] Specify iterating from right to left. | |
| * @returns {Function} Returns the new range function. | |
| */function createRange(fromRight){return function(start,end,step){if(step&&typeof step!="number"&&isIterateeCall(start,end,step)){end=step=undefined} | |
| // Ensure the sign of `-0` is preserved. | |
| start=toFinite(start);if(end===undefined){end=start;start=0}else{end=toFinite(end)}step=step===undefined?start<end?1:-1:toFinite(step);return baseRange(start,end,step,fromRight)}}module.exports=createRange},{"./_baseRange":119,"./_isIterateeCall":182,"./toFinite":279}],152:[function(require,module,exports){var Set=require("./_Set"),noop=require("./noop"),setToArray=require("./_setToArray"); | |
| /** Used as references for various `Number` constants. */var INFINITY=1/0; | |
| /** | |
| * Creates a set object of `values`. | |
| * | |
| * @private | |
| * @param {Array} values The values to add to the set. | |
| * @returns {Object} Returns the new set. | |
| */var createSet=!(Set&&1/setToArray(new Set([,-0]))[1]==INFINITY)?noop:function(values){return new Set(values)};module.exports=createSet},{"./_Set":57,"./_setToArray":212,"./noop":269}],153:[function(require,module,exports){var getNative=require("./_getNative");var defineProperty=function(){try{var func=getNative(Object,"defineProperty");func({},"",{});return func}catch(e){}}();module.exports=defineProperty},{"./_getNative":163}],154:[function(require,module,exports){var SetCache=require("./_SetCache"),arraySome=require("./_arraySome"),cacheHas=require("./_cacheHas"); | |
| /** Used to compose bitmasks for value comparisons. */var COMPARE_PARTIAL_FLAG=1,COMPARE_UNORDERED_FLAG=2; | |
| /** | |
| * A specialized version of `baseIsEqualDeep` for arrays with support for | |
| * partial deep comparisons. | |
| * | |
| * @private | |
| * @param {Array} array The array to compare. | |
| * @param {Array} other The other array to compare. | |
| * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. | |
| * @param {Function} customizer The function to customize comparisons. | |
| * @param {Function} equalFunc The function to determine equivalents of values. | |
| * @param {Object} stack Tracks traversed `array` and `other` objects. | |
| * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. | |
| */function equalArrays(array,other,bitmask,customizer,equalFunc,stack){var isPartial=bitmask&COMPARE_PARTIAL_FLAG,arrLength=array.length,othLength=other.length;if(arrLength!=othLength&&!(isPartial&&othLength>arrLength)){return false} | |
| // Assume cyclic values are equal. | |
| var stacked=stack.get(array);if(stacked&&stack.get(other)){return stacked==other}var index=-1,result=true,seen=bitmask&COMPARE_UNORDERED_FLAG?new SetCache:undefined;stack.set(array,other);stack.set(other,array); | |
| // Ignore non-index properties. | |
| while(++index<arrLength){var arrValue=array[index],othValue=other[index];if(customizer){var compared=isPartial?customizer(othValue,arrValue,index,other,array,stack):customizer(arrValue,othValue,index,array,other,stack)}if(compared!==undefined){if(compared){continue}result=false;break} | |
| // Recursively compare arrays (susceptible to call stack limits). | |
| if(seen){if(!arraySome(other,function(othValue,othIndex){if(!cacheHas(seen,othIndex)&&(arrValue===othValue||equalFunc(arrValue,othValue,bitmask,customizer,stack))){return seen.push(othIndex)}})){result=false;break}}else if(!(arrValue===othValue||equalFunc(arrValue,othValue,bitmask,customizer,stack))){result=false;break}}stack["delete"](array);stack["delete"](other);return result}module.exports=equalArrays},{"./_SetCache":58,"./_arraySome":72,"./_cacheHas":131}],155:[function(require,module,exports){var Symbol=require("./_Symbol"),Uint8Array=require("./_Uint8Array"),eq=require("./eq"),equalArrays=require("./_equalArrays"),mapToArray=require("./_mapToArray"),setToArray=require("./_setToArray"); | |
| /** Used to compose bitmasks for value comparisons. */var COMPARE_PARTIAL_FLAG=1,COMPARE_UNORDERED_FLAG=2; | |
| /** `Object#toString` result references. */var boolTag="[object Boolean]",dateTag="[object Date]",errorTag="[object Error]",mapTag="[object Map]",numberTag="[object Number]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",symbolTag="[object Symbol]";var arrayBufferTag="[object ArrayBuffer]",dataViewTag="[object DataView]"; | |
| /** Used to convert symbols to primitives and strings. */var symbolProto=Symbol?Symbol.prototype:undefined,symbolValueOf=symbolProto?symbolProto.valueOf:undefined; | |
| /** | |
| * A specialized version of `baseIsEqualDeep` for comparing objects of | |
| * the same `toStringTag`. | |
| * | |
| * **Note:** This function only supports comparing values with tags of | |
| * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. | |
| * | |
| * @private | |
| * @param {Object} object The object to compare. | |
| * @param {Object} other The other object to compare. | |
| * @param {string} tag The `toStringTag` of the objects to compare. | |
| * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. | |
| * @param {Function} customizer The function to customize comparisons. | |
| * @param {Function} equalFunc The function to determine equivalents of values. | |
| * @param {Object} stack Tracks traversed `object` and `other` objects. | |
| * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. | |
| */function equalByTag(object,other,tag,bitmask,customizer,equalFunc,stack){switch(tag){case dataViewTag:if(object.byteLength!=other.byteLength||object.byteOffset!=other.byteOffset){return false}object=object.buffer;other=other.buffer;case arrayBufferTag:if(object.byteLength!=other.byteLength||!equalFunc(new Uint8Array(object),new Uint8Array(other))){return false}return true;case boolTag:case dateTag:case numberTag: | |
| // Coerce booleans to `1` or `0` and dates to milliseconds. | |
| // Invalid dates are coerced to `NaN`. | |
| return eq(+object,+other);case errorTag:return object.name==other.name&&object.message==other.message;case regexpTag:case stringTag: | |
| // Coerce regexes to strings and treat strings, primitives and objects, | |
| // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring | |
| // for more details. | |
| return object==other+"";case mapTag:var convert=mapToArray;case setTag:var isPartial=bitmask&COMPARE_PARTIAL_FLAG;convert||(convert=setToArray);if(object.size!=other.size&&!isPartial){return false} | |
| // Assume cyclic values are equal. | |
| var stacked=stack.get(object);if(stacked){return stacked==other}bitmask|=COMPARE_UNORDERED_FLAG; | |
| // Recursively compare objects (susceptible to call stack limits). | |
| stack.set(object,other);var result=equalArrays(convert(object),convert(other),bitmask,customizer,equalFunc,stack);stack["delete"](object);return result;case symbolTag:if(symbolValueOf){return symbolValueOf.call(object)==symbolValueOf.call(other)}}return false}module.exports=equalByTag},{"./_Symbol":60,"./_Uint8Array":61,"./_equalArrays":154,"./_mapToArray":198,"./_setToArray":212,"./eq":231}],156:[function(require,module,exports){var getAllKeys=require("./_getAllKeys"); | |
| /** Used to compose bitmasks for value comparisons. */var COMPARE_PARTIAL_FLAG=1; | |
| /** Used for built-in method references. */var objectProto=Object.prototype; | |
| /** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty; | |
| /** | |
| * A specialized version of `baseIsEqualDeep` for objects with support for | |
| * partial deep comparisons. | |
| * | |
| * @private | |
| * @param {Object} object The object to compare. | |
| * @param {Object} other The other object to compare. | |
| * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. | |
| * @param {Function} customizer The function to customize comparisons. | |
| * @param {Function} equalFunc The function to determine equivalents of values. | |
| * @param {Object} stack Tracks traversed `object` and `other` objects. | |
| * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. | |
| */function equalObjects(object,other,bitmask,customizer,equalFunc,stack){var isPartial=bitmask&COMPARE_PARTIAL_FLAG,objProps=getAllKeys(object),objLength=objProps.length,othProps=getAllKeys(other),othLength=othProps.length;if(objLength!=othLength&&!isPartial){return false}var index=objLength;while(index--){var key=objProps[index];if(!(isPartial?key in other:hasOwnProperty.call(other,key))){return false}} | |
| // Assume cyclic values are equal. | |
| var stacked=stack.get(object);if(stacked&&stack.get(other)){return stacked==other}var result=true;stack.set(object,other);stack.set(other,object);var skipCtor=isPartial;while(++index<objLength){key=objProps[index];var objValue=object[key],othValue=other[key];if(customizer){var compared=isPartial?customizer(othValue,objValue,key,other,object,stack):customizer(objValue,othValue,key,object,other,stack)} | |
| // Recursively compare objects (susceptible to call stack limits). | |
| if(!(compared===undefined?objValue===othValue||equalFunc(objValue,othValue,bitmask,customizer,stack):compared)){result=false;break}skipCtor||(skipCtor=key=="constructor")}if(result&&!skipCtor){var objCtor=object.constructor,othCtor=other.constructor; | |
| // Non `Object` object instances with different constructors are not equal. | |
| if(objCtor!=othCtor&&("constructor"in object&&"constructor"in other)&&!(typeof objCtor=="function"&&objCtor instanceof objCtor&&typeof othCtor=="function"&&othCtor instanceof othCtor)){result=false}}stack["delete"](object);stack["delete"](other);return result}module.exports=equalObjects},{"./_getAllKeys":159}],157:[function(require,module,exports){var flatten=require("./flatten"),overRest=require("./_overRest"),setToString=require("./_setToString"); | |
| /** | |
| * A specialized version of `baseRest` which flattens the rest array. | |
| * | |
| * @private | |
| * @param {Function} func The function to apply a rest parameter to. | |
| * @returns {Function} Returns the new function. | |
| */function flatRest(func){return setToString(overRest(func,undefined,flatten),func+"")}module.exports=flatRest},{"./_overRest":207,"./_setToString":213,"./flatten":235}],158:[function(require,module,exports){(function(global){ | |
| /** Detect free variable `global` from Node.js. */ | |
| var freeGlobal=typeof global=="object"&&global&&global.Object===Object&&global;module.exports=freeGlobal}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],159:[function(require,module,exports){var baseGetAllKeys=require("./_baseGetAllKeys"),getSymbols=require("./_getSymbols"),keys=require("./keys"); | |
| /** | |
| * Creates an array of own enumerable property names and symbols of `object`. | |
| * | |
| * @private | |
| * @param {Object} object The object to query. | |
| * @returns {Array} Returns the array of property names and symbols. | |
| */function getAllKeys(object){return baseGetAllKeys(object,keys,getSymbols)}module.exports=getAllKeys},{"./_baseGetAllKeys":90,"./_getSymbols":166,"./keys":259}],160:[function(require,module,exports){var baseGetAllKeys=require("./_baseGetAllKeys"),getSymbolsIn=require("./_getSymbolsIn"),keysIn=require("./keysIn"); | |
| /** | |
| * Creates an array of own and inherited enumerable property names and | |
| * symbols of `object`. | |
| * | |
| * @private | |
| * @param {Object} object The object to query. | |
| * @returns {Array} Returns the array of property names and symbols. | |
| */function getAllKeysIn(object){return baseGetAllKeys(object,keysIn,getSymbolsIn)}module.exports=getAllKeysIn},{"./_baseGetAllKeys":90,"./_getSymbolsIn":167,"./keysIn":260}],161:[function(require,module,exports){var isKeyable=require("./_isKeyable"); | |
| /** | |
| * Gets the data for `map`. | |
| * | |
| * @private | |
| * @param {Object} map The map to query. | |
| * @param {string} key The reference key. | |
| * @returns {*} Returns the map data. | |
| */function getMapData(map,key){var data=map.__data__;return isKeyable(key)?data[typeof key=="string"?"string":"hash"]:data.map}module.exports=getMapData},{"./_isKeyable":184}],162:[function(require,module,exports){var isStrictComparable=require("./_isStrictComparable"),keys=require("./keys"); | |
| /** | |
| * Gets the property names, values, and compare flags of `object`. | |
| * | |
| * @private | |
| * @param {Object} object The object to query. | |
| * @returns {Array} Returns the match data of `object`. | |
| */function getMatchData(object){var result=keys(object),length=result.length;while(length--){var key=result[length],value=object[key];result[length]=[key,value,isStrictComparable(value)]}return result}module.exports=getMatchData},{"./_isStrictComparable":187,"./keys":259}],163:[function(require,module,exports){var baseIsNative=require("./_baseIsNative"),getValue=require("./_getValue"); | |
| /** | |
| * Gets the native function at `key` of `object`. | |
| * | |
| * @private | |
| * @param {Object} object The object to query. | |
| * @param {string} key The key of the method to get. | |
| * @returns {*} Returns the function if it's native, else `undefined`. | |
| */function getNative(object,key){var value=getValue(object,key);return baseIsNative(value)?value:undefined}module.exports=getNative},{"./_baseIsNative":102,"./_getValue":169}],164:[function(require,module,exports){var overArg=require("./_overArg"); | |
| /** Built-in value references. */var getPrototype=overArg(Object.getPrototypeOf,Object);module.exports=getPrototype},{"./_overArg":206}],165:[function(require,module,exports){var Symbol=require("./_Symbol"); | |
| /** Used for built-in method references. */var objectProto=Object.prototype; | |
| /** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty; | |
| /** | |
| * Used to resolve the | |
| * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) | |
| * of values. | |
| */var nativeObjectToString=objectProto.toString; | |
| /** Built-in value references. */var symToStringTag=Symbol?Symbol.toStringTag:undefined; | |
| /** | |
| * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. | |
| * | |
| * @private | |
| * @param {*} value The value to query. | |
| * @returns {string} Returns the raw `toStringTag`. | |
| */function getRawTag(value){var isOwn=hasOwnProperty.call(value,symToStringTag),tag=value[symToStringTag];try{value[symToStringTag]=undefined;var unmasked=true}catch(e){}var result=nativeObjectToString.call(value);if(unmasked){if(isOwn){value[symToStringTag]=tag}else{delete value[symToStringTag]}}return result}module.exports=getRawTag},{"./_Symbol":60}],166:[function(require,module,exports){var arrayFilter=require("./_arrayFilter"),stubArray=require("./stubArray"); | |
| /** Used for built-in method references. */var objectProto=Object.prototype; | |
| /** Built-in value references. */var propertyIsEnumerable=objectProto.propertyIsEnumerable; | |
| /* Built-in method references for those with the same name as other `lodash` methods. */var nativeGetSymbols=Object.getOwnPropertySymbols; | |
| /** | |
| * Creates an array of the own enumerable symbols of `object`. | |
| * | |
| * @private | |
| * @param {Object} object The object to query. | |
| * @returns {Array} Returns the array of symbols. | |
| */var getSymbols=!nativeGetSymbols?stubArray:function(object){if(object==null){return[]}object=Object(object);return arrayFilter(nativeGetSymbols(object),function(symbol){return propertyIsEnumerable.call(object,symbol)})};module.exports=getSymbols},{"./_arrayFilter":65,"./stubArray":277}],167:[function(require,module,exports){var arrayPush=require("./_arrayPush"),getPrototype=require("./_getPrototype"),getSymbols=require("./_getSymbols"),stubArray=require("./stubArray"); | |
| /* Built-in method references for those with the same name as other `lodash` methods. */var nativeGetSymbols=Object.getOwnPropertySymbols; | |
| /** | |
| * Creates an array of the own and inherited enumerable symbols of `object`. | |
| * | |
| * @private | |
| * @param {Object} object The object to query. | |
| * @returns {Array} Returns the array of symbols. | |
| */var getSymbolsIn=!nativeGetSymbols?stubArray:function(object){var result=[];while(object){arrayPush(result,getSymbols(object));object=getPrototype(object)}return result};module.exports=getSymbolsIn},{"./_arrayPush":70,"./_getPrototype":164,"./_getSymbols":166,"./stubArray":277}],168:[function(require,module,exports){var DataView=require("./_DataView"),Map=require("./_Map"),Promise=require("./_Promise"),Set=require("./_Set"),WeakMap=require("./_WeakMap"),baseGetTag=require("./_baseGetTag"),toSource=require("./_toSource"); | |
| /** `Object#toString` result references. */var mapTag="[object Map]",objectTag="[object Object]",promiseTag="[object Promise]",setTag="[object Set]",weakMapTag="[object WeakMap]";var dataViewTag="[object DataView]"; | |
| /** Used to detect maps, sets, and weakmaps. */var dataViewCtorString=toSource(DataView),mapCtorString=toSource(Map),promiseCtorString=toSource(Promise),setCtorString=toSource(Set),weakMapCtorString=toSource(WeakMap); | |
| /** | |
| * Gets the `toStringTag` of `value`. | |
| * | |
| * @private | |
| * @param {*} value The value to query. | |
| * @returns {string} Returns the `toStringTag`. | |
| */var getTag=baseGetTag; | |
| // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. | |
| if(DataView&&getTag(new DataView(new ArrayBuffer(1)))!=dataViewTag||Map&&getTag(new Map)!=mapTag||Promise&&getTag(Promise.resolve())!=promiseTag||Set&&getTag(new Set)!=setTag||WeakMap&&getTag(new WeakMap)!=weakMapTag){getTag=function(value){var result=baseGetTag(value),Ctor=result==objectTag?value.constructor:undefined,ctorString=Ctor?toSource(Ctor):"";if(ctorString){switch(ctorString){case dataViewCtorString:return dataViewTag;case mapCtorString:return mapTag;case promiseCtorString:return promiseTag;case setCtorString:return setTag;case weakMapCtorString:return weakMapTag}}return result}}module.exports=getTag},{"./_DataView":51,"./_Map":54,"./_Promise":56,"./_Set":57,"./_WeakMap":62,"./_baseGetTag":91,"./_toSource":224}],169:[function(require,module,exports){ | |
| /** | |
| * Gets the value at `key` of `object`. | |
| * | |
| * @private | |
| * @param {Object} [object] The object to query. | |
| * @param {string} key The key of the property to get. | |
| * @returns {*} Returns the property value. | |
| */ | |
| function getValue(object,key){return object==null?undefined:object[key]}module.exports=getValue},{}],170:[function(require,module,exports){var castPath=require("./_castPath"),isArguments=require("./isArguments"),isArray=require("./isArray"),isIndex=require("./_isIndex"),isLength=require("./isLength"),toKey=require("./_toKey"); | |
| /** | |
| * Checks if `path` exists on `object`. | |
| * | |
| * @private | |
| * @param {Object} object The object to query. | |
| * @param {Array|string} path The path to check. | |
| * @param {Function} hasFunc The function to check properties. | |
| * @returns {boolean} Returns `true` if `path` exists, else `false`. | |
| */function hasPath(object,path,hasFunc){path=castPath(path,object);var index=-1,length=path.length,result=false;while(++index<length){var key=toKey(path[index]);if(!(result=object!=null&&hasFunc(object,key))){break}object=object[key]}if(result||++index!=length){return result}length=object==null?0:object.length;return!!length&&isLength(length)&&isIndex(key,length)&&(isArray(object)||isArguments(object))}module.exports=hasPath},{"./_castPath":133,"./_isIndex":181,"./_toKey":223,"./isArguments":242,"./isArray":243,"./isLength":249}],171:[function(require,module,exports){ | |
| /** Used to compose unicode character classes. */ | |
| var rsAstralRange="\\ud800-\\udfff",rsComboMarksRange="\\u0300-\\u036f",reComboHalfMarksRange="\\ufe20-\\ufe2f",rsComboSymbolsRange="\\u20d0-\\u20ff",rsComboRange=rsComboMarksRange+reComboHalfMarksRange+rsComboSymbolsRange,rsVarRange="\\ufe0e\\ufe0f"; | |
| /** Used to compose unicode capture groups. */var rsZWJ="\\u200d"; | |
| /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */var reHasUnicode=RegExp("["+rsZWJ+rsAstralRange+rsComboRange+rsVarRange+"]"); | |
| /** | |
| * Checks if `string` contains Unicode symbols. | |
| * | |
| * @private | |
| * @param {string} string The string to inspect. | |
| * @returns {boolean} Returns `true` if a symbol is found, else `false`. | |
| */function hasUnicode(string){return reHasUnicode.test(string)}module.exports=hasUnicode},{}],172:[function(require,module,exports){var nativeCreate=require("./_nativeCreate"); | |
| /** | |
| * Removes all key-value entries from the hash. | |
| * | |
| * @private | |
| * @name clear | |
| * @memberOf Hash | |
| */function hashClear(){this.__data__=nativeCreate?nativeCreate(null):{};this.size=0}module.exports=hashClear},{"./_nativeCreate":201}],173:[function(require,module,exports){ | |
| /** | |
| * Removes `key` and its value from the hash. | |
| * | |
| * @private | |
| * @name delete | |
| * @memberOf Hash | |
| * @param {Object} hash The hash to modify. | |
| * @param {string} key The key of the value to remove. | |
| * @returns {boolean} Returns `true` if the entry was removed, else `false`. | |
| */ | |
| function hashDelete(key){var result=this.has(key)&&delete this.__data__[key];this.size-=result?1:0;return result}module.exports=hashDelete},{}],174:[function(require,module,exports){var nativeCreate=require("./_nativeCreate"); | |
| /** Used to stand-in for `undefined` hash values. */var HASH_UNDEFINED="__lodash_hash_undefined__"; | |
| /** Used for built-in method references. */var objectProto=Object.prototype; | |
| /** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty; | |
| /** | |
| * Gets the hash value for `key`. | |
| * | |
| * @private | |
| * @name get | |
| * @memberOf Hash | |
| * @param {string} key The key of the value to get. | |
| * @returns {*} Returns the entry value. | |
| */function hashGet(key){var data=this.__data__;if(nativeCreate){var result=data[key];return result===HASH_UNDEFINED?undefined:result}return hasOwnProperty.call(data,key)?data[key]:undefined}module.exports=hashGet},{"./_nativeCreate":201}],175:[function(require,module,exports){var nativeCreate=require("./_nativeCreate"); | |
| /** Used for built-in method references. */var objectProto=Object.prototype; | |
| /** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty; | |
| /** | |
| * Checks if a hash value for `key` exists. | |
| * | |
| * @private | |
| * @name has | |
| * @memberOf Hash | |
| * @param {string} key The key of the entry to check. | |
| * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | |
| */function hashHas(key){var data=this.__data__;return nativeCreate?data[key]!==undefined:hasOwnProperty.call(data,key)}module.exports=hashHas},{"./_nativeCreate":201}],176:[function(require,module,exports){var nativeCreate=require("./_nativeCreate"); | |
| /** Used to stand-in for `undefined` hash values. */var HASH_UNDEFINED="__lodash_hash_undefined__"; | |
| /** | |
| * Sets the hash `key` to `value`. | |
| * | |
| * @private | |
| * @name set | |
| * @memberOf Hash | |
| * @param {string} key The key of the value to set. | |
| * @param {*} value The value to set. | |
| * @returns {Object} Returns the hash instance. | |
| */function hashSet(key,value){var data=this.__data__;this.size+=this.has(key)?0:1;data[key]=nativeCreate&&value===undefined?HASH_UNDEFINED:value;return this}module.exports=hashSet},{"./_nativeCreate":201}],177:[function(require,module,exports){ | |
| /** Used for built-in method references. */ | |
| var objectProto=Object.prototype; | |
| /** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty; | |
| /** | |
| * Initializes an array clone. | |
| * | |
| * @private | |
| * @param {Array} array The array to clone. | |
| * @returns {Array} Returns the initialized clone. | |
| */function initCloneArray(array){var length=array.length,result=new array.constructor(length); | |
| // Add properties assigned by `RegExp#exec`. | |
| if(length&&typeof array[0]=="string"&&hasOwnProperty.call(array,"index")){result.index=array.index;result.input=array.input}return result}module.exports=initCloneArray},{}],178:[function(require,module,exports){var cloneArrayBuffer=require("./_cloneArrayBuffer"),cloneDataView=require("./_cloneDataView"),cloneRegExp=require("./_cloneRegExp"),cloneSymbol=require("./_cloneSymbol"),cloneTypedArray=require("./_cloneTypedArray"); | |
| /** `Object#toString` result references. */var boolTag="[object Boolean]",dateTag="[object Date]",mapTag="[object Map]",numberTag="[object Number]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",symbolTag="[object Symbol]";var arrayBufferTag="[object ArrayBuffer]",dataViewTag="[object DataView]",float32Tag="[object Float32Array]",float64Tag="[object Float64Array]",int8Tag="[object Int8Array]",int16Tag="[object Int16Array]",int32Tag="[object Int32Array]",uint8Tag="[object Uint8Array]",uint8ClampedTag="[object Uint8ClampedArray]",uint16Tag="[object Uint16Array]",uint32Tag="[object Uint32Array]"; | |
| /** | |
| * Initializes an object clone based on its `toStringTag`. | |
| * | |
| * **Note:** This function only supports cloning values with tags of | |
| * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. | |
| * | |
| * @private | |
| * @param {Object} object The object to clone. | |
| * @param {string} tag The `toStringTag` of the object to clone. | |
| * @param {boolean} [isDeep] Specify a deep clone. | |
| * @returns {Object} Returns the initialized clone. | |
| */function initCloneByTag(object,tag,isDeep){var Ctor=object.constructor;switch(tag){case arrayBufferTag:return cloneArrayBuffer(object);case boolTag:case dateTag:return new Ctor(+object);case dataViewTag:return cloneDataView(object,isDeep);case float32Tag:case float64Tag:case int8Tag:case int16Tag:case int32Tag:case uint8Tag:case uint8ClampedTag:case uint16Tag:case uint32Tag:return cloneTypedArray(object,isDeep);case mapTag:return new Ctor;case numberTag:case stringTag:return new Ctor(object);case regexpTag:return cloneRegExp(object);case setTag:return new Ctor;case symbolTag:return cloneSymbol(object)}}module.exports=initCloneByTag},{"./_cloneArrayBuffer":134,"./_cloneDataView":136,"./_cloneRegExp":137,"./_cloneSymbol":138,"./_cloneTypedArray":139}],179:[function(require,module,exports){var baseCreate=require("./_baseCreate"),getPrototype=require("./_getPrototype"),isPrototype=require("./_isPrototype"); | |
| /** | |
| * Initializes an object clone. | |
| * | |
| * @private | |
| * @param {Object} object The object to clone. | |
| * @returns {Object} Returns the initialized clone. | |
| */function initCloneObject(object){return typeof object.constructor=="function"&&!isPrototype(object)?baseCreate(getPrototype(object)):{}}module.exports=initCloneObject},{"./_baseCreate":81,"./_getPrototype":164,"./_isPrototype":186}],180:[function(require,module,exports){var Symbol=require("./_Symbol"),isArguments=require("./isArguments"),isArray=require("./isArray"); | |
| /** Built-in value references. */var spreadableSymbol=Symbol?Symbol.isConcatSpreadable:undefined; | |
| /** | |
| * Checks if `value` is a flattenable `arguments` object or array. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. | |
| */function isFlattenable(value){return isArray(value)||isArguments(value)||!!(spreadableSymbol&&value&&value[spreadableSymbol])}module.exports=isFlattenable},{"./_Symbol":60,"./isArguments":242,"./isArray":243}],181:[function(require,module,exports){ | |
| /** Used as references for various `Number` constants. */ | |
| var MAX_SAFE_INTEGER=9007199254740991; | |
| /** Used to detect unsigned integer values. */var reIsUint=/^(?:0|[1-9]\d*)$/; | |
| /** | |
| * Checks if `value` is a valid array-like index. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. | |
| * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. | |
| */function isIndex(value,length){var type=typeof value;length=length==null?MAX_SAFE_INTEGER:length;return!!length&&(type=="number"||type!="symbol"&&reIsUint.test(value))&&(value>-1&&value%1==0&&value<length)}module.exports=isIndex},{}],182:[function(require,module,exports){var eq=require("./eq"),isArrayLike=require("./isArrayLike"),isIndex=require("./_isIndex"),isObject=require("./isObject"); | |
| /** | |
| * Checks if the given arguments are from an iteratee call. | |
| * | |
| * @private | |
| * @param {*} value The potential iteratee value argument. | |
| * @param {*} index The potential iteratee index or key argument. | |
| * @param {*} object The potential iteratee object argument. | |
| * @returns {boolean} Returns `true` if the arguments are from an iteratee call, | |
| * else `false`. | |
| */function isIterateeCall(value,index,object){if(!isObject(object)){return false}var type=typeof index;if(type=="number"?isArrayLike(object)&&isIndex(index,object.length):type=="string"&&index in object){return eq(object[index],value)}return false}module.exports=isIterateeCall},{"./_isIndex":181,"./eq":231,"./isArrayLike":244,"./isObject":251}],183:[function(require,module,exports){var isArray=require("./isArray"),isSymbol=require("./isSymbol"); | |
| /** Used to match property names within property paths. */var reIsDeepProp=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,reIsPlainProp=/^\w*$/; | |
| /** | |
| * Checks if `value` is a property name and not a property path. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @param {Object} [object] The object to query keys on. | |
| * @returns {boolean} Returns `true` if `value` is a property name, else `false`. | |
| */function isKey(value,object){if(isArray(value)){return false}var type=typeof value;if(type=="number"||type=="symbol"||type=="boolean"||value==null||isSymbol(value)){return true}return reIsPlainProp.test(value)||!reIsDeepProp.test(value)||object!=null&&value in Object(object)}module.exports=isKey},{"./isArray":243,"./isSymbol":256}],184:[function(require,module,exports){ | |
| /** | |
| * Checks if `value` is suitable for use as unique object key. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is suitable, else `false`. | |
| */ | |
| function isKeyable(value){var type=typeof value;return type=="string"||type=="number"||type=="symbol"||type=="boolean"?value!=="__proto__":value===null}module.exports=isKeyable},{}],185:[function(require,module,exports){var coreJsData=require("./_coreJsData"); | |
| /** Used to detect methods masquerading as native. */var maskSrcKey=function(){var uid=/[^.]+$/.exec(coreJsData&&coreJsData.keys&&coreJsData.keys.IE_PROTO||"");return uid?"Symbol(src)_1."+uid:""}(); | |
| /** | |
| * Checks if `func` has its source masked. | |
| * | |
| * @private | |
| * @param {Function} func The function to check. | |
| * @returns {boolean} Returns `true` if `func` is masked, else `false`. | |
| */function isMasked(func){return!!maskSrcKey&&maskSrcKey in func}module.exports=isMasked},{"./_coreJsData":146}],186:[function(require,module,exports){ | |
| /** Used for built-in method references. */ | |
| var objectProto=Object.prototype; | |
| /** | |
| * Checks if `value` is likely a prototype object. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. | |
| */function isPrototype(value){var Ctor=value&&value.constructor,proto=typeof Ctor=="function"&&Ctor.prototype||objectProto;return value===proto}module.exports=isPrototype},{}],187:[function(require,module,exports){var isObject=require("./isObject"); | |
| /** | |
| * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. | |
| * | |
| * @private | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` if suitable for strict | |
| * equality comparisons, else `false`. | |
| */function isStrictComparable(value){return value===value&&!isObject(value)}module.exports=isStrictComparable},{"./isObject":251}],188:[function(require,module,exports){ | |
| /** | |
| * Removes all key-value entries from the list cache. | |
| * | |
| * @private | |
| * @name clear | |
| * @memberOf ListCache | |
| */ | |
| function listCacheClear(){this.__data__=[];this.size=0}module.exports=listCacheClear},{}],189:[function(require,module,exports){var assocIndexOf=require("./_assocIndexOf"); | |
| /** Used for built-in method references. */var arrayProto=Array.prototype; | |
| /** Built-in value references. */var splice=arrayProto.splice; | |
| /** | |
| * Removes `key` and its value from the list cache. | |
| * | |
| * @private | |
| * @name delete | |
| * @memberOf ListCache | |
| * @param {string} key The key of the value to remove. | |
| * @returns {boolean} Returns `true` if the entry was removed, else `false`. | |
| */function listCacheDelete(key){var data=this.__data__,index=assocIndexOf(data,key);if(index<0){return false}var lastIndex=data.length-1;if(index==lastIndex){data.pop()}else{splice.call(data,index,1)}--this.size;return true}module.exports=listCacheDelete},{"./_assocIndexOf":76}],190:[function(require,module,exports){var assocIndexOf=require("./_assocIndexOf"); | |
| /** | |
| * Gets the list cache value for `key`. | |
| * | |
| * @private | |
| * @name get | |
| * @memberOf ListCache | |
| * @param {string} key The key of the value to get. | |
| * @returns {*} Returns the entry value. | |
| */function listCacheGet(key){var data=this.__data__,index=assocIndexOf(data,key);return index<0?undefined:data[index][1]}module.exports=listCacheGet},{"./_assocIndexOf":76}],191:[function(require,module,exports){var assocIndexOf=require("./_assocIndexOf"); | |
| /** | |
| * Checks if a list cache value for `key` exists. | |
| * | |
| * @private | |
| * @name has | |
| * @memberOf ListCache | |
| * @param {string} key The key of the entry to check. | |
| * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | |
| */function listCacheHas(key){return assocIndexOf(this.__data__,key)>-1}module.exports=listCacheHas},{"./_assocIndexOf":76}],192:[function(require,module,exports){var assocIndexOf=require("./_assocIndexOf"); | |
| /** | |
| * Sets the list cache `key` to `value`. | |
| * | |
| * @private | |
| * @name set | |
| * @memberOf ListCache | |
| * @param {string} key The key of the value to set. | |
| * @param {*} value The value to set. | |
| * @returns {Object} Returns the list cache instance. | |
| */function listCacheSet(key,value){var data=this.__data__,index=assocIndexOf(data,key);if(index<0){++this.size;data.push([key,value])}else{data[index][1]=value}return this}module.exports=listCacheSet},{"./_assocIndexOf":76}],193:[function(require,module,exports){var Hash=require("./_Hash"),ListCache=require("./_ListCache"),Map=require("./_Map"); | |
| /** | |
| * Removes all key-value entries from the map. | |
| * | |
| * @private | |
| * @name clear | |
| * @memberOf MapCache | |
| */function mapCacheClear(){this.size=0;this.__data__={hash:new Hash,map:new(Map||ListCache),string:new Hash}}module.exports=mapCacheClear},{"./_Hash":52,"./_ListCache":53,"./_Map":54}],194:[function(require,module,exports){var getMapData=require("./_getMapData"); | |
| /** | |
| * Removes `key` and its value from the map. | |
| * | |
| * @private | |
| * @name delete | |
| * @memberOf MapCache | |
| * @param {string} key The key of the value to remove. | |
| * @returns {boolean} Returns `true` if the entry was removed, else `false`. | |
| */function mapCacheDelete(key){var result=getMapData(this,key)["delete"](key);this.size-=result?1:0;return result}module.exports=mapCacheDelete},{"./_getMapData":161}],195:[function(require,module,exports){var getMapData=require("./_getMapData"); | |
| /** | |
| * Gets the map value for `key`. | |
| * | |
| * @private | |
| * @name get | |
| * @memberOf MapCache | |
| * @param {string} key The key of the value to get. | |
| * @returns {*} Returns the entry value. | |
| */function mapCacheGet(key){return getMapData(this,key).get(key)}module.exports=mapCacheGet},{"./_getMapData":161}],196:[function(require,module,exports){var getMapData=require("./_getMapData"); | |
| /** | |
| * Checks if a map value for `key` exists. | |
| * | |
| * @private | |
| * @name has | |
| * @memberOf MapCache | |
| * @param {string} key The key of the entry to check. | |
| * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | |
| */function mapCacheHas(key){return getMapData(this,key).has(key)}module.exports=mapCacheHas},{"./_getMapData":161}],197:[function(require,module,exports){var getMapData=require("./_getMapData"); | |
| /** | |
| * Sets the map `key` to `value`. | |
| * | |
| * @private | |
| * @name set | |
| * @memberOf MapCache | |
| * @param {string} key The key of the value to set. | |
| * @param {*} value The value to set. | |
| * @returns {Object} Returns the map cache instance. | |
| */function mapCacheSet(key,value){var data=getMapData(this,key),size=data.size;data.set(key,value);this.size+=data.size==size?0:1;return this}module.exports=mapCacheSet},{"./_getMapData":161}],198:[function(require,module,exports){ | |
| /** | |
| * Converts `map` to its key-value pairs. | |
| * | |
| * @private | |
| * @param {Object} map The map to convert. | |
| * @returns {Array} Returns the key-value pairs. | |
| */ | |
| function mapToArray(map){var index=-1,result=Array(map.size);map.forEach(function(value,key){result[++index]=[key,value]});return result}module.exports=mapToArray},{}],199:[function(require,module,exports){ | |
| /** | |
| * A specialized version of `matchesProperty` for source values suitable | |
| * for strict equality comparisons, i.e. `===`. | |
| * | |
| * @private | |
| * @param {string} key The key of the property to get. | |
| * @param {*} srcValue The value to match. | |
| * @returns {Function} Returns the new spec function. | |
| */ | |
| function matchesStrictComparable(key,srcValue){return function(object){if(object==null){return false}return object[key]===srcValue&&(srcValue!==undefined||key in Object(object))}}module.exports=matchesStrictComparable},{}],200:[function(require,module,exports){var memoize=require("./memoize"); | |
| /** Used as the maximum memoize cache size. */var MAX_MEMOIZE_SIZE=500; | |
| /** | |
| * A specialized version of `_.memoize` which clears the memoized function's | |
| * cache when it exceeds `MAX_MEMOIZE_SIZE`. | |
| * | |
| * @private | |
| * @param {Function} func The function to have its output memoized. | |
| * @returns {Function} Returns the new memoized function. | |
| */function memoizeCapped(func){var result=memoize(func,function(key){if(cache.size===MAX_MEMOIZE_SIZE){cache.clear()}return key});var cache=result.cache;return result}module.exports=memoizeCapped},{"./memoize":265}],201:[function(require,module,exports){var getNative=require("./_getNative"); | |
| /* Built-in method references that are verified to be native. */var nativeCreate=getNative(Object,"create");module.exports=nativeCreate},{"./_getNative":163}],202:[function(require,module,exports){var overArg=require("./_overArg"); | |
| /* Built-in method references for those with the same name as other `lodash` methods. */var nativeKeys=overArg(Object.keys,Object);module.exports=nativeKeys},{"./_overArg":206}],203:[function(require,module,exports){ | |
| /** | |
| * This function is like | |
| * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) | |
| * except that it includes inherited enumerable properties. | |
| * | |
| * @private | |
| * @param {Object} object The object to query. | |
| * @returns {Array} Returns the array of property names. | |
| */ | |
| function nativeKeysIn(object){var result=[];if(object!=null){for(var key in Object(object)){result.push(key)}}return result}module.exports=nativeKeysIn},{}],204:[function(require,module,exports){var freeGlobal=require("./_freeGlobal"); | |
| /** Detect free variable `exports`. */var freeExports=typeof exports=="object"&&exports&&!exports.nodeType&&exports; | |
| /** Detect free variable `module`. */var freeModule=freeExports&&typeof module=="object"&&module&&!module.nodeType&&module; | |
| /** Detect the popular CommonJS extension `module.exports`. */var moduleExports=freeModule&&freeModule.exports===freeExports; | |
| /** Detect free variable `process` from Node.js. */var freeProcess=moduleExports&&freeGlobal.process; | |
| /** Used to access faster Node.js helpers. */var nodeUtil=function(){try{ | |
| // Use `util.types` for Node.js 10+. | |
| var types=freeModule&&freeModule.require&&freeModule.require("util").types;if(types){return types} | |
| // Legacy `process.binding('util')` for Node.js < 10. | |
| return freeProcess&&freeProcess.binding&&freeProcess.binding("util")}catch(e){}}();module.exports=nodeUtil},{"./_freeGlobal":158}],205:[function(require,module,exports){ | |
| /** Used for built-in method references. */ | |
| var objectProto=Object.prototype; | |
| /** | |
| * Used to resolve the | |
| * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) | |
| * of values. | |
| */var nativeObjectToString=objectProto.toString; | |
| /** | |
| * Converts `value` to a string using `Object.prototype.toString`. | |
| * | |
| * @private | |
| * @param {*} value The value to convert. | |
| * @returns {string} Returns the converted string. | |
| */function objectToString(value){return nativeObjectToString.call(value)}module.exports=objectToString},{}],206:[function(require,module,exports){ | |
| /** | |
| * Creates a unary function that invokes `func` with its argument transformed. | |
| * | |
| * @private | |
| * @param {Function} func The function to wrap. | |
| * @param {Function} transform The argument transform. | |
| * @returns {Function} Returns the new function. | |
| */ | |
| function overArg(func,transform){return function(arg){return func(transform(arg))}}module.exports=overArg},{}],207:[function(require,module,exports){var apply=require("./_apply"); | |
| /* Built-in method references for those with the same name as other `lodash` methods. */var nativeMax=Math.max; | |
| /** | |
| * A specialized version of `baseRest` which transforms the rest array. | |
| * | |
| * @private | |
| * @param {Function} func The function to apply a rest parameter to. | |
| * @param {number} [start=func.length-1] The start position of the rest parameter. | |
| * @param {Function} transform The rest array transform. | |
| * @returns {Function} Returns the new function. | |
| */function overRest(func,start,transform){start=nativeMax(start===undefined?func.length-1:start,0);return function(){var args=arguments,index=-1,length=nativeMax(args.length-start,0),array=Array(length);while(++index<length){array[index]=args[start+index]}index=-1;var otherArgs=Array(start+1);while(++index<start){otherArgs[index]=args[index]}otherArgs[start]=transform(array);return apply(func,this,otherArgs)}}module.exports=overRest},{"./_apply":63}],208:[function(require,module,exports){var freeGlobal=require("./_freeGlobal"); | |
| /** Detect free variable `self`. */var freeSelf=typeof self=="object"&&self&&self.Object===Object&&self; | |
| /** Used as a reference to the global object. */var root=freeGlobal||freeSelf||Function("return this")();module.exports=root},{"./_freeGlobal":158}],209:[function(require,module,exports){ | |
| /** | |
| * Gets the value at `key`, unless `key` is "__proto__" or "constructor". | |
| * | |
| * @private | |
| * @param {Object} object The object to query. | |
| * @param {string} key The key of the property to get. | |
| * @returns {*} Returns the property value. | |
| */ | |
| function safeGet(object,key){if(key==="constructor"&&typeof object[key]==="function"){return}if(key=="__proto__"){return}return object[key]}module.exports=safeGet},{}],210:[function(require,module,exports){ | |
| /** Used to stand-in for `undefined` hash values. */ | |
| var HASH_UNDEFINED="__lodash_hash_undefined__"; | |
| /** | |
| * Adds `value` to the array cache. | |
| * | |
| * @private | |
| * @name add | |
| * @memberOf SetCache | |
| * @alias push | |
| * @param {*} value The value to cache. | |
| * @returns {Object} Returns the cache instance. | |
| */function setCacheAdd(value){this.__data__.set(value,HASH_UNDEFINED);return this}module.exports=setCacheAdd},{}],211:[function(require,module,exports){ | |
| /** | |
| * Checks if `value` is in the array cache. | |
| * | |
| * @private | |
| * @name has | |
| * @memberOf SetCache | |
| * @param {*} value The value to search for. | |
| * @returns {number} Returns `true` if `value` is found, else `false`. | |
| */ | |
| function setCacheHas(value){return this.__data__.has(value)}module.exports=setCacheHas},{}],212:[function(require,module,exports){ | |
| /** | |
| * Converts `set` to an array of its values. | |
| * | |
| * @private | |
| * @param {Object} set The set to convert. | |
| * @returns {Array} Returns the values. | |
| */ | |
| function setToArray(set){var index=-1,result=Array(set.size);set.forEach(function(value){result[++index]=value});return result}module.exports=setToArray},{}],213:[function(require,module,exports){var baseSetToString=require("./_baseSetToString"),shortOut=require("./_shortOut"); | |
| /** | |
| * Sets the `toString` method of `func` to return `string`. | |
| * | |
| * @private | |
| * @param {Function} func The function to modify. | |
| * @param {Function} string The `toString` result. | |
| * @returns {Function} Returns `func`. | |
| */var setToString=shortOut(baseSetToString);module.exports=setToString},{"./_baseSetToString":123,"./_shortOut":214}],214:[function(require,module,exports){ | |
| /** Used to detect hot functions by number of calls within a span of milliseconds. */ | |
| var HOT_COUNT=800,HOT_SPAN=16; | |
| /* Built-in method references for those with the same name as other `lodash` methods. */var nativeNow=Date.now; | |
| /** | |
| * Creates a function that'll short out and invoke `identity` instead | |
| * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` | |
| * milliseconds. | |
| * | |
| * @private | |
| * @param {Function} func The function to restrict. | |
| * @returns {Function} Returns the new shortable function. | |
| */function shortOut(func){var count=0,lastCalled=0;return function(){var stamp=nativeNow(),remaining=HOT_SPAN-(stamp-lastCalled);lastCalled=stamp;if(remaining>0){if(++count>=HOT_COUNT){return arguments[0]}}else{count=0}return func.apply(undefined,arguments)}}module.exports=shortOut},{}],215:[function(require,module,exports){var ListCache=require("./_ListCache"); | |
| /** | |
| * Removes all key-value entries from the stack. | |
| * | |
| * @private | |
| * @name clear | |
| * @memberOf Stack | |
| */function stackClear(){this.__data__=new ListCache;this.size=0}module.exports=stackClear},{"./_ListCache":53}],216:[function(require,module,exports){ | |
| /** | |
| * Removes `key` and its value from the stack. | |
| * | |
| * @private | |
| * @name delete | |
| * @memberOf Stack | |
| * @param {string} key The key of the value to remove. | |
| * @returns {boolean} Returns `true` if the entry was removed, else `false`. | |
| */ | |
| function stackDelete(key){var data=this.__data__,result=data["delete"](key);this.size=data.size;return result}module.exports=stackDelete},{}],217:[function(require,module,exports){ | |
| /** | |
| * Gets the stack value for `key`. | |
| * | |
| * @private | |
| * @name get | |
| * @memberOf Stack | |
| * @param {string} key The key of the value to get. | |
| * @returns {*} Returns the entry value. | |
| */ | |
| function stackGet(key){return this.__data__.get(key)}module.exports=stackGet},{}],218:[function(require,module,exports){ | |
| /** | |
| * Checks if a stack value for `key` exists. | |
| * | |
| * @private | |
| * @name has | |
| * @memberOf Stack | |
| * @param {string} key The key of the entry to check. | |
| * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | |
| */ | |
| function stackHas(key){return this.__data__.has(key)}module.exports=stackHas},{}],219:[function(require,module,exports){var ListCache=require("./_ListCache"),Map=require("./_Map"),MapCache=require("./_MapCache"); | |
| /** Used as the size to enable large array optimizations. */var LARGE_ARRAY_SIZE=200; | |
| /** | |
| * Sets the stack `key` to `value`. | |
| * | |
| * @private | |
| * @name set | |
| * @memberOf Stack | |
| * @param {string} key The key of the value to set. | |
| * @param {*} value The value to set. | |
| * @returns {Object} Returns the stack cache instance. | |
| */function stackSet(key,value){var data=this.__data__;if(data instanceof ListCache){var pairs=data.__data__;if(!Map||pairs.length<LARGE_ARRAY_SIZE-1){pairs.push([key,value]);this.size=++data.size;return this}data=this.__data__=new MapCache(pairs)}data.set(key,value);this.size=data.size;return this}module.exports=stackSet},{"./_ListCache":53,"./_Map":54,"./_MapCache":55}],220:[function(require,module,exports){ | |
| /** | |
| * A specialized version of `_.indexOf` which performs strict equality | |
| * comparisons of values, i.e. `===`. | |
| * | |
| * @private | |
| * @param {Array} array The array to inspect. | |
| * @param {*} value The value to search for. | |
| * @param {number} fromIndex The index to search from. | |
| * @returns {number} Returns the index of the matched value, else `-1`. | |
| */ | |
| function strictIndexOf(array,value,fromIndex){var index=fromIndex-1,length=array.length;while(++index<length){if(array[index]===value){return index}}return-1}module.exports=strictIndexOf},{}],221:[function(require,module,exports){var asciiSize=require("./_asciiSize"),hasUnicode=require("./_hasUnicode"),unicodeSize=require("./_unicodeSize"); | |
| /** | |
| * Gets the number of symbols in `string`. | |
| * | |
| * @private | |
| * @param {string} string The string to inspect. | |
| * @returns {number} Returns the string size. | |
| */function stringSize(string){return hasUnicode(string)?unicodeSize(string):asciiSize(string)}module.exports=stringSize},{"./_asciiSize":73,"./_hasUnicode":171,"./_unicodeSize":225}],222:[function(require,module,exports){var memoizeCapped=require("./_memoizeCapped"); | |
| /** Used to match property names within property paths. */var rePropName=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; | |
| /** Used to match backslashes in property paths. */var reEscapeChar=/\\(\\)?/g; | |
| /** | |
| * Converts `string` to a property path array. | |
| * | |
| * @private | |
| * @param {string} string The string to convert. | |
| * @returns {Array} Returns the property path array. | |
| */var stringToPath=memoizeCapped(function(string){var result=[];if(string.charCodeAt(0)===46/* . */){result.push("")}string.replace(rePropName,function(match,number,quote,subString){result.push(quote?subString.replace(reEscapeChar,"$1"):number||match)});return result});module.exports=stringToPath},{"./_memoizeCapped":200}],223:[function(require,module,exports){var isSymbol=require("./isSymbol"); | |
| /** Used as references for various `Number` constants. */var INFINITY=1/0; | |
| /** | |
| * Converts `value` to a string key if it's not a string or symbol. | |
| * | |
| * @private | |
| * @param {*} value The value to inspect. | |
| * @returns {string|symbol} Returns the key. | |
| */function toKey(value){if(typeof value=="string"||isSymbol(value)){return value}var result=value+"";return result=="0"&&1/value==-INFINITY?"-0":result}module.exports=toKey},{"./isSymbol":256}],224:[function(require,module,exports){ | |
| /** Used for built-in method references. */ | |
| var funcProto=Function.prototype; | |
| /** Used to resolve the decompiled source of functions. */var funcToString=funcProto.toString; | |
| /** | |
| * Converts `func` to its source code. | |
| * | |
| * @private | |
| * @param {Function} func The function to convert. | |
| * @returns {string} Returns the source code. | |
| */function toSource(func){if(func!=null){try{return funcToString.call(func)}catch(e){}try{return func+""}catch(e){}}return""}module.exports=toSource},{}],225:[function(require,module,exports){ | |
| /** Used to compose unicode character classes. */ | |
| var rsAstralRange="\\ud800-\\udfff",rsComboMarksRange="\\u0300-\\u036f",reComboHalfMarksRange="\\ufe20-\\ufe2f",rsComboSymbolsRange="\\u20d0-\\u20ff",rsComboRange=rsComboMarksRange+reComboHalfMarksRange+rsComboSymbolsRange,rsVarRange="\\ufe0e\\ufe0f"; | |
| /** Used to compose unicode capture groups. */var rsAstral="["+rsAstralRange+"]",rsCombo="["+rsComboRange+"]",rsFitz="\\ud83c[\\udffb-\\udfff]",rsModifier="(?:"+rsCombo+"|"+rsFitz+")",rsNonAstral="[^"+rsAstralRange+"]",rsRegional="(?:\\ud83c[\\udde6-\\uddff]){2}",rsSurrPair="[\\ud800-\\udbff][\\udc00-\\udfff]",rsZWJ="\\u200d"; | |
| /** Used to compose unicode regexes. */var reOptMod=rsModifier+"?",rsOptVar="["+rsVarRange+"]?",rsOptJoin="(?:"+rsZWJ+"(?:"+[rsNonAstral,rsRegional,rsSurrPair].join("|")+")"+rsOptVar+reOptMod+")*",rsSeq=rsOptVar+reOptMod+rsOptJoin,rsSymbol="(?:"+[rsNonAstral+rsCombo+"?",rsCombo,rsRegional,rsSurrPair,rsAstral].join("|")+")"; | |
| /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */var reUnicode=RegExp(rsFitz+"(?="+rsFitz+")|"+rsSymbol+rsSeq,"g"); | |
| /** | |
| * Gets the size of a Unicode `string`. | |
| * | |
| * @private | |
| * @param {string} string The string inspect. | |
| * @returns {number} Returns the string size. | |
| */function unicodeSize(string){var result=reUnicode.lastIndex=0;while(reUnicode.test(string)){++result}return result}module.exports=unicodeSize},{}],226:[function(require,module,exports){var baseClone=require("./_baseClone"); | |
| /** Used to compose bitmasks for cloning. */var CLONE_SYMBOLS_FLAG=4; | |
| /** | |
| * Creates a shallow clone of `value`. | |
| * | |
| * **Note:** This method is loosely based on the | |
| * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) | |
| * and supports cloning arrays, array buffers, booleans, date objects, maps, | |
| * numbers, `Object` objects, regexes, sets, strings, symbols, and typed | |
| * arrays. The own enumerable properties of `arguments` objects are cloned | |
| * as plain objects. An empty object is returned for uncloneable values such | |
| * as error objects, functions, DOM nodes, and WeakMaps. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Lang | |
| * @param {*} value The value to clone. | |
| * @returns {*} Returns the cloned value. | |
| * @see _.cloneDeep | |
| * @example | |
| * | |
| * var objects = [{ 'a': 1 }, { 'b': 2 }]; | |
| * | |
| * var shallow = _.clone(objects); | |
| * console.log(shallow[0] === objects[0]); | |
| * // => true | |
| */function clone(value){return baseClone(value,CLONE_SYMBOLS_FLAG)}module.exports=clone},{"./_baseClone":80}],227:[function(require,module,exports){var baseClone=require("./_baseClone"); | |
| /** Used to compose bitmasks for cloning. */var CLONE_DEEP_FLAG=1,CLONE_SYMBOLS_FLAG=4; | |
| /** | |
| * This method is like `_.clone` except that it recursively clones `value`. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 1.0.0 | |
| * @category Lang | |
| * @param {*} value The value to recursively clone. | |
| * @returns {*} Returns the deep cloned value. | |
| * @see _.clone | |
| * @example | |
| * | |
| * var objects = [{ 'a': 1 }, { 'b': 2 }]; | |
| * | |
| * var deep = _.cloneDeep(objects); | |
| * console.log(deep[0] === objects[0]); | |
| * // => false | |
| */function cloneDeep(value){return baseClone(value,CLONE_DEEP_FLAG|CLONE_SYMBOLS_FLAG)}module.exports=cloneDeep},{"./_baseClone":80}],228:[function(require,module,exports){ | |
| /** | |
| * Creates a function that returns `value`. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 2.4.0 | |
| * @category Util | |
| * @param {*} value The value to return from the new function. | |
| * @returns {Function} Returns the new constant function. | |
| * @example | |
| * | |
| * var objects = _.times(2, _.constant({ 'a': 1 })); | |
| * | |
| * console.log(objects); | |
| * // => [{ 'a': 1 }, { 'a': 1 }] | |
| * | |
| * console.log(objects[0] === objects[1]); | |
| * // => true | |
| */ | |
| function constant(value){return function(){return value}}module.exports=constant},{}],229:[function(require,module,exports){var baseRest=require("./_baseRest"),eq=require("./eq"),isIterateeCall=require("./_isIterateeCall"),keysIn=require("./keysIn"); | |
| /** Used for built-in method references. */var objectProto=Object.prototype; | |
| /** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty; | |
| /** | |
| * Assigns own and inherited enumerable string keyed properties of source | |
| * objects to the destination object for all destination properties that | |
| * resolve to `undefined`. Source objects are applied from left to right. | |
| * Once a property is set, additional values of the same property are ignored. | |
| * | |
| * **Note:** This method mutates `object`. | |
| * | |
| * @static | |
| * @since 0.1.0 | |
| * @memberOf _ | |
| * @category Object | |
| * @param {Object} object The destination object. | |
| * @param {...Object} [sources] The source objects. | |
| * @returns {Object} Returns `object`. | |
| * @see _.defaultsDeep | |
| * @example | |
| * | |
| * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); | |
| * // => { 'a': 1, 'b': 2 } | |
| */var defaults=baseRest(function(object,sources){object=Object(object);var index=-1;var length=sources.length;var guard=length>2?sources[2]:undefined;if(guard&&isIterateeCall(sources[0],sources[1],guard)){length=1}while(++index<length){var source=sources[index];var props=keysIn(source);var propsIndex=-1;var propsLength=props.length;while(++propsIndex<propsLength){var key=props[propsIndex];var value=object[key];if(value===undefined||eq(value,objectProto[key])&&!hasOwnProperty.call(object,key)){object[key]=source[key]}}}return object});module.exports=defaults},{"./_baseRest":121,"./_isIterateeCall":182,"./eq":231,"./keysIn":260}],230:[function(require,module,exports){module.exports=require("./forEach")},{"./forEach":236}],231:[function(require,module,exports){ | |
| /** | |
| * Performs a | |
| * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) | |
| * comparison between two values to determine if they are equivalent. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.0.0 | |
| * @category Lang | |
| * @param {*} value The value to compare. | |
| * @param {*} other The other value to compare. | |
| * @returns {boolean} Returns `true` if the values are equivalent, else `false`. | |
| * @example | |
| * | |
| * var object = { 'a': 1 }; | |
| * var other = { 'a': 1 }; | |
| * | |
| * _.eq(object, object); | |
| * // => true | |
| * | |
| * _.eq(object, other); | |
| * // => false | |
| * | |
| * _.eq('a', 'a'); | |
| * // => true | |
| * | |
| * _.eq('a', Object('a')); | |
| * // => false | |
| * | |
| * _.eq(NaN, NaN); | |
| * // => true | |
| */ | |
| function eq(value,other){return value===other||value!==value&&other!==other}module.exports=eq},{}],232:[function(require,module,exports){var arrayFilter=require("./_arrayFilter"),baseFilter=require("./_baseFilter"),baseIteratee=require("./_baseIteratee"),isArray=require("./isArray"); | |
| /** | |
| * Iterates over elements of `collection`, returning an array of all elements | |
| * `predicate` returns truthy for. The predicate is invoked with three | |
| * arguments: (value, index|key, collection). | |
| * | |
| * **Note:** Unlike `_.remove`, this method returns a new array. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Collection | |
| * @param {Array|Object} collection The collection to iterate over. | |
| * @param {Function} [predicate=_.identity] The function invoked per iteration. | |
| * @returns {Array} Returns the new filtered array. | |
| * @see _.reject | |
| * @example | |
| * | |
| * var users = [ | |
| * { 'user': 'barney', 'age': 36, 'active': true }, | |
| * { 'user': 'fred', 'age': 40, 'active': false } | |
| * ]; | |
| * | |
| * _.filter(users, function(o) { return !o.active; }); | |
| * // => objects for ['fred'] | |
| * | |
| * // The `_.matches` iteratee shorthand. | |
| * _.filter(users, { 'age': 36, 'active': true }); | |
| * // => objects for ['barney'] | |
| * | |
| * // The `_.matchesProperty` iteratee shorthand. | |
| * _.filter(users, ['active', false]); | |
| * // => objects for ['fred'] | |
| * | |
| * // The `_.property` iteratee shorthand. | |
| * _.filter(users, 'active'); | |
| * // => objects for ['barney'] | |
| */function filter(collection,predicate){var func=isArray(collection)?arrayFilter:baseFilter;return func(collection,baseIteratee(predicate,3))}module.exports=filter},{"./_arrayFilter":65,"./_baseFilter":84,"./_baseIteratee":105,"./isArray":243}],233:[function(require,module,exports){var createFind=require("./_createFind"),findIndex=require("./findIndex"); | |
| /** | |
| * Iterates over elements of `collection`, returning the first element | |
| * `predicate` returns truthy for. The predicate is invoked with three | |
| * arguments: (value, index|key, collection). | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Collection | |
| * @param {Array|Object} collection The collection to inspect. | |
| * @param {Function} [predicate=_.identity] The function invoked per iteration. | |
| * @param {number} [fromIndex=0] The index to search from. | |
| * @returns {*} Returns the matched element, else `undefined`. | |
| * @example | |
| * | |
| * var users = [ | |
| * { 'user': 'barney', 'age': 36, 'active': true }, | |
| * { 'user': 'fred', 'age': 40, 'active': false }, | |
| * { 'user': 'pebbles', 'age': 1, 'active': true } | |
| * ]; | |
| * | |
| * _.find(users, function(o) { return o.age < 40; }); | |
| * // => object for 'barney' | |
| * | |
| * // The `_.matches` iteratee shorthand. | |
| * _.find(users, { 'age': 1, 'active': true }); | |
| * // => object for 'pebbles' | |
| * | |
| * // The `_.matchesProperty` iteratee shorthand. | |
| * _.find(users, ['active', false]); | |
| * // => object for 'fred' | |
| * | |
| * // The `_.property` iteratee shorthand. | |
| * _.find(users, 'active'); | |
| * // => object for 'barney' | |
| */var find=createFind(findIndex);module.exports=find},{"./_createFind":150,"./findIndex":234}],234:[function(require,module,exports){var baseFindIndex=require("./_baseFindIndex"),baseIteratee=require("./_baseIteratee"),toInteger=require("./toInteger"); | |
| /* Built-in method references for those with the same name as other `lodash` methods. */var nativeMax=Math.max; | |
| /** | |
| * This method is like `_.find` except that it returns the index of the first | |
| * element `predicate` returns truthy for instead of the element itself. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 1.1.0 | |
| * @category Array | |
| * @param {Array} array The array to inspect. | |
| * @param {Function} [predicate=_.identity] The function invoked per iteration. | |
| * @param {number} [fromIndex=0] The index to search from. | |
| * @returns {number} Returns the index of the found element, else `-1`. | |
| * @example | |
| * | |
| * var users = [ | |
| * { 'user': 'barney', 'active': false }, | |
| * { 'user': 'fred', 'active': false }, | |
| * { 'user': 'pebbles', 'active': true } | |
| * ]; | |
| * | |
| * _.findIndex(users, function(o) { return o.user == 'barney'; }); | |
| * // => 0 | |
| * | |
| * // The `_.matches` iteratee shorthand. | |
| * _.findIndex(users, { 'user': 'fred', 'active': false }); | |
| * // => 1 | |
| * | |
| * // The `_.matchesProperty` iteratee shorthand. | |
| * _.findIndex(users, ['active', false]); | |
| * // => 0 | |
| * | |
| * // The `_.property` iteratee shorthand. | |
| * _.findIndex(users, 'active'); | |
| * // => 2 | |
| */function findIndex(array,predicate,fromIndex){var length=array==null?0:array.length;if(!length){return-1}var index=fromIndex==null?0:toInteger(fromIndex);if(index<0){index=nativeMax(length+index,0)}return baseFindIndex(array,baseIteratee(predicate,3),index)}module.exports=findIndex},{"./_baseFindIndex":85,"./_baseIteratee":105,"./toInteger":280}],235:[function(require,module,exports){var baseFlatten=require("./_baseFlatten"); | |
| /** | |
| * Flattens `array` a single level deep. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Array | |
| * @param {Array} array The array to flatten. | |
| * @returns {Array} Returns the new flattened array. | |
| * @example | |
| * | |
| * _.flatten([1, [2, [3, [4]], 5]]); | |
| * // => [1, 2, [3, [4]], 5] | |
| */function flatten(array){var length=array==null?0:array.length;return length?baseFlatten(array,1):[]}module.exports=flatten},{"./_baseFlatten":86}],236:[function(require,module,exports){var arrayEach=require("./_arrayEach"),baseEach=require("./_baseEach"),castFunction=require("./_castFunction"),isArray=require("./isArray"); | |
| /** | |
| * Iterates over elements of `collection` and invokes `iteratee` for each element. | |
| * The iteratee is invoked with three arguments: (value, index|key, collection). | |
| * Iteratee functions may exit iteration early by explicitly returning `false`. | |
| * | |
| * **Note:** As with other "Collections" methods, objects with a "length" | |
| * property are iterated like arrays. To avoid this behavior use `_.forIn` | |
| * or `_.forOwn` for object iteration. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @alias each | |
| * @category Collection | |
| * @param {Array|Object} collection The collection to iterate over. | |
| * @param {Function} [iteratee=_.identity] The function invoked per iteration. | |
| * @returns {Array|Object} Returns `collection`. | |
| * @see _.forEachRight | |
| * @example | |
| * | |
| * _.forEach([1, 2], function(value) { | |
| * console.log(value); | |
| * }); | |
| * // => Logs `1` then `2`. | |
| * | |
| * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { | |
| * console.log(key); | |
| * }); | |
| * // => Logs 'a' then 'b' (iteration order is not guaranteed). | |
| */function forEach(collection,iteratee){var func=isArray(collection)?arrayEach:baseEach;return func(collection,castFunction(iteratee))}module.exports=forEach},{"./_arrayEach":64,"./_baseEach":82,"./_castFunction":132,"./isArray":243}],237:[function(require,module,exports){var baseFor=require("./_baseFor"),castFunction=require("./_castFunction"),keysIn=require("./keysIn"); | |
| /** | |
| * Iterates over own and inherited enumerable string keyed properties of an | |
| * object and invokes `iteratee` for each property. The iteratee is invoked | |
| * with three arguments: (value, key, object). Iteratee functions may exit | |
| * iteration early by explicitly returning `false`. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.3.0 | |
| * @category Object | |
| * @param {Object} object The object to iterate over. | |
| * @param {Function} [iteratee=_.identity] The function invoked per iteration. | |
| * @returns {Object} Returns `object`. | |
| * @see _.forInRight | |
| * @example | |
| * | |
| * function Foo() { | |
| * this.a = 1; | |
| * this.b = 2; | |
| * } | |
| * | |
| * Foo.prototype.c = 3; | |
| * | |
| * _.forIn(new Foo, function(value, key) { | |
| * console.log(key); | |
| * }); | |
| * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). | |
| */function forIn(object,iteratee){return object==null?object:baseFor(object,castFunction(iteratee),keysIn)}module.exports=forIn},{"./_baseFor":87,"./_castFunction":132,"./keysIn":260}],238:[function(require,module,exports){var baseGet=require("./_baseGet"); | |
| /** | |
| * Gets the value at `path` of `object`. If the resolved value is | |
| * `undefined`, the `defaultValue` is returned in its place. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 3.7.0 | |
| * @category Object | |
| * @param {Object} object The object to query. | |
| * @param {Array|string} path The path of the property to get. | |
| * @param {*} [defaultValue] The value returned for `undefined` resolved values. | |
| * @returns {*} Returns the resolved value. | |
| * @example | |
| * | |
| * var object = { 'a': [{ 'b': { 'c': 3 } }] }; | |
| * | |
| * _.get(object, 'a[0].b.c'); | |
| * // => 3 | |
| * | |
| * _.get(object, ['a', '0', 'b', 'c']); | |
| * // => 3 | |
| * | |
| * _.get(object, 'a.b.c', 'default'); | |
| * // => 'default' | |
| */function get(object,path,defaultValue){var result=object==null?undefined:baseGet(object,path);return result===undefined?defaultValue:result}module.exports=get},{"./_baseGet":89}],239:[function(require,module,exports){var baseHas=require("./_baseHas"),hasPath=require("./_hasPath"); | |
| /** | |
| * Checks if `path` is a direct property of `object`. | |
| * | |
| * @static | |
| * @since 0.1.0 | |
| * @memberOf _ | |
| * @category Object | |
| * @param {Object} object The object to query. | |
| * @param {Array|string} path The path to check. | |
| * @returns {boolean} Returns `true` if `path` exists, else `false`. | |
| * @example | |
| * | |
| * var object = { 'a': { 'b': 2 } }; | |
| * var other = _.create({ 'a': _.create({ 'b': 2 }) }); | |
| * | |
| * _.has(object, 'a'); | |
| * // => true | |
| * | |
| * _.has(object, 'a.b'); | |
| * // => true | |
| * | |
| * _.has(object, ['a', 'b']); | |
| * // => true | |
| * | |
| * _.has(other, 'a'); | |
| * // => false | |
| */function has(object,path){return object!=null&&hasPath(object,path,baseHas)}module.exports=has},{"./_baseHas":93,"./_hasPath":170}],240:[function(require,module,exports){var baseHasIn=require("./_baseHasIn"),hasPath=require("./_hasPath"); | |
| /** | |
| * Checks if `path` is a direct or inherited property of `object`. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.0.0 | |
| * @category Object | |
| * @param {Object} object The object to query. | |
| * @param {Array|string} path The path to check. | |
| * @returns {boolean} Returns `true` if `path` exists, else `false`. | |
| * @example | |
| * | |
| * var object = _.create({ 'a': _.create({ 'b': 2 }) }); | |
| * | |
| * _.hasIn(object, 'a'); | |
| * // => true | |
| * | |
| * _.hasIn(object, 'a.b'); | |
| * // => true | |
| * | |
| * _.hasIn(object, ['a', 'b']); | |
| * // => true | |
| * | |
| * _.hasIn(object, 'b'); | |
| * // => false | |
| */function hasIn(object,path){return object!=null&&hasPath(object,path,baseHasIn)}module.exports=hasIn},{"./_baseHasIn":94,"./_hasPath":170}],241:[function(require,module,exports){ | |
| /** | |
| * This method returns the first argument it receives. | |
| * | |
| * @static | |
| * @since 0.1.0 | |
| * @memberOf _ | |
| * @category Util | |
| * @param {*} value Any value. | |
| * @returns {*} Returns `value`. | |
| * @example | |
| * | |
| * var object = { 'a': 1 }; | |
| * | |
| * console.log(_.identity(object) === object); | |
| * // => true | |
| */ | |
| function identity(value){return value}module.exports=identity},{}],242:[function(require,module,exports){var baseIsArguments=require("./_baseIsArguments"),isObjectLike=require("./isObjectLike"); | |
| /** Used for built-in method references. */var objectProto=Object.prototype; | |
| /** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty; | |
| /** Built-in value references. */var propertyIsEnumerable=objectProto.propertyIsEnumerable; | |
| /** | |
| * Checks if `value` is likely an `arguments` object. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is an `arguments` object, | |
| * else `false`. | |
| * @example | |
| * | |
| * _.isArguments(function() { return arguments; }()); | |
| * // => true | |
| * | |
| * _.isArguments([1, 2, 3]); | |
| * // => false | |
| */var isArguments=baseIsArguments(function(){return arguments}())?baseIsArguments:function(value){return isObjectLike(value)&&hasOwnProperty.call(value,"callee")&&!propertyIsEnumerable.call(value,"callee")};module.exports=isArguments},{"./_baseIsArguments":96,"./isObjectLike":252}],243:[function(require,module,exports){ | |
| /** | |
| * Checks if `value` is classified as an `Array` object. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is an array, else `false`. | |
| * @example | |
| * | |
| * _.isArray([1, 2, 3]); | |
| * // => true | |
| * | |
| * _.isArray(document.body.children); | |
| * // => false | |
| * | |
| * _.isArray('abc'); | |
| * // => false | |
| * | |
| * _.isArray(_.noop); | |
| * // => false | |
| */ | |
| var isArray=Array.isArray;module.exports=isArray},{}],244:[function(require,module,exports){var isFunction=require("./isFunction"),isLength=require("./isLength"); | |
| /** | |
| * Checks if `value` is array-like. A value is considered array-like if it's | |
| * not a function and has a `value.length` that's an integer greater than or | |
| * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.0.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is array-like, else `false`. | |
| * @example | |
| * | |
| * _.isArrayLike([1, 2, 3]); | |
| * // => true | |
| * | |
| * _.isArrayLike(document.body.children); | |
| * // => true | |
| * | |
| * _.isArrayLike('abc'); | |
| * // => true | |
| * | |
| * _.isArrayLike(_.noop); | |
| * // => false | |
| */function isArrayLike(value){return value!=null&&isLength(value.length)&&!isFunction(value)}module.exports=isArrayLike},{"./isFunction":248,"./isLength":249}],245:[function(require,module,exports){var isArrayLike=require("./isArrayLike"),isObjectLike=require("./isObjectLike"); | |
| /** | |
| * This method is like `_.isArrayLike` except that it also checks if `value` | |
| * is an object. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.0.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is an array-like object, | |
| * else `false`. | |
| * @example | |
| * | |
| * _.isArrayLikeObject([1, 2, 3]); | |
| * // => true | |
| * | |
| * _.isArrayLikeObject(document.body.children); | |
| * // => true | |
| * | |
| * _.isArrayLikeObject('abc'); | |
| * // => false | |
| * | |
| * _.isArrayLikeObject(_.noop); | |
| * // => false | |
| */function isArrayLikeObject(value){return isObjectLike(value)&&isArrayLike(value)}module.exports=isArrayLikeObject},{"./isArrayLike":244,"./isObjectLike":252}],246:[function(require,module,exports){var root=require("./_root"),stubFalse=require("./stubFalse"); | |
| /** Detect free variable `exports`. */var freeExports=typeof exports=="object"&&exports&&!exports.nodeType&&exports; | |
| /** Detect free variable `module`. */var freeModule=freeExports&&typeof module=="object"&&module&&!module.nodeType&&module; | |
| /** Detect the popular CommonJS extension `module.exports`. */var moduleExports=freeModule&&freeModule.exports===freeExports; | |
| /** Built-in value references. */var Buffer=moduleExports?root.Buffer:undefined; | |
| /* Built-in method references for those with the same name as other `lodash` methods. */var nativeIsBuffer=Buffer?Buffer.isBuffer:undefined; | |
| /** | |
| * Checks if `value` is a buffer. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.3.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. | |
| * @example | |
| * | |
| * _.isBuffer(new Buffer(2)); | |
| * // => true | |
| * | |
| * _.isBuffer(new Uint8Array(2)); | |
| * // => false | |
| */var isBuffer=nativeIsBuffer||stubFalse;module.exports=isBuffer},{"./_root":208,"./stubFalse":278}],247:[function(require,module,exports){var baseKeys=require("./_baseKeys"),getTag=require("./_getTag"),isArguments=require("./isArguments"),isArray=require("./isArray"),isArrayLike=require("./isArrayLike"),isBuffer=require("./isBuffer"),isPrototype=require("./_isPrototype"),isTypedArray=require("./isTypedArray"); | |
| /** `Object#toString` result references. */var mapTag="[object Map]",setTag="[object Set]"; | |
| /** Used for built-in method references. */var objectProto=Object.prototype; | |
| /** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty; | |
| /** | |
| * Checks if `value` is an empty object, collection, map, or set. | |
| * | |
| * Objects are considered empty if they have no own enumerable string keyed | |
| * properties. | |
| * | |
| * Array-like values such as `arguments` objects, arrays, buffers, strings, or | |
| * jQuery-like collections are considered empty if they have a `length` of `0`. | |
| * Similarly, maps and sets are considered empty if they have a `size` of `0`. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is empty, else `false`. | |
| * @example | |
| * | |
| * _.isEmpty(null); | |
| * // => true | |
| * | |
| * _.isEmpty(true); | |
| * // => true | |
| * | |
| * _.isEmpty(1); | |
| * // => true | |
| * | |
| * _.isEmpty([1, 2, 3]); | |
| * // => false | |
| * | |
| * _.isEmpty({ 'a': 1 }); | |
| * // => false | |
| */function isEmpty(value){if(value==null){return true}if(isArrayLike(value)&&(isArray(value)||typeof value=="string"||typeof value.splice=="function"||isBuffer(value)||isTypedArray(value)||isArguments(value))){return!value.length}var tag=getTag(value);if(tag==mapTag||tag==setTag){return!value.size}if(isPrototype(value)){return!baseKeys(value).length}for(var key in value){if(hasOwnProperty.call(value,key)){return false}}return true}module.exports=isEmpty},{"./_baseKeys":106,"./_getTag":168,"./_isPrototype":186,"./isArguments":242,"./isArray":243,"./isArrayLike":244,"./isBuffer":246,"./isTypedArray":257}],248:[function(require,module,exports){var baseGetTag=require("./_baseGetTag"),isObject=require("./isObject"); | |
| /** `Object#toString` result references. */var asyncTag="[object AsyncFunction]",funcTag="[object Function]",genTag="[object GeneratorFunction]",proxyTag="[object Proxy]"; | |
| /** | |
| * Checks if `value` is classified as a `Function` object. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a function, else `false`. | |
| * @example | |
| * | |
| * _.isFunction(_); | |
| * // => true | |
| * | |
| * _.isFunction(/abc/); | |
| * // => false | |
| */function isFunction(value){if(!isObject(value)){return false} | |
| // The use of `Object#toString` avoids issues with the `typeof` operator | |
| // in Safari 9 which returns 'object' for typed arrays and other constructors. | |
| var tag=baseGetTag(value);return tag==funcTag||tag==genTag||tag==asyncTag||tag==proxyTag}module.exports=isFunction},{"./_baseGetTag":91,"./isObject":251}],249:[function(require,module,exports){ | |
| /** Used as references for various `Number` constants. */ | |
| var MAX_SAFE_INTEGER=9007199254740991; | |
| /** | |
| * Checks if `value` is a valid array-like length. | |
| * | |
| * **Note:** This method is loosely based on | |
| * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.0.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. | |
| * @example | |
| * | |
| * _.isLength(3); | |
| * // => true | |
| * | |
| * _.isLength(Number.MIN_VALUE); | |
| * // => false | |
| * | |
| * _.isLength(Infinity); | |
| * // => false | |
| * | |
| * _.isLength('3'); | |
| * // => false | |
| */function isLength(value){return typeof value=="number"&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER}module.exports=isLength},{}],250:[function(require,module,exports){var baseIsMap=require("./_baseIsMap"),baseUnary=require("./_baseUnary"),nodeUtil=require("./_nodeUtil"); | |
| /* Node.js helper references. */var nodeIsMap=nodeUtil&&nodeUtil.isMap; | |
| /** | |
| * Checks if `value` is classified as a `Map` object. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.3.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a map, else `false`. | |
| * @example | |
| * | |
| * _.isMap(new Map); | |
| * // => true | |
| * | |
| * _.isMap(new WeakMap); | |
| * // => false | |
| */var isMap=nodeIsMap?baseUnary(nodeIsMap):baseIsMap;module.exports=isMap},{"./_baseIsMap":99,"./_baseUnary":127,"./_nodeUtil":204}],251:[function(require,module,exports){ | |
| /** | |
| * Checks if `value` is the | |
| * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) | |
| * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is an object, else `false`. | |
| * @example | |
| * | |
| * _.isObject({}); | |
| * // => true | |
| * | |
| * _.isObject([1, 2, 3]); | |
| * // => true | |
| * | |
| * _.isObject(_.noop); | |
| * // => true | |
| * | |
| * _.isObject(null); | |
| * // => false | |
| */ | |
| function isObject(value){var type=typeof value;return value!=null&&(type=="object"||type=="function")}module.exports=isObject},{}],252:[function(require,module,exports){ | |
| /** | |
| * Checks if `value` is object-like. A value is object-like if it's not `null` | |
| * and has a `typeof` result of "object". | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.0.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is object-like, else `false`. | |
| * @example | |
| * | |
| * _.isObjectLike({}); | |
| * // => true | |
| * | |
| * _.isObjectLike([1, 2, 3]); | |
| * // => true | |
| * | |
| * _.isObjectLike(_.noop); | |
| * // => false | |
| * | |
| * _.isObjectLike(null); | |
| * // => false | |
| */ | |
| function isObjectLike(value){return value!=null&&typeof value=="object"}module.exports=isObjectLike},{}],253:[function(require,module,exports){var baseGetTag=require("./_baseGetTag"),getPrototype=require("./_getPrototype"),isObjectLike=require("./isObjectLike"); | |
| /** `Object#toString` result references. */var objectTag="[object Object]"; | |
| /** Used for built-in method references. */var funcProto=Function.prototype,objectProto=Object.prototype; | |
| /** Used to resolve the decompiled source of functions. */var funcToString=funcProto.toString; | |
| /** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty; | |
| /** Used to infer the `Object` constructor. */var objectCtorString=funcToString.call(Object); | |
| /** | |
| * Checks if `value` is a plain object, that is, an object created by the | |
| * `Object` constructor or one with a `[[Prototype]]` of `null`. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.8.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. | |
| * @example | |
| * | |
| * function Foo() { | |
| * this.a = 1; | |
| * } | |
| * | |
| * _.isPlainObject(new Foo); | |
| * // => false | |
| * | |
| * _.isPlainObject([1, 2, 3]); | |
| * // => false | |
| * | |
| * _.isPlainObject({ 'x': 0, 'y': 0 }); | |
| * // => true | |
| * | |
| * _.isPlainObject(Object.create(null)); | |
| * // => true | |
| */function isPlainObject(value){if(!isObjectLike(value)||baseGetTag(value)!=objectTag){return false}var proto=getPrototype(value);if(proto===null){return true}var Ctor=hasOwnProperty.call(proto,"constructor")&&proto.constructor;return typeof Ctor=="function"&&Ctor instanceof Ctor&&funcToString.call(Ctor)==objectCtorString}module.exports=isPlainObject},{"./_baseGetTag":91,"./_getPrototype":164,"./isObjectLike":252}],254:[function(require,module,exports){var baseIsSet=require("./_baseIsSet"),baseUnary=require("./_baseUnary"),nodeUtil=require("./_nodeUtil"); | |
| /* Node.js helper references. */var nodeIsSet=nodeUtil&&nodeUtil.isSet; | |
| /** | |
| * Checks if `value` is classified as a `Set` object. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.3.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a set, else `false`. | |
| * @example | |
| * | |
| * _.isSet(new Set); | |
| * // => true | |
| * | |
| * _.isSet(new WeakSet); | |
| * // => false | |
| */var isSet=nodeIsSet?baseUnary(nodeIsSet):baseIsSet;module.exports=isSet},{"./_baseIsSet":103,"./_baseUnary":127,"./_nodeUtil":204}],255:[function(require,module,exports){var baseGetTag=require("./_baseGetTag"),isArray=require("./isArray"),isObjectLike=require("./isObjectLike"); | |
| /** `Object#toString` result references. */var stringTag="[object String]"; | |
| /** | |
| * Checks if `value` is classified as a `String` primitive or object. | |
| * | |
| * @static | |
| * @since 0.1.0 | |
| * @memberOf _ | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a string, else `false`. | |
| * @example | |
| * | |
| * _.isString('abc'); | |
| * // => true | |
| * | |
| * _.isString(1); | |
| * // => false | |
| */function isString(value){return typeof value=="string"||!isArray(value)&&isObjectLike(value)&&baseGetTag(value)==stringTag}module.exports=isString},{"./_baseGetTag":91,"./isArray":243,"./isObjectLike":252}],256:[function(require,module,exports){var baseGetTag=require("./_baseGetTag"),isObjectLike=require("./isObjectLike"); | |
| /** `Object#toString` result references. */var symbolTag="[object Symbol]"; | |
| /** | |
| * Checks if `value` is classified as a `Symbol` primitive or object. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.0.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. | |
| * @example | |
| * | |
| * _.isSymbol(Symbol.iterator); | |
| * // => true | |
| * | |
| * _.isSymbol('abc'); | |
| * // => false | |
| */function isSymbol(value){return typeof value=="symbol"||isObjectLike(value)&&baseGetTag(value)==symbolTag}module.exports=isSymbol},{"./_baseGetTag":91,"./isObjectLike":252}],257:[function(require,module,exports){var baseIsTypedArray=require("./_baseIsTypedArray"),baseUnary=require("./_baseUnary"),nodeUtil=require("./_nodeUtil"); | |
| /* Node.js helper references. */var nodeIsTypedArray=nodeUtil&&nodeUtil.isTypedArray; | |
| /** | |
| * Checks if `value` is classified as a typed array. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 3.0.0 | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. | |
| * @example | |
| * | |
| * _.isTypedArray(new Uint8Array); | |
| * // => true | |
| * | |
| * _.isTypedArray([]); | |
| * // => false | |
| */var isTypedArray=nodeIsTypedArray?baseUnary(nodeIsTypedArray):baseIsTypedArray;module.exports=isTypedArray},{"./_baseIsTypedArray":104,"./_baseUnary":127,"./_nodeUtil":204}],258:[function(require,module,exports){ | |
| /** | |
| * Checks if `value` is `undefined`. | |
| * | |
| * @static | |
| * @since 0.1.0 | |
| * @memberOf _ | |
| * @category Lang | |
| * @param {*} value The value to check. | |
| * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. | |
| * @example | |
| * | |
| * _.isUndefined(void 0); | |
| * // => true | |
| * | |
| * _.isUndefined(null); | |
| * // => false | |
| */ | |
| function isUndefined(value){return value===undefined}module.exports=isUndefined},{}],259:[function(require,module,exports){var arrayLikeKeys=require("./_arrayLikeKeys"),baseKeys=require("./_baseKeys"),isArrayLike=require("./isArrayLike"); | |
| /** | |
| * Creates an array of the own enumerable property names of `object`. | |
| * | |
| * **Note:** Non-object values are coerced to objects. See the | |
| * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) | |
| * for more details. | |
| * | |
| * @static | |
| * @since 0.1.0 | |
| * @memberOf _ | |
| * @category Object | |
| * @param {Object} object The object to query. | |
| * @returns {Array} Returns the array of property names. | |
| * @example | |
| * | |
| * function Foo() { | |
| * this.a = 1; | |
| * this.b = 2; | |
| * } | |
| * | |
| * Foo.prototype.c = 3; | |
| * | |
| * _.keys(new Foo); | |
| * // => ['a', 'b'] (iteration order is not guaranteed) | |
| * | |
| * _.keys('hi'); | |
| * // => ['0', '1'] | |
| */function keys(object){return isArrayLike(object)?arrayLikeKeys(object):baseKeys(object)}module.exports=keys},{"./_arrayLikeKeys":68,"./_baseKeys":106,"./isArrayLike":244}],260:[function(require,module,exports){var arrayLikeKeys=require("./_arrayLikeKeys"),baseKeysIn=require("./_baseKeysIn"),isArrayLike=require("./isArrayLike"); | |
| /** | |
| * Creates an array of the own and inherited enumerable property names of `object`. | |
| * | |
| * **Note:** Non-object values are coerced to objects. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 3.0.0 | |
| * @category Object | |
| * @param {Object} object The object to query. | |
| * @returns {Array} Returns the array of property names. | |
| * @example | |
| * | |
| * function Foo() { | |
| * this.a = 1; | |
| * this.b = 2; | |
| * } | |
| * | |
| * Foo.prototype.c = 3; | |
| * | |
| * _.keysIn(new Foo); | |
| * // => ['a', 'b', 'c'] (iteration order is not guaranteed) | |
| */function keysIn(object){return isArrayLike(object)?arrayLikeKeys(object,true):baseKeysIn(object)}module.exports=keysIn},{"./_arrayLikeKeys":68,"./_baseKeysIn":107,"./isArrayLike":244}],261:[function(require,module,exports){ | |
| /** | |
| * Gets the last element of `array`. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Array | |
| * @param {Array} array The array to query. | |
| * @returns {*} Returns the last element of `array`. | |
| * @example | |
| * | |
| * _.last([1, 2, 3]); | |
| * // => 3 | |
| */ | |
| function last(array){var length=array==null?0:array.length;return length?array[length-1]:undefined}module.exports=last},{}],262:[function(require,module,exports){var arrayMap=require("./_arrayMap"),baseIteratee=require("./_baseIteratee"),baseMap=require("./_baseMap"),isArray=require("./isArray"); | |
| /** | |
| * Creates an array of values by running each element in `collection` thru | |
| * `iteratee`. The iteratee is invoked with three arguments: | |
| * (value, index|key, collection). | |
| * | |
| * Many lodash methods are guarded to work as iteratees for methods like | |
| * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. | |
| * | |
| * The guarded methods are: | |
| * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, | |
| * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, | |
| * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, | |
| * `template`, `trim`, `trimEnd`, `trimStart`, and `words` | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Collection | |
| * @param {Array|Object} collection The collection to iterate over. | |
| * @param {Function} [iteratee=_.identity] The function invoked per iteration. | |
| * @returns {Array} Returns the new mapped array. | |
| * @example | |
| * | |
| * function square(n) { | |
| * return n * n; | |
| * } | |
| * | |
| * _.map([4, 8], square); | |
| * // => [16, 64] | |
| * | |
| * _.map({ 'a': 4, 'b': 8 }, square); | |
| * // => [16, 64] (iteration order is not guaranteed) | |
| * | |
| * var users = [ | |
| * { 'user': 'barney' }, | |
| * { 'user': 'fred' } | |
| * ]; | |
| * | |
| * // The `_.property` iteratee shorthand. | |
| * _.map(users, 'user'); | |
| * // => ['barney', 'fred'] | |
| */function map(collection,iteratee){var func=isArray(collection)?arrayMap:baseMap;return func(collection,baseIteratee(iteratee,3))}module.exports=map},{"./_arrayMap":69,"./_baseIteratee":105,"./_baseMap":109,"./isArray":243}],263:[function(require,module,exports){var baseAssignValue=require("./_baseAssignValue"),baseForOwn=require("./_baseForOwn"),baseIteratee=require("./_baseIteratee"); | |
| /** | |
| * Creates an object with the same keys as `object` and values generated | |
| * by running each own enumerable string keyed property of `object` thru | |
| * `iteratee`. The iteratee is invoked with three arguments: | |
| * (value, key, object). | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 2.4.0 | |
| * @category Object | |
| * @param {Object} object The object to iterate over. | |
| * @param {Function} [iteratee=_.identity] The function invoked per iteration. | |
| * @returns {Object} Returns the new mapped object. | |
| * @see _.mapKeys | |
| * @example | |
| * | |
| * var users = { | |
| * 'fred': { 'user': 'fred', 'age': 40 }, | |
| * 'pebbles': { 'user': 'pebbles', 'age': 1 } | |
| * }; | |
| * | |
| * _.mapValues(users, function(o) { return o.age; }); | |
| * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) | |
| * | |
| * // The `_.property` iteratee shorthand. | |
| * _.mapValues(users, 'age'); | |
| * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) | |
| */function mapValues(object,iteratee){var result={};iteratee=baseIteratee(iteratee,3);baseForOwn(object,function(value,key,object){baseAssignValue(result,key,iteratee(value,key,object))});return result}module.exports=mapValues},{"./_baseAssignValue":79,"./_baseForOwn":88,"./_baseIteratee":105}],264:[function(require,module,exports){var baseExtremum=require("./_baseExtremum"),baseGt=require("./_baseGt"),identity=require("./identity"); | |
| /** | |
| * Computes the maximum value of `array`. If `array` is empty or falsey, | |
| * `undefined` is returned. | |
| * | |
| * @static | |
| * @since 0.1.0 | |
| * @memberOf _ | |
| * @category Math | |
| * @param {Array} array The array to iterate over. | |
| * @returns {*} Returns the maximum value. | |
| * @example | |
| * | |
| * _.max([4, 2, 8, 6]); | |
| * // => 8 | |
| * | |
| * _.max([]); | |
| * // => undefined | |
| */function max(array){return array&&array.length?baseExtremum(array,identity,baseGt):undefined}module.exports=max},{"./_baseExtremum":83,"./_baseGt":92,"./identity":241}],265:[function(require,module,exports){var MapCache=require("./_MapCache"); | |
| /** Error message constants. */var FUNC_ERROR_TEXT="Expected a function"; | |
| /** | |
| * Creates a function that memoizes the result of `func`. If `resolver` is | |
| * provided, it determines the cache key for storing the result based on the | |
| * arguments provided to the memoized function. By default, the first argument | |
| * provided to the memoized function is used as the map cache key. The `func` | |
| * is invoked with the `this` binding of the memoized function. | |
| * | |
| * **Note:** The cache is exposed as the `cache` property on the memoized | |
| * function. Its creation may be customized by replacing the `_.memoize.Cache` | |
| * constructor with one whose instances implement the | |
| * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) | |
| * method interface of `clear`, `delete`, `get`, `has`, and `set`. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Function | |
| * @param {Function} func The function to have its output memoized. | |
| * @param {Function} [resolver] The function to resolve the cache key. | |
| * @returns {Function} Returns the new memoized function. | |
| * @example | |
| * | |
| * var object = { 'a': 1, 'b': 2 }; | |
| * var other = { 'c': 3, 'd': 4 }; | |
| * | |
| * var values = _.memoize(_.values); | |
| * values(object); | |
| * // => [1, 2] | |
| * | |
| * values(other); | |
| * // => [3, 4] | |
| * | |
| * object.a = 2; | |
| * values(object); | |
| * // => [1, 2] | |
| * | |
| * // Modify the result cache. | |
| * values.cache.set(object, ['a', 'b']); | |
| * values(object); | |
| * // => ['a', 'b'] | |
| * | |
| * // Replace `_.memoize.Cache`. | |
| * _.memoize.Cache = WeakMap; | |
| */function memoize(func,resolver){if(typeof func!="function"||resolver!=null&&typeof resolver!="function"){throw new TypeError(FUNC_ERROR_TEXT)}var memoized=function(){var args=arguments,key=resolver?resolver.apply(this,args):args[0],cache=memoized.cache;if(cache.has(key)){return cache.get(key)}var result=func.apply(this,args);memoized.cache=cache.set(key,result)||cache;return result};memoized.cache=new(memoize.Cache||MapCache);return memoized} | |
| // Expose `MapCache`. | |
| memoize.Cache=MapCache;module.exports=memoize},{"./_MapCache":55}],266:[function(require,module,exports){var baseMerge=require("./_baseMerge"),createAssigner=require("./_createAssigner"); | |
| /** | |
| * This method is like `_.assign` except that it recursively merges own and | |
| * inherited enumerable string keyed properties of source objects into the | |
| * destination object. Source properties that resolve to `undefined` are | |
| * skipped if a destination value exists. Array and plain object properties | |
| * are merged recursively. Other objects and value types are overridden by | |
| * assignment. Source objects are applied from left to right. Subsequent | |
| * sources overwrite property assignments of previous sources. | |
| * | |
| * **Note:** This method mutates `object`. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.5.0 | |
| * @category Object | |
| * @param {Object} object The destination object. | |
| * @param {...Object} [sources] The source objects. | |
| * @returns {Object} Returns `object`. | |
| * @example | |
| * | |
| * var object = { | |
| * 'a': [{ 'b': 2 }, { 'd': 4 }] | |
| * }; | |
| * | |
| * var other = { | |
| * 'a': [{ 'c': 3 }, { 'e': 5 }] | |
| * }; | |
| * | |
| * _.merge(object, other); | |
| * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } | |
| */var merge=createAssigner(function(object,source,srcIndex){baseMerge(object,source,srcIndex)});module.exports=merge},{"./_baseMerge":112,"./_createAssigner":147}],267:[function(require,module,exports){var baseExtremum=require("./_baseExtremum"),baseLt=require("./_baseLt"),identity=require("./identity"); | |
| /** | |
| * Computes the minimum value of `array`. If `array` is empty or falsey, | |
| * `undefined` is returned. | |
| * | |
| * @static | |
| * @since 0.1.0 | |
| * @memberOf _ | |
| * @category Math | |
| * @param {Array} array The array to iterate over. | |
| * @returns {*} Returns the minimum value. | |
| * @example | |
| * | |
| * _.min([4, 2, 8, 6]); | |
| * // => 2 | |
| * | |
| * _.min([]); | |
| * // => undefined | |
| */function min(array){return array&&array.length?baseExtremum(array,identity,baseLt):undefined}module.exports=min},{"./_baseExtremum":83,"./_baseLt":108,"./identity":241}],268:[function(require,module,exports){var baseExtremum=require("./_baseExtremum"),baseIteratee=require("./_baseIteratee"),baseLt=require("./_baseLt"); | |
| /** | |
| * This method is like `_.min` except that it accepts `iteratee` which is | |
| * invoked for each element in `array` to generate the criterion by which | |
| * the value is ranked. The iteratee is invoked with one argument: (value). | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.0.0 | |
| * @category Math | |
| * @param {Array} array The array to iterate over. | |
| * @param {Function} [iteratee=_.identity] The iteratee invoked per element. | |
| * @returns {*} Returns the minimum value. | |
| * @example | |
| * | |
| * var objects = [{ 'n': 1 }, { 'n': 2 }]; | |
| * | |
| * _.minBy(objects, function(o) { return o.n; }); | |
| * // => { 'n': 1 } | |
| * | |
| * // The `_.property` iteratee shorthand. | |
| * _.minBy(objects, 'n'); | |
| * // => { 'n': 1 } | |
| */function minBy(array,iteratee){return array&&array.length?baseExtremum(array,baseIteratee(iteratee,2),baseLt):undefined}module.exports=minBy},{"./_baseExtremum":83,"./_baseIteratee":105,"./_baseLt":108}],269:[function(require,module,exports){ | |
| /** | |
| * This method returns `undefined`. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 2.3.0 | |
| * @category Util | |
| * @example | |
| * | |
| * _.times(2, _.noop); | |
| * // => [undefined, undefined] | |
| */ | |
| function noop(){ | |
| // No operation performed. | |
| }module.exports=noop},{}],270:[function(require,module,exports){var root=require("./_root"); | |
| /** | |
| * Gets the timestamp of the number of milliseconds that have elapsed since | |
| * the Unix epoch (1 January 1970 00:00:00 UTC). | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 2.4.0 | |
| * @category Date | |
| * @returns {number} Returns the timestamp. | |
| * @example | |
| * | |
| * _.defer(function(stamp) { | |
| * console.log(_.now() - stamp); | |
| * }, _.now()); | |
| * // => Logs the number of milliseconds it took for the deferred invocation. | |
| */var now=function(){return root.Date.now()};module.exports=now},{"./_root":208}],271:[function(require,module,exports){var basePick=require("./_basePick"),flatRest=require("./_flatRest"); | |
| /** | |
| * Creates an object composed of the picked `object` properties. | |
| * | |
| * @static | |
| * @since 0.1.0 | |
| * @memberOf _ | |
| * @category Object | |
| * @param {Object} object The source object. | |
| * @param {...(string|string[])} [paths] The property paths to pick. | |
| * @returns {Object} Returns the new object. | |
| * @example | |
| * | |
| * var object = { 'a': 1, 'b': '2', 'c': 3 }; | |
| * | |
| * _.pick(object, ['a', 'c']); | |
| * // => { 'a': 1, 'c': 3 } | |
| */var pick=flatRest(function(object,paths){return object==null?{}:basePick(object,paths)});module.exports=pick},{"./_basePick":115,"./_flatRest":157}],272:[function(require,module,exports){var baseProperty=require("./_baseProperty"),basePropertyDeep=require("./_basePropertyDeep"),isKey=require("./_isKey"),toKey=require("./_toKey"); | |
| /** | |
| * Creates a function that returns the value at `path` of a given object. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 2.4.0 | |
| * @category Util | |
| * @param {Array|string} path The path of the property to get. | |
| * @returns {Function} Returns the new accessor function. | |
| * @example | |
| * | |
| * var objects = [ | |
| * { 'a': { 'b': 2 } }, | |
| * { 'a': { 'b': 1 } } | |
| * ]; | |
| * | |
| * _.map(objects, _.property('a.b')); | |
| * // => [2, 1] | |
| * | |
| * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); | |
| * // => [1, 2] | |
| */function property(path){return isKey(path)?baseProperty(toKey(path)):basePropertyDeep(path)}module.exports=property},{"./_baseProperty":117,"./_basePropertyDeep":118,"./_isKey":183,"./_toKey":223}],273:[function(require,module,exports){var createRange=require("./_createRange"); | |
| /** | |
| * Creates an array of numbers (positive and/or negative) progressing from | |
| * `start` up to, but not including, `end`. A step of `-1` is used if a negative | |
| * `start` is specified without an `end` or `step`. If `end` is not specified, | |
| * it's set to `start` with `start` then set to `0`. | |
| * | |
| * **Note:** JavaScript follows the IEEE-754 standard for resolving | |
| * floating-point values which can produce unexpected results. | |
| * | |
| * @static | |
| * @since 0.1.0 | |
| * @memberOf _ | |
| * @category Util | |
| * @param {number} [start=0] The start of the range. | |
| * @param {number} end The end of the range. | |
| * @param {number} [step=1] The value to increment or decrement by. | |
| * @returns {Array} Returns the range of numbers. | |
| * @see _.inRange, _.rangeRight | |
| * @example | |
| * | |
| * _.range(4); | |
| * // => [0, 1, 2, 3] | |
| * | |
| * _.range(-4); | |
| * // => [0, -1, -2, -3] | |
| * | |
| * _.range(1, 5); | |
| * // => [1, 2, 3, 4] | |
| * | |
| * _.range(0, 20, 5); | |
| * // => [0, 5, 10, 15] | |
| * | |
| * _.range(0, -4, -1); | |
| * // => [0, -1, -2, -3] | |
| * | |
| * _.range(1, 4, 0); | |
| * // => [1, 1, 1] | |
| * | |
| * _.range(0); | |
| * // => [] | |
| */var range=createRange();module.exports=range},{"./_createRange":151}],274:[function(require,module,exports){var arrayReduce=require("./_arrayReduce"),baseEach=require("./_baseEach"),baseIteratee=require("./_baseIteratee"),baseReduce=require("./_baseReduce"),isArray=require("./isArray"); | |
| /** | |
| * Reduces `collection` to a value which is the accumulated result of running | |
| * each element in `collection` thru `iteratee`, where each successive | |
| * invocation is supplied the return value of the previous. If `accumulator` | |
| * is not given, the first element of `collection` is used as the initial | |
| * value. The iteratee is invoked with four arguments: | |
| * (accumulator, value, index|key, collection). | |
| * | |
| * Many lodash methods are guarded to work as iteratees for methods like | |
| * `_.reduce`, `_.reduceRight`, and `_.transform`. | |
| * | |
| * The guarded methods are: | |
| * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, | |
| * and `sortBy` | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Collection | |
| * @param {Array|Object} collection The collection to iterate over. | |
| * @param {Function} [iteratee=_.identity] The function invoked per iteration. | |
| * @param {*} [accumulator] The initial value. | |
| * @returns {*} Returns the accumulated value. | |
| * @see _.reduceRight | |
| * @example | |
| * | |
| * _.reduce([1, 2], function(sum, n) { | |
| * return sum + n; | |
| * }, 0); | |
| * // => 3 | |
| * | |
| * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { | |
| * (result[value] || (result[value] = [])).push(key); | |
| * return result; | |
| * }, {}); | |
| * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) | |
| */function reduce(collection,iteratee,accumulator){var func=isArray(collection)?arrayReduce:baseReduce,initAccum=arguments.length<3;return func(collection,baseIteratee(iteratee,4),accumulator,initAccum,baseEach)}module.exports=reduce},{"./_arrayReduce":71,"./_baseEach":82,"./_baseIteratee":105,"./_baseReduce":120,"./isArray":243}],275:[function(require,module,exports){var baseKeys=require("./_baseKeys"),getTag=require("./_getTag"),isArrayLike=require("./isArrayLike"),isString=require("./isString"),stringSize=require("./_stringSize"); | |
| /** `Object#toString` result references. */var mapTag="[object Map]",setTag="[object Set]"; | |
| /** | |
| * Gets the size of `collection` by returning its length for array-like | |
| * values or the number of own enumerable string keyed properties for objects. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Collection | |
| * @param {Array|Object|string} collection The collection to inspect. | |
| * @returns {number} Returns the collection size. | |
| * @example | |
| * | |
| * _.size([1, 2, 3]); | |
| * // => 3 | |
| * | |
| * _.size({ 'a': 1, 'b': 2 }); | |
| * // => 2 | |
| * | |
| * _.size('pebbles'); | |
| * // => 7 | |
| */function size(collection){if(collection==null){return 0}if(isArrayLike(collection)){return isString(collection)?stringSize(collection):collection.length}var tag=getTag(collection);if(tag==mapTag||tag==setTag){return collection.size}return baseKeys(collection).length}module.exports=size},{"./_baseKeys":106,"./_getTag":168,"./_stringSize":221,"./isArrayLike":244,"./isString":255}],276:[function(require,module,exports){var baseFlatten=require("./_baseFlatten"),baseOrderBy=require("./_baseOrderBy"),baseRest=require("./_baseRest"),isIterateeCall=require("./_isIterateeCall"); | |
| /** | |
| * Creates an array of elements, sorted in ascending order by the results of | |
| * running each element in a collection thru each iteratee. This method | |
| * performs a stable sort, that is, it preserves the original sort order of | |
| * equal elements. The iteratees are invoked with one argument: (value). | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Collection | |
| * @param {Array|Object} collection The collection to iterate over. | |
| * @param {...(Function|Function[])} [iteratees=[_.identity]] | |
| * The iteratees to sort by. | |
| * @returns {Array} Returns the new sorted array. | |
| * @example | |
| * | |
| * var users = [ | |
| * { 'user': 'fred', 'age': 48 }, | |
| * { 'user': 'barney', 'age': 36 }, | |
| * { 'user': 'fred', 'age': 40 }, | |
| * { 'user': 'barney', 'age': 34 } | |
| * ]; | |
| * | |
| * _.sortBy(users, [function(o) { return o.user; }]); | |
| * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] | |
| * | |
| * _.sortBy(users, ['user', 'age']); | |
| * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]] | |
| */var sortBy=baseRest(function(collection,iteratees){if(collection==null){return[]}var length=iteratees.length;if(length>1&&isIterateeCall(collection,iteratees[0],iteratees[1])){iteratees=[]}else if(length>2&&isIterateeCall(iteratees[0],iteratees[1],iteratees[2])){iteratees=[iteratees[0]]}return baseOrderBy(collection,baseFlatten(iteratees,1),[])});module.exports=sortBy},{"./_baseFlatten":86,"./_baseOrderBy":114,"./_baseRest":121,"./_isIterateeCall":182}],277:[function(require,module,exports){ | |
| /** | |
| * This method returns a new empty array. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.13.0 | |
| * @category Util | |
| * @returns {Array} Returns the new empty array. | |
| * @example | |
| * | |
| * var arrays = _.times(2, _.stubArray); | |
| * | |
| * console.log(arrays); | |
| * // => [[], []] | |
| * | |
| * console.log(arrays[0] === arrays[1]); | |
| * // => false | |
| */ | |
| function stubArray(){return[]}module.exports=stubArray},{}],278:[function(require,module,exports){ | |
| /** | |
| * This method returns `false`. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.13.0 | |
| * @category Util | |
| * @returns {boolean} Returns `false`. | |
| * @example | |
| * | |
| * _.times(2, _.stubFalse); | |
| * // => [false, false] | |
| */ | |
| function stubFalse(){return false}module.exports=stubFalse},{}],279:[function(require,module,exports){var toNumber=require("./toNumber"); | |
| /** Used as references for various `Number` constants. */var INFINITY=1/0,MAX_INTEGER=17976931348623157e292; | |
| /** | |
| * Converts `value` to a finite number. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.12.0 | |
| * @category Lang | |
| * @param {*} value The value to convert. | |
| * @returns {number} Returns the converted number. | |
| * @example | |
| * | |
| * _.toFinite(3.2); | |
| * // => 3.2 | |
| * | |
| * _.toFinite(Number.MIN_VALUE); | |
| * // => 5e-324 | |
| * | |
| * _.toFinite(Infinity); | |
| * // => 1.7976931348623157e+308 | |
| * | |
| * _.toFinite('3.2'); | |
| * // => 3.2 | |
| */function toFinite(value){if(!value){return value===0?value:0}value=toNumber(value);if(value===INFINITY||value===-INFINITY){var sign=value<0?-1:1;return sign*MAX_INTEGER}return value===value?value:0}module.exports=toFinite},{"./toNumber":281}],280:[function(require,module,exports){var toFinite=require("./toFinite"); | |
| /** | |
| * Converts `value` to an integer. | |
| * | |
| * **Note:** This method is loosely based on | |
| * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.0.0 | |
| * @category Lang | |
| * @param {*} value The value to convert. | |
| * @returns {number} Returns the converted integer. | |
| * @example | |
| * | |
| * _.toInteger(3.2); | |
| * // => 3 | |
| * | |
| * _.toInteger(Number.MIN_VALUE); | |
| * // => 0 | |
| * | |
| * _.toInteger(Infinity); | |
| * // => 1.7976931348623157e+308 | |
| * | |
| * _.toInteger('3.2'); | |
| * // => 3 | |
| */function toInteger(value){var result=toFinite(value),remainder=result%1;return result===result?remainder?result-remainder:result:0}module.exports=toInteger},{"./toFinite":279}],281:[function(require,module,exports){var isObject=require("./isObject"),isSymbol=require("./isSymbol"); | |
| /** Used as references for various `Number` constants. */var NAN=0/0; | |
| /** Used to match leading and trailing whitespace. */var reTrim=/^\s+|\s+$/g; | |
| /** Used to detect bad signed hexadecimal string values. */var reIsBadHex=/^[-+]0x[0-9a-f]+$/i; | |
| /** Used to detect binary string values. */var reIsBinary=/^0b[01]+$/i; | |
| /** Used to detect octal string values. */var reIsOctal=/^0o[0-7]+$/i; | |
| /** Built-in method references without a dependency on `root`. */var freeParseInt=parseInt; | |
| /** | |
| * Converts `value` to a number. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.0.0 | |
| * @category Lang | |
| * @param {*} value The value to process. | |
| * @returns {number} Returns the number. | |
| * @example | |
| * | |
| * _.toNumber(3.2); | |
| * // => 3.2 | |
| * | |
| * _.toNumber(Number.MIN_VALUE); | |
| * // => 5e-324 | |
| * | |
| * _.toNumber(Infinity); | |
| * // => Infinity | |
| * | |
| * _.toNumber('3.2'); | |
| * // => 3.2 | |
| */function toNumber(value){if(typeof value=="number"){return value}if(isSymbol(value)){return NAN}if(isObject(value)){var other=typeof value.valueOf=="function"?value.valueOf():value;value=isObject(other)?other+"":other}if(typeof value!="string"){return value===0?value:+value}value=value.replace(reTrim,"");var isBinary=reIsBinary.test(value);return isBinary||reIsOctal.test(value)?freeParseInt(value.slice(2),isBinary?2:8):reIsBadHex.test(value)?NAN:+value}module.exports=toNumber},{"./isObject":251,"./isSymbol":256}],282:[function(require,module,exports){var copyObject=require("./_copyObject"),keysIn=require("./keysIn"); | |
| /** | |
| * Converts `value` to a plain object flattening inherited enumerable string | |
| * keyed properties of `value` to own properties of the plain object. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 3.0.0 | |
| * @category Lang | |
| * @param {*} value The value to convert. | |
| * @returns {Object} Returns the converted plain object. | |
| * @example | |
| * | |
| * function Foo() { | |
| * this.b = 2; | |
| * } | |
| * | |
| * Foo.prototype.c = 3; | |
| * | |
| * _.assign({ 'a': 1 }, new Foo); | |
| * // => { 'a': 1, 'b': 2 } | |
| * | |
| * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); | |
| * // => { 'a': 1, 'b': 2, 'c': 3 } | |
| */function toPlainObject(value){return copyObject(value,keysIn(value))}module.exports=toPlainObject},{"./_copyObject":143,"./keysIn":260}],283:[function(require,module,exports){var baseToString=require("./_baseToString"); | |
| /** | |
| * Converts `value` to a string. An empty string is returned for `null` | |
| * and `undefined` values. The sign of `-0` is preserved. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 4.0.0 | |
| * @category Lang | |
| * @param {*} value The value to convert. | |
| * @returns {string} Returns the converted string. | |
| * @example | |
| * | |
| * _.toString(null); | |
| * // => '' | |
| * | |
| * _.toString(-0); | |
| * // => '-0' | |
| * | |
| * _.toString([1, 2, 3]); | |
| * // => '1,2,3' | |
| */function toString(value){return value==null?"":baseToString(value)}module.exports=toString},{"./_baseToString":126}],284:[function(require,module,exports){var arrayEach=require("./_arrayEach"),baseCreate=require("./_baseCreate"),baseForOwn=require("./_baseForOwn"),baseIteratee=require("./_baseIteratee"),getPrototype=require("./_getPrototype"),isArray=require("./isArray"),isBuffer=require("./isBuffer"),isFunction=require("./isFunction"),isObject=require("./isObject"),isTypedArray=require("./isTypedArray"); | |
| /** | |
| * An alternative to `_.reduce`; this method transforms `object` to a new | |
| * `accumulator` object which is the result of running each of its own | |
| * enumerable string keyed properties thru `iteratee`, with each invocation | |
| * potentially mutating the `accumulator` object. If `accumulator` is not | |
| * provided, a new object with the same `[[Prototype]]` will be used. The | |
| * iteratee is invoked with four arguments: (accumulator, value, key, object). | |
| * Iteratee functions may exit iteration early by explicitly returning `false`. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 1.3.0 | |
| * @category Object | |
| * @param {Object} object The object to iterate over. | |
| * @param {Function} [iteratee=_.identity] The function invoked per iteration. | |
| * @param {*} [accumulator] The custom accumulator value. | |
| * @returns {*} Returns the accumulated value. | |
| * @example | |
| * | |
| * _.transform([2, 3, 4], function(result, n) { | |
| * result.push(n *= n); | |
| * return n % 2 == 0; | |
| * }, []); | |
| * // => [4, 9] | |
| * | |
| * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { | |
| * (result[value] || (result[value] = [])).push(key); | |
| * }, {}); | |
| * // => { '1': ['a', 'c'], '2': ['b'] } | |
| */function transform(object,iteratee,accumulator){var isArr=isArray(object),isArrLike=isArr||isBuffer(object)||isTypedArray(object);iteratee=baseIteratee(iteratee,4);if(accumulator==null){var Ctor=object&&object.constructor;if(isArrLike){accumulator=isArr?new Ctor:[]}else if(isObject(object)){accumulator=isFunction(Ctor)?baseCreate(getPrototype(object)):{}}else{accumulator={}}}(isArrLike?arrayEach:baseForOwn)(object,function(value,index,object){return iteratee(accumulator,value,index,object)});return accumulator}module.exports=transform},{"./_arrayEach":64,"./_baseCreate":81,"./_baseForOwn":88,"./_baseIteratee":105,"./_getPrototype":164,"./isArray":243,"./isBuffer":246,"./isFunction":248,"./isObject":251,"./isTypedArray":257}],285:[function(require,module,exports){var baseFlatten=require("./_baseFlatten"),baseRest=require("./_baseRest"),baseUniq=require("./_baseUniq"),isArrayLikeObject=require("./isArrayLikeObject"); | |
| /** | |
| * Creates an array of unique values, in order, from all given arrays using | |
| * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) | |
| * for equality comparisons. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.1.0 | |
| * @category Array | |
| * @param {...Array} [arrays] The arrays to inspect. | |
| * @returns {Array} Returns the new array of combined values. | |
| * @example | |
| * | |
| * _.union([2], [1, 2]); | |
| * // => [2, 1] | |
| */var union=baseRest(function(arrays){return baseUniq(baseFlatten(arrays,1,isArrayLikeObject,true))});module.exports=union},{"./_baseFlatten":86,"./_baseRest":121,"./_baseUniq":128,"./isArrayLikeObject":245}],286:[function(require,module,exports){var toString=require("./toString"); | |
| /** Used to generate unique IDs. */var idCounter=0; | |
| /** | |
| * Generates a unique ID. If `prefix` is given, the ID is appended to it. | |
| * | |
| * @static | |
| * @since 0.1.0 | |
| * @memberOf _ | |
| * @category Util | |
| * @param {string} [prefix=''] The value to prefix the ID with. | |
| * @returns {string} Returns the unique ID. | |
| * @example | |
| * | |
| * _.uniqueId('contact_'); | |
| * // => 'contact_104' | |
| * | |
| * _.uniqueId(); | |
| * // => '105' | |
| */function uniqueId(prefix){var id=++idCounter;return toString(prefix)+id}module.exports=uniqueId},{"./toString":283}],287:[function(require,module,exports){var baseValues=require("./_baseValues"),keys=require("./keys"); | |
| /** | |
| * Creates an array of the own enumerable string keyed property values of `object`. | |
| * | |
| * **Note:** Non-object values are coerced to objects. | |
| * | |
| * @static | |
| * @since 0.1.0 | |
| * @memberOf _ | |
| * @category Object | |
| * @param {Object} object The object to query. | |
| * @returns {Array} Returns the array of property values. | |
| * @example | |
| * | |
| * function Foo() { | |
| * this.a = 1; | |
| * this.b = 2; | |
| * } | |
| * | |
| * Foo.prototype.c = 3; | |
| * | |
| * _.values(new Foo); | |
| * // => [1, 2] (iteration order is not guaranteed) | |
| * | |
| * _.values('hi'); | |
| * // => ['h', 'i'] | |
| */function values(object){return object==null?[]:baseValues(object,keys(object))}module.exports=values},{"./_baseValues":129,"./keys":259}],288:[function(require,module,exports){var assignValue=require("./_assignValue"),baseZipObject=require("./_baseZipObject"); | |
| /** | |
| * This method is like `_.fromPairs` except that it accepts two arrays, | |
| * one of property identifiers and one of corresponding values. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @since 0.4.0 | |
| * @category Array | |
| * @param {Array} [props=[]] The property identifiers. | |
| * @param {Array} [values=[]] The property values. | |
| * @returns {Object} Returns the new object. | |
| * @example | |
| * | |
| * _.zipObject(['a', 'b'], [1, 2]); | |
| * // => { 'a': 1, 'b': 2 } | |
| */function zipObject(props,values){return baseZipObject(props||[],values||[],assignValue)}module.exports=zipObject},{"./_assignValue":75,"./_baseZipObject":130}]},{},[1])(1)}); | |