{"version":3,"file":"bundle.js","sources":["node_modules/browserify/node_modules/browser-pack/_prelude.js","index.js","bucketData.js","bubble.js","setOrigin.js","chart.js","svgData.js","max.js","node_modules/react/addons.js","lib/arcGenerator.js","node_modules/domready/ready.js","node_modules/d3/d3.js","node_modules/d3-scale/index.js","node_modules/lodash/dist/lodash.js","allocation.js","bucket.js","node_modules/uuid/uuid.js","node_modules/react/react.js","node_modules/react/lib/ReactWithAddons.js","node_modules/uuid/rng-browser.js","node_modules/browserify/node_modules/buffer/index.js","lib/pathCoordsTween.js","lib/animate.js","lib/circleGenerator.js","node_modules/mouse-position/index.js","node_modules/browserify/node_modules/process/browser.js","node_modules/react/lib/React.js","node_modules/react/lib/LinkedStateMixin.js","node_modules/react/lib/ReactComponentWithPureRenderMixin.js","node_modules/react/lib/ReactCSSTransitionGroup.js","node_modules/react/lib/ReactTransitionGroup.js","node_modules/react/lib/cx.js","node_modules/react/lib/cloneWithProps.js","node_modules/react/lib/update.js","node_modules/react/lib/ReactDefaultPerf.js","node_modules/react/lib/ReactTestUtils.js","node_modules/browserify/node_modules/buffer/node_modules/ieee754/index.js","node_modules/browserify/node_modules/buffer/node_modules/base64-js/lib/b64.js","node_modules/mouse-position/node_modules/events/events.js","node_modules/react/lib/DOMPropertyOperations.js","node_modules/react/lib/EventPluginUtils.js","node_modules/react/lib/ReactChildren.js","node_modules/react/lib/ReactComponent.js","node_modules/react/lib/ReactCompositeComponent.js","node_modules/react/lib/ReactContext.js","node_modules/react/lib/ReactCurrentOwner.js","node_modules/react/lib/ReactDescriptor.js","node_modules/react/lib/ReactDOM.js","node_modules/react/lib/ReactDOMComponent.js","node_modules/react/lib/ReactDefaultInjection.js","node_modules/react/lib/ReactInstanceHandles.js","node_modules/react/lib/ReactMount.js","node_modules/react/lib/ReactMultiChild.js","node_modules/react/lib/ReactPerf.js","node_modules/react/lib/ReactPropTypes.js","node_modules/react/lib/ReactServerRendering.js","node_modules/react/lib/ReactTextComponent.js","node_modules/react/lib/onlyChild.js","node_modules/react/lib/ExecutionEnvironment.js","node_modules/react/lib/ReactLink.js","node_modules/react/lib/shallowEqual.js","node_modules/react/lib/ReactCSSTransitionGroupChild.js","node_modules/react/lib/ReactTransitionChildMapping.js","node_modules/react/lib/emptyFunction.js","node_modules/react/lib/merge.js","node_modules/react/lib/ReactPropTransferer.js","node_modules/react/lib/keyOf.js","node_modules/react/lib/warning.js","node_modules/react/lib/copyProperties.js","node_modules/react/lib/invariant.js","node_modules/react/lib/ReactStateSetters.js","node_modules/react/lib/DOMProperty.js","node_modules/react/lib/ReactDefaultPerfAnalysis.js","node_modules/react/lib/performanceNow.js","node_modules/react/lib/EventConstants.js","node_modules/react/lib/EventPluginHub.js","node_modules/react/lib/EventPropagators.js","node_modules/react/lib/ReactBrowserEventEmitter.js","node_modules/react/lib/ReactUpdates.js","node_modules/react/lib/SyntheticEvent.js","node_modules/react/lib/mergeInto.js","node_modules/react/lib/escapeTextForBrowser.js","node_modules/react/lib/memoizeStringOnly.js","node_modules/react/lib/PooledClass.js","node_modules/react/lib/traverseAllChildren.js","node_modules/react/lib/ReactOwner.js","node_modules/react/lib/keyMirror.js","node_modules/react/lib/ReactDescriptorValidator.js","node_modules/react/lib/ReactEmptyComponent.js","node_modules/react/lib/ReactErrorUtils.js","node_modules/react/lib/ReactPropTypeLocations.js","node_modules/react/lib/ReactPropTypeLocationNames.js","node_modules/react/lib/instantiateReactComponent.js","node_modules/react/lib/mixInto.js","node_modules/react/lib/monitorCodeUse.js","node_modules/react/lib/mapObject.js","node_modules/react/lib/shouldUpdateReactComponent.js","node_modules/react/lib/CSSPropertyOperations.js","node_modules/react/lib/ReactBrowserComponentMixin.js","node_modules/react/lib/BeforeInputEventPlugin.js","node_modules/react/lib/ChangeEventPlugin.js","node_modules/react/lib/ClientReactRootIndex.js","node_modules/react/lib/CompositionEventPlugin.js","node_modules/react/lib/DefaultEventPluginOrder.js","node_modules/react/lib/EnterLeaveEventPlugin.js","node_modules/react/lib/HTMLDOMPropertyConfig.js","node_modules/react/lib/MobileSafariClickEventPlugin.js","node_modules/react/lib/ReactComponentBrowserEnvironment.js","node_modules/react/lib/ReactDefaultBatchingStrategy.js","node_modules/react/lib/ReactDOMButton.js","node_modules/react/lib/ReactDOMForm.js","node_modules/react/lib/ReactDOMImg.js","node_modules/react/lib/ReactDOMInput.js","node_modules/react/lib/ReactDOMOption.js","node_modules/react/lib/ReactDOMSelect.js","node_modules/react/lib/ReactDOMTextarea.js","node_modules/react/lib/ReactEventListener.js","node_modules/react/lib/ReactInjection.js","node_modules/react/lib/SelectEventPlugin.js","node_modules/react/lib/ServerReactRootIndex.js","node_modules/react/lib/SimpleEventPlugin.js","node_modules/react/lib/SVGDOMPropertyConfig.js","node_modules/react/lib/createFullPageComponent.js","node_modules/react/lib/ReactRootIndex.js","node_modules/react/lib/containsNode.js","node_modules/react/lib/getReactRootElementInContainer.js","node_modules/react/lib/ReactMultiChildUpdateTypes.js","node_modules/react/lib/flattenChildren.js","node_modules/react/lib/ReactMarkupChecksum.js","node_modules/react/lib/ReactServerRenderingTransaction.js","node_modules/react/lib/CSSCore.js","node_modules/react/lib/EventPluginRegistry.js","node_modules/react/lib/ReactTransitionEvents.js","node_modules/react/lib/accumulate.js","node_modules/react/lib/forEachAccumulated.js","node_modules/react/lib/isEventSupported.js","node_modules/react/lib/ReactEventEmitterMixin.js","node_modules/react/lib/ViewportMetrics.js","node_modules/react/lib/CallbackQueue.js","node_modules/react/lib/Transaction.js","node_modules/react/lib/getEventTarget.js","node_modules/react/lib/mergeHelpers.js","node_modules/react/lib/joinClasses.js","node_modules/react/lib/performance.js","node_modules/react/lib/emptyObject.js","node_modules/react/lib/CSSProperty.js","node_modules/react/lib/dangerousStyleValue.js","node_modules/react/lib/hyphenateStyleName.js","node_modules/react/lib/SyntheticInputEvent.js","node_modules/react/lib/isTextInputElement.js","node_modules/react/lib/ReactInputSelection.js","node_modules/react/lib/SyntheticCompositionEvent.js","node_modules/react/lib/getTextContentAccessor.js","node_modules/react/lib/SyntheticMouseEvent.js","node_modules/react/lib/ReactDOMIDOperations.js","node_modules/react/lib/ReactReconcileTransaction.js","node_modules/react/lib/setInnerHTML.js","node_modules/react/lib/AutoFocusMixin.js","node_modules/react/lib/LocalEventTrapMixin.js","node_modules/react/lib/LinkedValueUtils.js","node_modules/react/lib/EventListener.js","node_modules/react/lib/getUnboundedScrollPosition.js","node_modules/react/lib/SyntheticClipboardEvent.js","node_modules/react/lib/getActiveElement.js","node_modules/react/lib/SyntheticFocusEvent.js","node_modules/react/lib/SyntheticKeyboardEvent.js","node_modules/react/lib/SyntheticDragEvent.js","node_modules/react/lib/SyntheticTouchEvent.js","node_modules/react/lib/SyntheticUIEvent.js","node_modules/react/lib/SyntheticWheelEvent.js","node_modules/react/lib/isTextNode.js","node_modules/react/lib/adler32.js","node_modules/react/lib/ReactPutListenerQueue.js","node_modules/react/lib/hyphenate.js","node_modules/react/lib/ReactDOMSelection.js","node_modules/react/lib/focusNode.js","node_modules/react/lib/getEventModifierState.js","node_modules/react/lib/DOMChildrenOperations.js","node_modules/react/lib/getEventKey.js","node_modules/react/lib/isNode.js","node_modules/react/lib/getNodeForCharacterOffset.js","node_modules/react/lib/Danger.js","node_modules/react/lib/createNodesFromMarkup.js","node_modules/react/lib/getMarkupWrap.js","node_modules/react/lib/createArrayFrom.js","node_modules/react/lib/toArray.js"],"names":["React","require","domready","_","buckets","bubble","setOrigin","Chart","svgData","max","Scale","scale","arc","d3","test","startAngle","endAngle","Math","PI","radius","center","test1","svg","line","console","log","allocation","type","ref","value","color","size","width","height","blobs","children","sqrt","domain","range","r","renderComponent","data","document","body","module","exports","target","allocated","layout","pack","uuid","nodes","rest","node","map","parent","initialX","x","initialY","y","id","v4","Allocation","Bucket","createClass","displayName","getInitialState","dragging","this","props","dragElement","render","DOM","onMouseUp","dragEnd","onMouseMove","onDrag","g","d","activate","dragStart","key","datum","ready","state","bind","mouseOver","mouseLeave","deActivate","circle","className","onMouseOver","onMouseLeave","cx","cy","style","opacity","e","dispatchMarker","split","dropDatum","find","dragDatum","midAngle","cos","sin","refs","arcForm","proportion","coordinates","circleForm","dragUpdate","bool","updateData","setState","arr","prop1","prop2","clone","options","n","length","theta","angleIncrement","angleOffset","angle","i","push","name","definition","define","amd","listener","fns","doc","domContentLoaded","loaded","readyState","addEventListener","removeEventListener","shift","fn","d3_ascending","a","b","NaN","d3_number","isNaN","d3_bisector","compare","left","lo","hi","arguments","mid","right","d3_zipLength","d3_range_integerScale","k","d3_class","ctor","properties","Object","defineProperty","prototype","enumerable","d3_Map","d3_map_has","d3_map_prefix","d3_map_remove","d3_map_keys","keys","forEach","d3_map_size","charCodeAt","d3_map_prefixCode","d3_map_empty","d3_Set","d3_rebind","source","method","apply","d3_vendorSymbol","object","charAt","toUpperCase","substring","d3_vendorPrefixes","prefixName","d3_noop","d3_dispatch","d3_dispatch_event","dispatch","event","l","z","listeners","on","listenerByName","get","slice","indexOf","concat","remove","set","d3_eventPreventDefault","preventDefault","d3_eventSource","s","sourceEvent","d3_eventDispatch","of","thiz","argumentz","e1","e0","d3_selection","groups","d3_subclass","d3_selectionPrototype","d3_selection_selector","selector","d3_select","d3_selection_selectorAll","d3_selectAll","d3_selection_attr","attrNull","removeAttribute","attrNullNS","removeAttributeNS","space","local","attrConstant","setAttribute","attrConstantNS","setAttributeNS","attrFunction","attrFunctionNS","ns","qualify","d3_collapse","trim","replace","d3_selection_classedRe","RegExp","requote","d3_selection_classes","d3_selection_classed","classedConstant","classedFunction","d3_selection_classedName","re","c","classList","add","getAttribute","lastIndex","d3_selection_style","priority","styleNull","removeProperty","styleConstant","setProperty","styleFunction","d3_selection_property","propertyNull","propertyConstant","propertyFunction","d3_selection_creator","ownerDocument","createElementNS","namespaceURI","d3_selection_dataNode","__data__","d3_selection_filter","d3_selectMatches","d3_selection_sortComparator","comparator","d3_selection_each","callback","j","m","group","d3_selection_enter","selection","d3_selection_enterPrototype","d3_selection_enterInsertBefore","enter","i0","j0","update","d3_selection_interrupt","lock","__transition__","active","d3_selection_on","capture","onRemove","$","onAdd","wrap","d3_array","call","removeAll","match","d3_selection_onListener","filter","d3_selection_onFilters","d3_selection_onFilter","o","related","relatedTarget","compareDocumentPosition","d3_event_dragSuppress","d3_event_dragId","click","w","select","d3_window","d3_event_dragSelect","d3_documentElement","suppressClick","off","setTimeout","d3_mousePoint","container","changedTouches","ownerSVGElement","createSVGPoint","point","d3_mouse_bug44083","scrollX","scrollY","append","position","top","margin","padding","border","ctm","getScreenCTM","f","pageX","pageY","clientX","clientY","matrixTransform","inverse","rect","getBoundingClientRect","clientLeft","clientTop","d3_behavior_dragTouchId","identifier","d3_behavior_dragTouchSubject","d3_behavior_dragMouseSubject","d3_sgn","d3_cross2d","d3_acos","π","acos","d3_asin","halfπ","asin","d3_sinh","exp","d3_cosh","d3_tanh","d3_haversin","d3_color","d3_hsl","h","d3_rgb_parse","d3_rgb_hsl","d3_hsl_rgb","v","m1","m2","vv","round","d3_rgb","d3_hcl","d3_lab","d3_lab_hcl","d3_rgb_lab","rgb","d3_hcl_lab","d3_radians","d3_lab_rgb","d3_lab_xyz","d3_lab_X","d3_lab_Y","d3_lab_Z","d3_xyz_rgb","atan2","d3_degrees","d3_xyz_lab","pow","d3_rgbNumber","d3_rgbString","d3_rgb_hex","toString","min","format","hsl","exec","parseFloat","d3_rgb_parseNumber","d3_rgb_names","parseInt","d3_rgb_xyz","d3_functor","d3_identity","d3_xhrType","response","url","mimeType","d3_xhr","respond","result","status","request","responseText","xhr","error","load","headers","XMLHttpRequest","responseType","XDomainRequest","onload","onerror","onreadystatechange","onprogress","progress","header","toLowerCase","send","open","setRequestHeader","overrideMimeType","beforesend","abort","rebind","d3_xhr_fixCallback","d3_timer_step","now","d3_timer_mark","delay","d3_timer_sweep","isFinite","clearTimeout","d3_timer_timeout","d3_timer_interval","d3_timer_frame","Date","d3_timer_active","d3_timer_queueHead","t","t0","t1","time","Infinity","d3_timer_queueTail","d3_format_precision","p","ceil","LN10","d3_formatPrefix","abs","symbol","d3_locale_numberFormat","locale","locale_decimal","decimal","locale_thousands","thousands","locale_grouping","grouping","locale_currency","currency","formatGroup","reverse","join","specifier","d3_format_re","fill","align","sign","zfill","comma","precision","prefix","suffix","integer","floor","d3_format_types","d3_format_typeDefault","zcomma","fullSuffix","negative","unit","formatPrefix","lastIndexOf","before","after","Array","d3_date_utc","UTC","d3_time_interval","step","number","date","d0","d1","offset","d3_date","dt","times","range_utc","utc","d3_time_interval_utc","d3_locale_timeFormat","d3_time_format","template","string","d3_time_formatPads","d3_time_formats","parse","H","M","S","L","Z","d3_time_parse","localZ","setFullYear","W","getDay","U","setHours","d3_time_parsers","d3_time_parseWeekdayAbbrev","d3_time_dayAbbrevRe","d3_time_dayAbbrevLookup","d3_time_parseWeekday","d3_time_dayRe","d3_time_dayLookup","d3_time_parseMonthAbbrev","d3_time_monthAbbrevRe","d3_time_monthAbbrevLookup","d3_time_parseMonth","d3_time_monthRe","d3_time_monthLookup","d3_time_parseLocaleFull","d3_time_parseLocaleDate","d3_time_parseLocaleTime","X","d3_time_parseAmPm","d3_time_periodLookup","locale_dateTime","dateTime","locale_date","locale_time","locale_periods","periods","locale_days","days","locale_shortDays","shortDays","locale_months","months","locale_shortMonths","shortMonths","multi","d3_time_formatMulti","d3_time_formatRe","d3_time_formatLookup","A","getMonth","B","d3_time_formatPad","getDate","getHours","I","d3_time","dayOfYear","getMilliseconds","getMinutes","getSeconds","sundayOfYear","mondayOfYear","getFullYear","Y","d3_time_zone","%","d3_time_parseDay","d3_time_parseHour24","d3_time_parseDayOfYear","d3_time_parseMilliseconds","d3_time_parseMonthNumber","d3_time_parseMinutes","d3_time_parseSeconds","d3_time_parseWeekNumberSunday","d3_time_parseWeekdayNumber","d3_time_parseWeekNumberMonday","d3_time_parseYear","d3_time_parseFullYear","d3_time_parseZone","d3_time_parseLiteralPercent","names","d3_time_numberRe","d3_time_expandYear","getTimezoneOffset","zs","zh","zm","d3_time_percentRe","formats","d3_adder","d3_adderSum","bv","av","d3_geo_streamGeometry","geometry","d3_geo_streamGeometryType","hasOwnProperty","d3_geo_streamLine","closed","coordinate","lineStart","lineEnd","d3_geo_streamPolygon","polygonStart","polygonEnd","d3_geo_areaRingStart","nextPoint","λ","φ","dλ","λ0","sdλ","adλ","cosφ","sinφ","sinφ0","u","cosφ0","d3_geo_areaRingSum","λ00","φ00","d3_geo_area","d3_geo_cartesian","spherical","d3_geo_cartesianDot","d3_geo_cartesianCross","d3_geo_cartesianAdd","d3_geo_cartesianScale","vector","d3_geo_cartesianNormalize","d3_geo_spherical","cartesian","d3_geo_sphericalEqual","ε","d3_geo_centroidPoint","d3_geo_centroidPointXYZ","d3_geo_centroidW0","d3_geo_centroidX0","d3_geo_centroidY0","d3_geo_centroidZ0","d3_geo_centroidLineStart","y0","z0","x0","d3_geo_centroidW1","d3_geo_centroidX1","d3_geo_centroidY1","d3_geo_centroidZ1","d3_geo_centroid","d3_geo_centroidLineEnd","d3_geo_centroidRingStart","cz","d3_geo_centroidX2","d3_geo_centroidY2","d3_geo_centroidZ2","d3_true","d3_geo_clipPolygon","segments","clipStartInside","interpolate","subject","clip","segment","p0","p1","d3_geo_clipPolygonIntersection","sort","d3_geo_clipPolygonLinkCircular","entry","points","start","current","isSubject","array","other","d3_geo_clip","pointVisible","clipLine","clipStart","rotate","pointLine","pointRing","ring","ringListener","ringStart","ringEnd","clean","ringSegments","buffer","pop","polygon","polygonStarted","d3_geo_clipSegmentLength1","rotatedClipStart","invert","merge","d3_geo_pointInPolygon","d3_geo_clipSort","sphere","d3_geo_clipBufferListener","lines","rejoin","meridian","parallel","meridianNormal","polarAngle","winding","reset","point0","φ0","antimeridian","τ","intersection","φarc","d3_geo_clipAntimeridianLine","sλ0","λ1","φ1","sλ1","d3_geo_clipAntimeridianIntersect","cosφ1","sinλ0_λ1","atan","d3_geo_clipAntimeridianInterpolate","from","to","direction","d3_geo_clipCircle","visible","cr","c0","v0","v00","point2","point1","smallRadius","code","intersect","notHemisphere","two","pa","pb","n1","n2","n2n2","n1n2","determinant","c1","c2","n1xn2","uu","t2","q","δλ","polar","q1","d3_geo_circleInterpolate","d3_geom_clipLine","x1","y1","ax","ay","bx","by","dx","dy","d3_geo_clipExtent","corner","comparePoints","ca","cb","insidePolygon","wn","a1","linePoint","first","v_","x_","y_","x__","y__","v__","bufferListener","d3_geo_clipExtentMAX","listener_","inside","d3_geo_compose","compose","d3_geo_conic","projectAt","d3_geo_projectionMutator","parallels","d3_geo_conicEqualArea","forward","ρ","C","ρ0","ρ0_y","d3_geo_pathAreaRingStart","d3_geo_pathAreaPolygon","x00","y00","d3_geo_pathArea","d3_geo_pathBoundsPoint","d3_geo_pathBoundsX0","d3_geo_pathBoundsX1","d3_geo_pathBoundsY0","d3_geo_pathBoundsY1","d3_geo_pathBuffer","pointCircle","pointLineStart","stream","lineEndPolygon","d3_geo_pathBufferCircle","pointRadius","d3_geo_pathCentroidPoint","d3_geo_pathCentroidLineStart","d3_geo_pathCentroid","d3_geo_pathCentroidLineEnd","d3_geo_pathCentroidRingStart","d3_geo_pathContext","context","moveTo","lineTo","closePath","d3_geo_resample","project","resample","maxDepth","resampleRecursive","resampleNone","d3_geo_transformPoint","resampleLineTo","a0","b0","ringPoint","a00","b00","c00","b1","depth","d2","δ2","φ2","λ2","x2","y2","dx2","dy2","dz","cosMinDistance","d3_geo_pathProjectStream","d3_geo_projectionRadians","d3_geo_transform","d3_geo_projection","projection","projectRotate","δx","δy","d3_geo_rotation","δφ","δγ","invalidate","valid","projectResample","preclip","d3_geo_clipAntimeridian","postclip","clipAngle","clipExtent","output","translate","d3_geo_equirectangular","d3_geo_identityRotation","d3_geo_rotationλ","d3_geo_rotationφγ","d3_geo_forwardRotationλ","rotation","cosδφ","sinδφ","cosδγ","sinδγ","sr","d3_geo_circleAngle","d3_geo_graticuleX","d3_geo_graticuleY","d3_source","d3_target","d3_geo_interpolate","cy0","sy0","cy1","sy1","kx0","ky0","kx1","ky1","distance","d3_geo_lengthLineStart","cosΔλ","d3_geo_lengthSum","d3_geo_length","d3_geo_azimuthal","azimuthal","cosλ","sinc","cosc","d3_geo_conicConformal","F","tan","d3_geo_mercator","d3_geo_conicEquidistant","G","d3_geo_mercatorProjection","clipAuto","d3_geo_transverseMercator","d3_geom_pointX","d3_geom_pointY","d3_geom_hullUpper","hull","hs","d3_geom_hullOrder","d3_geom_polygonInside","d3_geom_polygonIntersect","x3","x21","x43","y3","y21","y43","ua","d3_geom_polygonClosed","d3_geom_voronoiBeach","d3_geom_voronoiRedBlackNode","edge","site","d3_geom_voronoiCreateBeach","beach","d3_geom_voronoiBeachPool","d3_geom_voronoiDetachBeach","d3_geom_voronoiDetachCircle","d3_geom_voronoiBeaches","d3_geom_voronoiRemoveBeach","vertex","previous","P","next","N","disappearing","lArc","unshift","rArc","iArc","nArcs","d3_geom_voronoiSetEdgeEnd","d3_geom_voronoiCreateEdge","d3_geom_voronoiAttachCircle","d3_geom_voronoiAddBeach","dxl","dxr","directrix","d3_geom_voronoiLeftBreakPoint","d3_geom_voronoiRightBreakPoint","R","newArc","insert","lSite","rSite","hb","hc","rfocx","rfocy","pby2","lfocx","lfocy","plby2","hl","aby2","d3_geom_voronoiCell","edges","d3_geom_voronoiCloseCells","extent","cell","iHalfEdge","halfEdges","nHalfEdges","end","cells","d3_geom_voronoiCells","iCell","prepare","splice","d3_geom_voronoiHalfEdge","d3_geom_voronoiCreateBorderEdge","d3_geom_voronoiHalfEdgeOrder","d3_geom_voronoiCircle","cSite","ε2","ha","d3_geom_voronoiCirclePool","d3_geom_voronoiCircles","d3_geom_voronoiFirstCircle","d3_geom_voronoiClipEdges","d3_geom_voronoiEdges","d3_geom_voronoiConnectEdge","vb","fm","fb","va","lx","ly","rx","ry","fx","fy","d3_geom_voronoiEdge","d3_geom_voronoiRedBlackTree","d3_geom_voronoiRedBlackRotateLeft","tree","d3_geom_voronoiRedBlackRotateRight","d3_geom_voronoiRedBlackFirst","d3_geom_voronoi","sites","bbox","d3_geom_voronoiVertexOrder","diagram","d3_geom_voronoiTriangleArea","d3_geom_quadtreeCompatX","d3_geom_quadtreeCompatY","d3_geom_quadtreeNode","leaf","d3_geom_quadtreeVisit","sx","sy","d3_interpolateRgb","ar","ag","ab","br","bg","bb","d3_interpolateObject","d3_interpolate","d3_interpolateNumber","d3_interpolateString","am","bm","bs","bi","d3_interpolate_numberA","d3_interpolate_numberB","index","interpolators","d3_interpolateArray","na","nb","n0","d3_ease_clamp","d3_ease_reverse","d3_ease_reflect","d3_ease_quad","d3_ease_cubic","d3_ease_cubicInOut","t3","d3_ease_poly","d3_ease_sin","d3_ease_exp","d3_ease_circle","d3_ease_elastic","d3_ease_back","d3_ease_bounce","d3_interpolateHcl","hcl","ah","ac","al","bh","bc","bl","d3_interpolateHsl","as","d3_interpolateLab","lab","aa","ba","d3_interpolateRound","d3_transform","r0","r1","kx","d3_transformNormalize","kz","d3_transformDot","ky","d3_transformCombine","skew","d3_interpolateTransform","transform","ta","tb","ra","rb","wa","wb","ka","kb","d3_uninterpolateNumber","d3_uninterpolateClamp","d3_layout_bundlePath","link","lca","d3_layout_bundleLeastCommonAncestor","d3_layout_bundleAncestors","ancestors","aNodes","bNodes","aNode","bNode","sharedNode","d3_layout_forceDragstart","fixed","d3_layout_forceDragend","d3_layout_forceMouseover","px","py","d3_layout_forceMouseout","d3_layout_forceAccumulate","quad","alpha","charges","charge","random","pointCharge","d3_layout_hierarchyRebind","hierarchy","links","d3_layout_hierarchyLinks","d3_layout_hierarchyVisitBefore","d3_layout_hierarchyVisitAfter","nodes2","d3_layout_hierarchyChildren","d3_layout_hierarchyValue","d3_layout_hierarchySort","child","d3_layout_stackX","d3_layout_stackY","d3_layout_stackOut","d3_layout_stackOrderDefault","d3_layout_stackOffsetZero","d3_layout_stackMaxIndex","d3_layout_stackReduceSum","reduce","d3_layout_stackSum","d3_layout_histogramBinSturges","values","d3_layout_histogramBinFixed","LN2","d3_layout_histogramRange","d3_layout_packSort","d3_layout_packInsert","_pack_next","_pack_prev","d3_layout_packSplice","d3_layout_packIntersects","dr","d3_layout_packSiblings","bound","xMin","xMax","yMin","yMax","d3_layout_packLink","d3_layout_packPlace","isect","s1","s2","d3_layout_packUnlink","d3_layout_packTransform","db","da","dc","d3_layout_treeSeparation","d3_layout_treeLeft","d3_layout_treeRight","d3_layout_treeMove","wm","wp","change","d3_layout_treeShift","d3_layout_treeAncestor","vim","ancestor","d3_layout_clusterY","d3_layout_clusterX","d3_layout_clusterLeft","d3_layout_clusterRight","d3_layout_treemapPadNull","d3_layout_treemapPad","d3_scaleExtent","stop","d3_scaleRange","rangeExtent","d3_scale_bilinear","uninterpolate","d3_scale_nice","nice","i1","d3_scale_niceStep","d3_scale_niceIdentity","d3_scale_polylinear","bisect","d3_scale_linear","clamp","rescale","linear","input","Number","rangeRound","ticks","d3_scale_linearTicks","tickFormat","d3_scale_linearTickFormat","d3_scale_linearNice","copy","d3_scale_linearRebind","d3_scale_linearTickRange","span","err","d3_scale_linearPrecision","d3_scale_linearFormatPrecision","d3_scale_linearFormatSignificant","d3_scale_log","base","positive","niced","d3_scale_logNiceNegative","d3_scale_logFormat","d3_scale_pow","exponent","powp","d3_scale_powPow","powb","d3_scale_ordinal","ranger","steps","rangeBand","xi","has","rangePoints","rangeBands","outerPadding","rangeRoundBands","d3_scale_quantile","thresholds","quantile","quantiles","invertExtent","d3_scale_quantize","d3_scale_threshold","d3_scale_identity","identity","d3_svg_arcInnerRadius","innerRadius","d3_svg_arcOuterRadius","outerRadius","d3_svg_arcStartAngle","d3_svg_arcEndAngle","d3_svg_line","tension","defined","d3_svg_lineLinear","interpolateKey","d3_svg_lineInterpolators","d3_svg_lineLinearClosed","d3_svg_lineStep","path","d3_svg_lineStepBefore","d3_svg_lineStepAfter","d3_svg_lineCardinalOpen","d3_svg_lineHermite","d3_svg_lineCardinalTangents","d3_svg_lineCardinalClosed","d3_svg_lineCardinal","tangents","pi","lp","p2","d3_svg_lineBasis","d3_svg_lineDot4","d3_svg_lineBasisBezier3","d3_svg_lineBasisBezier","d3_svg_lineBasisOpen","d3_svg_lineBasisClosed","d3_svg_lineBundle","d3_svg_lineBasisBezier1","d3_svg_lineBasisBezier2","d3_svg_lineSlope","d3_svg_lineFiniteDifferences","d3_svg_lineMonotoneTangents","d3_svg_lineMonotone","d3_svg_lineRadial","d3_svg_arcOffset","d3_svg_area","area","points1","interpolateReverse","points0","fx0","fy0","fx1","fy1","d3_svg_chordRadius","d3_svg_diagonalProjection","d3_svg_diagonalRadialProjection","d3_svg_symbolSize","d3_svg_symbolType","d3_svg_symbolCircle","d3_transition","d3_transitionPrototype","d3_transition_tween","tween","d3_transition_text","textContent","d3_transitionNode","inherit","count","transition","ease","duration","timer","elapsed","tweened","tick","d3_svg_axisX","attr","d3_svg_axisY","d3_time_formatIsoNative","toISOString","d3_time_scale","methods","tickMethod","d3_time_scaleSteps","year","d3_time_scaleMilliseconds","d3_time_scaleDate","interval","skip","skipped","d3_json","JSON","d3_html","d3_document","createRange","selectNode","createContextualFragment","version","d3_arraySlice","list","documentElement","window","childNodes","nodeType","createElement","d3_element_prototype","Element","d3_element_setAttribute","d3_element_setAttributeNS","d3_style_prototype","CSSStyleDeclaration","d3_style_setProperty","ascending","descending","undefined","sum","mean","median","d3_bisect","bisectLeft","bisectRight","bisector","shuffle","permute","indexes","permutes","pairs","zip","zips","transpose","matrix","entries","arrays","merged","Error","empty","nest","mapType","rollup","sortValues","keyValue","setter","valuesByKey","sortKey","sortKeys","keyMap","order","behavior","d3_requote_re","__proto__","property","querySelector","querySelectorAll","d3_selectMatcher","matches","Sizzle","matchesSelector","d3_selectionRoot","subgroup","subnode","subgroups","parentNode","selectAll","d3_nsPrefix","xhtml","xlink","xml","xmlns","getAttributeNS","each","classed","contains","getComputedStyle","getPropertyValue","text","html","innerHTML","appendChild","insertBefore","removeChild","groupData","nodeData","updateNodes","enterNodes","exitNodes","nodeByKeyValue","dataByKeyValue","keyValues","exit","nextSibling","args","upgroup","d3_transitionInheritId","d3_transitionId","d3_transitionInherit","interrupt","mouseenter","mouseleave","mouse","navigator","userAgent","touches","touch","drag","mousedown","touchstart","dragstart","move","moved","position1","dragId","position0","dragged","dragOffset","ended","dragSubject","dragName","dragRestore","that","origin","SQRT2","ρ2","ρ4","interpolateZoom","coshr0","w0","ux0","uy0","ux1","uy1","w1","zoom","mousedowned","d3_behavior_zoomWheel","mousewheeled","dblclicked","touchstarted","location","view","scaleTo","scaleExtent","translateTo","zoomstarted","zoomed","zoomended","location0","mousemove","mouseup","relocate","scale0","locations0","started","touchmove","touchend","targets","changed","touchtime","distance0","l0","l1","distance1","scale1","zoomName","mousewheelTimer","translate0","center0","d3_behavior_zoomDelta","shiftKey","d3_behavior_zoomInfinity","view1","__chart__","deltaY","deltaMode","wheelDelta","detail","d3_hslPrototype","brighter","darker","d3_hclPrototype","d3_lab_K","d3_labPrototype","d3_rgbPrototype","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","functor","dsv","delimiter","row","typedResponse","formatRow","formatValue","reFormat","delimiterCode","parseRows","Function","stringify","token","EOF","eol","EOL","rows","isArray","formatRows","fieldSet","fields","field","csv","tsv","then","flush","d3_formatPrefixes","String","fromCharCode","toPrecision","toExponential","toFixed","getUTCDate","getUTCDay","getUTCFullYear","getUTCHours","getUTCMilliseconds","getUTCMinutes","getUTCMonth","getUTCSeconds","getTime","valueOf","setDate","d3_time_prototype","setUTCDate","setDay","setUTCDay","setUTCFullYear","setUTCHours","setMilliseconds","setUTCMilliseconds","setMinutes","setUTCMinutes","setMonth","setUTCMonth","setSeconds","setUTCSeconds","setTime","day","years","week","sunday","weeks","weekOfYear","-","0","numberFormat","timeFormat","d3_locale_enUS","geo","d3_adderTemp","d3_geo_streamObjectType","Feature","feature","FeatureCollection","features","Sphere","Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","GeometryCollection","geometries","d3_geo_areaSum","bounds","ranges","normal","equatorial","inflection","λ_","λi","φi","dλSum","λ__","φ__","compareRanges","withinRange","best","centroid","conicEqualArea","raw","albers","albersUsa","lower48Point","alaskaPoint","hawaiiPoint","lower48","alaska","hawaii","pointStream","lower48Stream","alaskaStream","hawaiiStream","d3_geo_pathAreaSum","d3_geo_pathBounds","contextStream","cacheStream","projectStream","projectionMutator","equirectangular","Δλ","sinΔλ","sinφ1","graticule","X0","DX","X1","Y0","DY","Y1","outline","majorExtent","minorExtent","majorStep","minorStep","greatArc","source_","target_","d3_geo_azimuthalEqualArea","cosλcosφ","azimuthalEqualArea","d3_geo_azimuthalEquidistant","azimuthalEquidistant","conicConformal","conicEquidistant","d3_geo_gnomonic","gnomonic","mercator","d3_geo_orthographic","orthographic","d3_geo_stereographic","stereographic","transverseMercator","geom","vertices","flippedPoints","upper","lower","skipLeft","skipRight","d3_geom_polygonPrototype","grandpa","uncle","sibling","voronoi","polygons","d3_geom_voronoiClipExtent","triangles","s0","delaunay","quadtree","nx","ny","insertChild","nPoint","bottom","xs","ys","x1_","y1_","x2_","y2_","compat","root","visit","interpolateRgb","interpolateObject","interpolateNumber","interpolateString","interpolateArray","d3_ease_default","d3_ease","poly","cubic","elastic","back","bounce","d3_ease_mode","in","out","in-out","out-in","interpolateHcl","interpolateHsl","interpolateLab","interpolateRound","baseVal","consolidate","d3_transformIdentity","interpolateTransform","bundle","paths","chord","relayout","groupSums","groupIndex","subgroupIndex","chords","sortGroups","sortSubgroups","di","dj","subindex","sortChords","resort","force","repulse","dw","dn","theta2","chargeDistance2","dragmove","resume","distances","strengths","friction","linkDistance","d3_layout_forceLinkDistance","linkStrength","d3_layout_forceLinkStrength","d3_layout_forceChargeDistance2","gravity","weight","chargeDistance","dimension","neighbors","candidates","stack","childs","revalue","partition","pie","d3_layout_pieSortByValue","arcs","series","orders","offsets","d3_layout_stackOrders","d3_layout_stackOffsets","inside-out","sums","tops","bottoms","default","silhouette","wiggle","s3","o0","expand","zero","histogram","bin","bins","valuer","binner","frequency","root0","root1","wrapTree","firstWalk","secondWalk","nodeSize","sizeNode","tx","separation","node1","queue","siblings","midpoint","apportion","vip","vop","vom","sip","sop","sim","som","cluster","previousNode","treemap","squarify","score","pad","remaining","mode","worst","stickify","rmax","rmin","ratio","stickies","sticky","padFunction","padConstant","µ","σ","logNormal","bates","irwinHall","ordinal","category10","d3_category10","category20","d3_category20","category20b","d3_category20b","category20c","d3_category20c","quantize","threshold","df","d3_svg_arcMax","linear-closed","step-before","step-after","basis","basis-open","basis-closed","cardinal","cardinal-open","cardinal-closed","monotone","radial","equals","curve","self","diagonal","p3","projection_","d3_svg_symbols","cross","diamond","d3_svg_symbolTan30","square","triangle-down","d3_svg_symbolSqrt3","triangle-up","symbolTypes","subnodes","nameNS","attrTween","attrTweenNS","styleString","styleTween","inheritId","id0","id1","create","axis","tickTransform","tickValues","tickArguments_","tickFormat_","tickEnter","tickExit","tickUpdate","pathUpdate","lineEnter","lineUpdate","textEnter","textUpdate","orient","innerTickSize","tickPadding","outerTickSize","d3_svg_axisDefaultOrient","d3_svg_axisOrients","tickSize","tickSubdivide","brush","brushstart","background","resize","resizes","d3_svg_brushCursor","gUpdate","backgroundUpdate","redrawX","redrawY","redraw","xExtent","yExtent","keydown","keyCode","keyup","brushmove","altKey","resizingX","move1","resizingY","event_","yClamp","xClamp","yExtentDomain","xExtentDomain","brushend","eventTarget","resizing","ex","ey","d3_svg_brushResizes","extent1","extent0","yi","clear","nw","ne","se","sw","d3_time_formatUtc","d3_time_formatIso","iso","second","seconds","minute","minutes","hour","timezone","hours","month","d3_time_scaleLocalMethods","d3_time_scaleLocalFormat","d3_time_scaleUtcMethods","d3_time_scaleUtcFormat","json","responseXML","d3_Color","d3_Hsl","d3_Hcl","d3_Lab","d3_Rgb","d3_interpolate_number","global","baseIndexOf","fromIndex","cacheIndexOf","cache","keyPrefix","cachePush","typeCache","charAtCallback","compareAscending","criteria","createCache","last","getObject","escapeStringChar","stringEscapes","getArray","arrayPool","objectPool","false","null","true","releaseArray","maxPoolSize","releaseObject","runInContext","lodash","lodashWrapper","chainAll","__chain__","__wrapped__","baseBind","bindData","partialArgs","thisBinding","baseCreate","func","isObject","thisArg","setBindData","baseClone","isDeep","stackA","stackB","isObj","cloneableClasses","ctorByClass","boolClass","dateClass","numberClass","stringClass","regexpClass","reFlags","isArr","initedStack","assign","forOwn","objValue","nativeCreate","baseCreateCallback","argCount","__bindData__","support","funcNames","funcDecomp","fnToString","reFuncName","reThis","collection","accumulator","baseCreateWrapper","isBind","partialRightArgs","isCurry","arity","bitmask","isCurryBound","isBindKey","baseDifference","getIndexOf","isLarge","largeArraySize","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherType","objectTypes","otherClass","argsClass","objectClass","arrayClass","aWrapped","bWrapped","ctorA","constructor","ctorB","isFunction","forIn","baseMerge","found","isPlainObject","stackLength","baseRandom","nativeRandom","baseUniq","isSorted","seen","computed","createAggregator","createCallback","createWrapper","isPartial","isPartialRight","TypeError","creater","escapeHtmlChar","htmlEscapes","isNative","reNative","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","cloneDeep","findKey","findLastKey","forOwnRight","forInRight","functions","isBoolean","isDate","isElement","isEmpty","isEqual","nativeIsFinite","nativeIsNaN","isNumber","isNull","isRegExp","isString","isUndefined","mapValues","sources","omit","pick","proto","at","nativeMax","every","findLast","forEachRight","invoke","methodName","isFunc","noaccum","reduceRight","reject","sample","guard","nativeMin","rand","some","sortBy","toArray","compact","difference","findIndex","findLastIndex","flatten","sortedIndex","initial","argsIndex","argsLength","caches","trustIndexOf","outer","pull","low","high","union","uniq","without","xor","pluck","zipObject","bindAll","funcs","bindKey","curry","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","maxWait","trailing","leading","delayed","isCalled","maxDelayed","leadingCall","defer","memoize","resolver","memoized","once","ran","partial","partialRight","throttle","debounceOptions","wrapper","constant","escape","reUnescapedHtml","mixin","chain","methodNames","noConflict","oldDash","noop","floating","noMin","noMax","settings","templateSettings","defaults","isEvaluating","imports","importsKeys","importsValues","reNoMatch","reDelimiters","reInterpolate","reEsTemplate","evaluate","escapeValue","interpolateValue","esTemplateValue","evaluateValue","reUnescapedString","variable","hasVariable","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","sourceURL","templateCounter","unescape","reEscapedHtml","uniqueId","idCounter","tap","interceptor","wrapperChain","wrapperToString","wrapperValueOf","contextProps","Boolean","arrayRef","objectProto","getPrototypeOf","nativeIsArray","nativeKeys","nativeParseInt","funcClass","WinRTError","descriptor","shimKeys","iterable","&","<",">","\"","'","ownIndex","ownProps","objProto","countBy","groupBy","indexBy","where","whitespace","radix","reLeadingSpacesAndZeros","collect","drop","eachRight","extend","tail","unique","unzip","all","any","detect","findWhere","foldl","foldr","include","inject","take","head","callbackable","VERSION","configurable","writable","boolean","function","\\","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","mousePosition","pathTween","shape","animate","onMouseDown","compontWillRecieveProps","arcCoords","interpolator","circleCoords","prevX","prevY","AnimateMixin","Arc","targetR","initAngle","arcAngle","segmentArc","stroke","animateArc","componentDidMount","cmp","Buffer","buf","ii","oct","_hexToByte","unparse","bth","_byteToHex","v1","clockseq","_clockseq","msecs","nsecs","_lastNSecs","_lastMSecs","tl","tmh","_nodeId","BufferClass","rnds","rng","_rng","substr","_seedBytes","process","LinkedStateMixin","ReactComponentWithPureRenderMixin","ReactCSSTransitionGroup","ReactTransitionGroup","cloneWithProps","addons","CSSTransitionGroup","PureRenderMixin","TransitionGroup","classSet","env","NODE_ENV","Perf","TestUtils","crypto","getRandomValues","_rnds8","Uint8Array","_rnds","encoding","noZero","base64clean","byteLength","TYPED_ARRAY_SUPPORT","_augment","_isBuffer","_set","isArrayish","isBuffer","readUInt8","write","hexWrite","strLen","assert","byte","utf8Write","charsWritten","blitBuffer","utf8ToBytes","asciiWrite","asciiToBytes","binaryWrite","base64Write","base64ToBytes","utf16leWrite","utf16leToBytes","base64Slice","base64","fromByteArray","utf8Slice","res","tmp","decodeUtf8Char","asciiSlice","ret","binarySlice","hexSlice","len","toHex","utf16leSlice","bytes","readUInt16","littleEndian","noAssert","val","readUInt32","readInt16","neg","readInt32","readFloat","ieee754","read","readDouble","writeUInt16","verifuint","writeUInt32","writeInt16","verifsint","writeInt32","writeFloat","verifIEEE754","writeDouble","str","stringtrim","INVALID_BASE64_RE","byteArray","encodeURIComponent","toByteArray","src","dst","decodeURIComponent","message","SlowBuffer","INSPECT_MAX_BYTES","poolSize","ArrayBuffer","foo","subarray","isEncoding","totalLength","pos","item","swap","toJSON","_arr","target_start","sliceLen","newBuf","writeUInt8","readUInt16LE","readUInt16BE","readUInt32LE","readUInt32BE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUInt16LE","writeUInt16BE","writeUInt32LE","writeUInt32BE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","inspect","toArrayBuffer","BP","_get","toLocaleString","coords0","coords1","pair0","targetValue","timeStamp","requestAnimationFrame","circumference","lengths","circumferenceOffset","attach","element","Emitter","emit","nextTick","canSetImmediate","setImmediate","canPost","postMessage","ev","stopPropagation","title","browser","argv","addListener","removeListener","removeAllListeners","binding","cwd","chdir","DOMPropertyOperations","EventPluginUtils","ReactChildren","ReactComponent","ReactCompositeComponent","ReactContext","ReactCurrentOwner","ReactDescriptor","ReactDOM","ReactDOMComponent","ReactDefaultInjection","ReactInstanceHandles","ReactMount","ReactMultiChild","ReactPerf","ReactPropTypes","ReactServerRendering","ReactTextComponent","onlyChild","Children","only","PropTypes","initializeTouchEvents","shouldUseTouch","useTouchEvents","createDescriptor","constructAndRenderComponent","constructAndRenderComponentByID","measure","renderComponentToString","renderComponentToStaticMarkup","unmountComponentAtNode","isValidClass","isValidFactory","isValidComponent","isValidDescriptor","withContext","__internals","Component","CurrentOwner","DOMComponent","InstanceHandles","Mount","MultiChild","TextComponent","ExecutionEnvironment","canUseDOM","debug","expectedFeatures","freeze","ReactLink","ReactStateSetters","linkState","createStateKeySetter","shallowEqual","shouldComponentUpdate","nextProps","nextState","ReactCSSTransitionGroupChild","propTypes","transitionName","isRequired","transitionEnter","transitionLeave","getDefaultProps","_wrapChild","leave","transferPropsTo","childFactory","ReactTransitionChildMapping","emptyFunction","component","thatReturnsArgument","getChildMapping","componentWillReceiveProps","nextChildMapping","prevChildMapping","mergeChildMappings","hasPrev","currentlyTransitioningKeys","keysToEnter","hasNext","keysToLeave","componentWillMount","componentDidUpdate","performEnter","performLeave","componentWillEnter","_handleDoneEntering","componentDidEnter","currentChildMapping","componentWillLeave","_handleDoneLeaving","componentDidLeave","newChildren","childrenToRender","classNames","warning","newProps","ReactPropTransferer","mergeProps","CHILDREN_PROP","keyOf","shallowCopy","copyProperties","invariantArrayCase","spec","command","invariant","specValue","ALL_COMMANDS_LIST","COMMAND_SET","nextValue","COMMAND_MERGE","mergeObj","COMMAND_PUSH","COMMAND_UNSHIFT","COMMAND_SPLICE","COMMAND_APPLY","ALL_COMMANDS_SET","$push","$unshift","$splice","$set","$merge","$apply","roundFloat","addValue","obj","DOMProperty","ReactDefaultPerfAnalysis","performanceNow","ReactDefaultPerf","_allMeasurements","_mountStack","_injected","injection","injectMeasure","enableMeasure","getLastMeasurements","printExclusive","measurements","summary","getExclusiveSummary","table","Component class name","componentName","Total inclusive time (ms)","inclusive","Exclusive mount time (ms)","exclusive","Exclusive render time (ms)","Mount time per instance (ms)","Render time per instance (ms)","Instances","printInclusive","getInclusiveSummary","Owner > component","Inclusive time (ms)","getTotalTime","printWasted","Wasted time (ms)","printDOM","getDOMSummary","ID_ATTRIBUTE_NAME","_recordWrite","fnName","totalTime","writes","moduleName","rv","counts","displayNames","mountID","getID","writeArgs","toIndex","markupIndex","markup","parentID","rootNodeID","_rootNodeID","isRender","isMount","mountStack","subMountTime","owner","_owner","Event","makeSimulator","eventType","domComponentOrNode","eventData","ReactTestUtils","isDOMComponent","getDOMNode","tagName","fakeNativeEvent","SyntheticEvent","ReactBrowserEventEmitter","eventNameDispatchConfigs","mergeInto","EventPropagators","accumulateTwoPhaseDispatches","ReactUpdates","batchedUpdates","EventPluginHub","enqueueEvents","processEventQueue","buildSimulators","Simulate","makeNativeSimulator","nativeEventData","simulateNativeEventOnDOMComponent","simulateNativeEventOnNode","EventConstants","topLevelTypes","renderIntoDocument","instance","div","isDescriptor","isDescriptorOfType","inst","convenienceConstructor","mountComponent","isDOMComponentDescriptor","isCompositeComponent","isCompositeComponentWithType","isCompositeComponentDescriptor","isCompositeComponentDescriptorWithType","isTextComponent","findAllInRenderedTree","renderedChildren","_renderedChildren","_renderedComponent","scryRenderedDOMComponentsWithClass","instClassName","findRenderedDOMComponentWithClass","scryRenderedDOMComponentsWithTag","findRenderedDOMComponentWithTag","scryRenderedComponentsWithType","componentType","findRenderedComponentWithType","mockComponent","ConvenienceConstructor","mockTagName","mockImplementation","topLevelType","ReactEventListener","dispatchEvent","comp","nativeTouchData","SimulateNative","oldInjectEventPluginOrder","injectEventPluginOrder","oldInjectEventPlugins","injectEventPluginsByName","convenienceName","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","rt","lookup","decode","elt","PLUS","SLASH","NUMBER","UPPER","LOWER","b64ToByteArray","b64","placeHolders","Arr","uint8ToBase64","uint8","encode","num","tripletToBase64","temp","extraBytes","base64js","EventEmitter","_events","_maxListeners","arg","defaultMaxListeners","setMaxListeners","er","handler","newListener","warned","trace","fired","listenerCount","emitter","shouldIgnoreValue","hasBooleanValue","hasNumericValue","hasPositiveNumericValue","hasOverloadedBooleanValue","escapeTextForBrowser","memoizeStringOnly","processAttributeNameAndPrefix","reactProps","dangerouslySetInnerHTML","warnedProperties","warnUnknownProperty","lowerCasedName","standardName","isCustomAttribute","getPossibleStandardName","createMarkupForID","createMarkupForProperty","isStandardName","attributeName","getAttributeName","setValueForProperty","mutationMethod","getMutationMethod","deleteValueForProperty","mustUseAttribute","propName","getPropertyName","hasSideEffects","defaultValue","getDefaultValueForProperty","nodeName","isEndish","topMouseUp","topTouchEnd","topTouchCancel","isMoveish","topMouseMove","topTouchMove","isStartish","topMouseDown","topTouchStart","forEachEventDispatch","dispatchListeners","_dispatchListeners","dispatchIDs","_dispatchIDs","validateEventDispatches","isPropagationStopped","executeDispatch","domID","currentTarget","getNode","returnValue","executeDispatchesInOrder","executeDispatchesInOrderStopAtTrueImpl","executeDispatchesInOrderStopAtTrue","executeDirectDispatch","dispatchListener","dispatchID","hasDispatches","injectMount","InjectedMount","listenersIsArr","idsIsArr","IDsLen","listenersLen","ForEachBookKeeping","forEachFunction","forEachContext","forEachSingleChild","traverseContext","forEachBookKeeping","forEachChildren","forEachFunc","getPooled","traverseAllChildren","release","MapBookKeeping","mapResult","mapFunction","mapContext","mapSingleChildIntoContext","mapBookKeeping","keyUnique","mappedChild","mapChildren","forEachSingleChildDummy","countChildren","PooledClass","twoArgumentPooler","threeArgumentPooler","addPoolingTo","ReactOwner","keyMirror","ComponentLifeCycle","MOUNTED","UNMOUNTED","injected","unmountIDFromEnvironment","mountImageIntoNode","injectEnvironment","ReactComponentEnvironment","BackendIDOperations","LifeCycle","Mixin","isMounted","_lifeCycleState","setProps","partialProps","_pendingDescriptor","_descriptor","replaceProps","_mountDepth","cloneAndReplaceProps","enqueueUpdate","_setPropsInternal","construct","_pendingCallbacks","rootID","transaction","mountDepth","addComponentAsRefTo","unmountComponent","removeComponentAsRefFrom","receiveComponent","nextDescriptor","performUpdateIfNecessary","prevDescriptor","updateComponent","mountComponentIntoNode","shouldReuseMarkup","ReactReconcileTransaction","perform","_mountComponentIntoNode","isOwnedBy","getSiblingByRef","getDeclarationErrorAddendum","validateTypeDef","Constructor","typeDef","ReactPropTypeLocationNames","validateMethodOverride","specPolicy","ReactCompositeComponentInterface","ReactCompositeComponentMixin","SpecPolicy","OVERRIDE_BASE","DEFINE_MANY","DEFINE_MANY_MERGED","validateLifeCycleOnReplaceState","compositeLifeCycleState","_compositeLifeCycleState","CompositeLifeCycle","MOUNTING","RECEIVING_STATE","UNMOUNTING","mixSpecIntoComponent","RESERVED_SPEC_KEYS","isCompositeComponentMethod","isAlreadyDefined","markedDontBind","__reactDontBind","shouldAutoBind","__reactAutoBindMap","createMergedResultFunction","createChainedFunction","mixStaticSpecIntoComponent","statics","isInherited","existingProperty","existingType","propertyType","mergeObjectsWithNoDuplicateKeys","one","mapObject","ReactDescriptorValidator","ReactEmptyComponent","ReactErrorUtils","ReactPropTypeLocations","instantiateReactComponent","mixInto","monitorCodeUse","shouldUpdateReactComponent","DEFINE_ONCE","injectedMixins","mixins","contextTypes","childContextTypes","getChildContext","componentWillUpdate","componentWillUnmount","childContext","prop","RECEIVING_PROPS","_pendingState","_bindAutoBindMethods","_processContext","_context","_processProps","_pendingForceUpdate","_renderValidatedComponent","getReactMountReady","enqueue","partialState","replaceState","completeState","maskedContext","contextName","_checkPropTypes","_processChildContext","currentContext","defaultProps","addendum","nextContext","shouldUpdate","warn","_performComponentUpdate","prevProps","prevState","prevContext","prevParentDescriptor","prevComponentInstance","thisID","prevComponentID","nextMarkup","dangerouslyReplaceNodeWithMarkupByID","forceUpdate","renderedComponent","previousContext","getEmptyComponent","registerNullComponentID","deregisterNullComponentID","autoBindKey","_bindAutoBindMethod","boundMethod","__reactBoundContext","__reactBoundMethod","__reactBoundArguments","_bind","newThis","reboundMethod","ReactCompositeComponentBase","Base","componentShouldUpdate","descriptorFactory","createFactory","injectMixin","newContext","scopedCallback","defineWarningProperty","_store","defineMutationMembrane","pseudoFrozenProperties","useMutationMembrane","proxyStaticMethods","descriptorPrototype","factory","childrenLength","childArray","validated","oldDescriptor","newDescriptor","createDOMComponentClass","omitClose","tag","abbr","address","article","aside","audio","bdi","bdo","big","blockquote","button","canvas","caption","cite","col","colgroup","datalist","dd","del","details","dfn","dl","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","hr","iframe","img","ins","kbd","keygen","label","legend","li","main","mark","menu","menuitem","meta","meter","nav","noscript","ol","optgroup","option","param","pre","rp","ruby","samp","script","section","small","strong","sub","sup","tbody","td","textarea","tfoot","th","thead","tr","track","ul","var","video","wbr","defs","ellipse","linearGradient","mask","pattern","polyline","radialGradient","tspan","injectComponentClasses","componentClasses","assertValidProps","putListener","registrationName","findReactContainerForID","ELEMENT_NODE_TYPE","listenTo","getPutListenerQueue","enqueuePutListener","_tagOpen","_tagClose","CSSPropertyOperations","ReactBrowserComponentMixin","deleteListener","registrationNameModules","CONTENT_TYPES","STYLE","_createOpenTagMarkupAndPutListeners","_createContentMarkup","propKey","propValue","createMarkupForStyles","renderToStaticMarkup","markupForID","__html","contentToUse","childrenToUse","mountImages","mountChildren","_updateDOMProperties","_updateDOMChildren","lastProps","styleName","styleUpdates","lastStyle","deletePropertyByID","nextProp","lastProp","updatePropertyByID","updateStylesByID","lastContent","nextContent","lastHtml","nextHtml","lastChildren","nextChildren","lastHasContentOrHtml","nextHasContentOrHtml","updateChildren","updateTextContent","updateInnerHTMLByID","unmountChildren","deleteAllListeners","ReactInjection","injectReactEventListener","DefaultEventPluginOrder","injectInstanceHandle","SimpleEventPlugin","EnterLeaveEventPlugin","ChangeEventPlugin","CompositionEventPlugin","MobileSafariClickEventPlugin","SelectEventPlugin","BeforeInputEventPlugin","ReactDOMButton","ReactDOMForm","ReactDOMImg","ReactDOMInput","ReactDOMOption","ReactDOMSelect","ReactDOMTextarea","createFullPageComponent","CompositeComponent","injectDOMPropertyConfig","HTMLDOMPropertyConfig","SVGDOMPropertyConfig","EmptyComponent","injectEmptyComponent","Updates","injectReconcileTransaction","ReactComponentBrowserEnvironment","injectBatchingStrategy","ReactDefaultBatchingStrategy","RootIndex","injectCreateReactRootIndex","ClientReactRootIndex","createReactRootIndex","ServerReactRootIndex","href","getReactRootIDString","SEPARATOR","isBoundary","isValidID","isAncestorIDOf","ancestorID","descendantID","getParentID","getNextDescendantID","destinationID","SEPARATOR_LENGTH","getFirstCommonAncestorID","oneID","twoID","minLength","lastCommonMarkerIndex","longestCommonID","traverseParentPath","skipFirst","skipLast","traverseUp","traverse","MAX_TREE_DEPTH","ReactRootIndex","createReactRootID","createReactID","getReactRootIDFromNodeID","traverseEnterLeave","leaveID","enterID","upArg","downArg","traverseTwoPhase","targetID","traverseAncestors","_getFirstCommonAncestorID","_getNextDescendantID","getReactRootID","rootElement","getReactRootElementInContainer","internalGetID","nodeCache","cached","isValid","ATTR_NAME","setID","oldID","findReactNodeByID","containsNode","purgeID","findDeepestCachedAncestorImpl","deepestNodeSoFar","findDeepestCachedAncestor","foundNode","DOC_NODE_TYPE","instancesByReactRootID","containersByReactRootID","rootElementsByReactRootID","findComponentRootReusableArray","_instancesByReactRootID","scrollMonitor","renderCallback","_updateRootComponent","prevComponent","nextComponent","_registerComponent","ensureScrollValueMonitoring","reactRootID","registerContainer","_renderNewRootComponent","componentInstance","reactRootElement","containerHasReactMarkup","isRenderedByReact","domNode","getElementById","unmountComponentFromNode","lastChild","containerChild","firstChild","reactRoot","findComponentRoot","getFirstReactDOM","ancestorNode","firstChildren","childIndex","deepestAncestor","targetChild","childID","enqueueMarkup","updateQueue","ReactMultiChildUpdateTypes","INSERT_MARKUP","markupQueue","enqueueMove","MOVE_EXISTING","enqueueRemove","REMOVE_NODE","enqueueTextContent","TEXT_CONTENT","processQueue","dangerouslyProcessChildrenUpdates","clearQueue","flattenChildren","updateDepth","nestedChildren","childInstance","mountImage","_mountIndex","errorThrown","prevChildren","_unmountChildByName","setTextContent","nextNestedChildren","_updateChildren","nextIndex","prevChild","moveChild","nextChildInstance","_mountChildByNameAtIndex","renderedChild","createChild","_noMeasure","objName","storedMeasure","measuredFunc","createChainableTypeChecker","validate","checkType","ANONYMOUS","locationName","chainedCheckType","createPrimitiveTypeChecker","expectedType","propType","getPropType","preciseType","getPreciseType","createAnyTypeChecker","thatReturns","createArrayOfTypeChecker","typeChecker","createComponentTypeChecker","createInstanceTypeChecker","expectedClass","expectedClassName","createEnumTypeChecker","expectedValues","valuesString","createObjectOfTypeChecker","createUnionTypeChecker","arrayOfTypeCheckers","checker","createRenderableTypeChecker","isRenderable","createShapeTypeChecker","shapeTypes","arrayOf","instanceOf","objectOf","oneOf","oneOfType","renderable","ReactServerRenderingTransaction","ReactMarkupChecksum","addChecksumToMarkup","escapedText","updateTextContentByID","canUseWorkers","Worker","canUseEventListeners","attachEvent","canUseViewport","screen","isInWorker","requestChange","createLinkTypeChecker","linkType","shapes","objA","objB","CSSCore","ReactTransitionEvents","TICK","NO_EVENT_TIMEOUT","noEventListener","animationType","finishCallback","activeClassName","noEventTimeout","endListener","removeClass","removeEndEventListener","addEndEventListener","addClass","queueClass","classNameQueue","timeout","flushClassNameQueue","done","prev","getValueForKey","nextKeysPending","pendingKeys","prevKey","childMapping","nextKey","pendingNextKey","makeEmptyFunction","thatReturnsFalse","thatReturnsTrue","thatReturnsNull","thatReturnsThis","createTransferStrategy","mergeStrategy","transferInto","thisKey","transferStrategy","TransferStrategies","joinClasses","transferStrategyMerge","oldProps","oneKeyObj","condition","argIndex","framesToPop","createStateSetter","funcReturningState","__keySetters","DOMPropertyInjection","MUST_USE_ATTRIBUTE","MUST_USE_PROPERTY","HAS_SIDE_EFFECTS","HAS_BOOLEAN_VALUE","HAS_NUMERIC_VALUE","HAS_POSITIVE_NUMERIC_VALUE","HAS_OVERLOADED_BOOLEAN_VALUE","domPropertyConfig","Properties","DOMAttributeNames","DOMPropertyNames","DOMMutationMethods","_isCustomAttributeFunctions","lowerCased","propConfig","mustUseProperty","defaultValueCache","isCustomAttributeFn","testElement","nodeDefaults","measurement","items","DOM_OPERATION_TYPES","allIDs","DONT_CARE_THRESHOLD","onlyClean","inclusiveKey","cleanComponents","getUnchangedComponents","dirtyLeafIDs","isDirty","performance","PropagationPhases","bubbled","captured","topBlur","topChange","topClick","topCompositionEnd","topCompositionStart","topCompositionUpdate","topContextMenu","topCopy","topCut","topDoubleClick","topDrag","topDragEnd","topDragEnter","topDragExit","topDragLeave","topDragOver","topDragStart","topDrop","topError","topFocus","topInput","topKeyDown","topKeyPress","topKeyUp","topLoad","topMouseOut","topMouseOver","topPaste","topReset","topScroll","topSelectionChange","topSubmit","topTextInput","topWheel","validateInstanceHandle","invalid","InstanceHandle","EventPluginRegistry","accumulate","forEachAccumulated","isEventSupported","listenerBank","eventQueue","executeDispatchesAndRelease","PluginModule","getPluginModuleForEvent","isPersistent","InjectedInstanceHandle","getInstanceHandle","bankForRegistrationName","getListener","extractEvents","topLevelTarget","topLevelTargetID","nativeEvent","events","plugins","possiblePlugin","extractedEvents","processingEventQueue","__purge","__getListenerBank","listenerAtPhase","propagationPhase","dispatchConfig","phasedRegistrationNames","accumulateDirectionalDispatches","upwards","phase","accumulateTwoPhaseDispatchesSingle","accumulateDispatches","ignoredDirection","accumulateDirectDispatchesSingle","accumulateEnterLeaveDispatches","fromID","toID","accumulateDirectDispatches","getListeningForDocument","mountAt","topListenersIDKey","reactTopListenersCounter","alreadyListeningTo","ReactEventEmitterMixin","ViewportMetrics","isMonitoringScrollValue","topEventMapping","setHandleTopLevel","handleTopLevel","setEnabled","enabled","isEnabled","contentDocumentHandle","isListening","dependencies","registrationNameDependencies","dependency","trapBubbledEvent","trapCapturedEvent","WINDOW_HANDLE","handlerBaseName","handle","refresh","refreshScrollValues","monitorScrollValue","ensureInjected","batchingStrategy","ReactUpdatesFlushTransaction","reinitializeTransaction","dirtyComponentsLength","callbackQueue","CallbackQueue","reconcileTransaction","mountDepthComparator","runBatchedUpdates","dirtyComponents","callbacks","isBatchingUpdates","Transaction","NESTED_UPDATES","initialize","close","flushBatchedUpdates","UPDATE_QUEUEING","notifyAll","TRANSACTION_WRAPPERS","getTransactionWrappers","destructor","scope","ReactUpdatesInjection","ReconcileTransaction","_batchingStrategy","Interface","normalize","defaultPrevented","isDefaultPrevented","getEventTarget","EventInterface","eventPhase","bubbles","cancelable","isTrusted","cancelBubble","persist","augmentClass","Class","Super","checkMergeIntoObjectArg","checkMergeObjectArg","mergeHelpers","escaper","ESCAPE_LOOKUP","ESCAPE_REGEX","oneArgumentPooler","copyFieldsFrom","Klass","instancePool","a2","a3","fiveArgumentPooler","a4","a5","standardReleaser","DEFAULT_POOL_SIZE","DEFAULT_POOLER","CopyConstructor","pooler","NewKlass","userProvidedKeyEscaper","userProvidedKeyEscaperLookup","getComponentKey","wrapUserProvidedKey","escapeUserProvidedKey","userProvidedKeyEscapeRegex","traverseAllChildrenImpl","SUBSEPARATOR","=",".",":","nameSoFar","indexSoFar","subtreeCount","nextName","isOnlyChild","storageName","normalizedText","normalizedNumber","emptyObject","isValidOwner","attachRef","detachRef","getCurrentOwnerDisplayName","validateExplicitKey","parentType","warnAndMonitorForKeyUse","validatePropertyKey","NUMERIC_PROPERTY_REGEX","warningID","ownerName","parentName","useName","memoizer","ownerHasKeyUseWarning","childOwnerName","componentOwner","monitorUseOfObjectMap","currentName","ownerHasMonitoredObjectMap","validateChildKeys","checkPropTypes","loggedTypeFailures","react_key_warning","react_numeric_key_warning","validatedFactory","nullComponentIdsRegistry","isNullComponentID","ReactEmptyComponentInjection","emptyComponent","isValidComponentDescriptor","methodBag","eventName","CSSProperty","dangerousStyleValue","hyphenateStyleName","processStyleName","styles","serialized","styleValue","setValueForStyles","expansion","shorthandPropertyExpansions","individualStyleName","isPresto","opera","isKeypressCommand","ctrlKey","metaKey","SyntheticInputEvent","canUseTextInputEvent","SPACEBAR_CODE","SPACEBAR_CHAR","eventTypes","beforeInput","onBeforeInput","onBeforeInputCapture","fallbackChars","chars","which","shouldUseChangeEvent","elem","manualDispatchChangeEvent","activeElementID","runEventInBatch","startWatchingForChangeEventIE8","activeElement","stopWatchingForChangeEventIE8","detachEvent","getTargetIDForChangeEvent","handleEventsForChangeEventIE8","startWatchingForValueChange","activeElementValue","activeElementValueProp","getOwnPropertyDescriptor","newValueProp","handlePropertyChange","stopWatchingForValueChange","propertyName","srcElement","getTargetIDForInputEvent","handleEventsForInputEventIE","getTargetIDForInputEventIE","shouldUseClickEvent","getTargetIDForClickEvent","isTextInputElement","onChange","onChangeCapture","doesChangeEventBubble","documentMode","isInputEventSupported","getTargetIDFunc","handleEventFunc","nextReactRootIndex","getCompositionEventType","compositionStart","compositionEnd","compositionUpdate","isFallbackStart","START_KEYCODE","isFallbackEnd","END_KEYCODES","FallbackCompositionState","startSelection","ReactInputSelection","getSelection","startValue","getText","SyntheticCompositionEvent","getTextContentAccessor","useCompositionEvent","useFallbackData","currentComposition","onCompositionEnd","onCompositionEndCapture","onCompositionStart","onCompositionStartCapture","onCompositionUpdate","onCompositionUpdateCapture","getData","endValue","prefixLength","suffixLength","ResponderEventPlugin","TapEventPlugin","AnalyticsEventPlugin","SyntheticMouseEvent","mouseEnter","onMouseEnter","fromElement","win","defaultView","parentWindow","toElement","hasSVG","implementation","hasFeature","accept","accessKey","action","allowFullScreen","allowTransparency","alt","async","autoComplete","autoPlay","cellPadding","cellSpacing","charSet","checked","cols","colSpan","content","contentEditable","contextMenu","controls","coords","crossOrigin","dir","disabled","download","draggable","encType","formNoValidate","frameBorder","hidden","hrefLang","htmlFor","httpEquiv","icon","lang","loop","maxLength","mediaGroup","multiple","muted","noValidate","placeholder","poster","preload","radioGroup","readOnly","rel","required","role","rowSpan","sandbox","scrollLeft","scrolling","scrollTop","seamless","selected","spellCheck","srcDoc","srcSet","tabIndex","useMap","wmode","autoCapitalize","autoCorrect","itemProp","itemScope","itemType","autoFocus","onclick","ReactDOMIDOperations","setInnerHTML","canReuseMarkup","ReactDefaultBatchingStrategyTransaction","RESET_BATCHED_UPDATES","FLUSH_BATCHED_UPDATES","alreadyBatchingUpdates","AutoFocusMixin","mouseListenerNames","onClick","onDoubleClick","onClickCapture","onDoubleClickCapture","onMouseDownCapture","onMouseMoveCapture","onMouseUpCapture","LocalEventTrapMixin","LinkedValueUtils","instancesByReactID","defaultChecked","_isChanging","getValue","getChecked","_handleChange","rootNode","getOnChange","queryRoot","groupLen","otherNode","otherID","otherInstance","selectValueType","updateOptions","selectedValue","prevMultiple","initialValue","findParent","nodeID","TopLevelCallbackBookKeeping","handleTopLevelImpl","bookKeeping","_handleTopLevel","scrollValueMonitor","scrollPosition","getUnboundedScrollPosition","EventListener","_enabled","listen","hasSelectionCapabilities","selectionStart","selectionEnd","parentElement","boundingTop","boundingLeft","anchorNode","anchorOffset","focusNode","focusOffset","constructSelectEvent","mouseDown","getActiveElement","currentSelection","lastSelection","syntheticEvent","onSelect","onSelectCapture","GLOBAL_MOUNT_POINT_MAX","SyntheticClipboardEvent","SyntheticFocusEvent","SyntheticKeyboardEvent","SyntheticDragEvent","SyntheticTouchEvent","SyntheticUIEvent","SyntheticWheelEvent","blur","onBlur","onBlurCapture","onContextMenu","onContextMenuCapture","onCopy","onCopyCapture","cut","onCut","onCutCapture","doubleClick","onDragCapture","onDragEnd","onDragEndCapture","dragEnter","onDragEnter","onDragEnterCapture","dragExit","onDragExit","onDragExitCapture","dragLeave","onDragLeave","onDragLeaveCapture","dragOver","onDragOver","onDragOverCapture","onDragStart","onDragStartCapture","onDrop","onDropCapture","focus","onFocus","onFocusCapture","onInput","onInputCapture","keyDown","onKeyDown","onKeyDownCapture","keyPress","onKeyPress","onKeyPressCapture","keyUp","onKeyUp","onKeyUpCapture","onLoad","onLoadCapture","onError","onErrorCapture","mouseMove","mouseOut","onMouseOut","onMouseOutCapture","onMouseOverCapture","mouseUp","paste","onPaste","onPasteCapture","onReset","onResetCapture","scroll","onScroll","onScrollCapture","submit","onSubmit","onSubmitCapture","touchCancel","onTouchCancel","onTouchCancelCapture","touchEnd","onTouchEnd","onTouchEndCapture","touchMove","onTouchMove","onTouchMoveCapture","touchStart","onTouchStart","onTouchStartCapture","wheel","onWheel","onWheelCapture","topLevelEventsToDispatchConfig","EventConstructor","charCode","fillOpacity","fontFamily","fontSize","gradientTransform","gradientUnits","markerEnd","markerMid","markerStart","patternContentUnits","patternUnits","preserveAspectRatio","spreadMethod","stopColor","stopOpacity","strokeDasharray","strokeLinecap","strokeOpacity","strokeWidth","textAnchor","viewBox","componentClass","FullPageComponent","ReactRootIndexInjection","_createReactRootIndex","outerNode","innerNode","isTextNode","flattenSingleChildIntoContext","adler32","CHECKSUM_ATTR_NAME","checksum","existingChecksum","markupChecksum","reactMountReady","putListenerQueue","ReactPutListenerQueue","ON_DOM_READY_QUEUEING","PUT_LISTENER_QUEUEING","hasClass","conditionClass","recomputePluginOrdering","EventPluginOrder","pluginName","namesToPlugins","pluginIndex","publishedEvents","publishEventForPlugin","phaseName","phasedRegistrationName","publishRegistrationName","InjectedEventPluginOrder","injectedNamesToPlugins","isOrderingDirty","_resetEventPlugins","detectEvents","testEl","EVENT_NAME_MAP","animationend","animation","transitionend","baseEventName","baseEvents","endEvents","eventListener","WebkitTransition","MozTransition","OTransition","msTransition","WebkitAnimation","MozAnimation","OAnimation","msAnimation","endEvent","currentIsArray","nextIsArray","eventNameSuffix","isSupported","useHasFeature","runEventQueueInBatch","currentScrollLeft","currentScrollTop","_callbacks","_contexts","contexts","transactionWrappers","wrapperInitData","_isInTransaction","isInTransaction","initializeAll","closeAll","startIndex","OBSERVED_ERROR","initData","MAX_MERGE_DEPTH","isTerminal","normalizeMergeArg","checkMergeArrayArgs","checkMergeObjectArgs","checkMergeLevel","level","checkArrayStrategy","strategy","ArrayStrategies","Clobber","IndexByIndex","nextClass","argLength","msPerformance","webkitPerformance","prefixKey","isUnitlessNumber","columnCount","flex","flexGrow","flexShrink","fontWeight","lineClamp","lineHeight","orphans","widows","zIndex","prefixes","backgroundImage","backgroundPosition","backgroundRepeat","backgroundColor","borderWidth","borderStyle","borderColor","borderBottom","borderBottomWidth","borderBottomStyle","borderBottomColor","borderLeft","borderLeftWidth","borderLeftStyle","borderLeftColor","borderRight","borderRightWidth","borderRightStyle","borderRightColor","borderTop","borderTopWidth","borderTopStyle","borderTopColor","font","fontStyle","fontVariant","isNonNumeric","hyphenate","msPattern","InputEventInterface","supportedInputTypes","datetime","datetime-local","email","password","search","tel","isInDocument","ReactDOMSelection","getSelectionInformation","focusedElem","selectionRange","restoreSelection","priorSelectionInformation","curFocusedElem","priorFocusedElem","priorSelectionRange","setSelection","moveStart","moveEnd","getOffsets","createTextRange","collapse","setOffsets","CompositionEventInterface","contentKey","getEventModifierState","MouseEventInterface","screenX","screenY","getModifierState","buttons","DOMChildrenOperations","INVALID_PROPERTY_ERRORS","dangerouslyReplaceNodeWithMarkup","updates","processUpdates","SELECTION_RESTORATION","EVENT_SUPPRESSION","currentlyEnabled","previouslyEnabled","putListeners","replaceChild","textNode","deleteData","_localEventListeners","_assertSingleLink","checkedLink","valueLink","_assertValueLink","_assertCheckedLink","_handleLinkedValueChange","_handleLinkedCheckChange","hasReadOnlyValue","checkbox","image","radio","registerDefault","scrollable","pageXOffset","pageYOffset","ClipboardEventInterface","clipboardData","FocusEventInterface","getEventKey","KeyboardEventInterface","repeat","DragEventInterface","dataTransfer","TouchEventInterface","targetTouches","UIEventInterface","WheelEventInterface","deltaX","wheelDeltaX","wheelDeltaY","deltaZ","isNode","MOD","listenersToPut","listenerToPut","_uppercasePattern","isCollapsed","getIEOffsets","selectedRange","selectedLength","fromStart","duplicate","moveToElementText","setEndPoint","startOffset","endOffset","getModernOffsets","rangeCount","currentRange","getRangeAt","isSelectionCollapsed","rangeLength","tempRange","cloneRange","selectNodeContents","setEnd","startContainer","isTempRangeCollapsed","endContainer","detectionRange","setStart","isBackward","collapsed","detach","setIEOffsets","setModernOffsets","startMarker","getNodeForCharacterOffset","endMarker","removeAllRanges","addRange","useIEOffsets","modifierStateGetter","keyArg","keyProp","modifierKeyToProp","Alt","Control","Meta","Shift","insertChildAt","childNode","Danger","textContentAccessor","createTextNode","markupList","initialChildren","updatedChildren","updatedIndex","updatedChild","renderedMarkup","dangerouslyRenderMarkup","normalizeKey","translateToKey","Esc","Spacebar","Left","Up","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey",8,9,12,13,16,17,18,19,20,27,32,33,34,35,36,37,38,39,40,45,46,112,113,114,115,116,117,118,119,120,121,122,123,144,145,224,"Node","getLeafNode","getSiblingNode","nodeStart","nodeEnd","getNodeName","createNodesFromMarkup","getMarkupWrap","OPEN_TAG_NAME_EXP","RESULT_INDEX_ATTR","markupByNodeName","resultList","resultListAssignmentCount","markupListByNodeName","resultIndex","renderNodes","renderNode","hasAttribute","oldChild","newChild","nodeNameMatch","nodeNamePattern","handleScript","dummyNode","wrapDepth","scripts","getElementsByTagName","createArrayFrom","markupWrap","shouldWrap","selectWrap","tableWrap","trWrap","svgWrap","*","hasArrayNature"],"mappings":"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","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})","/**\n * @jsx React.DOM\n */\n\nvar React = require('react/addons');\nvar domready = require('domready');\nvar _ = require('lodash');\nvar buckets = require('./bucketData');\nvar bubble = require('./bubble');\nvar setOrigin = require('./setOrigin');\nvar Chart = require('./chart');\nvar svgData = require('./svgData');\nvar max = require('./max');\nvar Scale = require('d3-scale').scale;\nvar arc = require('./lib/arcGenerator');\nvar d3 = require('d3');\n\nvar test = arc({startAngle:0, endAngle: Math.PI, radius: 50, center:[0,0]});\n\nvar test1 = d3.svg.line()\n\n\nconsole.log(test, test1(test));\n\nvar allocation = {type: 'allocation', ref: 'allocation', value: 50, color: 'grey'}\n\nbubble.size([svgData.width, svgData.height]);\nvar buckets = max(buckets, 'target', 'allocated');\nvar blobs = bubble({children:[{children: buckets}, allocation]});\n\nblobs = setOrigin(blobs);\nvar scale = Scale.sqrt()\n  .domain([0, blobs[0].value])\n  .range([0, blobs[0].r])\n\n\ndomready(function() {\n\n  React.renderComponent(Chart({scale: scale, width: svgData.width, height: svgData.height, data: blobs}), document.body);\n\n})\n\n","module.exports = [ \n  {\n    type: 'bucket',\n    ref: 'bucket',\n    target: 200,\n    allocated: 50,\n    color: \"red\"\n  },\n  {\n    type: 'bucket',\n    ref: 'bucket',\n    target: 100,\n    allocated: 70,\n    color: \"blue\"\n  },\n  {\n    type: 'bucket',\n    ref: 'bucket',\n    target: 125,\n    allocated: 25,\n    color: \"green\"\n  }\n]\n  \n","/**\n * @jsx React.DOM\n */\n\n var d3 = require('d3');\n\n module.exports = d3.layout.pack()\n","var _ = require('lodash');\nvar uuid = require('uuid');\n\nmodule.exports = function(nodes) {\n\nchildren = _.rest(nodes, function(node) { return node.children });\n\n  return children.map(function(node) {\n    if (node.parent) {\n      node.initialX = node.parent.x;\n      node.initialY = node.parent.y;\n      node.id = uuid.v4();\n    }\n    return node;\n  })\n\n};","/**\n * @jsx React.DOM\n */\n\nvar React = require('react');\nvar Allocation = require('./allocation');\nvar Bucket = require('./bucket');\nvar _ = require('lodash');\n\nmodule.exports = React.createClass({displayName: 'exports',\n  getInitialState: function() {\n    return {\n      dragging: false,\n      data: this.props.data,\n      dragElement: null\n    };\n  },\n\n  render: function() {\n\n    return (\n      React.DOM.svg({\n        width: this.props.width, \n        height: this.props.height, \n        onMouseUp: this.dragEnd, \n        onMouseMove: this.onDrag}, \n        React.DOM.g(null, \n          this.props.data.map(function(d){\n            console.log(this.activate)\n            switch (d.type) {\n              case 'allocation':\n                return Allocation({\n                  ref: d.ref, \n                  dragStart: this.dragStart, \n                  key: d.id, \n                  datum: d})\n                break;\n              case 'bucket':\n                return Bucket({\n                  ready: this.state.dragging, \n                  ref: d.ref, \n                  key: d.id, \n                  datum: d, \n                  scale: this.props.scale})\n                break;\n            };\n          }.bind(this))\n        ), \n        React.DOM.g(null, \n          this.state.dragging ? this.props.data.map(function(d) {\n\n            var mouseOver = this.state.dragging ? this.activate : null;\n            var mouseLeave = this.state.dragging ? this.deActivate : null;\n\n\n            if (d.type === 'bucket') {   \n              return React.DOM.circle({\n                className: \"collisionDetection\", \n                key: d.id + '$-over', \n                onMouseOver: mouseOver, \n                onMouseLeave: mouseLeave, \n                cx: d.x, \n                cy: d.y, \n                r: d.r, \n                style: {opacity:0}}\n              )\n            } else {\n              return;\n            }\n          }.bind(this)) : null\n        )\n      )\n    );\n  },\n\n  activate: function(e) {\n    //extract data from elements and send to allocation arcform function\n\n    var key = e.dispatchMarker.split(\"$\")[1],\n        dropDatum = _.find(this.state.data, {id: key}),\n        dragDatum = _.find(this.state.data, {id: this.state.dragElement}),\n        startAngle = (dropDatum.allocated / dropDatum.target)*Math.PI*2,\n        endAngle = (dragDatum.value/dropDatum.target)*Math.PI*2 + startAngle,\n        midAngle = endAngle - startAngle,\n        radius = this.props.scale(dropDatum.target),\n        //offset center based on arc's computed centroid\n        center = [\n          dragDatum.x - (radius/2)*Math.cos(midAngle),\n          dragDatum.y - (radius/2)*Math.sin(midAngle)\n        ];\n\n    this.refs.dragElement.arcForm({\n      startAngle: startAngle, \n      endAngle: endAngle, \n      radius: radius,\n      center: center,\n      value: dragDatum.value,\n      proportion: (dragDatum.value / dropDatum.target)\n    });\n\n  },\n\n  deActivate: function(e) {\n    var key = e.dispatchMarker.split(\"$\")[1];\n    var coordinates = this.refs.dragElement.state.coordinates\n    this.refs.dragElement.circleForm({coordinates: coordinates});\n\n  },\n\n  onDrag: function(e) {\n    if (!this.state.dragging) {\n      return;\n    } else {\n      this.refs.dragElement.onDrag()\n    }\n  },\n\n  dragUpdate: function(key, bool) {\n    var dragElement = bool ? key : null\n    var updateData = this.state.data.map(function(d) {\n      if (d.id === key) {\n        d.ref = bool ? 'dragElement' : d.type;\n      }\n      return d;\n    });\n\n\n    this.setState({data: updateData, dragging: bool, dragElement: dragElement})\n\n  },\n\n  dragStart: function(e) {\n    var key = e.dispatchMarker.split(\"$\")[1];\n    this.dragUpdate(key, true)\n\n  },\n\n  dragEnd: function(e) {\n    var key = e.dispatchMarker.split(\"$\")[1];\n    this.dragUpdate(key, false)\n  }\n\n});\n\n","module.exports = {\n  width: 900,\n  height: 540\n}","var _ = require('lodash');\n\nmodule.exports = function(arr, prop1, prop2) {\n  return _.map(arr, function(d) { \n    x = _.clone(d)\n    x.value = Math.max(x[prop1], x[prop2]);\n    return x\n   })\n\n}","module.exports = require('./lib/ReactWithAddons');\n","\nmodule.exports = function(options) {\n  var coordinates = options.coordinates || null,\n      n = coordinates ? coordinates.length : 40;\n\n  var center = options.center,\n      startAngle = options.startAngle,\n      endAngle = options.endAngle,\n      radius = options.radius,\n      theta = endAngle - startAngle,\n      arcLength = theta * radius,\n      angleIncrement = theta / (n-2),\n      angleOffset = -Math.PI/2,\n      angle = startAngle;\n\n  var arc = [[center[0], center[1]]]  ;\n  \n  for (var i = 0; i < (n-1); i++) {\n    arc.push([\n      center[0] + radius*Math.cos(angle+angleOffset),\n      center[1] + radius*Math.sin(angle+angleOffset)\n    ]);\n    angle += angleIncrement\n  };\n\n  return arc;\n\n\n}\n","/*!\n  * domready (c) Dustin Diaz 2014 - License MIT\n  */\n!function (name, definition) {\n\n  if (typeof module != 'undefined') module.exports = definition()\n  else if (typeof define == 'function' && typeof define.amd == 'object') define(definition)\n  else this[name] = definition()\n\n}('domready', function () {\n\n  var fns = [], listener\n    , doc = document\n    , domContentLoaded = 'DOMContentLoaded'\n    , loaded = /^loaded|^i|^c/.test(doc.readyState)\n\n  if (!loaded)\n  doc.addEventListener(domContentLoaded, listener = function () {\n    doc.removeEventListener(domContentLoaded, listener)\n    loaded = 1\n    while (listener = fns.shift()) listener()\n  })\n\n  return function (fn) {\n    loaded ? fn() : fns.push(fn)\n  }\n\n});\n","!function() {\n  var d3 = {\n    version: \"3.4.11\"\n  };\n  if (!Date.now) Date.now = function() {\n    return +new Date();\n  };\n  var d3_arraySlice = [].slice, d3_array = function(list) {\n    return d3_arraySlice.call(list);\n  };\n  var d3_document = document, d3_documentElement = d3_document.documentElement, d3_window = window;\n  try {\n    d3_array(d3_documentElement.childNodes)[0].nodeType;\n  } catch (e) {\n    d3_array = function(list) {\n      var i = list.length, array = new Array(i);\n      while (i--) array[i] = list[i];\n      return array;\n    };\n  }\n  try {\n    d3_document.createElement(\"div\").style.setProperty(\"opacity\", 0, \"\");\n  } catch (error) {\n    var d3_element_prototype = d3_window.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = d3_window.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;\n    d3_element_prototype.setAttribute = function(name, value) {\n      d3_element_setAttribute.call(this, name, value + \"\");\n    };\n    d3_element_prototype.setAttributeNS = function(space, local, value) {\n      d3_element_setAttributeNS.call(this, space, local, value + \"\");\n    };\n    d3_style_prototype.setProperty = function(name, value, priority) {\n      d3_style_setProperty.call(this, name, value + \"\", priority);\n    };\n  }\n  d3.ascending = d3_ascending;\n  function d3_ascending(a, b) {\n    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n  }\n  d3.descending = function(a, b) {\n    return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n  };\n  d3.min = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n && !((a = array[i]) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = array[i]) != null && a > b) a = b;\n    } else {\n      while (++i < n && !((a = f.call(array, array[i], i)) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;\n    }\n    return a;\n  };\n  d3.max = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n && !((a = array[i]) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = array[i]) != null && b > a) a = b;\n    } else {\n      while (++i < n && !((a = f.call(array, array[i], i)) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;\n    }\n    return a;\n  };\n  d3.extent = function(array, f) {\n    var i = -1, n = array.length, a, b, c;\n    if (arguments.length === 1) {\n      while (++i < n && !((a = c = array[i]) != null && a <= a)) a = c = undefined;\n      while (++i < n) if ((b = array[i]) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    } else {\n      while (++i < n && !((a = c = f.call(array, array[i], i)) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    }\n    return [ a, c ];\n  };\n  d3.sum = function(array, f) {\n    var s = 0, n = array.length, a, i = -1;\n    if (arguments.length === 1) {\n      while (++i < n) if (!isNaN(a = +array[i])) s += a;\n    } else {\n      while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a;\n    }\n    return s;\n  };\n  function d3_number(x) {\n    return x != null && !isNaN(x);\n  }\n  d3.mean = function(array, f) {\n    var s = 0, n = array.length, a, i = -1, j = n;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_number(a = array[i])) s += a; else --j;\n    } else {\n      while (++i < n) if (d3_number(a = f.call(array, array[i], i))) s += a; else --j;\n    }\n    return j ? s / j : undefined;\n  };\n  d3.quantile = function(values, p) {\n    var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;\n    return e ? v + e * (values[h] - v) : v;\n  };\n  d3.median = function(array, f) {\n    if (arguments.length > 1) array = array.map(f);\n    array = array.filter(d3_number);\n    return array.length ? d3.quantile(array.sort(d3_ascending), .5) : undefined;\n  };\n  function d3_bisector(compare) {\n    return {\n      left: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;\n        }\n        return lo;\n      },\n      right: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;\n        }\n        return lo;\n      }\n    };\n  }\n  var d3_bisect = d3_bisector(d3_ascending);\n  d3.bisectLeft = d3_bisect.left;\n  d3.bisect = d3.bisectRight = d3_bisect.right;\n  d3.bisector = function(f) {\n    return d3_bisector(f.length === 1 ? function(d, x) {\n      return d3_ascending(f(d), x);\n    } : f);\n  };\n  d3.shuffle = function(array) {\n    var m = array.length, t, i;\n    while (m) {\n      i = Math.random() * m-- | 0;\n      t = array[m], array[m] = array[i], array[i] = t;\n    }\n    return array;\n  };\n  d3.permute = function(array, indexes) {\n    var i = indexes.length, permutes = new Array(i);\n    while (i--) permutes[i] = array[indexes[i]];\n    return permutes;\n  };\n  d3.pairs = function(array) {\n    var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);\n    while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];\n    return pairs;\n  };\n  d3.zip = function() {\n    if (!(n = arguments.length)) return [];\n    for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m; ) {\n      for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n; ) {\n        zip[j] = arguments[j][i];\n      }\n    }\n    return zips;\n  };\n  function d3_zipLength(d) {\n    return d.length;\n  }\n  d3.transpose = function(matrix) {\n    return d3.zip.apply(d3, matrix);\n  };\n  d3.keys = function(map) {\n    var keys = [];\n    for (var key in map) keys.push(key);\n    return keys;\n  };\n  d3.values = function(map) {\n    var values = [];\n    for (var key in map) values.push(map[key]);\n    return values;\n  };\n  d3.entries = function(map) {\n    var entries = [];\n    for (var key in map) entries.push({\n      key: key,\n      value: map[key]\n    });\n    return entries;\n  };\n  d3.merge = function(arrays) {\n    var n = arrays.length, m, i = -1, j = 0, merged, array;\n    while (++i < n) j += arrays[i].length;\n    merged = new Array(j);\n    while (--n >= 0) {\n      array = arrays[n];\n      m = array.length;\n      while (--m >= 0) {\n        merged[--j] = array[m];\n      }\n    }\n    return merged;\n  };\n  var abs = Math.abs;\n  d3.range = function(start, stop, step) {\n    if (arguments.length < 3) {\n      step = 1;\n      if (arguments.length < 2) {\n        stop = start;\n        start = 0;\n      }\n    }\n    if ((stop - start) / step === Infinity) throw new Error(\"infinite range\");\n    var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;\n    start *= k, stop *= k, step *= k;\n    if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);\n    return range;\n  };\n  function d3_range_integerScale(x) {\n    var k = 1;\n    while (x * k % 1) k *= 10;\n    return k;\n  }\n  function d3_class(ctor, properties) {\n    try {\n      for (var key in properties) {\n        Object.defineProperty(ctor.prototype, key, {\n          value: properties[key],\n          enumerable: false\n        });\n      }\n    } catch (e) {\n      ctor.prototype = properties;\n    }\n  }\n  d3.map = function(object) {\n    var map = new d3_Map();\n    if (object instanceof d3_Map) object.forEach(function(key, value) {\n      map.set(key, value);\n    }); else for (var key in object) map.set(key, object[key]);\n    return map;\n  };\n  function d3_Map() {}\n  d3_class(d3_Map, {\n    has: d3_map_has,\n    get: function(key) {\n      return this[d3_map_prefix + key];\n    },\n    set: function(key, value) {\n      return this[d3_map_prefix + key] = value;\n    },\n    remove: d3_map_remove,\n    keys: d3_map_keys,\n    values: function() {\n      var values = [];\n      this.forEach(function(key, value) {\n        values.push(value);\n      });\n      return values;\n    },\n    entries: function() {\n      var entries = [];\n      this.forEach(function(key, value) {\n        entries.push({\n          key: key,\n          value: value\n        });\n      });\n      return entries;\n    },\n    size: d3_map_size,\n    empty: d3_map_empty,\n    forEach: function(f) {\n      for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) f.call(this, key.substring(1), this[key]);\n    }\n  });\n  var d3_map_prefix = \"\\x00\", d3_map_prefixCode = d3_map_prefix.charCodeAt(0);\n  function d3_map_has(key) {\n    return d3_map_prefix + key in this;\n  }\n  function d3_map_remove(key) {\n    key = d3_map_prefix + key;\n    return key in this && delete this[key];\n  }\n  function d3_map_keys() {\n    var keys = [];\n    this.forEach(function(key) {\n      keys.push(key);\n    });\n    return keys;\n  }\n  function d3_map_size() {\n    var size = 0;\n    for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) ++size;\n    return size;\n  }\n  function d3_map_empty() {\n    for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) return false;\n    return true;\n  }\n  d3.nest = function() {\n    var nest = {}, keys = [], sortKeys = [], sortValues, rollup;\n    function map(mapType, array, depth) {\n      if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;\n      var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;\n      while (++i < n) {\n        if (values = valuesByKey.get(keyValue = key(object = array[i]))) {\n          values.push(object);\n        } else {\n          valuesByKey.set(keyValue, [ object ]);\n        }\n      }\n      if (mapType) {\n        object = mapType();\n        setter = function(keyValue, values) {\n          object.set(keyValue, map(mapType, values, depth));\n        };\n      } else {\n        object = {};\n        setter = function(keyValue, values) {\n          object[keyValue] = map(mapType, values, depth);\n        };\n      }\n      valuesByKey.forEach(setter);\n      return object;\n    }\n    function entries(map, depth) {\n      if (depth >= keys.length) return map;\n      var array = [], sortKey = sortKeys[depth++];\n      map.forEach(function(key, keyMap) {\n        array.push({\n          key: key,\n          values: entries(keyMap, depth)\n        });\n      });\n      return sortKey ? array.sort(function(a, b) {\n        return sortKey(a.key, b.key);\n      }) : array;\n    }\n    nest.map = function(array, mapType) {\n      return map(mapType, array, 0);\n    };\n    nest.entries = function(array) {\n      return entries(map(d3.map, array, 0), 0);\n    };\n    nest.key = function(d) {\n      keys.push(d);\n      return nest;\n    };\n    nest.sortKeys = function(order) {\n      sortKeys[keys.length - 1] = order;\n      return nest;\n    };\n    nest.sortValues = function(order) {\n      sortValues = order;\n      return nest;\n    };\n    nest.rollup = function(f) {\n      rollup = f;\n      return nest;\n    };\n    return nest;\n  };\n  d3.set = function(array) {\n    var set = new d3_Set();\n    if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);\n    return set;\n  };\n  function d3_Set() {}\n  d3_class(d3_Set, {\n    has: d3_map_has,\n    add: function(value) {\n      this[d3_map_prefix + value] = true;\n      return value;\n    },\n    remove: function(value) {\n      value = d3_map_prefix + value;\n      return value in this && delete this[value];\n    },\n    values: d3_map_keys,\n    size: d3_map_size,\n    empty: d3_map_empty,\n    forEach: function(f) {\n      for (var value in this) if (value.charCodeAt(0) === d3_map_prefixCode) f.call(this, value.substring(1));\n    }\n  });\n  d3.behavior = {};\n  d3.rebind = function(target, source) {\n    var i = 1, n = arguments.length, method;\n    while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);\n    return target;\n  };\n  function d3_rebind(target, source, method) {\n    return function() {\n      var value = method.apply(source, arguments);\n      return value === source ? target : value;\n    };\n  }\n  function d3_vendorSymbol(object, name) {\n    if (name in object) return name;\n    name = name.charAt(0).toUpperCase() + name.substring(1);\n    for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {\n      var prefixName = d3_vendorPrefixes[i] + name;\n      if (prefixName in object) return prefixName;\n    }\n  }\n  var d3_vendorPrefixes = [ \"webkit\", \"ms\", \"moz\", \"Moz\", \"o\", \"O\" ];\n  function d3_noop() {}\n  d3.dispatch = function() {\n    var dispatch = new d3_dispatch(), i = -1, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    return dispatch;\n  };\n  function d3_dispatch() {}\n  d3_dispatch.prototype.on = function(type, listener) {\n    var i = type.indexOf(\".\"), name = \"\";\n    if (i >= 0) {\n      name = type.substring(i + 1);\n      type = type.substring(0, i);\n    }\n    if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);\n    if (arguments.length === 2) {\n      if (listener == null) for (type in this) {\n        if (this.hasOwnProperty(type)) this[type].on(name, null);\n      }\n      return this;\n    }\n  };\n  function d3_dispatch_event(dispatch) {\n    var listeners = [], listenerByName = new d3_Map();\n    function event() {\n      var z = listeners, i = -1, n = z.length, l;\n      while (++i < n) if (l = z[i].on) l.apply(this, arguments);\n      return dispatch;\n    }\n    event.on = function(name, listener) {\n      var l = listenerByName.get(name), i;\n      if (arguments.length < 2) return l && l.on;\n      if (l) {\n        l.on = null;\n        listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));\n        listenerByName.remove(name);\n      }\n      if (listener) listeners.push(listenerByName.set(name, {\n        on: listener\n      }));\n      return dispatch;\n    };\n    return event;\n  }\n  d3.event = null;\n  function d3_eventPreventDefault() {\n    d3.event.preventDefault();\n  }\n  function d3_eventSource() {\n    var e = d3.event, s;\n    while (s = e.sourceEvent) e = s;\n    return e;\n  }\n  function d3_eventDispatch(target) {\n    var dispatch = new d3_dispatch(), i = 0, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    dispatch.of = function(thiz, argumentz) {\n      return function(e1) {\n        try {\n          var e0 = e1.sourceEvent = d3.event;\n          e1.target = target;\n          d3.event = e1;\n          dispatch[e1.type].apply(thiz, argumentz);\n        } finally {\n          d3.event = e0;\n        }\n      };\n    };\n    return dispatch;\n  }\n  d3.requote = function(s) {\n    return s.replace(d3_requote_re, \"\\\\$&\");\n  };\n  var d3_requote_re = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n  var d3_subclass = {}.__proto__ ? function(object, prototype) {\n    object.__proto__ = prototype;\n  } : function(object, prototype) {\n    for (var property in prototype) object[property] = prototype[property];\n  };\n  function d3_selection(groups) {\n    d3_subclass(groups, d3_selectionPrototype);\n    return groups;\n  }\n  var d3_select = function(s, n) {\n    return n.querySelector(s);\n  }, d3_selectAll = function(s, n) {\n    return n.querySelectorAll(s);\n  }, d3_selectMatcher = d3_documentElement.matches || d3_documentElement[d3_vendorSymbol(d3_documentElement, \"matchesSelector\")], d3_selectMatches = function(n, s) {\n    return d3_selectMatcher.call(n, s);\n  };\n  if (typeof Sizzle === \"function\") {\n    d3_select = function(s, n) {\n      return Sizzle(s, n)[0] || null;\n    };\n    d3_selectAll = Sizzle;\n    d3_selectMatches = Sizzle.matchesSelector;\n  }\n  d3.selection = function() {\n    return d3_selectionRoot;\n  };\n  var d3_selectionPrototype = d3.selection.prototype = [];\n  d3_selectionPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, group, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(subnode = selector.call(node, node.__data__, i, j));\n          if (subnode && \"__data__\" in node) subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selector(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_select(selector, this);\n    };\n  }\n  d3_selectionPrototype.selectAll = function(selector) {\n    var subgroups = [], subgroup, node;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));\n          subgroup.parentNode = node;\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selectorAll(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_selectAll(selector, this);\n    };\n  }\n  var d3_nsPrefix = {\n    svg: \"http://www.w3.org/2000/svg\",\n    xhtml: \"http://www.w3.org/1999/xhtml\",\n    xlink: \"http://www.w3.org/1999/xlink\",\n    xml: \"http://www.w3.org/XML/1998/namespace\",\n    xmlns: \"http://www.w3.org/2000/xmlns/\"\n  };\n  d3.ns = {\n    prefix: d3_nsPrefix,\n    qualify: function(name) {\n      var i = name.indexOf(\":\"), prefix = name;\n      if (i >= 0) {\n        prefix = name.substring(0, i);\n        name = name.substring(i + 1);\n      }\n      return d3_nsPrefix.hasOwnProperty(prefix) ? {\n        space: d3_nsPrefix[prefix],\n        local: name\n      } : name;\n    }\n  };\n  d3_selectionPrototype.attr = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node();\n        name = d3.ns.qualify(name);\n        return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);\n      }\n      for (value in name) this.each(d3_selection_attr(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_attr(name, value));\n  };\n  function d3_selection_attr(name, value) {\n    name = d3.ns.qualify(name);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrConstant() {\n      this.setAttribute(name, value);\n    }\n    function attrConstantNS() {\n      this.setAttributeNS(name.space, name.local, value);\n    }\n    function attrFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);\n    }\n    function attrFunctionNS() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);\n    }\n    return value == null ? name.local ? attrNullNS : attrNull : typeof value === \"function\" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;\n  }\n  function d3_collapse(s) {\n    return s.trim().replace(/\\s+/g, \" \");\n  }\n  d3_selectionPrototype.classed = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;\n        if (value = node.classList) {\n          while (++i < n) if (!value.contains(name[i])) return false;\n        } else {\n          value = node.getAttribute(\"class\");\n          while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;\n        }\n        return true;\n      }\n      for (value in name) this.each(d3_selection_classed(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_classed(name, value));\n  };\n  function d3_selection_classedRe(name) {\n    return new RegExp(\"(?:^|\\\\s+)\" + d3.requote(name) + \"(?:\\\\s+|$)\", \"g\");\n  }\n  function d3_selection_classes(name) {\n    return (name + \"\").trim().split(/^|\\s+/);\n  }\n  function d3_selection_classed(name, value) {\n    name = d3_selection_classes(name).map(d3_selection_classedName);\n    var n = name.length;\n    function classedConstant() {\n      var i = -1;\n      while (++i < n) name[i](this, value);\n    }\n    function classedFunction() {\n      var i = -1, x = value.apply(this, arguments);\n      while (++i < n) name[i](this, x);\n    }\n    return typeof value === \"function\" ? classedFunction : classedConstant;\n  }\n  function d3_selection_classedName(name) {\n    var re = d3_selection_classedRe(name);\n    return function(node, value) {\n      if (c = node.classList) return value ? c.add(name) : c.remove(name);\n      var c = node.getAttribute(\"class\") || \"\";\n      if (value) {\n        re.lastIndex = 0;\n        if (!re.test(c)) node.setAttribute(\"class\", d3_collapse(c + \" \" + name));\n      } else {\n        node.setAttribute(\"class\", d3_collapse(c.replace(re, \" \")));\n      }\n    };\n  }\n  d3_selectionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.each(d3_selection_style(priority, name[priority], value));\n        return this;\n      }\n      if (n < 2) return d3_window.getComputedStyle(this.node(), null).getPropertyValue(name);\n      priority = \"\";\n    }\n    return this.each(d3_selection_style(name, value, priority));\n  };\n  function d3_selection_style(name, value, priority) {\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleConstant() {\n      this.style.setProperty(name, value, priority);\n    }\n    function styleFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);\n    }\n    return value == null ? styleNull : typeof value === \"function\" ? styleFunction : styleConstant;\n  }\n  d3_selectionPrototype.property = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") return this.node()[name];\n      for (value in name) this.each(d3_selection_property(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_property(name, value));\n  };\n  function d3_selection_property(name, value) {\n    function propertyNull() {\n      delete this[name];\n    }\n    function propertyConstant() {\n      this[name] = value;\n    }\n    function propertyFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) delete this[name]; else this[name] = x;\n    }\n    return value == null ? propertyNull : typeof value === \"function\" ? propertyFunction : propertyConstant;\n  }\n  d3_selectionPrototype.text = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.textContent = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.textContent = \"\";\n    } : function() {\n      this.textContent = value;\n    }) : this.node().textContent;\n  };\n  d3_selectionPrototype.html = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.innerHTML = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.innerHTML = \"\";\n    } : function() {\n      this.innerHTML = value;\n    }) : this.node().innerHTML;\n  };\n  d3_selectionPrototype.append = function(name) {\n    name = d3_selection_creator(name);\n    return this.select(function() {\n      return this.appendChild(name.apply(this, arguments));\n    });\n  };\n  function d3_selection_creator(name) {\n    return typeof name === \"function\" ? name : (name = d3.ns.qualify(name)).local ? function() {\n      return this.ownerDocument.createElementNS(name.space, name.local);\n    } : function() {\n      return this.ownerDocument.createElementNS(this.namespaceURI, name);\n    };\n  }\n  d3_selectionPrototype.insert = function(name, before) {\n    name = d3_selection_creator(name);\n    before = d3_selection_selector(before);\n    return this.select(function() {\n      return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);\n    });\n  };\n  d3_selectionPrototype.remove = function() {\n    return this.each(function() {\n      var parent = this.parentNode;\n      if (parent) parent.removeChild(this);\n    });\n  };\n  d3_selectionPrototype.data = function(value, key) {\n    var i = -1, n = this.length, group, node;\n    if (!arguments.length) {\n      value = new Array(n = (group = this[0]).length);\n      while (++i < n) {\n        if (node = group[i]) {\n          value[i] = node.__data__;\n        }\n      }\n      return value;\n    }\n    function bind(group, groupData) {\n      var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;\n      if (key) {\n        var nodeByKeyValue = new d3_Map(), dataByKeyValue = new d3_Map(), keyValues = [], keyValue;\n        for (i = -1; ++i < n; ) {\n          keyValue = key.call(node = group[i], node.__data__, i);\n          if (nodeByKeyValue.has(keyValue)) {\n            exitNodes[i] = node;\n          } else {\n            nodeByKeyValue.set(keyValue, node);\n          }\n          keyValues.push(keyValue);\n        }\n        for (i = -1; ++i < m; ) {\n          keyValue = key.call(groupData, nodeData = groupData[i], i);\n          if (node = nodeByKeyValue.get(keyValue)) {\n            updateNodes[i] = node;\n            node.__data__ = nodeData;\n          } else if (!dataByKeyValue.has(keyValue)) {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          }\n          dataByKeyValue.set(keyValue, nodeData);\n          nodeByKeyValue.remove(keyValue);\n        }\n        for (i = -1; ++i < n; ) {\n          if (nodeByKeyValue.has(keyValues[i])) {\n            exitNodes[i] = group[i];\n          }\n        }\n      } else {\n        for (i = -1; ++i < n0; ) {\n          node = group[i];\n          nodeData = groupData[i];\n          if (node) {\n            node.__data__ = nodeData;\n            updateNodes[i] = node;\n          } else {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          }\n        }\n        for (;i < m; ++i) {\n          enterNodes[i] = d3_selection_dataNode(groupData[i]);\n        }\n        for (;i < n; ++i) {\n          exitNodes[i] = group[i];\n        }\n      }\n      enterNodes.update = updateNodes;\n      enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;\n      enter.push(enterNodes);\n      update.push(updateNodes);\n      exit.push(exitNodes);\n    }\n    var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);\n    if (typeof value === \"function\") {\n      while (++i < n) {\n        bind(group = this[i], value.call(group, group.parentNode.__data__, i));\n      }\n    } else {\n      while (++i < n) {\n        bind(group = this[i], value);\n      }\n    }\n    update.enter = function() {\n      return enter;\n    };\n    update.exit = function() {\n      return exit;\n    };\n    return update;\n  };\n  function d3_selection_dataNode(data) {\n    return {\n      __data__: data\n    };\n  }\n  d3_selectionPrototype.datum = function(value) {\n    return arguments.length ? this.property(\"__data__\", value) : this.property(\"__data__\");\n  };\n  d3_selectionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_filter(selector) {\n    return function() {\n      return d3_selectMatches(this, selector);\n    };\n  }\n  d3_selectionPrototype.order = function() {\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {\n        if (node = group[i]) {\n          if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n          next = node;\n        }\n      }\n    }\n    return this;\n  };\n  d3_selectionPrototype.sort = function(comparator) {\n    comparator = d3_selection_sortComparator.apply(this, arguments);\n    for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);\n    return this.order();\n  };\n  function d3_selection_sortComparator(comparator) {\n    if (!arguments.length) comparator = d3_ascending;\n    return function(a, b) {\n      return a && b ? comparator(a.__data__, b.__data__) : !a - !b;\n    };\n  }\n  d3_selectionPrototype.each = function(callback) {\n    return d3_selection_each(this, function(node, i, j) {\n      callback.call(node, node.__data__, i, j);\n    });\n  };\n  function d3_selection_each(groups, callback) {\n    for (var j = 0, m = groups.length; j < m; j++) {\n      for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {\n        if (node = group[i]) callback(node, i, j);\n      }\n    }\n    return groups;\n  }\n  d3_selectionPrototype.call = function(callback) {\n    var args = d3_array(arguments);\n    callback.apply(args[0] = this, args);\n    return this;\n  };\n  d3_selectionPrototype.empty = function() {\n    return !this.node();\n  };\n  d3_selectionPrototype.node = function() {\n    for (var j = 0, m = this.length; j < m; j++) {\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        var node = group[i];\n        if (node) return node;\n      }\n    }\n    return null;\n  };\n  d3_selectionPrototype.size = function() {\n    var n = 0;\n    this.each(function() {\n      ++n;\n    });\n    return n;\n  };\n  function d3_selection_enter(selection) {\n    d3_subclass(selection, d3_selection_enterPrototype);\n    return selection;\n  }\n  var d3_selection_enterPrototype = [];\n  d3.selection.enter = d3_selection_enter;\n  d3.selection.enter.prototype = d3_selection_enterPrototype;\n  d3_selection_enterPrototype.append = d3_selectionPrototype.append;\n  d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;\n  d3_selection_enterPrototype.node = d3_selectionPrototype.node;\n  d3_selection_enterPrototype.call = d3_selectionPrototype.call;\n  d3_selection_enterPrototype.size = d3_selectionPrototype.size;\n  d3_selection_enterPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, upgroup, group, node;\n    for (var j = -1, m = this.length; ++j < m; ) {\n      upgroup = (group = this[j]).update;\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = group.parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));\n          subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  d3_selection_enterPrototype.insert = function(name, before) {\n    if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);\n    return d3_selectionPrototype.insert.call(this, name, before);\n  };\n  function d3_selection_enterInsertBefore(enter) {\n    var i0, j0;\n    return function(d, i, j) {\n      var group = enter[j].update, n = group.length, node;\n      if (j != j0) j0 = j, i0 = 0;\n      if (i >= i0) i0 = i + 1;\n      while (!(node = group[i0]) && ++i0 < n) ;\n      return node;\n    };\n  }\n  d3_selectionPrototype.transition = function() {\n    var id = d3_transitionInheritId || ++d3_transitionId, subgroups = [], subgroup, node, transition = d3_transitionInherit || {\n      time: Date.now(),\n      ease: d3_ease_cubicInOut,\n      delay: 0,\n      duration: 250\n    };\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) d3_transitionNode(node, i, id, transition);\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, id);\n  };\n  d3_selectionPrototype.interrupt = function() {\n    return this.each(d3_selection_interrupt);\n  };\n  function d3_selection_interrupt() {\n    var lock = this.__transition__;\n    if (lock) ++lock.active;\n  }\n  d3.select = function(node) {\n    var group = [ typeof node === \"string\" ? d3_select(node, d3_document) : node ];\n    group.parentNode = d3_documentElement;\n    return d3_selection([ group ]);\n  };\n  d3.selectAll = function(nodes) {\n    var group = d3_array(typeof nodes === \"string\" ? d3_selectAll(nodes, d3_document) : nodes);\n    group.parentNode = d3_documentElement;\n    return d3_selection([ group ]);\n  };\n  var d3_selectionRoot = d3.select(d3_documentElement);\n  d3_selectionPrototype.on = function(type, listener, capture) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof type !== \"string\") {\n        if (n < 2) listener = false;\n        for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));\n        return this;\n      }\n      if (n < 2) return (n = this.node()[\"__on\" + type]) && n._;\n      capture = false;\n    }\n    return this.each(d3_selection_on(type, listener, capture));\n  };\n  function d3_selection_on(type, listener, capture) {\n    var name = \"__on\" + type, i = type.indexOf(\".\"), wrap = d3_selection_onListener;\n    if (i > 0) type = type.substring(0, i);\n    var filter = d3_selection_onFilters.get(type);\n    if (filter) type = filter, wrap = d3_selection_onFilter;\n    function onRemove() {\n      var l = this[name];\n      if (l) {\n        this.removeEventListener(type, l, l.$);\n        delete this[name];\n      }\n    }\n    function onAdd() {\n      var l = wrap(listener, d3_array(arguments));\n      onRemove.call(this);\n      this.addEventListener(type, this[name] = l, l.$ = capture);\n      l._ = listener;\n    }\n    function removeAll() {\n      var re = new RegExp(\"^__on([^.]+)\" + d3.requote(type) + \"$\"), match;\n      for (var name in this) {\n        if (match = name.match(re)) {\n          var l = this[name];\n          this.removeEventListener(match[1], l, l.$);\n          delete this[name];\n        }\n      }\n    }\n    return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;\n  }\n  var d3_selection_onFilters = d3.map({\n    mouseenter: \"mouseover\",\n    mouseleave: \"mouseout\"\n  });\n  d3_selection_onFilters.forEach(function(k) {\n    if (\"on\" + k in d3_document) d3_selection_onFilters.remove(k);\n  });\n  function d3_selection_onListener(listener, argumentz) {\n    return function(e) {\n      var o = d3.event;\n      d3.event = e;\n      argumentz[0] = this.__data__;\n      try {\n        listener.apply(this, argumentz);\n      } finally {\n        d3.event = o;\n      }\n    };\n  }\n  function d3_selection_onFilter(listener, argumentz) {\n    var l = d3_selection_onListener(listener, argumentz);\n    return function(e) {\n      var target = this, related = e.relatedTarget;\n      if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {\n        l.call(target, e);\n      }\n    };\n  }\n  var d3_event_dragSelect = \"onselectstart\" in d3_document ? null : d3_vendorSymbol(d3_documentElement.style, \"userSelect\"), d3_event_dragId = 0;\n  function d3_event_dragSuppress() {\n    var name = \".dragsuppress-\" + ++d3_event_dragId, click = \"click\" + name, w = d3.select(d3_window).on(\"touchmove\" + name, d3_eventPreventDefault).on(\"dragstart\" + name, d3_eventPreventDefault).on(\"selectstart\" + name, d3_eventPreventDefault);\n    if (d3_event_dragSelect) {\n      var style = d3_documentElement.style, select = style[d3_event_dragSelect];\n      style[d3_event_dragSelect] = \"none\";\n    }\n    return function(suppressClick) {\n      w.on(name, null);\n      if (d3_event_dragSelect) style[d3_event_dragSelect] = select;\n      if (suppressClick) {\n        function off() {\n          w.on(click, null);\n        }\n        w.on(click, function() {\n          d3_eventPreventDefault();\n          off();\n        }, true);\n        setTimeout(off, 0);\n      }\n    };\n  }\n  d3.mouse = function(container) {\n    return d3_mousePoint(container, d3_eventSource());\n  };\n  var d3_mouse_bug44083 = /WebKit/.test(d3_window.navigator.userAgent) ? -1 : 0;\n  function d3_mousePoint(container, e) {\n    if (e.changedTouches) e = e.changedTouches[0];\n    var svg = container.ownerSVGElement || container;\n    if (svg.createSVGPoint) {\n      var point = svg.createSVGPoint();\n      if (d3_mouse_bug44083 < 0 && (d3_window.scrollX || d3_window.scrollY)) {\n        svg = d3.select(\"body\").append(\"svg\").style({\n          position: \"absolute\",\n          top: 0,\n          left: 0,\n          margin: 0,\n          padding: 0,\n          border: \"none\"\n        }, \"important\");\n        var ctm = svg[0][0].getScreenCTM();\n        d3_mouse_bug44083 = !(ctm.f || ctm.e);\n        svg.remove();\n      }\n      if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, \n      point.y = e.clientY;\n      point = point.matrixTransform(container.getScreenCTM().inverse());\n      return [ point.x, point.y ];\n    }\n    var rect = container.getBoundingClientRect();\n    return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];\n  }\n  d3.touches = function(container, touches) {\n    if (arguments.length < 2) touches = d3_eventSource().touches;\n    return touches ? d3_array(touches).map(function(touch) {\n      var point = d3_mousePoint(container, touch);\n      point.identifier = touch.identifier;\n      return point;\n    }) : [];\n  };\n  d3.behavior.drag = function() {\n    var event = d3_eventDispatch(drag, \"drag\", \"dragstart\", \"dragend\"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_behavior_dragMouseSubject, \"mousemove\", \"mouseup\"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_behavior_dragTouchSubject, \"touchmove\", \"touchend\");\n    function drag() {\n      this.on(\"mousedown.drag\", mousedown).on(\"touchstart.drag\", touchstart);\n    }\n    function dragstart(id, position, subject, move, end) {\n      return function() {\n        var that = this, target = d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = \".drag\" + (dragId == null ? \"\" : \"-\" + dragId), dragOffset, dragSubject = d3.select(subject()).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(), position0 = position(parent, dragId);\n        if (origin) {\n          dragOffset = origin.apply(that, arguments);\n          dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];\n        } else {\n          dragOffset = [ 0, 0 ];\n        }\n        dispatch({\n          type: \"dragstart\"\n        });\n        function moved() {\n          var position1 = position(parent, dragId), dx, dy;\n          if (!position1) return;\n          dx = position1[0] - position0[0];\n          dy = position1[1] - position0[1];\n          dragged |= dx | dy;\n          position0 = position1;\n          dispatch({\n            type: \"drag\",\n            x: position1[0] + dragOffset[0],\n            y: position1[1] + dragOffset[1],\n            dx: dx,\n            dy: dy\n          });\n        }\n        function ended() {\n          if (!position(parent, dragId)) return;\n          dragSubject.on(move + dragName, null).on(end + dragName, null);\n          dragRestore(dragged && d3.event.target === target);\n          dispatch({\n            type: \"dragend\"\n          });\n        }\n      };\n    }\n    drag.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return drag;\n    };\n    return d3.rebind(drag, event, \"on\");\n  };\n  function d3_behavior_dragTouchId() {\n    return d3.event.changedTouches[0].identifier;\n  }\n  function d3_behavior_dragTouchSubject() {\n    return d3.event.target;\n  }\n  function d3_behavior_dragMouseSubject() {\n    return d3_window;\n  }\n  var π = Math.PI, τ = 2 * π, halfπ = π / 2, ε = 1e-6, ε2 = ε * ε, d3_radians = π / 180, d3_degrees = 180 / π;\n  function d3_sgn(x) {\n    return x > 0 ? 1 : x < 0 ? -1 : 0;\n  }\n  function d3_cross2d(a, b, c) {\n    return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n  }\n  function d3_acos(x) {\n    return x > 1 ? 0 : x < -1 ? π : Math.acos(x);\n  }\n  function d3_asin(x) {\n    return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);\n  }\n  function d3_sinh(x) {\n    return ((x = Math.exp(x)) - 1 / x) / 2;\n  }\n  function d3_cosh(x) {\n    return ((x = Math.exp(x)) + 1 / x) / 2;\n  }\n  function d3_tanh(x) {\n    return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n  }\n  function d3_haversin(x) {\n    return (x = Math.sin(x / 2)) * x;\n  }\n  var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;\n  d3.interpolateZoom = function(p0, p1) {\n    var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2];\n    var dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1), dr = r1 - r0, S = (dr || Math.log(w1 / w0)) / ρ;\n    function interpolate(t) {\n      var s = t * S;\n      if (dr) {\n        var coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));\n        return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];\n      }\n      return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * s) ];\n    }\n    interpolate.duration = S * 1e3;\n    return interpolate;\n  };\n  d3.behavior.zoom = function() {\n    var view = {\n      x: 0,\n      y: 0,\n      k: 1\n    }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, mousedown = \"mousedown.zoom\", mousemove = \"mousemove.zoom\", mouseup = \"mouseup.zoom\", mousewheelTimer, touchstart = \"touchstart.zoom\", touchtime, event = d3_eventDispatch(zoom, \"zoomstart\", \"zoom\", \"zoomend\"), x0, x1, y0, y1;\n    function zoom(g) {\n      g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + \".zoom\", mousewheeled).on(\"dblclick.zoom\", dblclicked).on(touchstart, touchstarted);\n    }\n    zoom.event = function(g) {\n      g.each(function() {\n        var dispatch = event.of(this, arguments), view1 = view;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.zoom\", function() {\n            view = this.__chart__ || {\n              x: 0,\n              y: 0,\n              k: 1\n            };\n            zoomstarted(dispatch);\n          }).tween(\"zoom:zoom\", function() {\n            var dx = size[0], dy = size[1], cx = dx / 2, cy = dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);\n            return function(t) {\n              var l = i(t), k = dx / l[2];\n              this.__chart__ = view = {\n                x: cx - l[0] * k,\n                y: cy - l[1] * k,\n                k: k\n              };\n              zoomed(dispatch);\n            };\n          }).each(\"end.zoom\", function() {\n            zoomended(dispatch);\n          });\n        } else {\n          this.__chart__ = view;\n          zoomstarted(dispatch);\n          zoomed(dispatch);\n          zoomended(dispatch);\n        }\n      });\n    };\n    zoom.translate = function(_) {\n      if (!arguments.length) return [ view.x, view.y ];\n      view = {\n        x: +_[0],\n        y: +_[1],\n        k: view.k\n      };\n      rescale();\n      return zoom;\n    };\n    zoom.scale = function(_) {\n      if (!arguments.length) return view.k;\n      view = {\n        x: view.x,\n        y: view.y,\n        k: +_\n      };\n      rescale();\n      return zoom;\n    };\n    zoom.scaleExtent = function(_) {\n      if (!arguments.length) return scaleExtent;\n      scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.center = function(_) {\n      if (!arguments.length) return center;\n      center = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.size = function(_) {\n      if (!arguments.length) return size;\n      size = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.x = function(z) {\n      if (!arguments.length) return x1;\n      x1 = z;\n      x0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    zoom.y = function(z) {\n      if (!arguments.length) return y1;\n      y1 = z;\n      y0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    function location(p) {\n      return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];\n    }\n    function point(l) {\n      return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];\n    }\n    function scaleTo(s) {\n      view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));\n    }\n    function translateTo(p, l) {\n      l = point(l);\n      view.x += p[0] - l[0];\n      view.y += p[1] - l[1];\n    }\n    function rescale() {\n      if (x1) x1.domain(x0.range().map(function(x) {\n        return (x - view.x) / view.k;\n      }).map(x0.invert));\n      if (y1) y1.domain(y0.range().map(function(y) {\n        return (y - view.y) / view.k;\n      }).map(y0.invert));\n    }\n    function zoomstarted(dispatch) {\n      dispatch({\n        type: \"zoomstart\"\n      });\n    }\n    function zoomed(dispatch) {\n      rescale();\n      dispatch({\n        type: \"zoom\",\n        scale: view.k,\n        translate: [ view.x, view.y ]\n      });\n    }\n    function zoomended(dispatch) {\n      dispatch({\n        type: \"zoomend\"\n      });\n    }\n    function mousedowned() {\n      var that = this, target = d3.event.target, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress();\n      d3_selection_interrupt.call(that);\n      zoomstarted(dispatch);\n      function moved() {\n        dragged = 1;\n        translateTo(d3.mouse(that), location0);\n        zoomed(dispatch);\n      }\n      function ended() {\n        subject.on(mousemove, null).on(mouseup, null);\n        dragRestore(dragged && d3.event.target === target);\n        zoomended(dispatch);\n      }\n    }\n    function touchstarted() {\n      var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = \".zoom-\" + d3.event.changedTouches[0].identifier, touchmove = \"touchmove\" + zoomName, touchend = \"touchend\" + zoomName, targets = [], subject = d3.select(that).on(mousedown, null).on(touchstart, started), dragRestore = d3_event_dragSuppress();\n      d3_selection_interrupt.call(that);\n      started();\n      zoomstarted(dispatch);\n      function relocate() {\n        var touches = d3.touches(that);\n        scale0 = view.k;\n        touches.forEach(function(t) {\n          if (t.identifier in locations0) locations0[t.identifier] = location(t);\n        });\n        return touches;\n      }\n      function started() {\n        var target = d3.event.target;\n        d3.select(target).on(touchmove, moved).on(touchend, ended);\n        targets.push(target);\n        var changed = d3.event.changedTouches;\n        for (var i = 0, n = changed.length; i < n; ++i) {\n          locations0[changed[i].identifier] = null;\n        }\n        var touches = relocate(), now = Date.now();\n        if (touches.length === 1) {\n          if (now - touchtime < 500) {\n            var p = touches[0], l = locations0[p.identifier];\n            scaleTo(view.k * 2);\n            translateTo(p, l);\n            d3_eventPreventDefault();\n            zoomed(dispatch);\n          }\n          touchtime = now;\n        } else if (touches.length > 1) {\n          var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];\n          distance0 = dx * dx + dy * dy;\n        }\n      }\n      function moved() {\n        var touches = d3.touches(that), p0, l0, p1, l1;\n        for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {\n          p1 = touches[i];\n          if (l1 = locations0[p1.identifier]) {\n            if (l0) break;\n            p0 = p1, l0 = l1;\n          }\n        }\n        if (l1) {\n          var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);\n          p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];\n          l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];\n          scaleTo(scale1 * scale0);\n        }\n        touchtime = null;\n        translateTo(p0, l0);\n        zoomed(dispatch);\n      }\n      function ended() {\n        if (d3.event.touches.length) {\n          var changed = d3.event.changedTouches;\n          for (var i = 0, n = changed.length; i < n; ++i) {\n            delete locations0[changed[i].identifier];\n          }\n          for (var identifier in locations0) {\n            return void relocate();\n          }\n        }\n        d3.selectAll(targets).on(zoomName, null);\n        subject.on(mousedown, mousedowned).on(touchstart, touchstarted);\n        dragRestore();\n        zoomended(dispatch);\n      }\n    }\n    function mousewheeled() {\n      var dispatch = event.of(this, arguments);\n      if (mousewheelTimer) clearTimeout(mousewheelTimer); else translate0 = location(center0 = center || d3.mouse(this)), \n      d3_selection_interrupt.call(this), zoomstarted(dispatch);\n      mousewheelTimer = setTimeout(function() {\n        mousewheelTimer = null;\n        zoomended(dispatch);\n      }, 50);\n      d3_eventPreventDefault();\n      scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);\n      translateTo(center0, translate0);\n      zoomed(dispatch);\n    }\n    function dblclicked() {\n      var dispatch = event.of(this, arguments), p = d3.mouse(this), l = location(p), k = Math.log(view.k) / Math.LN2;\n      zoomstarted(dispatch);\n      scaleTo(Math.pow(2, d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1));\n      translateTo(p, l);\n      zoomed(dispatch);\n      zoomended(dispatch);\n    }\n    return d3.rebind(zoom, event, \"on\");\n  };\n  var d3_behavior_zoomInfinity = [ 0, Infinity ];\n  var d3_behavior_zoomDelta, d3_behavior_zoomWheel = \"onwheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n    return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);\n  }, \"wheel\") : \"onmousewheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n    return d3.event.wheelDelta;\n  }, \"mousewheel\") : (d3_behavior_zoomDelta = function() {\n    return -d3.event.detail;\n  }, \"MozMousePixelScroll\");\n  d3.color = d3_color;\n  function d3_color() {}\n  d3_color.prototype.toString = function() {\n    return this.rgb() + \"\";\n  };\n  d3.hsl = d3_hsl;\n  function d3_hsl(h, s, l) {\n    return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse(\"\" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);\n  }\n  var d3_hslPrototype = d3_hsl.prototype = new d3_color();\n  d3_hslPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_hsl(this.h, this.s, this.l / k);\n  };\n  d3_hslPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_hsl(this.h, this.s, k * this.l);\n  };\n  d3_hslPrototype.rgb = function() {\n    return d3_hsl_rgb(this.h, this.s, this.l);\n  };\n  function d3_hsl_rgb(h, s, l) {\n    var m1, m2;\n    h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;\n    s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;\n    l = l < 0 ? 0 : l > 1 ? 1 : l;\n    m2 = l <= .5 ? l * (1 + s) : l + s - l * s;\n    m1 = 2 * l - m2;\n    function v(h) {\n      if (h > 360) h -= 360; else if (h < 0) h += 360;\n      if (h < 60) return m1 + (m2 - m1) * h / 60;\n      if (h < 180) return m2;\n      if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;\n      return m1;\n    }\n    function vv(h) {\n      return Math.round(v(h) * 255);\n    }\n    return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));\n  }\n  d3.hcl = d3_hcl;\n  function d3_hcl(h, c, l) {\n    return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);\n  }\n  var d3_hclPrototype = d3_hcl.prototype = new d3_color();\n  d3_hclPrototype.brighter = function(k) {\n    return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.darker = function(k) {\n    return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.rgb = function() {\n    return d3_hcl_lab(this.h, this.c, this.l).rgb();\n  };\n  function d3_hcl_lab(h, c, l) {\n    if (isNaN(h)) h = 0;\n    if (isNaN(c)) c = 0;\n    return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);\n  }\n  d3.lab = d3_lab;\n  function d3_lab(l, a, b) {\n    return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.l, l.c, l.h) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);\n  }\n  var d3_lab_K = 18;\n  var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;\n  var d3_labPrototype = d3_lab.prototype = new d3_color();\n  d3_labPrototype.brighter = function(k) {\n    return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.darker = function(k) {\n    return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.rgb = function() {\n    return d3_lab_rgb(this.l, this.a, this.b);\n  };\n  function d3_lab_rgb(l, a, b) {\n    var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;\n    x = d3_lab_xyz(x) * d3_lab_X;\n    y = d3_lab_xyz(y) * d3_lab_Y;\n    z = d3_lab_xyz(z) * d3_lab_Z;\n    return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));\n  }\n  function d3_lab_hcl(l, a, b) {\n    return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);\n  }\n  function d3_lab_xyz(x) {\n    return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;\n  }\n  function d3_xyz_lab(x) {\n    return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;\n  }\n  function d3_xyz_rgb(r) {\n    return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));\n  }\n  d3.rgb = d3_rgb;\n  function d3_rgb(r, g, b) {\n    return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse(\"\" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);\n  }\n  function d3_rgbNumber(value) {\n    return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);\n  }\n  function d3_rgbString(value) {\n    return d3_rgbNumber(value) + \"\";\n  }\n  var d3_rgbPrototype = d3_rgb.prototype = new d3_color();\n  d3_rgbPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    var r = this.r, g = this.g, b = this.b, i = 30;\n    if (!r && !g && !b) return new d3_rgb(i, i, i);\n    if (r && r < i) r = i;\n    if (g && g < i) g = i;\n    if (b && b < i) b = i;\n    return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));\n  };\n  d3_rgbPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_rgb(k * this.r, k * this.g, k * this.b);\n  };\n  d3_rgbPrototype.hsl = function() {\n    return d3_rgb_hsl(this.r, this.g, this.b);\n  };\n  d3_rgbPrototype.toString = function() {\n    return \"#\" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);\n  };\n  function d3_rgb_hex(v) {\n    return v < 16 ? \"0\" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);\n  }\n  function d3_rgb_parse(format, rgb, hsl) {\n    var r = 0, g = 0, b = 0, m1, m2, color;\n    m1 = /([a-z]+)\\((.*)\\)/i.exec(format);\n    if (m1) {\n      m2 = m1[2].split(\",\");\n      switch (m1[1]) {\n       case \"hsl\":\n        {\n          return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);\n        }\n\n       case \"rgb\":\n        {\n          return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));\n        }\n      }\n    }\n    if (color = d3_rgb_names.get(format)) return rgb(color.r, color.g, color.b);\n    if (format != null && format.charAt(0) === \"#\" && !isNaN(color = parseInt(format.substring(1), 16))) {\n      if (format.length === 4) {\n        r = (color & 3840) >> 4;\n        r = r >> 4 | r;\n        g = color & 240;\n        g = g >> 4 | g;\n        b = color & 15;\n        b = b << 4 | b;\n      } else if (format.length === 7) {\n        r = (color & 16711680) >> 16;\n        g = (color & 65280) >> 8;\n        b = color & 255;\n      }\n    }\n    return rgb(r, g, b);\n  }\n  function d3_rgb_hsl(r, g, b) {\n    var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;\n    if (d) {\n      s = l < .5 ? d / (max + min) : d / (2 - max - min);\n      if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;\n      h *= 60;\n    } else {\n      h = NaN;\n      s = l > 0 && l < 1 ? 0 : h;\n    }\n    return new d3_hsl(h, s, l);\n  }\n  function d3_rgb_lab(r, g, b) {\n    r = d3_rgb_xyz(r);\n    g = d3_rgb_xyz(g);\n    b = d3_rgb_xyz(b);\n    var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);\n    return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));\n  }\n  function d3_rgb_xyz(r) {\n    return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);\n  }\n  function d3_rgb_parseNumber(c) {\n    var f = parseFloat(c);\n    return c.charAt(c.length - 1) === \"%\" ? Math.round(f * 2.55) : f;\n  }\n  var d3_rgb_names = d3.map({\n    aliceblue: 15792383,\n    antiquewhite: 16444375,\n    aqua: 65535,\n    aquamarine: 8388564,\n    azure: 15794175,\n    beige: 16119260,\n    bisque: 16770244,\n    black: 0,\n    blanchedalmond: 16772045,\n    blue: 255,\n    blueviolet: 9055202,\n    brown: 10824234,\n    burlywood: 14596231,\n    cadetblue: 6266528,\n    chartreuse: 8388352,\n    chocolate: 13789470,\n    coral: 16744272,\n    cornflowerblue: 6591981,\n    cornsilk: 16775388,\n    crimson: 14423100,\n    cyan: 65535,\n    darkblue: 139,\n    darkcyan: 35723,\n    darkgoldenrod: 12092939,\n    darkgray: 11119017,\n    darkgreen: 25600,\n    darkgrey: 11119017,\n    darkkhaki: 12433259,\n    darkmagenta: 9109643,\n    darkolivegreen: 5597999,\n    darkorange: 16747520,\n    darkorchid: 10040012,\n    darkred: 9109504,\n    darksalmon: 15308410,\n    darkseagreen: 9419919,\n    darkslateblue: 4734347,\n    darkslategray: 3100495,\n    darkslategrey: 3100495,\n    darkturquoise: 52945,\n    darkviolet: 9699539,\n    deeppink: 16716947,\n    deepskyblue: 49151,\n    dimgray: 6908265,\n    dimgrey: 6908265,\n    dodgerblue: 2003199,\n    firebrick: 11674146,\n    floralwhite: 16775920,\n    forestgreen: 2263842,\n    fuchsia: 16711935,\n    gainsboro: 14474460,\n    ghostwhite: 16316671,\n    gold: 16766720,\n    goldenrod: 14329120,\n    gray: 8421504,\n    green: 32768,\n    greenyellow: 11403055,\n    grey: 8421504,\n    honeydew: 15794160,\n    hotpink: 16738740,\n    indianred: 13458524,\n    indigo: 4915330,\n    ivory: 16777200,\n    khaki: 15787660,\n    lavender: 15132410,\n    lavenderblush: 16773365,\n    lawngreen: 8190976,\n    lemonchiffon: 16775885,\n    lightblue: 11393254,\n    lightcoral: 15761536,\n    lightcyan: 14745599,\n    lightgoldenrodyellow: 16448210,\n    lightgray: 13882323,\n    lightgreen: 9498256,\n    lightgrey: 13882323,\n    lightpink: 16758465,\n    lightsalmon: 16752762,\n    lightseagreen: 2142890,\n    lightskyblue: 8900346,\n    lightslategray: 7833753,\n    lightslategrey: 7833753,\n    lightsteelblue: 11584734,\n    lightyellow: 16777184,\n    lime: 65280,\n    limegreen: 3329330,\n    linen: 16445670,\n    magenta: 16711935,\n    maroon: 8388608,\n    mediumaquamarine: 6737322,\n    mediumblue: 205,\n    mediumorchid: 12211667,\n    mediumpurple: 9662683,\n    mediumseagreen: 3978097,\n    mediumslateblue: 8087790,\n    mediumspringgreen: 64154,\n    mediumturquoise: 4772300,\n    mediumvioletred: 13047173,\n    midnightblue: 1644912,\n    mintcream: 16121850,\n    mistyrose: 16770273,\n    moccasin: 16770229,\n    navajowhite: 16768685,\n    navy: 128,\n    oldlace: 16643558,\n    olive: 8421376,\n    olivedrab: 7048739,\n    orange: 16753920,\n    orangered: 16729344,\n    orchid: 14315734,\n    palegoldenrod: 15657130,\n    palegreen: 10025880,\n    paleturquoise: 11529966,\n    palevioletred: 14381203,\n    papayawhip: 16773077,\n    peachpuff: 16767673,\n    peru: 13468991,\n    pink: 16761035,\n    plum: 14524637,\n    powderblue: 11591910,\n    purple: 8388736,\n    red: 16711680,\n    rosybrown: 12357519,\n    royalblue: 4286945,\n    saddlebrown: 9127187,\n    salmon: 16416882,\n    sandybrown: 16032864,\n    seagreen: 3050327,\n    seashell: 16774638,\n    sienna: 10506797,\n    silver: 12632256,\n    skyblue: 8900331,\n    slateblue: 6970061,\n    slategray: 7372944,\n    slategrey: 7372944,\n    snow: 16775930,\n    springgreen: 65407,\n    steelblue: 4620980,\n    tan: 13808780,\n    teal: 32896,\n    thistle: 14204888,\n    tomato: 16737095,\n    turquoise: 4251856,\n    violet: 15631086,\n    wheat: 16113331,\n    white: 16777215,\n    whitesmoke: 16119285,\n    yellow: 16776960,\n    yellowgreen: 10145074\n  });\n  d3_rgb_names.forEach(function(key, value) {\n    d3_rgb_names.set(key, d3_rgbNumber(value));\n  });\n  function d3_functor(v) {\n    return typeof v === \"function\" ? v : function() {\n      return v;\n    };\n  }\n  d3.functor = d3_functor;\n  function d3_identity(d) {\n    return d;\n  }\n  d3.xhr = d3_xhrType(d3_identity);\n  function d3_xhrType(response) {\n    return function(url, mimeType, callback) {\n      if (arguments.length === 2 && typeof mimeType === \"function\") callback = mimeType, \n      mimeType = null;\n      return d3_xhr(url, mimeType, response, callback);\n    };\n  }\n  function d3_xhr(url, mimeType, response, callback) {\n    var xhr = {}, dispatch = d3.dispatch(\"beforesend\", \"progress\", \"load\", \"error\"), headers = {}, request = new XMLHttpRequest(), responseType = null;\n    if (d3_window.XDomainRequest && !(\"withCredentials\" in request) && /^(http(s)?:)?\\/\\//.test(url)) request = new XDomainRequest();\n    \"onload\" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {\n      request.readyState > 3 && respond();\n    };\n    function respond() {\n      var status = request.status, result;\n      if (!status && request.responseText || status >= 200 && status < 300 || status === 304) {\n        try {\n          result = response.call(xhr, request);\n        } catch (e) {\n          dispatch.error.call(xhr, e);\n          return;\n        }\n        dispatch.load.call(xhr, result);\n      } else {\n        dispatch.error.call(xhr, request);\n      }\n    }\n    request.onprogress = function(event) {\n      var o = d3.event;\n      d3.event = event;\n      try {\n        dispatch.progress.call(xhr, request);\n      } finally {\n        d3.event = o;\n      }\n    };\n    xhr.header = function(name, value) {\n      name = (name + \"\").toLowerCase();\n      if (arguments.length < 2) return headers[name];\n      if (value == null) delete headers[name]; else headers[name] = value + \"\";\n      return xhr;\n    };\n    xhr.mimeType = function(value) {\n      if (!arguments.length) return mimeType;\n      mimeType = value == null ? null : value + \"\";\n      return xhr;\n    };\n    xhr.responseType = function(value) {\n      if (!arguments.length) return responseType;\n      responseType = value;\n      return xhr;\n    };\n    xhr.response = function(value) {\n      response = value;\n      return xhr;\n    };\n    [ \"get\", \"post\" ].forEach(function(method) {\n      xhr[method] = function() {\n        return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));\n      };\n    });\n    xhr.send = function(method, data, callback) {\n      if (arguments.length === 2 && typeof data === \"function\") callback = data, data = null;\n      request.open(method, url, true);\n      if (mimeType != null && !(\"accept\" in headers)) headers[\"accept\"] = mimeType + \",*/*\";\n      if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);\n      if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);\n      if (responseType != null) request.responseType = responseType;\n      if (callback != null) xhr.on(\"error\", callback).on(\"load\", function(request) {\n        callback(null, request);\n      });\n      dispatch.beforesend.call(xhr, request);\n      request.send(data == null ? null : data);\n      return xhr;\n    };\n    xhr.abort = function() {\n      request.abort();\n      return xhr;\n    };\n    d3.rebind(xhr, dispatch, \"on\");\n    return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));\n  }\n  function d3_xhr_fixCallback(callback) {\n    return callback.length === 1 ? function(error, request) {\n      callback(error == null ? request : null);\n    } : callback;\n  }\n  d3.dsv = function(delimiter, mimeType) {\n    var reFormat = new RegExp('[\"' + delimiter + \"\\n]\"), delimiterCode = delimiter.charCodeAt(0);\n    function dsv(url, row, callback) {\n      if (arguments.length < 3) callback = row, row = null;\n      var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);\n      xhr.row = function(_) {\n        return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;\n      };\n      return xhr;\n    }\n    function response(request) {\n      return dsv.parse(request.responseText);\n    }\n    function typedResponse(f) {\n      return function(request) {\n        return dsv.parse(request.responseText, f);\n      };\n    }\n    dsv.parse = function(text, f) {\n      var o;\n      return dsv.parseRows(text, function(row, i) {\n        if (o) return o(row, i - 1);\n        var a = new Function(\"d\", \"return {\" + row.map(function(name, i) {\n          return JSON.stringify(name) + \": d[\" + i + \"]\";\n        }).join(\",\") + \"}\");\n        o = f ? function(row, i) {\n          return f(a(row), i);\n        } : a;\n      });\n    };\n    dsv.parseRows = function(text, f) {\n      var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;\n      function token() {\n        if (I >= N) return EOF;\n        if (eol) return eol = false, EOL;\n        var j = I;\n        if (text.charCodeAt(j) === 34) {\n          var i = j;\n          while (i++ < N) {\n            if (text.charCodeAt(i) === 34) {\n              if (text.charCodeAt(i + 1) !== 34) break;\n              ++i;\n            }\n          }\n          I = i + 2;\n          var c = text.charCodeAt(i + 1);\n          if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(i + 2) === 10) ++I;\n          } else if (c === 10) {\n            eol = true;\n          }\n          return text.substring(j + 1, i).replace(/\"\"/g, '\"');\n        }\n        while (I < N) {\n          var c = text.charCodeAt(I++), k = 1;\n          if (c === 10) eol = true; else if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(I) === 10) ++I, ++k;\n          } else if (c !== delimiterCode) continue;\n          return text.substring(j, I - k);\n        }\n        return text.substring(j);\n      }\n      while ((t = token()) !== EOF) {\n        var a = [];\n        while (t !== EOL && t !== EOF) {\n          a.push(t);\n          t = token();\n        }\n        if (f && !(a = f(a, n++))) continue;\n        rows.push(a);\n      }\n      return rows;\n    };\n    dsv.format = function(rows) {\n      if (Array.isArray(rows[0])) return dsv.formatRows(rows);\n      var fieldSet = new d3_Set(), fields = [];\n      rows.forEach(function(row) {\n        for (var field in row) {\n          if (!fieldSet.has(field)) {\n            fields.push(fieldSet.add(field));\n          }\n        }\n      });\n      return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {\n        return fields.map(function(field) {\n          return formatValue(row[field]);\n        }).join(delimiter);\n      })).join(\"\\n\");\n    };\n    dsv.formatRows = function(rows) {\n      return rows.map(formatRow).join(\"\\n\");\n    };\n    function formatRow(row) {\n      return row.map(formatValue).join(delimiter);\n    }\n    function formatValue(text) {\n      return reFormat.test(text) ? '\"' + text.replace(/\\\"/g, '\"\"') + '\"' : text;\n    }\n    return dsv;\n  };\n  d3.csv = d3.dsv(\",\", \"text/csv\");\n  d3.tsv = d3.dsv(\"\t\", \"text/tab-separated-values\");\n  d3.touch = function(container, touches, identifier) {\n    if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;\n    if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {\n      if ((touch = touches[i]).identifier === identifier) {\n        return d3_mousePoint(container, touch);\n      }\n    }\n  };\n  var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_active, d3_timer_frame = d3_window[d3_vendorSymbol(d3_window, \"requestAnimationFrame\")] || function(callback) {\n    setTimeout(callback, 17);\n  };\n  d3.timer = function(callback, delay, then) {\n    var n = arguments.length;\n    if (n < 2) delay = 0;\n    if (n < 3) then = Date.now();\n    var time = then + delay, timer = {\n      c: callback,\n      t: time,\n      f: false,\n      n: null\n    };\n    if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;\n    d3_timer_queueTail = timer;\n    if (!d3_timer_interval) {\n      d3_timer_timeout = clearTimeout(d3_timer_timeout);\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n  };\n  function d3_timer_step() {\n    var now = d3_timer_mark(), delay = d3_timer_sweep() - now;\n    if (delay > 24) {\n      if (isFinite(delay)) {\n        clearTimeout(d3_timer_timeout);\n        d3_timer_timeout = setTimeout(d3_timer_step, delay);\n      }\n      d3_timer_interval = 0;\n    } else {\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n  }\n  d3.timer.flush = function() {\n    d3_timer_mark();\n    d3_timer_sweep();\n  };\n  function d3_timer_mark() {\n    var now = Date.now();\n    d3_timer_active = d3_timer_queueHead;\n    while (d3_timer_active) {\n      if (now >= d3_timer_active.t) d3_timer_active.f = d3_timer_active.c(now - d3_timer_active.t);\n      d3_timer_active = d3_timer_active.n;\n    }\n    return now;\n  }\n  function d3_timer_sweep() {\n    var t0, t1 = d3_timer_queueHead, time = Infinity;\n    while (t1) {\n      if (t1.f) {\n        t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;\n      } else {\n        if (t1.t < time) time = t1.t;\n        t1 = (t0 = t1).n;\n      }\n    }\n    d3_timer_queueTail = t0;\n    return time;\n  }\n  function d3_format_precision(x, p) {\n    return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);\n  }\n  d3.round = function(x, n) {\n    return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);\n  };\n  var d3_formatPrefixes = [ \"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\" ].map(d3_formatPrefix);\n  d3.formatPrefix = function(value, precision) {\n    var i = 0;\n    if (value) {\n      if (value < 0) value *= -1;\n      if (precision) value = d3.round(value, d3_format_precision(value, precision));\n      i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);\n      i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));\n    }\n    return d3_formatPrefixes[8 + i / 3];\n  };\n  function d3_formatPrefix(d, i) {\n    var k = Math.pow(10, abs(8 - i) * 3);\n    return {\n      scale: i > 8 ? function(d) {\n        return d / k;\n      } : function(d) {\n        return d * k;\n      },\n      symbol: d\n    };\n  }\n  function d3_locale_numberFormat(locale) {\n    var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping ? function(value) {\n      var i = value.length, t = [], j = 0, g = locale_grouping[0];\n      while (i > 0 && g > 0) {\n        t.push(value.substring(i -= g, i + g));\n        g = locale_grouping[j = (j + 1) % locale_grouping.length];\n      }\n      return t.reverse().join(locale_thousands);\n    } : d3_identity;\n    return function(specifier) {\n      var match = d3_format_re.exec(specifier), fill = match[1] || \" \", align = match[2] || \">\", sign = match[3] || \"\", symbol = match[4] || \"\", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = \"\", suffix = \"\", integer = false;\n      if (precision) precision = +precision.substring(1);\n      if (zfill || fill === \"0\" && align === \"=\") {\n        zfill = fill = \"0\";\n        align = \"=\";\n        if (comma) width -= Math.floor((width - 1) / 4);\n      }\n      switch (type) {\n       case \"n\":\n        comma = true;\n        type = \"g\";\n        break;\n\n       case \"%\":\n        scale = 100;\n        suffix = \"%\";\n        type = \"f\";\n        break;\n\n       case \"p\":\n        scale = 100;\n        suffix = \"%\";\n        type = \"r\";\n        break;\n\n       case \"b\":\n       case \"o\":\n       case \"x\":\n       case \"X\":\n        if (symbol === \"#\") prefix = \"0\" + type.toLowerCase();\n\n       case \"c\":\n       case \"d\":\n        integer = true;\n        precision = 0;\n        break;\n\n       case \"s\":\n        scale = -1;\n        type = \"r\";\n        break;\n      }\n      if (symbol === \"$\") prefix = locale_currency[0], suffix = locale_currency[1];\n      if (type == \"r\" && !precision) type = \"g\";\n      if (precision != null) {\n        if (type == \"g\") precision = Math.max(1, Math.min(21, precision)); else if (type == \"e\" || type == \"f\") precision = Math.max(0, Math.min(20, precision));\n      }\n      type = d3_format_types.get(type) || d3_format_typeDefault;\n      var zcomma = zfill && comma;\n      return function(value) {\n        var fullSuffix = suffix;\n        if (integer && value % 1) return \"\";\n        var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, \"-\") : sign;\n        if (scale < 0) {\n          var unit = d3.formatPrefix(value, precision);\n          value = unit.scale(value);\n          fullSuffix = unit.symbol + suffix;\n        } else {\n          value *= scale;\n        }\n        value = type(value, precision);\n        var i = value.lastIndexOf(\".\"), before = i < 0 ? value : value.substring(0, i), after = i < 0 ? \"\" : locale_decimal + value.substring(i + 1);\n        if (!zfill && comma) before = formatGroup(before);\n        var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : \"\";\n        if (zcomma) before = formatGroup(padding + before);\n        negative += prefix;\n        value = before + after;\n        return (align === \"<\" ? negative + value + padding : align === \">\" ? padding + negative + value : align === \"^\" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;\n      };\n    };\n  }\n  var d3_format_re = /(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i;\n  var d3_format_types = d3.map({\n    b: function(x) {\n      return x.toString(2);\n    },\n    c: function(x) {\n      return String.fromCharCode(x);\n    },\n    o: function(x) {\n      return x.toString(8);\n    },\n    x: function(x) {\n      return x.toString(16);\n    },\n    X: function(x) {\n      return x.toString(16).toUpperCase();\n    },\n    g: function(x, p) {\n      return x.toPrecision(p);\n    },\n    e: function(x, p) {\n      return x.toExponential(p);\n    },\n    f: function(x, p) {\n      return x.toFixed(p);\n    },\n    r: function(x, p) {\n      return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));\n    }\n  });\n  function d3_format_typeDefault(x) {\n    return x + \"\";\n  }\n  var d3_time = d3.time = {}, d3_date = Date;\n  function d3_date_utc() {\n    this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);\n  }\n  d3_date_utc.prototype = {\n    getDate: function() {\n      return this._.getUTCDate();\n    },\n    getDay: function() {\n      return this._.getUTCDay();\n    },\n    getFullYear: function() {\n      return this._.getUTCFullYear();\n    },\n    getHours: function() {\n      return this._.getUTCHours();\n    },\n    getMilliseconds: function() {\n      return this._.getUTCMilliseconds();\n    },\n    getMinutes: function() {\n      return this._.getUTCMinutes();\n    },\n    getMonth: function() {\n      return this._.getUTCMonth();\n    },\n    getSeconds: function() {\n      return this._.getUTCSeconds();\n    },\n    getTime: function() {\n      return this._.getTime();\n    },\n    getTimezoneOffset: function() {\n      return 0;\n    },\n    valueOf: function() {\n      return this._.valueOf();\n    },\n    setDate: function() {\n      d3_time_prototype.setUTCDate.apply(this._, arguments);\n    },\n    setDay: function() {\n      d3_time_prototype.setUTCDay.apply(this._, arguments);\n    },\n    setFullYear: function() {\n      d3_time_prototype.setUTCFullYear.apply(this._, arguments);\n    },\n    setHours: function() {\n      d3_time_prototype.setUTCHours.apply(this._, arguments);\n    },\n    setMilliseconds: function() {\n      d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);\n    },\n    setMinutes: function() {\n      d3_time_prototype.setUTCMinutes.apply(this._, arguments);\n    },\n    setMonth: function() {\n      d3_time_prototype.setUTCMonth.apply(this._, arguments);\n    },\n    setSeconds: function() {\n      d3_time_prototype.setUTCSeconds.apply(this._, arguments);\n    },\n    setTime: function() {\n      d3_time_prototype.setTime.apply(this._, arguments);\n    }\n  };\n  var d3_time_prototype = Date.prototype;\n  function d3_time_interval(local, step, number) {\n    function round(date) {\n      var d0 = local(date), d1 = offset(d0, 1);\n      return date - d0 < d1 - date ? d0 : d1;\n    }\n    function ceil(date) {\n      step(date = local(new d3_date(date - 1)), 1);\n      return date;\n    }\n    function offset(date, k) {\n      step(date = new d3_date(+date), k);\n      return date;\n    }\n    function range(t0, t1, dt) {\n      var time = ceil(t0), times = [];\n      if (dt > 1) {\n        while (time < t1) {\n          if (!(number(time) % dt)) times.push(new Date(+time));\n          step(time, 1);\n        }\n      } else {\n        while (time < t1) times.push(new Date(+time)), step(time, 1);\n      }\n      return times;\n    }\n    function range_utc(t0, t1, dt) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = t0;\n        return range(utc, t1, dt);\n      } finally {\n        d3_date = Date;\n      }\n    }\n    local.floor = local;\n    local.round = round;\n    local.ceil = ceil;\n    local.offset = offset;\n    local.range = range;\n    var utc = local.utc = d3_time_interval_utc(local);\n    utc.floor = utc;\n    utc.round = d3_time_interval_utc(round);\n    utc.ceil = d3_time_interval_utc(ceil);\n    utc.offset = d3_time_interval_utc(offset);\n    utc.range = range_utc;\n    return local;\n  }\n  function d3_time_interval_utc(method) {\n    return function(date, k) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = date;\n        return method(utc, k)._;\n      } finally {\n        d3_date = Date;\n      }\n    };\n  }\n  d3_time.year = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setMonth(0, 1);\n    return date;\n  }, function(date, offset) {\n    date.setFullYear(date.getFullYear() + offset);\n  }, function(date) {\n    return date.getFullYear();\n  });\n  d3_time.years = d3_time.year.range;\n  d3_time.years.utc = d3_time.year.utc.range;\n  d3_time.day = d3_time_interval(function(date) {\n    var day = new d3_date(2e3, 0);\n    day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n    return day;\n  }, function(date, offset) {\n    date.setDate(date.getDate() + offset);\n  }, function(date) {\n    return date.getDate() - 1;\n  });\n  d3_time.days = d3_time.day.range;\n  d3_time.days.utc = d3_time.day.utc.range;\n  d3_time.dayOfYear = function(date) {\n    var year = d3_time.year(date);\n    return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);\n  };\n  [ \"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\" ].forEach(function(day, i) {\n    i = 7 - i;\n    var interval = d3_time[day] = d3_time_interval(function(date) {\n      (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);\n      return date;\n    }, function(date, offset) {\n      date.setDate(date.getDate() + Math.floor(offset) * 7);\n    }, function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);\n    });\n    d3_time[day + \"s\"] = interval.range;\n    d3_time[day + \"s\"].utc = interval.utc.range;\n    d3_time[day + \"OfYear\"] = function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);\n    };\n  });\n  d3_time.week = d3_time.sunday;\n  d3_time.weeks = d3_time.sunday.range;\n  d3_time.weeks.utc = d3_time.sunday.utc.range;\n  d3_time.weekOfYear = d3_time.sundayOfYear;\n  function d3_locale_timeFormat(locale) {\n    var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;\n    function d3_time_format(template) {\n      var n = template.length;\n      function format(date) {\n        var string = [], i = -1, j = 0, c, p, f;\n        while (++i < n) {\n          if (template.charCodeAt(i) === 37) {\n            string.push(template.substring(j, i));\n            if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);\n            if (f = d3_time_formats[c]) c = f(date, p == null ? c === \"e\" ? \" \" : \"0\" : p);\n            string.push(c);\n            j = i + 1;\n          }\n        }\n        string.push(template.substring(j, i));\n        return string.join(\"\");\n      }\n      format.parse = function(string) {\n        var d = {\n          y: 1900,\n          m: 0,\n          d: 1,\n          H: 0,\n          M: 0,\n          S: 0,\n          L: 0,\n          Z: null\n        }, i = d3_time_parse(d, template, string, 0);\n        if (i != string.length) return null;\n        if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n        var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();\n        if (\"j\" in d) date.setFullYear(d.y, 0, d.j); else if (\"w\" in d && (\"W\" in d || \"U\" in d)) {\n          date.setFullYear(d.y, 0, 1);\n          date.setFullYear(d.y, 0, \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);\n        } else date.setFullYear(d.y, d.m, d.d);\n        date.setHours(d.H + Math.floor(d.Z / 100), d.M + d.Z % 100, d.S, d.L);\n        return localZ ? date._ : date;\n      };\n      format.toString = function() {\n        return template;\n      };\n      return format;\n    }\n    function d3_time_parse(date, template, string, j) {\n      var c, p, t, i = 0, n = template.length, m = string.length;\n      while (i < n) {\n        if (j >= m) return -1;\n        c = template.charCodeAt(i++);\n        if (c === 37) {\n          t = template.charAt(i++);\n          p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];\n          if (!p || (j = p(date, string, j)) < 0) return -1;\n        } else if (c != string.charCodeAt(j++)) {\n          return -1;\n        }\n      }\n      return j;\n    }\n    d3_time_format.utc = function(template) {\n      var local = d3_time_format(template);\n      function format(date) {\n        try {\n          d3_date = d3_date_utc;\n          var utc = new d3_date();\n          utc._ = date;\n          return local(utc);\n        } finally {\n          d3_date = Date;\n        }\n      }\n      format.parse = function(string) {\n        try {\n          d3_date = d3_date_utc;\n          var date = local.parse(string);\n          return date && date._;\n        } finally {\n          d3_date = Date;\n        }\n      };\n      format.toString = local.toString;\n      return format;\n    };\n    d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;\n    var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);\n    locale_periods.forEach(function(p, i) {\n      d3_time_periodLookup.set(p.toLowerCase(), i);\n    });\n    var d3_time_formats = {\n      a: function(d) {\n        return locale_shortDays[d.getDay()];\n      },\n      A: function(d) {\n        return locale_days[d.getDay()];\n      },\n      b: function(d) {\n        return locale_shortMonths[d.getMonth()];\n      },\n      B: function(d) {\n        return locale_months[d.getMonth()];\n      },\n      c: d3_time_format(locale_dateTime),\n      d: function(d, p) {\n        return d3_time_formatPad(d.getDate(), p, 2);\n      },\n      e: function(d, p) {\n        return d3_time_formatPad(d.getDate(), p, 2);\n      },\n      H: function(d, p) {\n        return d3_time_formatPad(d.getHours(), p, 2);\n      },\n      I: function(d, p) {\n        return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);\n      },\n      j: function(d, p) {\n        return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);\n      },\n      L: function(d, p) {\n        return d3_time_formatPad(d.getMilliseconds(), p, 3);\n      },\n      m: function(d, p) {\n        return d3_time_formatPad(d.getMonth() + 1, p, 2);\n      },\n      M: function(d, p) {\n        return d3_time_formatPad(d.getMinutes(), p, 2);\n      },\n      p: function(d) {\n        return locale_periods[+(d.getHours() >= 12)];\n      },\n      S: function(d, p) {\n        return d3_time_formatPad(d.getSeconds(), p, 2);\n      },\n      U: function(d, p) {\n        return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);\n      },\n      w: function(d) {\n        return d.getDay();\n      },\n      W: function(d, p) {\n        return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);\n      },\n      x: d3_time_format(locale_date),\n      X: d3_time_format(locale_time),\n      y: function(d, p) {\n        return d3_time_formatPad(d.getFullYear() % 100, p, 2);\n      },\n      Y: function(d, p) {\n        return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);\n      },\n      Z: d3_time_zone,\n      \"%\": function() {\n        return \"%\";\n      }\n    };\n    var d3_time_parsers = {\n      a: d3_time_parseWeekdayAbbrev,\n      A: d3_time_parseWeekday,\n      b: d3_time_parseMonthAbbrev,\n      B: d3_time_parseMonth,\n      c: d3_time_parseLocaleFull,\n      d: d3_time_parseDay,\n      e: d3_time_parseDay,\n      H: d3_time_parseHour24,\n      I: d3_time_parseHour24,\n      j: d3_time_parseDayOfYear,\n      L: d3_time_parseMilliseconds,\n      m: d3_time_parseMonthNumber,\n      M: d3_time_parseMinutes,\n      p: d3_time_parseAmPm,\n      S: d3_time_parseSeconds,\n      U: d3_time_parseWeekNumberSunday,\n      w: d3_time_parseWeekdayNumber,\n      W: d3_time_parseWeekNumberMonday,\n      x: d3_time_parseLocaleDate,\n      X: d3_time_parseLocaleTime,\n      y: d3_time_parseYear,\n      Y: d3_time_parseFullYear,\n      Z: d3_time_parseZone,\n      \"%\": d3_time_parseLiteralPercent\n    };\n    function d3_time_parseWeekdayAbbrev(date, string, i) {\n      d3_time_dayAbbrevRe.lastIndex = 0;\n      var n = d3_time_dayAbbrevRe.exec(string.substring(i));\n      return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseWeekday(date, string, i) {\n      d3_time_dayRe.lastIndex = 0;\n      var n = d3_time_dayRe.exec(string.substring(i));\n      return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseMonthAbbrev(date, string, i) {\n      d3_time_monthAbbrevRe.lastIndex = 0;\n      var n = d3_time_monthAbbrevRe.exec(string.substring(i));\n      return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseMonth(date, string, i) {\n      d3_time_monthRe.lastIndex = 0;\n      var n = d3_time_monthRe.exec(string.substring(i));\n      return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseLocaleFull(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.c.toString(), string, i);\n    }\n    function d3_time_parseLocaleDate(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.x.toString(), string, i);\n    }\n    function d3_time_parseLocaleTime(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.X.toString(), string, i);\n    }\n    function d3_time_parseAmPm(date, string, i) {\n      var n = d3_time_periodLookup.get(string.substring(i, i += 2).toLowerCase());\n      return n == null ? -1 : (date.p = n, i);\n    }\n    return d3_time_format;\n  }\n  var d3_time_formatPads = {\n    \"-\": \"\",\n    _: \" \",\n    \"0\": \"0\"\n  }, d3_time_numberRe = /^\\s*\\d+/, d3_time_percentRe = /^%/;\n  function d3_time_formatPad(value, fill, width) {\n    var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n    return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n  }\n  function d3_time_formatRe(names) {\n    return new RegExp(\"^(?:\" + names.map(d3.requote).join(\"|\") + \")\", \"i\");\n  }\n  function d3_time_formatLookup(names) {\n    var map = new d3_Map(), i = -1, n = names.length;\n    while (++i < n) map.set(names[i].toLowerCase(), i);\n    return map;\n  }\n  function d3_time_parseWeekdayNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 1));\n    return n ? (date.w = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberSunday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i));\n    return n ? (date.U = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberMonday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i));\n    return n ? (date.W = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseFullYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 4));\n    return n ? (date.y = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;\n  }\n  function d3_time_parseZone(date, string, i) {\n    return /^[+-]\\d{4}$/.test(string = string.substring(i, i + 5)) ? (date.Z = -string, \n    i + 5) : -1;\n  }\n  function d3_time_expandYear(d) {\n    return d + (d > 68 ? 1900 : 2e3);\n  }\n  function d3_time_parseMonthNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.m = n[0] - 1, i + n[0].length) : -1;\n  }\n  function d3_time_parseDay(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.d = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseDayOfYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 3));\n    return n ? (date.j = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseHour24(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.H = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMinutes(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.M = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseSeconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.S = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMilliseconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 3));\n    return n ? (date.L = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_zone(d) {\n    var z = d.getTimezoneOffset(), zs = z > 0 ? \"-\" : \"+\", zh = ~~(abs(z) / 60), zm = abs(z) % 60;\n    return zs + d3_time_formatPad(zh, \"0\", 2) + d3_time_formatPad(zm, \"0\", 2);\n  }\n  function d3_time_parseLiteralPercent(date, string, i) {\n    d3_time_percentRe.lastIndex = 0;\n    var n = d3_time_percentRe.exec(string.substring(i, i + 1));\n    return n ? i + n[0].length : -1;\n  }\n  function d3_time_formatMulti(formats) {\n    var n = formats.length, i = -1;\n    while (++i < n) formats[i][0] = this(formats[i][0]);\n    return function(date) {\n      var i = 0, f = formats[i];\n      while (!f[1](date)) f = formats[++i];\n      return f[0](date);\n    };\n  }\n  d3.locale = function(locale) {\n    return {\n      numberFormat: d3_locale_numberFormat(locale),\n      timeFormat: d3_locale_timeFormat(locale)\n    };\n  };\n  var d3_locale_enUS = d3.locale({\n    decimal: \".\",\n    thousands: \",\",\n    grouping: [ 3 ],\n    currency: [ \"$\", \"\" ],\n    dateTime: \"%a %b %e %X %Y\",\n    date: \"%m/%d/%Y\",\n    time: \"%H:%M:%S\",\n    periods: [ \"AM\", \"PM\" ],\n    days: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ],\n    shortDays: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ],\n    months: [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\" ],\n    shortMonths: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n  });\n  d3.format = d3_locale_enUS.numberFormat;\n  d3.geo = {};\n  function d3_adder() {}\n  d3_adder.prototype = {\n    s: 0,\n    t: 0,\n    add: function(y) {\n      d3_adderSum(y, this.t, d3_adderTemp);\n      d3_adderSum(d3_adderTemp.s, this.s, this);\n      if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;\n    },\n    reset: function() {\n      this.s = this.t = 0;\n    },\n    valueOf: function() {\n      return this.s;\n    }\n  };\n  var d3_adderTemp = new d3_adder();\n  function d3_adderSum(a, b, o) {\n    var x = o.s = a + b, bv = x - a, av = x - bv;\n    o.t = a - av + (b - bv);\n  }\n  d3.geo.stream = function(object, listener) {\n    if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {\n      d3_geo_streamObjectType[object.type](object, listener);\n    } else {\n      d3_geo_streamGeometry(object, listener);\n    }\n  };\n  function d3_geo_streamGeometry(geometry, listener) {\n    if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {\n      d3_geo_streamGeometryType[geometry.type](geometry, listener);\n    }\n  }\n  var d3_geo_streamObjectType = {\n    Feature: function(feature, listener) {\n      d3_geo_streamGeometry(feature.geometry, listener);\n    },\n    FeatureCollection: function(object, listener) {\n      var features = object.features, i = -1, n = features.length;\n      while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);\n    }\n  };\n  var d3_geo_streamGeometryType = {\n    Sphere: function(object, listener) {\n      listener.sphere();\n    },\n    Point: function(object, listener) {\n      object = object.coordinates;\n      listener.point(object[0], object[1], object[2]);\n    },\n    MultiPoint: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);\n    },\n    LineString: function(object, listener) {\n      d3_geo_streamLine(object.coordinates, listener, 0);\n    },\n    MultiLineString: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);\n    },\n    Polygon: function(object, listener) {\n      d3_geo_streamPolygon(object.coordinates, listener);\n    },\n    MultiPolygon: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);\n    },\n    GeometryCollection: function(object, listener) {\n      var geometries = object.geometries, i = -1, n = geometries.length;\n      while (++i < n) d3_geo_streamGeometry(geometries[i], listener);\n    }\n  };\n  function d3_geo_streamLine(coordinates, listener, closed) {\n    var i = -1, n = coordinates.length - closed, coordinate;\n    listener.lineStart();\n    while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);\n    listener.lineEnd();\n  }\n  function d3_geo_streamPolygon(coordinates, listener) {\n    var i = -1, n = coordinates.length;\n    listener.polygonStart();\n    while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);\n    listener.polygonEnd();\n  }\n  d3.geo.area = function(object) {\n    d3_geo_areaSum = 0;\n    d3.geo.stream(object, d3_geo_area);\n    return d3_geo_areaSum;\n  };\n  var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();\n  var d3_geo_area = {\n    sphere: function() {\n      d3_geo_areaSum += 4 * π;\n    },\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_areaRingSum.reset();\n      d3_geo_area.lineStart = d3_geo_areaRingStart;\n    },\n    polygonEnd: function() {\n      var area = 2 * d3_geo_areaRingSum;\n      d3_geo_areaSum += area < 0 ? 4 * π + area : area;\n      d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;\n    }\n  };\n  function d3_geo_areaRingStart() {\n    var λ00, φ00, λ0, cosφ0, sinφ0;\n    d3_geo_area.point = function(λ, φ) {\n      d3_geo_area.point = nextPoint;\n      λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), \n      sinφ0 = Math.sin(φ);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      φ = φ * d3_radians / 2 + π / 4;\n      var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);\n      d3_geo_areaRingSum.add(Math.atan2(v, u));\n      λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;\n    }\n    d3_geo_area.lineEnd = function() {\n      nextPoint(λ00, φ00);\n    };\n  }\n  function d3_geo_cartesian(spherical) {\n    var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);\n    return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];\n  }\n  function d3_geo_cartesianDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n  }\n  function d3_geo_cartesianCross(a, b) {\n    return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];\n  }\n  function d3_geo_cartesianAdd(a, b) {\n    a[0] += b[0];\n    a[1] += b[1];\n    a[2] += b[2];\n  }\n  function d3_geo_cartesianScale(vector, k) {\n    return [ vector[0] * k, vector[1] * k, vector[2] * k ];\n  }\n  function d3_geo_cartesianNormalize(d) {\n    var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n    d[0] /= l;\n    d[1] /= l;\n    d[2] /= l;\n  }\n  function d3_geo_spherical(cartesian) {\n    return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];\n  }\n  function d3_geo_sphericalEqual(a, b) {\n    return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;\n  }\n  d3.geo.bounds = function() {\n    var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;\n    var bound = {\n      point: point,\n      lineStart: lineStart,\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        bound.point = ringPoint;\n        bound.lineStart = ringStart;\n        bound.lineEnd = ringEnd;\n        dλSum = 0;\n        d3_geo_area.polygonStart();\n      },\n      polygonEnd: function() {\n        d3_geo_area.polygonEnd();\n        bound.point = point;\n        bound.lineStart = lineStart;\n        bound.lineEnd = lineEnd;\n        if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;\n        range[0] = λ0, range[1] = λ1;\n      }\n    };\n    function point(λ, φ) {\n      ranges.push(range = [ λ0 = λ, λ1 = λ ]);\n      if (φ < φ0) φ0 = φ;\n      if (φ > φ1) φ1 = φ;\n    }\n    function linePoint(λ, φ) {\n      var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);\n      if (p0) {\n        var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);\n        d3_geo_cartesianNormalize(inflection);\n        inflection = d3_geo_spherical(inflection);\n        var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;\n        if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = inflection[1] * d3_degrees;\n          if (φi > φ1) φ1 = φi;\n        } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = -inflection[1] * d3_degrees;\n          if (φi < φ0) φ0 = φi;\n        } else {\n          if (φ < φ0) φ0 = φ;\n          if (φ > φ1) φ1 = φ;\n        }\n        if (antimeridian) {\n          if (λ < λ_) {\n            if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n          } else {\n            if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n          }\n        } else {\n          if (λ1 >= λ0) {\n            if (λ < λ0) λ0 = λ;\n            if (λ > λ1) λ1 = λ;\n          } else {\n            if (λ > λ_) {\n              if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n            } else {\n              if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n            }\n          }\n        }\n      } else {\n        point(λ, φ);\n      }\n      p0 = p, λ_ = λ;\n    }\n    function lineStart() {\n      bound.point = linePoint;\n    }\n    function lineEnd() {\n      range[0] = λ0, range[1] = λ1;\n      bound.point = point;\n      p0 = null;\n    }\n    function ringPoint(λ, φ) {\n      if (p0) {\n        var dλ = λ - λ_;\n        dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;\n      } else λ__ = λ, φ__ = φ;\n      d3_geo_area.point(λ, φ);\n      linePoint(λ, φ);\n    }\n    function ringStart() {\n      d3_geo_area.lineStart();\n    }\n    function ringEnd() {\n      ringPoint(λ__, φ__);\n      d3_geo_area.lineEnd();\n      if (abs(dλSum) > ε) λ0 = -(λ1 = 180);\n      range[0] = λ0, range[1] = λ1;\n      p0 = null;\n    }\n    function angle(λ0, λ1) {\n      return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;\n    }\n    function compareRanges(a, b) {\n      return a[0] - b[0];\n    }\n    function withinRange(x, range) {\n      return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n    }\n    return function(feature) {\n      φ1 = λ1 = -(λ0 = φ0 = Infinity);\n      ranges = [];\n      d3.geo.stream(feature, bound);\n      var n = ranges.length;\n      if (n) {\n        ranges.sort(compareRanges);\n        for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {\n          b = ranges[i];\n          if (withinRange(b[0], a) || withinRange(b[1], a)) {\n            if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n            if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n          } else {\n            merged.push(a = b);\n          }\n        }\n        var best = -Infinity, dλ;\n        for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {\n          b = merged[i];\n          if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];\n        }\n      }\n      ranges = range = null;\n      return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];\n    };\n  }();\n  d3.geo.centroid = function(object) {\n    d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n    d3.geo.stream(object, d3_geo_centroid);\n    var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;\n    if (m < ε2) {\n      x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;\n      if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;\n      m = x * x + y * y + z * z;\n      if (m < ε2) return [ NaN, NaN ];\n    }\n    return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];\n  };\n  var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;\n  var d3_geo_centroid = {\n    sphere: d3_noop,\n    point: d3_geo_centroidPoint,\n    lineStart: d3_geo_centroidLineStart,\n    lineEnd: d3_geo_centroidLineEnd,\n    polygonStart: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidLineStart;\n    }\n  };\n  function d3_geo_centroidPoint(λ, φ) {\n    λ *= d3_radians;\n    var cosφ = Math.cos(φ *= d3_radians);\n    d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));\n  }\n  function d3_geo_centroidPointXYZ(x, y, z) {\n    ++d3_geo_centroidW0;\n    d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;\n    d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;\n    d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;\n  }\n  function d3_geo_centroidLineStart() {\n    var x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroid.point = nextPoint;\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_geo_centroidLineEnd() {\n    d3_geo_centroid.point = d3_geo_centroidPoint;\n  }\n  function d3_geo_centroidRingStart() {\n    var λ00, φ00, x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ00 = λ, φ00 = φ;\n      d3_geo_centroid.point = nextPoint;\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    d3_geo_centroid.lineEnd = function() {\n      nextPoint(λ00, φ00);\n      d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;\n      d3_geo_centroid.point = d3_geo_centroidPoint;\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);\n      d3_geo_centroidX2 += v * cx;\n      d3_geo_centroidY2 += v * cy;\n      d3_geo_centroidZ2 += v * cz;\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_true() {\n    return true;\n  }\n  function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {\n    var subject = [], clip = [];\n    segments.forEach(function(segment) {\n      if ((n = segment.length - 1) <= 0) return;\n      var n, p0 = segment[0], p1 = segment[n];\n      if (d3_geo_sphericalEqual(p0, p1)) {\n        listener.lineStart();\n        for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);\n        listener.lineEnd();\n        return;\n      }\n      var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n      a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);\n      b = new d3_geo_clipPolygonIntersection(p1, null, a, true);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n    });\n    clip.sort(compare);\n    d3_geo_clipPolygonLinkCircular(subject);\n    d3_geo_clipPolygonLinkCircular(clip);\n    if (!subject.length) return;\n    for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {\n      clip[i].e = entry = !entry;\n    }\n    var start = subject[0], points, point;\n    while (1) {\n      var current = start, isSubject = true;\n      while (current.v) if ((current = current.n) === start) return;\n      points = current.z;\n      listener.lineStart();\n      do {\n        current.v = current.o.v = true;\n        if (current.e) {\n          if (isSubject) {\n            for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.n.x, 1, listener);\n          }\n          current = current.n;\n        } else {\n          if (isSubject) {\n            points = current.p.z;\n            for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.p.x, -1, listener);\n          }\n          current = current.p;\n        }\n        current = current.o;\n        points = current.z;\n        isSubject = !isSubject;\n      } while (!current.v);\n      listener.lineEnd();\n    }\n  }\n  function d3_geo_clipPolygonLinkCircular(array) {\n    if (!(n = array.length)) return;\n    var n, i = 0, a = array[0], b;\n    while (++i < n) {\n      a.n = b = array[i];\n      b.p = a;\n      a = b;\n    }\n    a.n = b = array[0];\n    b.p = a;\n  }\n  function d3_geo_clipPolygonIntersection(point, points, other, entry) {\n    this.x = point;\n    this.z = points;\n    this.o = other;\n    this.e = entry;\n    this.v = false;\n    this.n = this.p = null;\n  }\n  function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {\n    return function(rotate, listener) {\n      var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          clip.point = pointRing;\n          clip.lineStart = ringStart;\n          clip.lineEnd = ringEnd;\n          segments = [];\n          polygon = [];\n        },\n        polygonEnd: function() {\n          clip.point = point;\n          clip.lineStart = lineStart;\n          clip.lineEnd = lineEnd;\n          segments = d3.merge(segments);\n          var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);\n          if (segments.length) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);\n          } else if (clipStartInside) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            listener.lineStart();\n            interpolate(null, null, 1, listener);\n            listener.lineEnd();\n          }\n          if (polygonStarted) listener.polygonEnd(), polygonStarted = false;\n          segments = polygon = null;\n        },\n        sphere: function() {\n          listener.polygonStart();\n          listener.lineStart();\n          interpolate(null, null, 1, listener);\n          listener.lineEnd();\n          listener.polygonEnd();\n        }\n      };\n      function point(λ, φ) {\n        var point = rotate(λ, φ);\n        if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);\n      }\n      function pointLine(λ, φ) {\n        var point = rotate(λ, φ);\n        line.point(point[0], point[1]);\n      }\n      function lineStart() {\n        clip.point = pointLine;\n        line.lineStart();\n      }\n      function lineEnd() {\n        clip.point = point;\n        line.lineEnd();\n      }\n      var segments;\n      var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;\n      function pointRing(λ, φ) {\n        ring.push([ λ, φ ]);\n        var point = rotate(λ, φ);\n        ringListener.point(point[0], point[1]);\n      }\n      function ringStart() {\n        ringListener.lineStart();\n        ring = [];\n      }\n      function ringEnd() {\n        pointRing(ring[0][0], ring[0][1]);\n        ringListener.lineEnd();\n        var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;\n        ring.pop();\n        polygon.push(ring);\n        ring = null;\n        if (!n) return;\n        if (clean & 1) {\n          segment = ringSegments[0];\n          var n = segment.length - 1, i = -1, point;\n          if (n > 0) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            listener.lineStart();\n            while (++i < n) listener.point((point = segment[i])[0], point[1]);\n            listener.lineEnd();\n          }\n          return;\n        }\n        if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n        segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));\n      }\n      return clip;\n    };\n  }\n  function d3_geo_clipSegmentLength1(segment) {\n    return segment.length > 1;\n  }\n  function d3_geo_clipBufferListener() {\n    var lines = [], line;\n    return {\n      lineStart: function() {\n        lines.push(line = []);\n      },\n      point: function(λ, φ) {\n        line.push([ λ, φ ]);\n      },\n      lineEnd: d3_noop,\n      buffer: function() {\n        var buffer = lines;\n        lines = [];\n        line = null;\n        return buffer;\n      },\n      rejoin: function() {\n        if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n      }\n    };\n  }\n  function d3_geo_clipSort(a, b) {\n    return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);\n  }\n  function d3_geo_pointInPolygon(point, polygon) {\n    var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;\n    d3_geo_areaRingSum.reset();\n    for (var i = 0, n = polygon.length; i < n; ++i) {\n      var ring = polygon[i], m = ring.length;\n      if (!m) continue;\n      var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;\n      while (true) {\n        if (j === m) j = 0;\n        point = ring[j];\n        var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;\n        d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));\n        polarAngle += antimeridian ? dλ + sdλ * τ : dλ;\n        if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {\n          var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));\n          d3_geo_cartesianNormalize(arc);\n          var intersection = d3_geo_cartesianCross(meridianNormal, arc);\n          d3_geo_cartesianNormalize(intersection);\n          var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);\n          if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {\n            winding += antimeridian ^ dλ >= 0 ? 1 : -1;\n          }\n        }\n        if (!j++) break;\n        λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;\n      }\n    }\n    return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < 0) ^ winding & 1;\n  }\n  var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);\n  function d3_geo_clipAntimeridianLine(listener) {\n    var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;\n    return {\n      lineStart: function() {\n        listener.lineStart();\n        clean = 1;\n      },\n      point: function(λ1, φ1) {\n        var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);\n        if (abs(dλ - π) < ε) {\n          listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          listener.point(λ1, φ0);\n          clean = 0;\n        } else if (sλ0 !== sλ1 && dλ >= π) {\n          if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;\n          if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;\n          φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          clean = 0;\n        }\n        listener.point(λ0 = λ1, φ0 = φ1);\n        sλ0 = sλ1;\n      },\n      lineEnd: function() {\n        listener.lineEnd();\n        λ0 = φ0 = NaN;\n      },\n      clean: function() {\n        return 2 - clean;\n      }\n    };\n  }\n  function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {\n    var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);\n    return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;\n  }\n  function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {\n    var φ;\n    if (from == null) {\n      φ = direction * halfπ;\n      listener.point(-π, φ);\n      listener.point(0, φ);\n      listener.point(π, φ);\n      listener.point(π, 0);\n      listener.point(π, -φ);\n      listener.point(0, -φ);\n      listener.point(-π, -φ);\n      listener.point(-π, 0);\n      listener.point(-π, φ);\n    } else if (abs(from[0] - to[0]) > ε) {\n      var s = from[0] < to[0] ? π : -π;\n      φ = direction * s / 2;\n      listener.point(-s, φ);\n      listener.point(0, φ);\n      listener.point(s, φ);\n    } else {\n      listener.point(to[0], to[1]);\n    }\n  }\n  function d3_geo_clipCircle(radius) {\n    var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);\n    return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);\n    function visible(λ, φ) {\n      return Math.cos(λ) * Math.cos(φ) > cr;\n    }\n    function clipLine(listener) {\n      var point0, c0, v0, v00, clean;\n      return {\n        lineStart: function() {\n          v00 = v0 = false;\n          clean = 1;\n        },\n        point: function(λ, φ) {\n          var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;\n          if (!point0 && (v00 = v0 = v)) listener.lineStart();\n          if (v !== v0) {\n            point2 = intersect(point0, point1);\n            if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {\n              point1[0] += ε;\n              point1[1] += ε;\n              v = visible(point1[0], point1[1]);\n            }\n          }\n          if (v !== v0) {\n            clean = 0;\n            if (v) {\n              listener.lineStart();\n              point2 = intersect(point1, point0);\n              listener.point(point2[0], point2[1]);\n            } else {\n              point2 = intersect(point0, point1);\n              listener.point(point2[0], point2[1]);\n              listener.lineEnd();\n            }\n            point0 = point2;\n          } else if (notHemisphere && point0 && smallRadius ^ v) {\n            var t;\n            if (!(c & c0) && (t = intersect(point1, point0, true))) {\n              clean = 0;\n              if (smallRadius) {\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n              } else {\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n              }\n            }\n          }\n          if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {\n            listener.point(point1[0], point1[1]);\n          }\n          point0 = point1, v0 = v, c0 = c;\n        },\n        lineEnd: function() {\n          if (v0) listener.lineEnd();\n          point0 = null;\n        },\n        clean: function() {\n          return clean | (v00 && v0) << 1;\n        }\n      };\n    }\n    function intersect(a, b, two) {\n      var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);\n      var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n      if (!determinant) return !two && a;\n      var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);\n      d3_geo_cartesianAdd(A, B);\n      var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);\n      if (t2 < 0) return;\n      var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);\n      d3_geo_cartesianAdd(q, A);\n      q = d3_geo_spherical(q);\n      if (!two) return q;\n      var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;\n      if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;\n      var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;\n      if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;\n      if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {\n        var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);\n        d3_geo_cartesianAdd(q1, A);\n        return [ q, d3_geo_spherical(q1) ];\n      }\n    }\n    function code(λ, φ) {\n      var r = smallRadius ? radius : π - radius, code = 0;\n      if (λ < -r) code |= 1; else if (λ > r) code |= 2;\n      if (φ < -r) code |= 4; else if (φ > r) code |= 8;\n      return code;\n    }\n  }\n  function d3_geom_clipLine(x0, y0, x1, y1) {\n    return function(line) {\n      var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;\n      r = x0 - ax;\n      if (!dx && r > 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dx > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = x1 - ax;\n      if (!dx && r < 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dx > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      r = y0 - ay;\n      if (!dy && r > 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dy > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = y1 - ay;\n      if (!dy && r < 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dy > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      if (t0 > 0) line.a = {\n        x: ax + t0 * dx,\n        y: ay + t0 * dy\n      };\n      if (t1 < 1) line.b = {\n        x: ax + t1 * dx,\n        y: ay + t1 * dy\n      };\n      return line;\n    };\n  }\n  var d3_geo_clipExtentMAX = 1e9;\n  d3.geo.clipExtent = function() {\n    var x0, y0, x1, y1, stream, clip, clipExtent = {\n      stream: function(output) {\n        if (stream) stream.valid = false;\n        stream = clip(output);\n        stream.valid = true;\n        return stream;\n      },\n      extent: function(_) {\n        if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n        clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);\n        if (stream) stream.valid = false, stream = null;\n        return clipExtent;\n      }\n    };\n    return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);\n  };\n  function d3_geo_clipExtent(x0, y0, x1, y1) {\n    return function(listener) {\n      var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          listener = bufferListener;\n          segments = [];\n          polygon = [];\n          clean = true;\n        },\n        polygonEnd: function() {\n          listener = listener_;\n          segments = d3.merge(segments);\n          var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;\n          if (inside || visible) {\n            listener.polygonStart();\n            if (inside) {\n              listener.lineStart();\n              interpolate(null, null, 1, listener);\n              listener.lineEnd();\n            }\n            if (visible) {\n              d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);\n            }\n            listener.polygonEnd();\n          }\n          segments = polygon = ring = null;\n        }\n      };\n      function insidePolygon(p) {\n        var wn = 0, n = polygon.length, y = p[1];\n        for (var i = 0; i < n; ++i) {\n          for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {\n            b = v[j];\n            if (a[1] <= y) {\n              if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;\n            } else {\n              if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;\n            }\n            a = b;\n          }\n        }\n        return wn !== 0;\n      }\n      function interpolate(from, to, direction, listener) {\n        var a = 0, a1 = 0;\n        if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {\n          do {\n            listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n          } while ((a = (a + direction + 4) % 4) !== a1);\n        } else {\n          listener.point(to[0], to[1]);\n        }\n      }\n      function pointVisible(x, y) {\n        return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n      }\n      function point(x, y) {\n        if (pointVisible(x, y)) listener.point(x, y);\n      }\n      var x__, y__, v__, x_, y_, v_, first, clean;\n      function lineStart() {\n        clip.point = linePoint;\n        if (polygon) polygon.push(ring = []);\n        first = true;\n        v_ = false;\n        x_ = y_ = NaN;\n      }\n      function lineEnd() {\n        if (segments) {\n          linePoint(x__, y__);\n          if (v__ && v_) bufferListener.rejoin();\n          segments.push(bufferListener.buffer());\n        }\n        clip.point = point;\n        if (v_) listener.lineEnd();\n      }\n      function linePoint(x, y) {\n        x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));\n        y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));\n        var v = pointVisible(x, y);\n        if (polygon) ring.push([ x, y ]);\n        if (first) {\n          x__ = x, y__ = y, v__ = v;\n          first = false;\n          if (v) {\n            listener.lineStart();\n            listener.point(x, y);\n          }\n        } else {\n          if (v && v_) listener.point(x, y); else {\n            var l = {\n              a: {\n                x: x_,\n                y: y_\n              },\n              b: {\n                x: x,\n                y: y\n              }\n            };\n            if (clipLine(l)) {\n              if (!v_) {\n                listener.lineStart();\n                listener.point(l.a.x, l.a.y);\n              }\n              listener.point(l.b.x, l.b.y);\n              if (!v) listener.lineEnd();\n              clean = false;\n            } else if (v) {\n              listener.lineStart();\n              listener.point(x, y);\n              clean = false;\n            }\n          }\n        }\n        x_ = x, y_ = y, v_ = v;\n      }\n      return clip;\n    };\n    function corner(p, direction) {\n      return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n    }\n    function compare(a, b) {\n      return comparePoints(a.x, b.x);\n    }\n    function comparePoints(a, b) {\n      var ca = corner(a, 1), cb = corner(b, 1);\n      return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];\n    }\n  }\n  function d3_geo_compose(a, b) {\n    function compose(x, y) {\n      return x = a(x, y), b(x[0], x[1]);\n    }\n    if (a.invert && b.invert) compose.invert = function(x, y) {\n      return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n    };\n    return compose;\n  }\n  function d3_geo_conic(projectAt) {\n    var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);\n    p.parallels = function(_) {\n      if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];\n      return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);\n    };\n    return p;\n  }\n  function d3_geo_conicEqualArea(φ0, φ1) {\n    var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;\n    function forward(λ, φ) {\n      var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;\n      return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = ρ0 - y;\n      return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEqualArea = function() {\n    return d3_geo_conic(d3_geo_conicEqualArea);\n  }).raw = d3_geo_conicEqualArea;\n  d3.geo.albers = function() {\n    return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);\n  };\n  d3.geo.albersUsa = function() {\n    var lower48 = d3.geo.albers();\n    var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);\n    var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);\n    var point, pointStream = {\n      point: function(x, y) {\n        point = [ x, y ];\n      }\n    }, lower48Point, alaskaPoint, hawaiiPoint;\n    function albersUsa(coordinates) {\n      var x = coordinates[0], y = coordinates[1];\n      point = null;\n      (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);\n      return point;\n    }\n    albersUsa.invert = function(coordinates) {\n      var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;\n      return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);\n    };\n    albersUsa.stream = function(stream) {\n      var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);\n      return {\n        point: function(x, y) {\n          lower48Stream.point(x, y);\n          alaskaStream.point(x, y);\n          hawaiiStream.point(x, y);\n        },\n        sphere: function() {\n          lower48Stream.sphere();\n          alaskaStream.sphere();\n          hawaiiStream.sphere();\n        },\n        lineStart: function() {\n          lower48Stream.lineStart();\n          alaskaStream.lineStart();\n          hawaiiStream.lineStart();\n        },\n        lineEnd: function() {\n          lower48Stream.lineEnd();\n          alaskaStream.lineEnd();\n          hawaiiStream.lineEnd();\n        },\n        polygonStart: function() {\n          lower48Stream.polygonStart();\n          alaskaStream.polygonStart();\n          hawaiiStream.polygonStart();\n        },\n        polygonEnd: function() {\n          lower48Stream.polygonEnd();\n          alaskaStream.polygonEnd();\n          hawaiiStream.polygonEnd();\n        }\n      };\n    };\n    albersUsa.precision = function(_) {\n      if (!arguments.length) return lower48.precision();\n      lower48.precision(_);\n      alaska.precision(_);\n      hawaii.precision(_);\n      return albersUsa;\n    };\n    albersUsa.scale = function(_) {\n      if (!arguments.length) return lower48.scale();\n      lower48.scale(_);\n      alaska.scale(_ * .35);\n      hawaii.scale(_);\n      return albersUsa.translate(lower48.translate());\n    };\n    albersUsa.translate = function(_) {\n      if (!arguments.length) return lower48.translate();\n      var k = lower48.scale(), x = +_[0], y = +_[1];\n      lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;\n      alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      return albersUsa;\n    };\n    return albersUsa.scale(1070);\n  };\n  var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_pathAreaPolygon = 0;\n      d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;\n      d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);\n    }\n  };\n  function d3_geo_pathAreaRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathArea.point = function(x, y) {\n      d3_geo_pathArea.point = nextPoint;\n      x00 = x0 = x, y00 = y0 = y;\n    };\n    function nextPoint(x, y) {\n      d3_geo_pathAreaPolygon += y0 * x - x0 * y;\n      x0 = x, y0 = y;\n    }\n    d3_geo_pathArea.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;\n  var d3_geo_pathBounds = {\n    point: d3_geo_pathBoundsPoint,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_pathBoundsPoint(x, y) {\n    if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;\n    if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;\n    if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;\n    if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;\n  }\n  function d3_geo_pathBuffer() {\n    var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointCircle = d3_geo_pathBufferCircle(_);\n        return stream;\n      },\n      result: function() {\n        if (buffer.length) {\n          var result = buffer.join(\"\");\n          buffer = [];\n          return result;\n        }\n      }\n    };\n    function point(x, y) {\n      buffer.push(\"M\", x, \",\", y, pointCircle);\n    }\n    function pointLineStart(x, y) {\n      buffer.push(\"M\", x, \",\", y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      buffer.push(\"L\", x, \",\", y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      buffer.push(\"Z\");\n    }\n    return stream;\n  }\n  function d3_geo_pathBufferCircle(radius) {\n    return \"m0,\" + radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius + \"z\";\n  }\n  var d3_geo_pathCentroid = {\n    point: d3_geo_pathCentroidPoint,\n    lineStart: d3_geo_pathCentroidLineStart,\n    lineEnd: d3_geo_pathCentroidLineEnd,\n    polygonStart: function() {\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;\n      d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;\n    }\n  };\n  function d3_geo_pathCentroidPoint(x, y) {\n    d3_geo_centroidX0 += x;\n    d3_geo_centroidY0 += y;\n    ++d3_geo_centroidZ0;\n  }\n  function d3_geo_pathCentroidLineStart() {\n    var x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n  }\n  function d3_geo_pathCentroidLineEnd() {\n    d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n  }\n  function d3_geo_pathCentroidRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      z = y0 * x - x0 * y;\n      d3_geo_centroidX2 += z * (x0 + x);\n      d3_geo_centroidY2 += z * (y0 + y);\n      d3_geo_centroidZ2 += z * 3;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n    d3_geo_pathCentroid.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  function d3_geo_pathContext(context) {\n    var pointRadius = 4.5;\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointRadius = _;\n        return stream;\n      },\n      result: d3_noop\n    };\n    function point(x, y) {\n      context.moveTo(x, y);\n      context.arc(x, y, pointRadius, 0, τ);\n    }\n    function pointLineStart(x, y) {\n      context.moveTo(x, y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      context.lineTo(x, y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      context.closePath();\n    }\n    return stream;\n  }\n  function d3_geo_resample(project) {\n    var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;\n    function resample(stream) {\n      return (maxDepth ? resampleRecursive : resampleNone)(stream);\n    }\n    function resampleNone(stream) {\n      return d3_geo_transformPoint(stream, function(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      });\n    }\n    function resampleRecursive(stream) {\n      var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;\n      var resample = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          stream.polygonStart();\n          resample.lineStart = ringStart;\n        },\n        polygonEnd: function() {\n          stream.polygonEnd();\n          resample.lineStart = lineStart;\n        }\n      };\n      function point(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      }\n      function lineStart() {\n        x0 = NaN;\n        resample.point = linePoint;\n        stream.lineStart();\n      }\n      function linePoint(λ, φ) {\n        var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n        stream.point(x0, y0);\n      }\n      function lineEnd() {\n        resample.point = point;\n        stream.lineEnd();\n      }\n      function ringStart() {\n        lineStart();\n        resample.point = ringPoint;\n        resample.lineEnd = ringEnd;\n      }\n      function ringPoint(λ, φ) {\n        linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n        resample.point = linePoint;\n      }\n      function ringEnd() {\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);\n        resample.lineEnd = lineEnd;\n        lineEnd();\n      }\n      return resample;\n    }\n    function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {\n      var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;\n      if (d2 > 4 * δ2 && depth--) {\n        var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;\n        if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n          resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);\n          stream.point(x2, y2);\n          resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);\n        }\n      }\n    }\n    resample.precision = function(_) {\n      if (!arguments.length) return Math.sqrt(δ2);\n      maxDepth = (δ2 = _ * _) > 0 && 16;\n      return resample;\n    };\n    return resample;\n  }\n  d3.geo.path = function() {\n    var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;\n    function path(object) {\n      if (object) {\n        if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n        if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);\n        d3.geo.stream(object, cacheStream);\n      }\n      return contextStream.result();\n    }\n    path.area = function(object) {\n      d3_geo_pathAreaSum = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathArea));\n      return d3_geo_pathAreaSum;\n    };\n    path.centroid = function(object) {\n      d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathCentroid));\n      return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];\n    };\n    path.bounds = function(object) {\n      d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);\n      d3.geo.stream(object, projectStream(d3_geo_pathBounds));\n      return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];\n    };\n    path.projection = function(_) {\n      if (!arguments.length) return projection;\n      projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;\n      return reset();\n    };\n    path.context = function(_) {\n      if (!arguments.length) return context;\n      contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);\n      if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n      return reset();\n    };\n    path.pointRadius = function(_) {\n      if (!arguments.length) return pointRadius;\n      pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n      return path;\n    };\n    function reset() {\n      cacheStream = null;\n      return path;\n    }\n    return path.projection(d3.geo.albersUsa()).context(null);\n  };\n  function d3_geo_pathProjectStream(project) {\n    var resample = d3_geo_resample(function(x, y) {\n      return project([ x * d3_degrees, y * d3_degrees ]);\n    });\n    return function(stream) {\n      return d3_geo_projectionRadians(resample(stream));\n    };\n  }\n  d3.geo.transform = function(methods) {\n    return {\n      stream: function(stream) {\n        var transform = new d3_geo_transform(stream);\n        for (var k in methods) transform[k] = methods[k];\n        return transform;\n      }\n    };\n  };\n  function d3_geo_transform(stream) {\n    this.stream = stream;\n  }\n  d3_geo_transform.prototype = {\n    point: function(x, y) {\n      this.stream.point(x, y);\n    },\n    sphere: function() {\n      this.stream.sphere();\n    },\n    lineStart: function() {\n      this.stream.lineStart();\n    },\n    lineEnd: function() {\n      this.stream.lineEnd();\n    },\n    polygonStart: function() {\n      this.stream.polygonStart();\n    },\n    polygonEnd: function() {\n      this.stream.polygonEnd();\n    }\n  };\n  function d3_geo_transformPoint(stream, point) {\n    return {\n      point: point,\n      sphere: function() {\n        stream.sphere();\n      },\n      lineStart: function() {\n        stream.lineStart();\n      },\n      lineEnd: function() {\n        stream.lineEnd();\n      },\n      polygonStart: function() {\n        stream.polygonStart();\n      },\n      polygonEnd: function() {\n        stream.polygonEnd();\n      }\n    };\n  }\n  d3.geo.projection = d3_geo_projection;\n  d3.geo.projectionMutator = d3_geo_projectionMutator;\n  function d3_geo_projection(project) {\n    return d3_geo_projectionMutator(function() {\n      return project;\n    })();\n  }\n  function d3_geo_projectionMutator(projectAt) {\n    var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {\n      x = project(x, y);\n      return [ x[0] * k + δx, δy - x[1] * k ];\n    }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;\n    function projection(point) {\n      point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);\n      return [ point[0] * k + δx, δy - point[1] * k ];\n    }\n    function invert(point) {\n      point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);\n      return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];\n    }\n    projection.stream = function(output) {\n      if (stream) stream.valid = false;\n      stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));\n      stream.valid = true;\n      return stream;\n    };\n    projection.clipAngle = function(_) {\n      if (!arguments.length) return clipAngle;\n      preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);\n      return invalidate();\n    };\n    projection.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent;\n      clipExtent = _;\n      postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;\n      return invalidate();\n    };\n    projection.scale = function(_) {\n      if (!arguments.length) return k;\n      k = +_;\n      return reset();\n    };\n    projection.translate = function(_) {\n      if (!arguments.length) return [ x, y ];\n      x = +_[0];\n      y = +_[1];\n      return reset();\n    };\n    projection.center = function(_) {\n      if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];\n      λ = _[0] % 360 * d3_radians;\n      φ = _[1] % 360 * d3_radians;\n      return reset();\n    };\n    projection.rotate = function(_) {\n      if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];\n      δλ = _[0] % 360 * d3_radians;\n      δφ = _[1] % 360 * d3_radians;\n      δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;\n      return reset();\n    };\n    d3.rebind(projection, projectResample, \"precision\");\n    function reset() {\n      projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);\n      var center = project(λ, φ);\n      δx = x - center[0] * k;\n      δy = y + center[1] * k;\n      return invalidate();\n    }\n    function invalidate() {\n      if (stream) stream.valid = false, stream = null;\n      return projection;\n    }\n    return function() {\n      project = projectAt.apply(this, arguments);\n      projection.invert = project.invert && invert;\n      return reset();\n    };\n  }\n  function d3_geo_projectionRadians(stream) {\n    return d3_geo_transformPoint(stream, function(x, y) {\n      stream.point(x * d3_radians, y * d3_radians);\n    });\n  }\n  function d3_geo_equirectangular(λ, φ) {\n    return [ λ, φ ];\n  }\n  (d3.geo.equirectangular = function() {\n    return d3_geo_projection(d3_geo_equirectangular);\n  }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;\n  d3.geo.rotation = function(rotate) {\n    rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);\n    function forward(coordinates) {\n      coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    }\n    forward.invert = function(coordinates) {\n      coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    };\n    return forward;\n  };\n  function d3_geo_identityRotation(λ, φ) {\n    return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n  }\n  d3_geo_identityRotation.invert = d3_geo_equirectangular;\n  function d3_geo_rotation(δλ, δφ, δγ) {\n    return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;\n  }\n  function d3_geo_forwardRotationλ(δλ) {\n    return function(λ, φ) {\n      return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n    };\n  }\n  function d3_geo_rotationλ(δλ) {\n    var rotation = d3_geo_forwardRotationλ(δλ);\n    rotation.invert = d3_geo_forwardRotationλ(-δλ);\n    return rotation;\n  }\n  function d3_geo_rotationφγ(δφ, δγ) {\n    var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);\n    function rotation(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;\n      return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];\n    }\n    rotation.invert = function(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;\n      return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];\n    };\n    return rotation;\n  }\n  d3.geo.circle = function() {\n    var origin = [ 0, 0 ], angle, precision = 6, interpolate;\n    function circle() {\n      var center = typeof origin === \"function\" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];\n      interpolate(null, null, 1, {\n        point: function(x, y) {\n          ring.push(x = rotate(x, y));\n          x[0] *= d3_degrees, x[1] *= d3_degrees;\n        }\n      });\n      return {\n        type: \"Polygon\",\n        coordinates: [ ring ]\n      };\n    }\n    circle.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return circle;\n    };\n    circle.angle = function(x) {\n      if (!arguments.length) return angle;\n      interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);\n      return circle;\n    };\n    circle.precision = function(_) {\n      if (!arguments.length) return precision;\n      interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);\n      return circle;\n    };\n    return circle.angle(90);\n  };\n  function d3_geo_circleInterpolate(radius, precision) {\n    var cr = Math.cos(radius), sr = Math.sin(radius);\n    return function(from, to, direction, listener) {\n      var step = direction * precision;\n      if (from != null) {\n        from = d3_geo_circleAngle(cr, from);\n        to = d3_geo_circleAngle(cr, to);\n        if (direction > 0 ? from < to : from > to) from += direction * τ;\n      } else {\n        from = radius + direction * τ;\n        to = radius - .5 * step;\n      }\n      for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {\n        listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);\n      }\n    };\n  }\n  function d3_geo_circleAngle(cr, point) {\n    var a = d3_geo_cartesian(point);\n    a[0] -= cr;\n    d3_geo_cartesianNormalize(a);\n    var angle = d3_acos(-a[1]);\n    return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);\n  }\n  d3.geo.distance = function(a, b) {\n    var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;\n    return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);\n  };\n  d3.geo.graticule = function() {\n    var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;\n    function graticule() {\n      return {\n        type: \"MultiLineString\",\n        coordinates: lines()\n      };\n    }\n    function lines() {\n      return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {\n        return abs(x % DX) > ε;\n      }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {\n        return abs(y % DY) > ε;\n      }).map(y));\n    }\n    graticule.lines = function() {\n      return lines().map(function(coordinates) {\n        return {\n          type: \"LineString\",\n          coordinates: coordinates\n        };\n      });\n    };\n    graticule.outline = function() {\n      return {\n        type: \"Polygon\",\n        coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]\n      };\n    };\n    graticule.extent = function(_) {\n      if (!arguments.length) return graticule.minorExtent();\n      return graticule.majorExtent(_).minorExtent(_);\n    };\n    graticule.majorExtent = function(_) {\n      if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];\n      X0 = +_[0][0], X1 = +_[1][0];\n      Y0 = +_[0][1], Y1 = +_[1][1];\n      if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n      if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.minorExtent = function(_) {\n      if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n      x0 = +_[0][0], x1 = +_[1][0];\n      y0 = +_[0][1], y1 = +_[1][1];\n      if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n      if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.step = function(_) {\n      if (!arguments.length) return graticule.minorStep();\n      return graticule.majorStep(_).minorStep(_);\n    };\n    graticule.majorStep = function(_) {\n      if (!arguments.length) return [ DX, DY ];\n      DX = +_[0], DY = +_[1];\n      return graticule;\n    };\n    graticule.minorStep = function(_) {\n      if (!arguments.length) return [ dx, dy ];\n      dx = +_[0], dy = +_[1];\n      return graticule;\n    };\n    graticule.precision = function(_) {\n      if (!arguments.length) return precision;\n      precision = +_;\n      x = d3_geo_graticuleX(y0, y1, 90);\n      y = d3_geo_graticuleY(x0, x1, precision);\n      X = d3_geo_graticuleX(Y0, Y1, 90);\n      Y = d3_geo_graticuleY(X0, X1, precision);\n      return graticule;\n    };\n    return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);\n  };\n  function d3_geo_graticuleX(y0, y1, dy) {\n    var y = d3.range(y0, y1 - ε, dy).concat(y1);\n    return function(x) {\n      return y.map(function(y) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_geo_graticuleY(x0, x1, dx) {\n    var x = d3.range(x0, x1 - ε, dx).concat(x1);\n    return function(y) {\n      return x.map(function(x) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_source(d) {\n    return d.source;\n  }\n  function d3_target(d) {\n    return d.target;\n  }\n  d3.geo.greatArc = function() {\n    var source = d3_source, source_, target = d3_target, target_;\n    function greatArc() {\n      return {\n        type: \"LineString\",\n        coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]\n      };\n    }\n    greatArc.distance = function() {\n      return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));\n    };\n    greatArc.source = function(_) {\n      if (!arguments.length) return source;\n      source = _, source_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.target = function(_) {\n      if (!arguments.length) return target;\n      target = _, target_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.precision = function() {\n      return arguments.length ? greatArc : 0;\n    };\n    return greatArc;\n  };\n  d3.geo.interpolate = function(source, target) {\n    return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);\n  };\n  function d3_geo_interpolate(x0, y0, x1, y1) {\n    var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);\n    var interpolate = d ? function(t) {\n      var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;\n      return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];\n    } : function() {\n      return [ x0 * d3_degrees, y0 * d3_degrees ];\n    };\n    interpolate.distance = d;\n    return interpolate;\n  }\n  d3.geo.length = function(object) {\n    d3_geo_lengthSum = 0;\n    d3.geo.stream(object, d3_geo_length);\n    return d3_geo_lengthSum;\n  };\n  var d3_geo_lengthSum;\n  var d3_geo_length = {\n    sphere: d3_noop,\n    point: d3_noop,\n    lineStart: d3_geo_lengthLineStart,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_lengthLineStart() {\n    var λ0, sinφ0, cosφ0;\n    d3_geo_length.point = function(λ, φ) {\n      λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);\n      d3_geo_length.point = nextPoint;\n    };\n    d3_geo_length.lineEnd = function() {\n      d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;\n    };\n    function nextPoint(λ, φ) {\n      var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);\n      d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);\n      λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;\n    }\n  }\n  function d3_geo_azimuthal(scale, angle) {\n    function azimuthal(λ, φ) {\n      var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);\n      return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];\n    }\n    azimuthal.invert = function(x, y) {\n      var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);\n      return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];\n    };\n    return azimuthal;\n  }\n  var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {\n    return Math.sqrt(2 / (1 + cosλcosφ));\n  }, function(ρ) {\n    return 2 * Math.asin(ρ / 2);\n  });\n  (d3.geo.azimuthalEqualArea = function() {\n    return d3_geo_projection(d3_geo_azimuthalEqualArea);\n  }).raw = d3_geo_azimuthalEqualArea;\n  var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {\n    var c = Math.acos(cosλcosφ);\n    return c && c / Math.sin(c);\n  }, d3_identity);\n  (d3.geo.azimuthalEquidistant = function() {\n    return d3_geo_projection(d3_geo_azimuthalEquidistant);\n  }).raw = d3_geo_azimuthalEquidistant;\n  function d3_geo_conicConformal(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), t = function(φ) {\n      return Math.tan(π / 4 + φ / 2);\n    }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;\n    if (!n) return d3_geo_mercator;\n    function forward(λ, φ) {\n      if (F > 0) {\n        if (φ < -halfπ + ε) φ = -halfπ + ε;\n      } else {\n        if (φ > halfπ - ε) φ = halfπ - ε;\n      }\n      var ρ = F / Math.pow(t(φ), n);\n      return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);\n      return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];\n    };\n    return forward;\n  }\n  (d3.geo.conicConformal = function() {\n    return d3_geo_conic(d3_geo_conicConformal);\n  }).raw = d3_geo_conicConformal;\n  function d3_geo_conicEquidistant(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;\n    if (abs(n) < ε) return d3_geo_equirectangular;\n    function forward(λ, φ) {\n      var ρ = G - φ;\n      return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = G - y;\n      return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEquidistant = function() {\n    return d3_geo_conic(d3_geo_conicEquidistant);\n  }).raw = d3_geo_conicEquidistant;\n  var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / cosλcosφ;\n  }, Math.atan);\n  (d3.geo.gnomonic = function() {\n    return d3_geo_projection(d3_geo_gnomonic);\n  }).raw = d3_geo_gnomonic;\n  function d3_geo_mercator(λ, φ) {\n    return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];\n  }\n  d3_geo_mercator.invert = function(x, y) {\n    return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];\n  };\n  function d3_geo_mercatorProjection(project) {\n    var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;\n    m.scale = function() {\n      var v = scale.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.translate = function() {\n      var v = translate.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.clipExtent = function(_) {\n      var v = clipExtent.apply(m, arguments);\n      if (v === m) {\n        if (clipAuto = _ == null) {\n          var k = π * scale(), t = translate();\n          clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);\n        }\n      } else if (clipAuto) {\n        v = null;\n      }\n      return v;\n    };\n    return m.clipExtent(null);\n  }\n  (d3.geo.mercator = function() {\n    return d3_geo_mercatorProjection(d3_geo_mercator);\n  }).raw = d3_geo_mercator;\n  var d3_geo_orthographic = d3_geo_azimuthal(function() {\n    return 1;\n  }, Math.asin);\n  (d3.geo.orthographic = function() {\n    return d3_geo_projection(d3_geo_orthographic);\n  }).raw = d3_geo_orthographic;\n  var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / (1 + cosλcosφ);\n  }, function(ρ) {\n    return 2 * Math.atan(ρ);\n  });\n  (d3.geo.stereographic = function() {\n    return d3_geo_projection(d3_geo_stereographic);\n  }).raw = d3_geo_stereographic;\n  function d3_geo_transverseMercator(λ, φ) {\n    return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];\n  }\n  d3_geo_transverseMercator.invert = function(x, y) {\n    return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];\n  };\n  (d3.geo.transverseMercator = function() {\n    var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;\n    projection.center = function(_) {\n      return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);\n    };\n    projection.rotate = function(_) {\n      return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(), \n      [ _[0], _[1], _[2] - 90 ]);\n    };\n    return rotate([ 0, 0, 90 ]);\n  }).raw = d3_geo_transverseMercator;\n  d3.geom = {};\n  function d3_geom_pointX(d) {\n    return d[0];\n  }\n  function d3_geom_pointY(d) {\n    return d[1];\n  }\n  d3.geom.hull = function(vertices) {\n    var x = d3_geom_pointX, y = d3_geom_pointY;\n    if (arguments.length) return hull(vertices);\n    function hull(data) {\n      if (data.length < 3) return [];\n      var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];\n      for (i = 0; i < n; i++) {\n        points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);\n      }\n      points.sort(d3_geom_hullOrder);\n      for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);\n      var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);\n      var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];\n      for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);\n      for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);\n      return polygon;\n    }\n    hull.x = function(_) {\n      return arguments.length ? (x = _, hull) : x;\n    };\n    hull.y = function(_) {\n      return arguments.length ? (y = _, hull) : y;\n    };\n    return hull;\n  };\n  function d3_geom_hullUpper(points) {\n    var n = points.length, hull = [ 0, 1 ], hs = 2;\n    for (var i = 2; i < n; i++) {\n      while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;\n      hull[hs++] = i;\n    }\n    return hull.slice(0, hs);\n  }\n  function d3_geom_hullOrder(a, b) {\n    return a[0] - b[0] || a[1] - b[1];\n  }\n  d3.geom.polygon = function(coordinates) {\n    d3_subclass(coordinates, d3_geom_polygonPrototype);\n    return coordinates;\n  };\n  var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];\n  d3_geom_polygonPrototype.area = function() {\n    var i = -1, n = this.length, a, b = this[n - 1], area = 0;\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      area += a[1] * b[0] - a[0] * b[1];\n    }\n    return area * .5;\n  };\n  d3_geom_polygonPrototype.centroid = function(k) {\n    var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;\n    if (!arguments.length) k = -1 / (6 * this.area());\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      c = a[0] * b[1] - b[0] * a[1];\n      x += (a[0] + b[0]) * c;\n      y += (a[1] + b[1]) * c;\n    }\n    return [ x * k, y * k ];\n  };\n  d3_geom_polygonPrototype.clip = function(subject) {\n    var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;\n    while (++i < n) {\n      input = subject.slice();\n      subject.length = 0;\n      b = this[i];\n      c = input[(m = input.length - closed) - 1];\n      j = -1;\n      while (++j < m) {\n        d = input[j];\n        if (d3_geom_polygonInside(d, a, b)) {\n          if (!d3_geom_polygonInside(c, a, b)) {\n            subject.push(d3_geom_polygonIntersect(c, d, a, b));\n          }\n          subject.push(d);\n        } else if (d3_geom_polygonInside(c, a, b)) {\n          subject.push(d3_geom_polygonIntersect(c, d, a, b));\n        }\n        c = d;\n      }\n      if (closed) subject.push(subject[0]);\n      a = b;\n    }\n    return subject;\n  };\n  function d3_geom_polygonInside(p, a, b) {\n    return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);\n  }\n  function d3_geom_polygonIntersect(c, d, a, b) {\n    var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);\n    return [ x1 + ua * x21, y1 + ua * y21 ];\n  }\n  function d3_geom_polygonClosed(coordinates) {\n    var a = coordinates[0], b = coordinates[coordinates.length - 1];\n    return !(a[0] - b[0] || a[1] - b[1]);\n  }\n  var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];\n  function d3_geom_voronoiBeach() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.edge = this.site = this.circle = null;\n  }\n  function d3_geom_voronoiCreateBeach(site) {\n    var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();\n    beach.site = site;\n    return beach;\n  }\n  function d3_geom_voronoiDetachBeach(beach) {\n    d3_geom_voronoiDetachCircle(beach);\n    d3_geom_voronoiBeaches.remove(beach);\n    d3_geom_voronoiBeachPool.push(beach);\n    d3_geom_voronoiRedBlackNode(beach);\n  }\n  function d3_geom_voronoiRemoveBeach(beach) {\n    var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {\n      x: x,\n      y: y\n    }, previous = beach.P, next = beach.N, disappearing = [ beach ];\n    d3_geom_voronoiDetachBeach(beach);\n    var lArc = previous;\n    while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {\n      previous = lArc.P;\n      disappearing.unshift(lArc);\n      d3_geom_voronoiDetachBeach(lArc);\n      lArc = previous;\n    }\n    disappearing.unshift(lArc);\n    d3_geom_voronoiDetachCircle(lArc);\n    var rArc = next;\n    while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {\n      next = rArc.N;\n      disappearing.push(rArc);\n      d3_geom_voronoiDetachBeach(rArc);\n      rArc = next;\n    }\n    disappearing.push(rArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var nArcs = disappearing.length, iArc;\n    for (iArc = 1; iArc < nArcs; ++iArc) {\n      rArc = disappearing[iArc];\n      lArc = disappearing[iArc - 1];\n      d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n    }\n    lArc = disappearing[0];\n    rArc = disappearing[nArcs - 1];\n    rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiAddBeach(site) {\n    var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;\n    while (node) {\n      dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;\n      if (dxl > ε) node = node.L; else {\n        dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);\n        if (dxr > ε) {\n          if (!node.R) {\n            lArc = node;\n            break;\n          }\n          node = node.R;\n        } else {\n          if (dxl > -ε) {\n            lArc = node.P;\n            rArc = node;\n          } else if (dxr > -ε) {\n            lArc = node;\n            rArc = node.N;\n          } else {\n            lArc = rArc = node;\n          }\n          break;\n        }\n      }\n    }\n    var newArc = d3_geom_voronoiCreateBeach(site);\n    d3_geom_voronoiBeaches.insert(lArc, newArc);\n    if (!lArc && !rArc) return;\n    if (lArc === rArc) {\n      d3_geom_voronoiDetachCircle(lArc);\n      rArc = d3_geom_voronoiCreateBeach(lArc.site);\n      d3_geom_voronoiBeaches.insert(newArc, rArc);\n      newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      d3_geom_voronoiAttachCircle(lArc);\n      d3_geom_voronoiAttachCircle(rArc);\n      return;\n    }\n    if (!rArc) {\n      newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      return;\n    }\n    d3_geom_voronoiDetachCircle(lArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {\n      x: (cy * hb - by * hc) / d + ax,\n      y: (bx * hc - cx * hb) / d + ay\n    };\n    d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);\n    newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);\n    rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiLeftBreakPoint(arc, directrix) {\n    var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;\n    if (!pby2) return rfocx;\n    var lArc = arc.P;\n    if (!lArc) return -Infinity;\n    site = lArc.site;\n    var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;\n    if (!plby2) return lfocx;\n    var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;\n    if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n    return (rfocx + lfocx) / 2;\n  }\n  function d3_geom_voronoiRightBreakPoint(arc, directrix) {\n    var rArc = arc.N;\n    if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);\n    var site = arc.site;\n    return site.y === directrix ? site.x : Infinity;\n  }\n  function d3_geom_voronoiCell(site) {\n    this.site = site;\n    this.edges = [];\n  }\n  d3_geom_voronoiCell.prototype.prepare = function() {\n    var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;\n    while (iHalfEdge--) {\n      edge = halfEdges[iHalfEdge].edge;\n      if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);\n    }\n    halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);\n    return halfEdges.length;\n  };\n  function d3_geom_voronoiCloseCells(extent) {\n    var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;\n    while (iCell--) {\n      cell = cells[iCell];\n      if (!cell || !cell.prepare()) continue;\n      halfEdges = cell.edges;\n      nHalfEdges = halfEdges.length;\n      iHalfEdge = 0;\n      while (iHalfEdge < nHalfEdges) {\n        end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;\n        start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;\n        if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {\n          halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {\n            x: x0,\n            y: abs(x2 - x0) < ε ? y2 : y1\n          } : abs(y3 - y1) < ε && x1 - x3 > ε ? {\n            x: abs(y2 - y1) < ε ? x2 : x1,\n            y: y1\n          } : abs(x3 - x1) < ε && y3 - y0 > ε ? {\n            x: x1,\n            y: abs(x2 - x1) < ε ? y2 : y0\n          } : abs(y3 - y0) < ε && x3 - x0 > ε ? {\n            x: abs(y2 - y0) < ε ? x2 : x0,\n            y: y0\n          } : null), cell.site, null));\n          ++nHalfEdges;\n        }\n      }\n    }\n  }\n  function d3_geom_voronoiHalfEdgeOrder(a, b) {\n    return b.angle - a.angle;\n  }\n  function d3_geom_voronoiCircle() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.x = this.y = this.arc = this.site = this.cy = null;\n  }\n  function d3_geom_voronoiAttachCircle(arc) {\n    var lArc = arc.P, rArc = arc.N;\n    if (!lArc || !rArc) return;\n    var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;\n    if (lSite === rSite) return;\n    var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;\n    var d = 2 * (ax * cy - ay * cx);\n    if (d >= -ε2) return;\n    var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;\n    var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();\n    circle.arc = arc;\n    circle.site = cSite;\n    circle.x = x + bx;\n    circle.y = cy + Math.sqrt(x * x + y * y);\n    circle.cy = cy;\n    arc.circle = circle;\n    var before = null, node = d3_geom_voronoiCircles._;\n    while (node) {\n      if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {\n        if (node.L) node = node.L; else {\n          before = node.P;\n          break;\n        }\n      } else {\n        if (node.R) node = node.R; else {\n          before = node;\n          break;\n        }\n      }\n    }\n    d3_geom_voronoiCircles.insert(before, circle);\n    if (!before) d3_geom_voronoiFirstCircle = circle;\n  }\n  function d3_geom_voronoiDetachCircle(arc) {\n    var circle = arc.circle;\n    if (circle) {\n      if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;\n      d3_geom_voronoiCircles.remove(circle);\n      d3_geom_voronoiCirclePool.push(circle);\n      d3_geom_voronoiRedBlackNode(circle);\n      arc.circle = null;\n    }\n  }\n  function d3_geom_voronoiClipEdges(extent) {\n    var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;\n    while (i--) {\n      e = edges[i];\n      if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {\n        e.a = e.b = null;\n        edges.splice(i, 1);\n      }\n    }\n  }\n  function d3_geom_voronoiConnectEdge(edge, extent) {\n    var vb = edge.b;\n    if (vb) return true;\n    var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;\n    if (ry === ly) {\n      if (fx < x0 || fx >= x1) return;\n      if (lx > rx) {\n        if (!va) va = {\n          x: fx,\n          y: y0\n        }; else if (va.y >= y1) return;\n        vb = {\n          x: fx,\n          y: y1\n        };\n      } else {\n        if (!va) va = {\n          x: fx,\n          y: y1\n        }; else if (va.y < y0) return;\n        vb = {\n          x: fx,\n          y: y0\n        };\n      }\n    } else {\n      fm = (lx - rx) / (ry - ly);\n      fb = fy - fm * fx;\n      if (fm < -1 || fm > 1) {\n        if (lx > rx) {\n          if (!va) va = {\n            x: (y0 - fb) / fm,\n            y: y0\n          }; else if (va.y >= y1) return;\n          vb = {\n            x: (y1 - fb) / fm,\n            y: y1\n          };\n        } else {\n          if (!va) va = {\n            x: (y1 - fb) / fm,\n            y: y1\n          }; else if (va.y < y0) return;\n          vb = {\n            x: (y0 - fb) / fm,\n            y: y0\n          };\n        }\n      } else {\n        if (ly < ry) {\n          if (!va) va = {\n            x: x0,\n            y: fm * x0 + fb\n          }; else if (va.x >= x1) return;\n          vb = {\n            x: x1,\n            y: fm * x1 + fb\n          };\n        } else {\n          if (!va) va = {\n            x: x1,\n            y: fm * x1 + fb\n          }; else if (va.x < x0) return;\n          vb = {\n            x: x0,\n            y: fm * x0 + fb\n          };\n        }\n      }\n    }\n    edge.a = va;\n    edge.b = vb;\n    return true;\n  }\n  function d3_geom_voronoiEdge(lSite, rSite) {\n    this.l = lSite;\n    this.r = rSite;\n    this.a = this.b = null;\n  }\n  function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, rSite);\n    d3_geom_voronoiEdges.push(edge);\n    if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);\n    if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);\n    d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));\n    d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));\n    return edge;\n  }\n  function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, null);\n    edge.a = va;\n    edge.b = vb;\n    d3_geom_voronoiEdges.push(edge);\n    return edge;\n  }\n  function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {\n    if (!edge.a && !edge.b) {\n      edge.a = vertex;\n      edge.l = lSite;\n      edge.r = rSite;\n    } else if (edge.l === rSite) {\n      edge.b = vertex;\n    } else {\n      edge.a = vertex;\n    }\n  }\n  function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {\n    var va = edge.a, vb = edge.b;\n    this.edge = edge;\n    this.site = lSite;\n    this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);\n  }\n  d3_geom_voronoiHalfEdge.prototype = {\n    start: function() {\n      return this.edge.l === this.site ? this.edge.a : this.edge.b;\n    },\n    end: function() {\n      return this.edge.l === this.site ? this.edge.b : this.edge.a;\n    }\n  };\n  function d3_geom_voronoiRedBlackTree() {\n    this._ = null;\n  }\n  function d3_geom_voronoiRedBlackNode(node) {\n    node.U = node.C = node.L = node.R = node.P = node.N = null;\n  }\n  d3_geom_voronoiRedBlackTree.prototype = {\n    insert: function(after, node) {\n      var parent, grandpa, uncle;\n      if (after) {\n        node.P = after;\n        node.N = after.N;\n        if (after.N) after.N.P = node;\n        after.N = node;\n        if (after.R) {\n          after = after.R;\n          while (after.L) after = after.L;\n          after.L = node;\n        } else {\n          after.R = node;\n        }\n        parent = after;\n      } else if (this._) {\n        after = d3_geom_voronoiRedBlackFirst(this._);\n        node.P = null;\n        node.N = after;\n        after.P = after.L = node;\n        parent = after;\n      } else {\n        node.P = node.N = null;\n        this._ = node;\n        parent = null;\n      }\n      node.L = node.R = null;\n      node.U = parent;\n      node.C = true;\n      after = node;\n      while (parent && parent.C) {\n        grandpa = parent.U;\n        if (parent === grandpa.L) {\n          uncle = grandpa.R;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.R) {\n              d3_geom_voronoiRedBlackRotateLeft(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, grandpa);\n          }\n        } else {\n          uncle = grandpa.L;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.L) {\n              d3_geom_voronoiRedBlackRotateRight(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, grandpa);\n          }\n        }\n        parent = after.U;\n      }\n      this._.C = false;\n    },\n    remove: function(node) {\n      if (node.N) node.N.P = node.P;\n      if (node.P) node.P.N = node.N;\n      node.N = node.P = null;\n      var parent = node.U, sibling, left = node.L, right = node.R, next, red;\n      if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);\n      if (parent) {\n        if (parent.L === node) parent.L = next; else parent.R = next;\n      } else {\n        this._ = next;\n      }\n      if (left && right) {\n        red = next.C;\n        next.C = node.C;\n        next.L = left;\n        left.U = next;\n        if (next !== right) {\n          parent = next.U;\n          next.U = node.U;\n          node = next.R;\n          parent.L = node;\n          next.R = right;\n          right.U = next;\n        } else {\n          next.U = parent;\n          parent = next;\n          node = next.R;\n        }\n      } else {\n        red = node.C;\n        node = next;\n      }\n      if (node) node.U = parent;\n      if (red) return;\n      if (node && node.C) {\n        node.C = false;\n        return;\n      }\n      do {\n        if (node === this._) break;\n        if (node === parent.L) {\n          sibling = parent.R;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            sibling = parent.R;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.R || !sibling.R.C) {\n              sibling.L.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateRight(this, sibling);\n              sibling = parent.R;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.R.C = false;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            node = this._;\n            break;\n          }\n        } else {\n          sibling = parent.L;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            sibling = parent.L;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.L || !sibling.L.C) {\n              sibling.R.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateLeft(this, sibling);\n              sibling = parent.L;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.L.C = false;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            node = this._;\n            break;\n          }\n        }\n        sibling.C = true;\n        node = parent;\n        parent = parent.U;\n      } while (!node.C);\n      if (node) node.C = false;\n    }\n  };\n  function d3_geom_voronoiRedBlackRotateLeft(tree, node) {\n    var p = node, q = node.R, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.R = q.L;\n    if (p.R) p.R.U = p;\n    q.L = p;\n  }\n  function d3_geom_voronoiRedBlackRotateRight(tree, node) {\n    var p = node, q = node.L, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.L = q.R;\n    if (p.L) p.L.U = p;\n    q.R = p;\n  }\n  function d3_geom_voronoiRedBlackFirst(node) {\n    while (node.L) node = node.L;\n    return node;\n  }\n  function d3_geom_voronoi(sites, bbox) {\n    var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;\n    d3_geom_voronoiEdges = [];\n    d3_geom_voronoiCells = new Array(sites.length);\n    d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();\n    d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();\n    while (true) {\n      circle = d3_geom_voronoiFirstCircle;\n      if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {\n        if (site.x !== x0 || site.y !== y0) {\n          d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);\n          d3_geom_voronoiAddBeach(site);\n          x0 = site.x, y0 = site.y;\n        }\n        site = sites.pop();\n      } else if (circle) {\n        d3_geom_voronoiRemoveBeach(circle.arc);\n      } else {\n        break;\n      }\n    }\n    if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);\n    var diagram = {\n      cells: d3_geom_voronoiCells,\n      edges: d3_geom_voronoiEdges\n    };\n    d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;\n    return diagram;\n  }\n  function d3_geom_voronoiVertexOrder(a, b) {\n    return b.y - a.y || b.x - a.x;\n  }\n  d3.geom.voronoi = function(points) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;\n    if (points) return voronoi(points);\n    function voronoi(data) {\n      var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];\n      d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {\n        var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {\n          var s = e.start();\n          return [ s.x, s.y ];\n        }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];\n        polygon.point = data[i];\n      });\n      return polygons;\n    }\n    function sites(data) {\n      return data.map(function(d, i) {\n        return {\n          x: Math.round(fx(d, i) / ε) * ε,\n          y: Math.round(fy(d, i) / ε) * ε,\n          i: i\n        };\n      });\n    }\n    voronoi.links = function(data) {\n      return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {\n        return edge.l && edge.r;\n      }).map(function(edge) {\n        return {\n          source: data[edge.l.i],\n          target: data[edge.r.i]\n        };\n      });\n    };\n    voronoi.triangles = function(data) {\n      var triangles = [];\n      d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {\n        var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;\n        while (++j < m) {\n          e0 = e1;\n          s0 = s1;\n          e1 = edges[j].edge;\n          s1 = e1.l === site ? e1.r : e1.l;\n          if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {\n            triangles.push([ data[i], data[s0.i], data[s1.i] ]);\n          }\n        }\n      });\n      return triangles;\n    };\n    voronoi.x = function(_) {\n      return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;\n    };\n    voronoi.y = function(_) {\n      return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;\n    };\n    voronoi.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;\n      clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;\n      return voronoi;\n    };\n    voronoi.size = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];\n      return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);\n    };\n    return voronoi;\n  };\n  var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];\n  function d3_geom_voronoiTriangleArea(a, b, c) {\n    return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);\n  }\n  d3.geom.delaunay = function(vertices) {\n    return d3.geom.voronoi().triangles(vertices);\n  };\n  d3.geom.quadtree = function(points, x1, y1, x2, y2) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, compat;\n    if (compat = arguments.length) {\n      x = d3_geom_quadtreeCompatX;\n      y = d3_geom_quadtreeCompatY;\n      if (compat === 3) {\n        y2 = y1;\n        x2 = x1;\n        y1 = x1 = 0;\n      }\n      return quadtree(points);\n    }\n    function quadtree(data) {\n      var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;\n      if (x1 != null) {\n        x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;\n      } else {\n        x2_ = y2_ = -(x1_ = y1_ = Infinity);\n        xs = [], ys = [];\n        n = data.length;\n        if (compat) for (i = 0; i < n; ++i) {\n          d = data[i];\n          if (d.x < x1_) x1_ = d.x;\n          if (d.y < y1_) y1_ = d.y;\n          if (d.x > x2_) x2_ = d.x;\n          if (d.y > y2_) y2_ = d.y;\n          xs.push(d.x);\n          ys.push(d.y);\n        } else for (i = 0; i < n; ++i) {\n          var x_ = +fx(d = data[i], i), y_ = +fy(d, i);\n          if (x_ < x1_) x1_ = x_;\n          if (y_ < y1_) y1_ = y_;\n          if (x_ > x2_) x2_ = x_;\n          if (y_ > y2_) y2_ = y_;\n          xs.push(x_);\n          ys.push(y_);\n        }\n      }\n      var dx = x2_ - x1_, dy = y2_ - y1_;\n      if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;\n      function insert(n, d, x, y, x1, y1, x2, y2) {\n        if (isNaN(x) || isNaN(y)) return;\n        if (n.leaf) {\n          var nx = n.x, ny = n.y;\n          if (nx != null) {\n            if (abs(nx - x) + abs(ny - y) < .01) {\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            } else {\n              var nPoint = n.point;\n              n.x = n.y = n.point = null;\n              insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            }\n          } else {\n            n.x = x, n.y = y, n.point = d;\n          }\n        } else {\n          insertChild(n, d, x, y, x1, y1, x2, y2);\n        }\n      }\n      function insertChild(n, d, x, y, x1, y1, x2, y2) {\n        var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, right = x >= sx, bottom = y >= sy, i = (bottom << 1) + right;\n        n.leaf = false;\n        n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());\n        if (right) x1 = sx; else x2 = sx;\n        if (bottom) y1 = sy; else y2 = sy;\n        insert(n, d, x, y, x1, y1, x2, y2);\n      }\n      var root = d3_geom_quadtreeNode();\n      root.add = function(d) {\n        insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);\n      };\n      root.visit = function(f) {\n        d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);\n      };\n      i = -1;\n      if (x1 == null) {\n        while (++i < n) {\n          insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);\n        }\n        --i;\n      } else data.forEach(root.add);\n      xs = ys = data = d = null;\n      return root;\n    }\n    quadtree.x = function(_) {\n      return arguments.length ? (x = _, quadtree) : x;\n    };\n    quadtree.y = function(_) {\n      return arguments.length ? (y = _, quadtree) : y;\n    };\n    quadtree.extent = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], \n      y2 = +_[1][1];\n      return quadtree;\n    };\n    quadtree.size = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];\n      return quadtree;\n    };\n    return quadtree;\n  };\n  function d3_geom_quadtreeCompatX(d) {\n    return d.x;\n  }\n  function d3_geom_quadtreeCompatY(d) {\n    return d.y;\n  }\n  function d3_geom_quadtreeNode() {\n    return {\n      leaf: true,\n      nodes: [],\n      point: null,\n      x: null,\n      y: null\n    };\n  }\n  function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {\n    if (!f(node, x1, y1, x2, y2)) {\n      var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;\n      if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);\n      if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);\n      if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);\n      if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);\n    }\n  }\n  d3.interpolateRgb = d3_interpolateRgb;\n  function d3_interpolateRgb(a, b) {\n    a = d3.rgb(a);\n    b = d3.rgb(b);\n    var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;\n    return function(t) {\n      return \"#\" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));\n    };\n  }\n  d3.interpolateObject = d3_interpolateObject;\n  function d3_interpolateObject(a, b) {\n    var i = {}, c = {}, k;\n    for (k in a) {\n      if (k in b) {\n        i[k] = d3_interpolate(a[k], b[k]);\n      } else {\n        c[k] = a[k];\n      }\n    }\n    for (k in b) {\n      if (!(k in a)) {\n        c[k] = b[k];\n      }\n    }\n    return function(t) {\n      for (k in i) c[k] = i[k](t);\n      return c;\n    };\n  }\n  d3.interpolateNumber = d3_interpolateNumber;\n  function d3_interpolateNumber(a, b) {\n    b -= a = +a;\n    return function(t) {\n      return a + b * t;\n    };\n  }\n  d3.interpolateString = d3_interpolateString;\n  function d3_interpolateString(a, b) {\n    var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];\n    a = a + \"\", b = b + \"\";\n    while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {\n      if ((bs = bm.index) > bi) {\n        bs = b.substring(bi, bs);\n        if (s[i]) s[i] += bs; else s[++i] = bs;\n      }\n      if ((am = am[0]) === (bm = bm[0])) {\n        if (s[i]) s[i] += bm; else s[++i] = bm;\n      } else {\n        s[++i] = null;\n        q.push({\n          i: i,\n          x: d3_interpolateNumber(am, bm)\n        });\n      }\n      bi = d3_interpolate_numberB.lastIndex;\n    }\n    if (bi < b.length) {\n      bs = b.substring(bi);\n      if (s[i]) s[i] += bs; else s[++i] = bs;\n    }\n    return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {\n      return b(t) + \"\";\n    }) : function() {\n      return b;\n    } : (b = q.length, function(t) {\n      for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    });\n  }\n  var d3_interpolate_numberA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, \"g\");\n  d3.interpolate = d3_interpolate;\n  function d3_interpolate(a, b) {\n    var i = d3.interpolators.length, f;\n    while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;\n    return f;\n  }\n  d3.interpolators = [ function(a, b) {\n    var t = typeof b;\n    return (t === \"string\" ? d3_rgb_names.has(b) || /^(#|rgb\\(|hsl\\()/.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === \"object\" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);\n  } ];\n  d3.interpolateArray = d3_interpolateArray;\n  function d3_interpolateArray(a, b) {\n    var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;\n    for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));\n    for (;i < na; ++i) c[i] = a[i];\n    for (;i < nb; ++i) c[i] = b[i];\n    return function(t) {\n      for (i = 0; i < n0; ++i) c[i] = x[i](t);\n      return c;\n    };\n  }\n  var d3_ease_default = function() {\n    return d3_identity;\n  };\n  var d3_ease = d3.map({\n    linear: d3_ease_default,\n    poly: d3_ease_poly,\n    quad: function() {\n      return d3_ease_quad;\n    },\n    cubic: function() {\n      return d3_ease_cubic;\n    },\n    sin: function() {\n      return d3_ease_sin;\n    },\n    exp: function() {\n      return d3_ease_exp;\n    },\n    circle: function() {\n      return d3_ease_circle;\n    },\n    elastic: d3_ease_elastic,\n    back: d3_ease_back,\n    bounce: function() {\n      return d3_ease_bounce;\n    }\n  });\n  var d3_ease_mode = d3.map({\n    \"in\": d3_identity,\n    out: d3_ease_reverse,\n    \"in-out\": d3_ease_reflect,\n    \"out-in\": function(f) {\n      return d3_ease_reflect(d3_ease_reverse(f));\n    }\n  });\n  d3.ease = function(name) {\n    var i = name.indexOf(\"-\"), t = i >= 0 ? name.substring(0, i) : name, m = i >= 0 ? name.substring(i + 1) : \"in\";\n    t = d3_ease.get(t) || d3_ease_default;\n    m = d3_ease_mode.get(m) || d3_identity;\n    return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));\n  };\n  function d3_ease_clamp(f) {\n    return function(t) {\n      return t <= 0 ? 0 : t >= 1 ? 1 : f(t);\n    };\n  }\n  function d3_ease_reverse(f) {\n    return function(t) {\n      return 1 - f(1 - t);\n    };\n  }\n  function d3_ease_reflect(f) {\n    return function(t) {\n      return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));\n    };\n  }\n  function d3_ease_quad(t) {\n    return t * t;\n  }\n  function d3_ease_cubic(t) {\n    return t * t * t;\n  }\n  function d3_ease_cubicInOut(t) {\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n    var t2 = t * t, t3 = t2 * t;\n    return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);\n  }\n  function d3_ease_poly(e) {\n    return function(t) {\n      return Math.pow(t, e);\n    };\n  }\n  function d3_ease_sin(t) {\n    return 1 - Math.cos(t * halfπ);\n  }\n  function d3_ease_exp(t) {\n    return Math.pow(2, 10 * (t - 1));\n  }\n  function d3_ease_circle(t) {\n    return 1 - Math.sqrt(1 - t * t);\n  }\n  function d3_ease_elastic(a, p) {\n    var s;\n    if (arguments.length < 2) p = .45;\n    if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;\n    return function(t) {\n      return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);\n    };\n  }\n  function d3_ease_back(s) {\n    if (!s) s = 1.70158;\n    return function(t) {\n      return t * t * ((s + 1) * t - s);\n    };\n  }\n  function d3_ease_bounce(t) {\n    return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;\n  }\n  d3.interpolateHcl = d3_interpolateHcl;\n  function d3_interpolateHcl(a, b) {\n    a = d3.hcl(a);\n    b = d3.hcl(b);\n    var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;\n    if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateHsl = d3_interpolateHsl;\n  function d3_interpolateHsl(a, b) {\n    a = d3.hsl(a);\n    b = d3.hsl(b);\n    var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;\n    if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateLab = d3_interpolateLab;\n  function d3_interpolateLab(a, b) {\n    a = d3.lab(a);\n    b = d3.lab(b);\n    var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;\n    return function(t) {\n      return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + \"\";\n    };\n  }\n  d3.interpolateRound = d3_interpolateRound;\n  function d3_interpolateRound(a, b) {\n    b -= a;\n    return function(t) {\n      return Math.round(a + b * t);\n    };\n  }\n  d3.transform = function(string) {\n    var g = d3_document.createElementNS(d3.ns.prefix.svg, \"g\");\n    return (d3.transform = function(string) {\n      if (string != null) {\n        g.setAttribute(\"transform\", string);\n        var t = g.transform.baseVal.consolidate();\n      }\n      return new d3_transform(t ? t.matrix : d3_transformIdentity);\n    })(string);\n  };\n  function d3_transform(m) {\n    var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;\n    if (r0[0] * r1[1] < r1[0] * r0[1]) {\n      r0[0] *= -1;\n      r0[1] *= -1;\n      kx *= -1;\n      kz *= -1;\n    }\n    this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;\n    this.translate = [ m.e, m.f ];\n    this.scale = [ kx, ky ];\n    this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;\n  }\n  d3_transform.prototype.toString = function() {\n    return \"translate(\" + this.translate + \")rotate(\" + this.rotate + \")skewX(\" + this.skew + \")scale(\" + this.scale + \")\";\n  };\n  function d3_transformDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1];\n  }\n  function d3_transformNormalize(a) {\n    var k = Math.sqrt(d3_transformDot(a, a));\n    if (k) {\n      a[0] /= k;\n      a[1] /= k;\n    }\n    return k;\n  }\n  function d3_transformCombine(a, b, k) {\n    a[0] += k * b[0];\n    a[1] += k * b[1];\n    return a;\n  }\n  var d3_transformIdentity = {\n    a: 1,\n    b: 0,\n    c: 0,\n    d: 1,\n    e: 0,\n    f: 0\n  };\n  d3.interpolateTransform = d3_interpolateTransform;\n  function d3_interpolateTransform(a, b) {\n    var s = [], q = [], n, A = d3.transform(a), B = d3.transform(b), ta = A.translate, tb = B.translate, ra = A.rotate, rb = B.rotate, wa = A.skew, wb = B.skew, ka = A.scale, kb = B.scale;\n    if (ta[0] != tb[0] || ta[1] != tb[1]) {\n      s.push(\"translate(\", null, \",\", null, \")\");\n      q.push({\n        i: 1,\n        x: d3_interpolateNumber(ta[0], tb[0])\n      }, {\n        i: 3,\n        x: d3_interpolateNumber(ta[1], tb[1])\n      });\n    } else if (tb[0] || tb[1]) {\n      s.push(\"translate(\" + tb + \")\");\n    } else {\n      s.push(\"\");\n    }\n    if (ra != rb) {\n      if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;\n      q.push({\n        i: s.push(s.pop() + \"rotate(\", null, \")\") - 2,\n        x: d3_interpolateNumber(ra, rb)\n      });\n    } else if (rb) {\n      s.push(s.pop() + \"rotate(\" + rb + \")\");\n    }\n    if (wa != wb) {\n      q.push({\n        i: s.push(s.pop() + \"skewX(\", null, \")\") - 2,\n        x: d3_interpolateNumber(wa, wb)\n      });\n    } else if (wb) {\n      s.push(s.pop() + \"skewX(\" + wb + \")\");\n    }\n    if (ka[0] != kb[0] || ka[1] != kb[1]) {\n      n = s.push(s.pop() + \"scale(\", null, \",\", null, \")\");\n      q.push({\n        i: n - 4,\n        x: d3_interpolateNumber(ka[0], kb[0])\n      }, {\n        i: n - 2,\n        x: d3_interpolateNumber(ka[1], kb[1])\n      });\n    } else if (kb[0] != 1 || kb[1] != 1) {\n      s.push(s.pop() + \"scale(\" + kb + \")\");\n    }\n    n = q.length;\n    return function(t) {\n      var i = -1, o;\n      while (++i < n) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    };\n  }\n  function d3_uninterpolateNumber(a, b) {\n    b = b - (a = +a) ? 1 / (b - a) : 0;\n    return function(x) {\n      return (x - a) * b;\n    };\n  }\n  function d3_uninterpolateClamp(a, b) {\n    b = b - (a = +a) ? 1 / (b - a) : 0;\n    return function(x) {\n      return Math.max(0, Math.min(1, (x - a) * b));\n    };\n  }\n  d3.layout = {};\n  d3.layout.bundle = function() {\n    return function(links) {\n      var paths = [], i = -1, n = links.length;\n      while (++i < n) paths.push(d3_layout_bundlePath(links[i]));\n      return paths;\n    };\n  };\n  function d3_layout_bundlePath(link) {\n    var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];\n    while (start !== lca) {\n      start = start.parent;\n      points.push(start);\n    }\n    var k = points.length;\n    while (end !== lca) {\n      points.splice(k, 0, end);\n      end = end.parent;\n    }\n    return points;\n  }\n  function d3_layout_bundleAncestors(node) {\n    var ancestors = [], parent = node.parent;\n    while (parent != null) {\n      ancestors.push(node);\n      node = parent;\n      parent = parent.parent;\n    }\n    ancestors.push(node);\n    return ancestors;\n  }\n  function d3_layout_bundleLeastCommonAncestor(a, b) {\n    if (a === b) return a;\n    var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;\n    while (aNode === bNode) {\n      sharedNode = aNode;\n      aNode = aNodes.pop();\n      bNode = bNodes.pop();\n    }\n    return sharedNode;\n  }\n  d3.layout.chord = function() {\n    var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;\n    function relayout() {\n      var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;\n      chords = [];\n      groups = [];\n      k = 0, i = -1;\n      while (++i < n) {\n        x = 0, j = -1;\n        while (++j < n) {\n          x += matrix[i][j];\n        }\n        groupSums.push(x);\n        subgroupIndex.push(d3.range(n));\n        k += x;\n      }\n      if (sortGroups) {\n        groupIndex.sort(function(a, b) {\n          return sortGroups(groupSums[a], groupSums[b]);\n        });\n      }\n      if (sortSubgroups) {\n        subgroupIndex.forEach(function(d, i) {\n          d.sort(function(a, b) {\n            return sortSubgroups(matrix[i][a], matrix[i][b]);\n          });\n        });\n      }\n      k = (τ - padding * n) / k;\n      x = 0, i = -1;\n      while (++i < n) {\n        x0 = x, j = -1;\n        while (++j < n) {\n          var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;\n          subgroups[di + \"-\" + dj] = {\n            index: di,\n            subindex: dj,\n            startAngle: a0,\n            endAngle: a1,\n            value: v\n          };\n        }\n        groups[di] = {\n          index: di,\n          startAngle: x0,\n          endAngle: x,\n          value: (x - x0) / k\n        };\n        x += padding;\n      }\n      i = -1;\n      while (++i < n) {\n        j = i - 1;\n        while (++j < n) {\n          var source = subgroups[i + \"-\" + j], target = subgroups[j + \"-\" + i];\n          if (source.value || target.value) {\n            chords.push(source.value < target.value ? {\n              source: target,\n              target: source\n            } : {\n              source: source,\n              target: target\n            });\n          }\n        }\n      }\n      if (sortChords) resort();\n    }\n    function resort() {\n      chords.sort(function(a, b) {\n        return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);\n      });\n    }\n    chord.matrix = function(x) {\n      if (!arguments.length) return matrix;\n      n = (matrix = x) && matrix.length;\n      chords = groups = null;\n      return chord;\n    };\n    chord.padding = function(x) {\n      if (!arguments.length) return padding;\n      padding = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortGroups = function(x) {\n      if (!arguments.length) return sortGroups;\n      sortGroups = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortSubgroups = function(x) {\n      if (!arguments.length) return sortSubgroups;\n      sortSubgroups = x;\n      chords = null;\n      return chord;\n    };\n    chord.sortChords = function(x) {\n      if (!arguments.length) return sortChords;\n      sortChords = x;\n      if (chords) resort();\n      return chord;\n    };\n    chord.chords = function() {\n      if (!chords) relayout();\n      return chords;\n    };\n    chord.groups = function() {\n      if (!groups) relayout();\n      return groups;\n    };\n    return chord;\n  };\n  d3.layout.force = function() {\n    var force = {}, event = d3.dispatch(\"start\", \"tick\", \"end\"), size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;\n    function repulse(node) {\n      return function(quad, x1, _, x2) {\n        if (quad.point !== node) {\n          var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;\n          if (dw * dw / theta2 < dn) {\n            if (dn < chargeDistance2) {\n              var k = quad.charge / dn;\n              node.px -= dx * k;\n              node.py -= dy * k;\n            }\n            return true;\n          }\n          if (quad.point && dn && dn < chargeDistance2) {\n            var k = quad.pointCharge / dn;\n            node.px -= dx * k;\n            node.py -= dy * k;\n          }\n        }\n        return !quad.charge;\n      };\n    }\n    force.tick = function() {\n      if ((alpha *= .99) < .005) {\n        event.end({\n          type: \"end\",\n          alpha: alpha = 0\n        });\n        return true;\n      }\n      var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        s = o.source;\n        t = o.target;\n        x = t.x - s.x;\n        y = t.y - s.y;\n        if (l = x * x + y * y) {\n          l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;\n          x *= l;\n          y *= l;\n          t.x -= x * (k = s.weight / (t.weight + s.weight));\n          t.y -= y * k;\n          s.x += x * (k = 1 - k);\n          s.y += y * k;\n        }\n      }\n      if (k = alpha * gravity) {\n        x = size[0] / 2;\n        y = size[1] / 2;\n        i = -1;\n        if (k) while (++i < n) {\n          o = nodes[i];\n          o.x += (x - o.x) * k;\n          o.y += (y - o.y) * k;\n        }\n      }\n      if (charge) {\n        d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);\n        i = -1;\n        while (++i < n) {\n          if (!(o = nodes[i]).fixed) {\n            q.visit(repulse(o));\n          }\n        }\n      }\n      i = -1;\n      while (++i < n) {\n        o = nodes[i];\n        if (o.fixed) {\n          o.x = o.px;\n          o.y = o.py;\n        } else {\n          o.x -= (o.px - (o.px = o.x)) * friction;\n          o.y -= (o.py - (o.py = o.y)) * friction;\n        }\n      }\n      event.tick({\n        type: \"tick\",\n        alpha: alpha\n      });\n    };\n    force.nodes = function(x) {\n      if (!arguments.length) return nodes;\n      nodes = x;\n      return force;\n    };\n    force.links = function(x) {\n      if (!arguments.length) return links;\n      links = x;\n      return force;\n    };\n    force.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return force;\n    };\n    force.linkDistance = function(x) {\n      if (!arguments.length) return linkDistance;\n      linkDistance = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.distance = force.linkDistance;\n    force.linkStrength = function(x) {\n      if (!arguments.length) return linkStrength;\n      linkStrength = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.friction = function(x) {\n      if (!arguments.length) return friction;\n      friction = +x;\n      return force;\n    };\n    force.charge = function(x) {\n      if (!arguments.length) return charge;\n      charge = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.chargeDistance = function(x) {\n      if (!arguments.length) return Math.sqrt(chargeDistance2);\n      chargeDistance2 = x * x;\n      return force;\n    };\n    force.gravity = function(x) {\n      if (!arguments.length) return gravity;\n      gravity = +x;\n      return force;\n    };\n    force.theta = function(x) {\n      if (!arguments.length) return Math.sqrt(theta2);\n      theta2 = x * x;\n      return force;\n    };\n    force.alpha = function(x) {\n      if (!arguments.length) return alpha;\n      x = +x;\n      if (alpha) {\n        if (x > 0) alpha = x; else alpha = 0;\n      } else if (x > 0) {\n        event.start({\n          type: \"start\",\n          alpha: alpha = x\n        });\n        d3.timer(force.tick);\n      }\n      return force;\n    };\n    force.start = function() {\n      var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;\n      for (i = 0; i < n; ++i) {\n        (o = nodes[i]).index = i;\n        o.weight = 0;\n      }\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        if (typeof o.source == \"number\") o.source = nodes[o.source];\n        if (typeof o.target == \"number\") o.target = nodes[o.target];\n        ++o.source.weight;\n        ++o.target.weight;\n      }\n      for (i = 0; i < n; ++i) {\n        o = nodes[i];\n        if (isNaN(o.x)) o.x = position(\"x\", w);\n        if (isNaN(o.y)) o.y = position(\"y\", h);\n        if (isNaN(o.px)) o.px = o.x;\n        if (isNaN(o.py)) o.py = o.y;\n      }\n      distances = [];\n      if (typeof linkDistance === \"function\") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;\n      strengths = [];\n      if (typeof linkStrength === \"function\") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;\n      charges = [];\n      if (typeof charge === \"function\") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;\n      function position(dimension, size) {\n        if (!neighbors) {\n          neighbors = new Array(n);\n          for (j = 0; j < n; ++j) {\n            neighbors[j] = [];\n          }\n          for (j = 0; j < m; ++j) {\n            var o = links[j];\n            neighbors[o.source.index].push(o.target);\n            neighbors[o.target.index].push(o.source);\n          }\n        }\n        var candidates = neighbors[i], j = -1, m = candidates.length, x;\n        while (++j < m) if (!isNaN(x = candidates[j][dimension])) return x;\n        return Math.random() * size;\n      }\n      return force.resume();\n    };\n    force.resume = function() {\n      return force.alpha(.1);\n    };\n    force.stop = function() {\n      return force.alpha(0);\n    };\n    force.drag = function() {\n      if (!drag) drag = d3.behavior.drag().origin(d3_identity).on(\"dragstart.force\", d3_layout_forceDragstart).on(\"drag.force\", dragmove).on(\"dragend.force\", d3_layout_forceDragend);\n      if (!arguments.length) return drag;\n      this.on(\"mouseover.force\", d3_layout_forceMouseover).on(\"mouseout.force\", d3_layout_forceMouseout).call(drag);\n    };\n    function dragmove(d) {\n      d.px = d3.event.x, d.py = d3.event.y;\n      force.resume();\n    }\n    return d3.rebind(force, event, \"on\");\n  };\n  function d3_layout_forceDragstart(d) {\n    d.fixed |= 2;\n  }\n  function d3_layout_forceDragend(d) {\n    d.fixed &= ~6;\n  }\n  function d3_layout_forceMouseover(d) {\n    d.fixed |= 4;\n    d.px = d.x, d.py = d.y;\n  }\n  function d3_layout_forceMouseout(d) {\n    d.fixed &= ~4;\n  }\n  function d3_layout_forceAccumulate(quad, alpha, charges) {\n    var cx = 0, cy = 0;\n    quad.charge = 0;\n    if (!quad.leaf) {\n      var nodes = quad.nodes, n = nodes.length, i = -1, c;\n      while (++i < n) {\n        c = nodes[i];\n        if (c == null) continue;\n        d3_layout_forceAccumulate(c, alpha, charges);\n        quad.charge += c.charge;\n        cx += c.charge * c.cx;\n        cy += c.charge * c.cy;\n      }\n    }\n    if (quad.point) {\n      if (!quad.leaf) {\n        quad.point.x += Math.random() - .5;\n        quad.point.y += Math.random() - .5;\n      }\n      var k = alpha * charges[quad.point.index];\n      quad.charge += quad.pointCharge = k;\n      cx += k * quad.point.x;\n      cy += k * quad.point.y;\n    }\n    quad.cx = cx / quad.charge;\n    quad.cy = cy / quad.charge;\n  }\n  var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;\n  d3.layout.hierarchy = function() {\n    var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;\n    function hierarchy(root) {\n      var stack = [ root ], nodes = [], node;\n      root.depth = 0;\n      while ((node = stack.pop()) != null) {\n        nodes.push(node);\n        if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {\n          var n, childs, child;\n          while (--n >= 0) {\n            stack.push(child = childs[n]);\n            child.parent = node;\n            child.depth = node.depth + 1;\n          }\n          if (value) node.value = 0;\n          node.children = childs;\n        } else {\n          if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;\n          delete node.children;\n        }\n      }\n      d3_layout_hierarchyVisitAfter(root, function(node) {\n        var childs, parent;\n        if (sort && (childs = node.children)) childs.sort(sort);\n        if (value && (parent = node.parent)) parent.value += node.value;\n      });\n      return nodes;\n    }\n    hierarchy.sort = function(x) {\n      if (!arguments.length) return sort;\n      sort = x;\n      return hierarchy;\n    };\n    hierarchy.children = function(x) {\n      if (!arguments.length) return children;\n      children = x;\n      return hierarchy;\n    };\n    hierarchy.value = function(x) {\n      if (!arguments.length) return value;\n      value = x;\n      return hierarchy;\n    };\n    hierarchy.revalue = function(root) {\n      if (value) {\n        d3_layout_hierarchyVisitBefore(root, function(node) {\n          if (node.children) node.value = 0;\n        });\n        d3_layout_hierarchyVisitAfter(root, function(node) {\n          var parent;\n          if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;\n          if (parent = node.parent) parent.value += node.value;\n        });\n      }\n      return root;\n    };\n    return hierarchy;\n  };\n  function d3_layout_hierarchyRebind(object, hierarchy) {\n    d3.rebind(object, hierarchy, \"sort\", \"children\", \"value\");\n    object.nodes = object;\n    object.links = d3_layout_hierarchyLinks;\n    return object;\n  }\n  function d3_layout_hierarchyVisitBefore(node, callback) {\n    var nodes = [ node ];\n    while ((node = nodes.pop()) != null) {\n      callback(node);\n      if ((children = node.children) && (n = children.length)) {\n        var n, children;\n        while (--n >= 0) nodes.push(children[n]);\n      }\n    }\n  }\n  function d3_layout_hierarchyVisitAfter(node, callback) {\n    var nodes = [ node ], nodes2 = [];\n    while ((node = nodes.pop()) != null) {\n      nodes2.push(node);\n      if ((children = node.children) && (n = children.length)) {\n        var i = -1, n, children;\n        while (++i < n) nodes.push(children[i]);\n      }\n    }\n    while ((node = nodes2.pop()) != null) {\n      callback(node);\n    }\n  }\n  function d3_layout_hierarchyChildren(d) {\n    return d.children;\n  }\n  function d3_layout_hierarchyValue(d) {\n    return d.value;\n  }\n  function d3_layout_hierarchySort(a, b) {\n    return b.value - a.value;\n  }\n  function d3_layout_hierarchyLinks(nodes) {\n    return d3.merge(nodes.map(function(parent) {\n      return (parent.children || []).map(function(child) {\n        return {\n          source: parent,\n          target: child\n        };\n      });\n    }));\n  }\n  d3.layout.partition = function() {\n    var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];\n    function position(node, x, dx, dy) {\n      var children = node.children;\n      node.x = x;\n      node.y = node.depth * dy;\n      node.dx = dx;\n      node.dy = dy;\n      if (children && (n = children.length)) {\n        var i = -1, n, c, d;\n        dx = node.value ? dx / node.value : 0;\n        while (++i < n) {\n          position(c = children[i], x, d = c.value * dx, dy);\n          x += d;\n        }\n      }\n    }\n    function depth(node) {\n      var children = node.children, d = 0;\n      if (children && (n = children.length)) {\n        var i = -1, n;\n        while (++i < n) d = Math.max(d, depth(children[i]));\n      }\n      return 1 + d;\n    }\n    function partition(d, i) {\n      var nodes = hierarchy.call(this, d, i);\n      position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));\n      return nodes;\n    }\n    partition.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return partition;\n    };\n    return d3_layout_hierarchyRebind(partition, hierarchy);\n  };\n  d3.layout.pie = function() {\n    var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ;\n    function pie(data) {\n      var values = data.map(function(d, i) {\n        return +value.call(pie, d, i);\n      });\n      var a = +(typeof startAngle === \"function\" ? startAngle.apply(this, arguments) : startAngle);\n      var k = ((typeof endAngle === \"function\" ? endAngle.apply(this, arguments) : endAngle) - a) / d3.sum(values);\n      var index = d3.range(data.length);\n      if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {\n        return values[j] - values[i];\n      } : function(i, j) {\n        return sort(data[i], data[j]);\n      });\n      var arcs = [];\n      index.forEach(function(i) {\n        var d;\n        arcs[i] = {\n          data: data[i],\n          value: d = values[i],\n          startAngle: a,\n          endAngle: a += d * k\n        };\n      });\n      return arcs;\n    }\n    pie.value = function(x) {\n      if (!arguments.length) return value;\n      value = x;\n      return pie;\n    };\n    pie.sort = function(x) {\n      if (!arguments.length) return sort;\n      sort = x;\n      return pie;\n    };\n    pie.startAngle = function(x) {\n      if (!arguments.length) return startAngle;\n      startAngle = x;\n      return pie;\n    };\n    pie.endAngle = function(x) {\n      if (!arguments.length) return endAngle;\n      endAngle = x;\n      return pie;\n    };\n    return pie;\n  };\n  var d3_layout_pieSortByValue = {};\n  d3.layout.stack = function() {\n    var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;\n    function stack(data, index) {\n      var series = data.map(function(d, i) {\n        return values.call(stack, d, i);\n      });\n      var points = series.map(function(d) {\n        return d.map(function(v, i) {\n          return [ x.call(stack, v, i), y.call(stack, v, i) ];\n        });\n      });\n      var orders = order.call(stack, points, index);\n      series = d3.permute(series, orders);\n      points = d3.permute(points, orders);\n      var offsets = offset.call(stack, points, index);\n      var n = series.length, m = series[0].length, i, j, o;\n      for (j = 0; j < m; ++j) {\n        out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);\n        for (i = 1; i < n; ++i) {\n          out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);\n        }\n      }\n      return data;\n    }\n    stack.values = function(x) {\n      if (!arguments.length) return values;\n      values = x;\n      return stack;\n    };\n    stack.order = function(x) {\n      if (!arguments.length) return order;\n      order = typeof x === \"function\" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;\n      return stack;\n    };\n    stack.offset = function(x) {\n      if (!arguments.length) return offset;\n      offset = typeof x === \"function\" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;\n      return stack;\n    };\n    stack.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      return stack;\n    };\n    stack.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      return stack;\n    };\n    stack.out = function(z) {\n      if (!arguments.length) return out;\n      out = z;\n      return stack;\n    };\n    return stack;\n  };\n  function d3_layout_stackX(d) {\n    return d.x;\n  }\n  function d3_layout_stackY(d) {\n    return d.y;\n  }\n  function d3_layout_stackOut(d, y0, y) {\n    d.y0 = y0;\n    d.y = y;\n  }\n  var d3_layout_stackOrders = d3.map({\n    \"inside-out\": function(data) {\n      var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {\n        return max[a] - max[b];\n      }), top = 0, bottom = 0, tops = [], bottoms = [];\n      for (i = 0; i < n; ++i) {\n        j = index[i];\n        if (top < bottom) {\n          top += sums[j];\n          tops.push(j);\n        } else {\n          bottom += sums[j];\n          bottoms.push(j);\n        }\n      }\n      return bottoms.reverse().concat(tops);\n    },\n    reverse: function(data) {\n      return d3.range(data.length).reverse();\n    },\n    \"default\": d3_layout_stackOrderDefault\n  });\n  var d3_layout_stackOffsets = d3.map({\n    silhouette: function(data) {\n      var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o > max) max = o;\n        sums.push(o);\n      }\n      for (j = 0; j < m; ++j) {\n        y0[j] = (max - sums[j]) / 2;\n      }\n      return y0;\n    },\n    wiggle: function(data) {\n      var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];\n      y0[0] = o = o0 = 0;\n      for (j = 1; j < m; ++j) {\n        for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];\n        for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {\n          for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {\n            s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;\n          }\n          s2 += s3 * data[i][j][1];\n        }\n        y0[j] = o -= s1 ? s2 / s1 * dx : 0;\n        if (o < o0) o0 = o;\n      }\n      for (j = 0; j < m; ++j) y0[j] -= o0;\n      return y0;\n    },\n    expand: function(data) {\n      var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;\n      }\n      for (j = 0; j < m; ++j) y0[j] = 0;\n      return y0;\n    },\n    zero: d3_layout_stackOffsetZero\n  });\n  function d3_layout_stackOrderDefault(data) {\n    return d3.range(data.length);\n  }\n  function d3_layout_stackOffsetZero(data) {\n    var j = -1, m = data[0].length, y0 = [];\n    while (++j < m) y0[j] = 0;\n    return y0;\n  }\n  function d3_layout_stackMaxIndex(array) {\n    var i = 1, j = 0, v = array[0][1], k, n = array.length;\n    for (;i < n; ++i) {\n      if ((k = array[i][1]) > v) {\n        j = i;\n        v = k;\n      }\n    }\n    return j;\n  }\n  function d3_layout_stackReduceSum(d) {\n    return d.reduce(d3_layout_stackSum, 0);\n  }\n  function d3_layout_stackSum(p, d) {\n    return p + d[1];\n  }\n  d3.layout.histogram = function() {\n    var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;\n    function histogram(data, i) {\n      var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;\n      while (++i < m) {\n        bin = bins[i] = [];\n        bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);\n        bin.y = 0;\n      }\n      if (m > 0) {\n        i = -1;\n        while (++i < n) {\n          x = values[i];\n          if (x >= range[0] && x <= range[1]) {\n            bin = bins[d3.bisect(thresholds, x, 1, m) - 1];\n            bin.y += k;\n            bin.push(data[i]);\n          }\n        }\n      }\n      return bins;\n    }\n    histogram.value = function(x) {\n      if (!arguments.length) return valuer;\n      valuer = x;\n      return histogram;\n    };\n    histogram.range = function(x) {\n      if (!arguments.length) return ranger;\n      ranger = d3_functor(x);\n      return histogram;\n    };\n    histogram.bins = function(x) {\n      if (!arguments.length) return binner;\n      binner = typeof x === \"number\" ? function(range) {\n        return d3_layout_histogramBinFixed(range, x);\n      } : d3_functor(x);\n      return histogram;\n    };\n    histogram.frequency = function(x) {\n      if (!arguments.length) return frequency;\n      frequency = !!x;\n      return histogram;\n    };\n    return histogram;\n  };\n  function d3_layout_histogramBinSturges(range, values) {\n    return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));\n  }\n  function d3_layout_histogramBinFixed(range, n) {\n    var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];\n    while (++x <= n) f[x] = m * x + b;\n    return f;\n  }\n  function d3_layout_histogramRange(values) {\n    return [ d3.min(values), d3.max(values) ];\n  }\n  d3.layout.pack = function() {\n    var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;\n    function pack(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === \"function\" ? radius : function() {\n        return radius;\n      };\n      root.x = root.y = 0;\n      d3_layout_hierarchyVisitAfter(root, function(d) {\n        d.r = +r(d.value);\n      });\n      d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n      if (padding) {\n        var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;\n        d3_layout_hierarchyVisitAfter(root, function(d) {\n          d.r += dr;\n        });\n        d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n        d3_layout_hierarchyVisitAfter(root, function(d) {\n          d.r -= dr;\n        });\n      }\n      d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));\n      return nodes;\n    }\n    pack.size = function(_) {\n      if (!arguments.length) return size;\n      size = _;\n      return pack;\n    };\n    pack.radius = function(_) {\n      if (!arguments.length) return radius;\n      radius = _ == null || typeof _ === \"function\" ? _ : +_;\n      return pack;\n    };\n    pack.padding = function(_) {\n      if (!arguments.length) return padding;\n      padding = +_;\n      return pack;\n    };\n    return d3_layout_hierarchyRebind(pack, hierarchy);\n  };\n  function d3_layout_packSort(a, b) {\n    return a.value - b.value;\n  }\n  function d3_layout_packInsert(a, b) {\n    var c = a._pack_next;\n    a._pack_next = b;\n    b._pack_prev = a;\n    b._pack_next = c;\n    c._pack_prev = b;\n  }\n  function d3_layout_packSplice(a, b) {\n    a._pack_next = b;\n    b._pack_prev = a;\n  }\n  function d3_layout_packIntersects(a, b) {\n    var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;\n    return .999 * dr * dr > dx * dx + dy * dy;\n  }\n  function d3_layout_packSiblings(node) {\n    if (!(nodes = node.children) || !(n = nodes.length)) return;\n    var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;\n    function bound(node) {\n      xMin = Math.min(node.x - node.r, xMin);\n      xMax = Math.max(node.x + node.r, xMax);\n      yMin = Math.min(node.y - node.r, yMin);\n      yMax = Math.max(node.y + node.r, yMax);\n    }\n    nodes.forEach(d3_layout_packLink);\n    a = nodes[0];\n    a.x = -a.r;\n    a.y = 0;\n    bound(a);\n    if (n > 1) {\n      b = nodes[1];\n      b.x = b.r;\n      b.y = 0;\n      bound(b);\n      if (n > 2) {\n        c = nodes[2];\n        d3_layout_packPlace(a, b, c);\n        bound(c);\n        d3_layout_packInsert(a, c);\n        a._pack_prev = c;\n        d3_layout_packInsert(c, b);\n        b = a._pack_next;\n        for (i = 3; i < n; i++) {\n          d3_layout_packPlace(a, b, c = nodes[i]);\n          var isect = 0, s1 = 1, s2 = 1;\n          for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {\n            if (d3_layout_packIntersects(j, c)) {\n              isect = 1;\n              break;\n            }\n          }\n          if (isect == 1) {\n            for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {\n              if (d3_layout_packIntersects(k, c)) {\n                break;\n              }\n            }\n          }\n          if (isect) {\n            if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);\n            i--;\n          } else {\n            d3_layout_packInsert(a, c);\n            b = c;\n            bound(c);\n          }\n        }\n      }\n    }\n    var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;\n    for (i = 0; i < n; i++) {\n      c = nodes[i];\n      c.x -= cx;\n      c.y -= cy;\n      cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));\n    }\n    node.r = cr;\n    nodes.forEach(d3_layout_packUnlink);\n  }\n  function d3_layout_packLink(node) {\n    node._pack_next = node._pack_prev = node;\n  }\n  function d3_layout_packUnlink(node) {\n    delete node._pack_next;\n    delete node._pack_prev;\n  }\n  function d3_layout_packTransform(node, x, y, k) {\n    var children = node.children;\n    node.x = x += k * node.x;\n    node.y = y += k * node.y;\n    node.r *= k;\n    if (children) {\n      var i = -1, n = children.length;\n      while (++i < n) d3_layout_packTransform(children[i], x, y, k);\n    }\n  }\n  function d3_layout_packPlace(a, b, c) {\n    var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;\n    if (db && (dx || dy)) {\n      var da = b.r + c.r, dc = dx * dx + dy * dy;\n      da *= da;\n      db *= db;\n      var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);\n      c.x = a.x + x * dx + y * dy;\n      c.y = a.y + x * dy - y * dx;\n    } else {\n      c.x = a.x + db;\n      c.y = a.y;\n    }\n  }\n  d3.layout.tree = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;\n    function tree(d, i) {\n      var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);\n      d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;\n      d3_layout_hierarchyVisitBefore(root1, secondWalk);\n      if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {\n        var left = root0, right = root0, bottom = root0;\n        d3_layout_hierarchyVisitBefore(root0, function(node) {\n          if (node.x < left.x) left = node;\n          if (node.x > right.x) right = node;\n          if (node.depth > bottom.depth) bottom = node;\n        });\n        var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);\n        d3_layout_hierarchyVisitBefore(root0, function(node) {\n          node.x = (node.x + tx) * kx;\n          node.y = node.depth * ky;\n        });\n      }\n      return nodes;\n    }\n    function wrapTree(root0) {\n      var root1 = {\n        A: null,\n        children: [ root0 ]\n      }, queue = [ root1 ], node1;\n      while ((node1 = queue.pop()) != null) {\n        for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {\n          queue.push((children[i] = child = {\n            _: children[i],\n            parent: node1,\n            children: (child = children[i].children) && child.slice() || [],\n            A: null,\n            a: null,\n            z: 0,\n            m: 0,\n            c: 0,\n            s: 0,\n            t: null,\n            i: i\n          }).a = child);\n        }\n      }\n      return root1.children[0];\n    }\n    function firstWalk(v) {\n      var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;\n      if (children.length) {\n        d3_layout_treeShift(v);\n        var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n        if (w) {\n          v.z = w.z + separation(v._, w._);\n          v.m = v.z - midpoint;\n        } else {\n          v.z = midpoint;\n        }\n      } else if (w) {\n        v.z = w.z + separation(v._, w._);\n      }\n      v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n    }\n    function secondWalk(v) {\n      v._.x = v.z + v.parent.m;\n      v.m += v.parent.m;\n    }\n    function apportion(v, w, ancestor) {\n      if (w) {\n        var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n        while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {\n          vom = d3_layout_treeLeft(vom);\n          vop = d3_layout_treeRight(vop);\n          vop.a = v;\n          shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n          if (shift > 0) {\n            d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);\n            sip += shift;\n            sop += shift;\n          }\n          sim += vim.m;\n          sip += vip.m;\n          som += vom.m;\n          sop += vop.m;\n        }\n        if (vim && !d3_layout_treeRight(vop)) {\n          vop.t = vim;\n          vop.m += sim - sop;\n        }\n        if (vip && !d3_layout_treeLeft(vom)) {\n          vom.t = vip;\n          vom.m += sip - som;\n          ancestor = v;\n        }\n      }\n      return ancestor;\n    }\n    function sizeNode(node) {\n      node.x *= size[0];\n      node.y = node.depth * size[1];\n    }\n    tree.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return tree;\n    };\n    tree.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null ? sizeNode : null;\n      return tree;\n    };\n    tree.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) == null ? null : sizeNode;\n      return tree;\n    };\n    return d3_layout_hierarchyRebind(tree, hierarchy);\n  };\n  function d3_layout_treeSeparation(a, b) {\n    return a.parent == b.parent ? 1 : 2;\n  }\n  function d3_layout_treeLeft(v) {\n    var children = v.children;\n    return children.length ? children[0] : v.t;\n  }\n  function d3_layout_treeRight(v) {\n    var children = v.children, n;\n    return (n = children.length) ? children[n - 1] : v.t;\n  }\n  function d3_layout_treeMove(wm, wp, shift) {\n    var change = shift / (wp.i - wm.i);\n    wp.c -= change;\n    wp.s += shift;\n    wm.c += change;\n    wp.z += shift;\n    wp.m += shift;\n  }\n  function d3_layout_treeShift(v) {\n    var shift = 0, change = 0, children = v.children, i = children.length, w;\n    while (--i >= 0) {\n      w = children[i];\n      w.z += shift;\n      w.m += shift;\n      shift += w.s + (change += w.c);\n    }\n  }\n  function d3_layout_treeAncestor(vim, v, ancestor) {\n    return vim.a.parent === v.parent ? vim.a : ancestor;\n  }\n  d3.layout.cluster = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;\n    function cluster(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;\n      d3_layout_hierarchyVisitAfter(root, function(node) {\n        var children = node.children;\n        if (children && children.length) {\n          node.x = d3_layout_clusterX(children);\n          node.y = d3_layout_clusterY(children);\n        } else {\n          node.x = previousNode ? x += separation(node, previousNode) : 0;\n          node.y = 0;\n          previousNode = node;\n        }\n      });\n      var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;\n      d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {\n        node.x = (node.x - root.x) * size[0];\n        node.y = (root.y - node.y) * size[1];\n      } : function(node) {\n        node.x = (node.x - x0) / (x1 - x0) * size[0];\n        node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];\n      });\n      return nodes;\n    }\n    cluster.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return cluster;\n    };\n    cluster.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null;\n      return cluster;\n    };\n    cluster.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) != null;\n      return cluster;\n    };\n    return d3_layout_hierarchyRebind(cluster, hierarchy);\n  };\n  function d3_layout_clusterY(children) {\n    return 1 + d3.max(children, function(child) {\n      return child.y;\n    });\n  }\n  function d3_layout_clusterX(children) {\n    return children.reduce(function(x, child) {\n      return x + child.x;\n    }, 0) / children.length;\n  }\n  function d3_layout_clusterLeft(node) {\n    var children = node.children;\n    return children && children.length ? d3_layout_clusterLeft(children[0]) : node;\n  }\n  function d3_layout_clusterRight(node) {\n    var children = node.children, n;\n    return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;\n  }\n  d3.layout.treemap = function() {\n    var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = \"squarify\", ratio = .5 * (1 + Math.sqrt(5));\n    function scale(children, k) {\n      var i = -1, n = children.length, child, area;\n      while (++i < n) {\n        area = (child = children[i]).value * (k < 0 ? 0 : k);\n        child.area = isNaN(area) || area <= 0 ? 0 : area;\n      }\n    }\n    function squarify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === \"slice\" ? rect.dx : mode === \"dice\" ? rect.dy : mode === \"slice-dice\" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while ((n = remaining.length) > 0) {\n          row.push(child = remaining[n - 1]);\n          row.area += child.area;\n          if (mode !== \"squarify\" || (score = worst(row, u)) <= best) {\n            remaining.pop();\n            best = score;\n          } else {\n            row.area -= row.pop().area;\n            position(row, u, rect, false);\n            u = Math.min(rect.dx, rect.dy);\n            row.length = row.area = 0;\n            best = Infinity;\n          }\n        }\n        if (row.length) {\n          position(row, u, rect, true);\n          row.length = row.area = 0;\n        }\n        children.forEach(squarify);\n      }\n    }\n    function stickify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), remaining = children.slice(), child, row = [];\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while (child = remaining.pop()) {\n          row.push(child);\n          row.area += child.area;\n          if (child.z != null) {\n            position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);\n            row.length = row.area = 0;\n          }\n        }\n        children.forEach(stickify);\n      }\n    }\n    function worst(row, u) {\n      var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;\n      while (++i < n) {\n        if (!(r = row[i].area)) continue;\n        if (r < rmin) rmin = r;\n        if (r > rmax) rmax = r;\n      }\n      s *= s;\n      u *= u;\n      return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;\n    }\n    function position(row, u, rect, flush) {\n      var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;\n      if (u == rect.dx) {\n        if (flush || v > rect.dy) v = rect.dy;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dy = v;\n          x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);\n        }\n        o.z = true;\n        o.dx += rect.x + rect.dx - x;\n        rect.y += v;\n        rect.dy -= v;\n      } else {\n        if (flush || v > rect.dx) v = rect.dx;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dx = v;\n          y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);\n        }\n        o.z = false;\n        o.dy += rect.y + rect.dy - y;\n        rect.x += v;\n        rect.dx -= v;\n      }\n    }\n    function treemap(d) {\n      var nodes = stickies || hierarchy(d), root = nodes[0];\n      root.x = 0;\n      root.y = 0;\n      root.dx = size[0];\n      root.dy = size[1];\n      if (stickies) hierarchy.revalue(root);\n      scale([ root ], root.dx * root.dy / root.value);\n      (stickies ? stickify : squarify)(root);\n      if (sticky) stickies = nodes;\n      return nodes;\n    }\n    treemap.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return treemap;\n    };\n    treemap.padding = function(x) {\n      if (!arguments.length) return padding;\n      function padFunction(node) {\n        var p = x.call(treemap, node, node.depth);\n        return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === \"number\" ? [ p, p, p, p ] : p);\n      }\n      function padConstant(node) {\n        return d3_layout_treemapPad(node, x);\n      }\n      var type;\n      pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === \"function\" ? padFunction : type === \"number\" ? (x = [ x, x, x, x ], \n      padConstant) : padConstant;\n      return treemap;\n    };\n    treemap.round = function(x) {\n      if (!arguments.length) return round != Number;\n      round = x ? Math.round : Number;\n      return treemap;\n    };\n    treemap.sticky = function(x) {\n      if (!arguments.length) return sticky;\n      sticky = x;\n      stickies = null;\n      return treemap;\n    };\n    treemap.ratio = function(x) {\n      if (!arguments.length) return ratio;\n      ratio = x;\n      return treemap;\n    };\n    treemap.mode = function(x) {\n      if (!arguments.length) return mode;\n      mode = x + \"\";\n      return treemap;\n    };\n    return d3_layout_hierarchyRebind(treemap, hierarchy);\n  };\n  function d3_layout_treemapPadNull(node) {\n    return {\n      x: node.x,\n      y: node.y,\n      dx: node.dx,\n      dy: node.dy\n    };\n  }\n  function d3_layout_treemapPad(node, padding) {\n    var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];\n    if (dx < 0) {\n      x += dx / 2;\n      dx = 0;\n    }\n    if (dy < 0) {\n      y += dy / 2;\n      dy = 0;\n    }\n    return {\n      x: x,\n      y: y,\n      dx: dx,\n      dy: dy\n    };\n  }\n  d3.random = {\n    normal: function(µ, σ) {\n      var n = arguments.length;\n      if (n < 2) σ = 1;\n      if (n < 1) µ = 0;\n      return function() {\n        var x, y, r;\n        do {\n          x = Math.random() * 2 - 1;\n          y = Math.random() * 2 - 1;\n          r = x * x + y * y;\n        } while (!r || r > 1);\n        return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);\n      };\n    },\n    logNormal: function() {\n      var random = d3.random.normal.apply(d3, arguments);\n      return function() {\n        return Math.exp(random());\n      };\n    },\n    bates: function(m) {\n      var random = d3.random.irwinHall(m);\n      return function() {\n        return random() / m;\n      };\n    },\n    irwinHall: function(m) {\n      return function() {\n        for (var s = 0, j = 0; j < m; j++) s += Math.random();\n        return s;\n      };\n    }\n  };\n  d3.scale = {};\n  function d3_scaleExtent(domain) {\n    var start = domain[0], stop = domain[domain.length - 1];\n    return start < stop ? [ start, stop ] : [ stop, start ];\n  }\n  function d3_scaleRange(scale) {\n    return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());\n  }\n  function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {\n    var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);\n    return function(x) {\n      return i(u(x));\n    };\n  }\n  function d3_scale_nice(domain, nice) {\n    var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;\n    if (x1 < x0) {\n      dx = i0, i0 = i1, i1 = dx;\n      dx = x0, x0 = x1, x1 = dx;\n    }\n    domain[i0] = nice.floor(x0);\n    domain[i1] = nice.ceil(x1);\n    return domain;\n  }\n  function d3_scale_niceStep(step) {\n    return step ? {\n      floor: function(x) {\n        return Math.floor(x / step) * step;\n      },\n      ceil: function(x) {\n        return Math.ceil(x / step) * step;\n      }\n    } : d3_scale_niceIdentity;\n  }\n  var d3_scale_niceIdentity = {\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {\n    var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;\n    if (domain[k] < domain[0]) {\n      domain = domain.slice().reverse();\n      range = range.slice().reverse();\n    }\n    while (++j <= k) {\n      u.push(uninterpolate(domain[j - 1], domain[j]));\n      i.push(interpolate(range[j - 1], range[j]));\n    }\n    return function(x) {\n      var j = d3.bisect(domain, x, 1, k) - 1;\n      return i[j](u[j](x));\n    };\n  }\n  d3.scale.linear = function() {\n    return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);\n  };\n  function d3_scale_linear(domain, range, interpolate, clamp) {\n    var output, input;\n    function rescale() {\n      var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;\n      output = linear(domain, range, uninterpolate, interpolate);\n      input = linear(range, domain, uninterpolate, d3_interpolate);\n      return scale;\n    }\n    function scale(x) {\n      return output(x);\n    }\n    scale.invert = function(y) {\n      return input(y);\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(Number);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.rangeRound = function(x) {\n      return scale.range(x).interpolate(d3_interpolateRound);\n    };\n    scale.clamp = function(x) {\n      if (!arguments.length) return clamp;\n      clamp = x;\n      return rescale();\n    };\n    scale.interpolate = function(x) {\n      if (!arguments.length) return interpolate;\n      interpolate = x;\n      return rescale();\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      d3_scale_linearNice(domain, m);\n      return rescale();\n    };\n    scale.copy = function() {\n      return d3_scale_linear(domain, range, interpolate, clamp);\n    };\n    return rescale();\n  }\n  function d3_scale_linearRebind(scale, linear) {\n    return d3.rebind(scale, linear, \"range\", \"rangeRound\", \"interpolate\", \"clamp\");\n  }\n  function d3_scale_linearNice(domain, m) {\n    return d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n  }\n  function d3_scale_linearTickRange(domain, m) {\n    if (m == null) m = 10;\n    var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;\n    if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;\n    extent[0] = Math.ceil(extent[0] / step) * step;\n    extent[1] = Math.floor(extent[1] / step) * step + step * .5;\n    extent[2] = step;\n    return extent;\n  }\n  function d3_scale_linearTicks(domain, m) {\n    return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));\n  }\n  function d3_scale_linearTickFormat(domain, m, format) {\n    var range = d3_scale_linearTickRange(domain, m);\n    if (format) {\n      var match = d3_format_re.exec(format);\n      match.shift();\n      if (match[8] === \"s\") {\n        var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));\n        if (!match[7]) match[7] = \".\" + d3_scale_linearPrecision(prefix.scale(range[2]));\n        match[8] = \"f\";\n        format = d3.format(match.join(\"\"));\n        return function(d) {\n          return format(prefix.scale(d)) + prefix.symbol;\n        };\n      }\n      if (!match[7]) match[7] = \".\" + d3_scale_linearFormatPrecision(match[8], range);\n      format = match.join(\"\");\n    } else {\n      format = \",.\" + d3_scale_linearPrecision(range[2]) + \"f\";\n    }\n    return d3.format(format);\n  }\n  var d3_scale_linearFormatSignificant = {\n    s: 1,\n    g: 1,\n    p: 1,\n    r: 1,\n    e: 1\n  };\n  function d3_scale_linearPrecision(value) {\n    return -Math.floor(Math.log(value) / Math.LN10 + .01);\n  }\n  function d3_scale_linearFormatPrecision(type, range) {\n    var p = d3_scale_linearPrecision(range[2]);\n    return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== \"e\") : p - (type === \"%\") * 2;\n  }\n  d3.scale.log = function() {\n    return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);\n  };\n  function d3_scale_log(linear, base, positive, domain) {\n    function log(x) {\n      return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);\n    }\n    function pow(x) {\n      return positive ? Math.pow(base, x) : -Math.pow(base, -x);\n    }\n    function scale(x) {\n      return linear(log(x));\n    }\n    scale.invert = function(x) {\n      return pow(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      positive = x[0] >= 0;\n      linear.domain((domain = x.map(Number)).map(log));\n      return scale;\n    };\n    scale.base = function(_) {\n      if (!arguments.length) return base;\n      base = +_;\n      linear.domain(domain.map(log));\n      return scale;\n    };\n    scale.nice = function() {\n      var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);\n      linear.domain(niced);\n      domain = niced.map(pow);\n      return scale;\n    };\n    scale.ticks = function() {\n      var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;\n      if (isFinite(j - i)) {\n        if (positive) {\n          for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);\n          ticks.push(pow(i));\n        } else {\n          ticks.push(pow(i));\n          for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);\n        }\n        for (i = 0; ticks[i] < u; i++) {}\n        for (j = ticks.length; ticks[j - 1] > v; j--) {}\n        ticks = ticks.slice(i, j);\n      }\n      return ticks;\n    };\n    scale.tickFormat = function(n, format) {\n      if (!arguments.length) return d3_scale_logFormat;\n      if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== \"function\") format = d3.format(format);\n      var k = Math.max(.1, n / scale.ticks().length), f = positive ? (e = 1e-12, Math.ceil) : (e = -1e-12, \n      Math.floor), e;\n      return function(d) {\n        return d / pow(f(log(d) + e)) <= k ? format(d) : \"\";\n      };\n    };\n    scale.copy = function() {\n      return d3_scale_log(linear.copy(), base, positive, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  var d3_scale_logFormat = d3.format(\".0e\"), d3_scale_logNiceNegative = {\n    floor: function(x) {\n      return -Math.ceil(-x);\n    },\n    ceil: function(x) {\n      return -Math.floor(-x);\n    }\n  };\n  d3.scale.pow = function() {\n    return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);\n  };\n  function d3_scale_pow(linear, exponent, domain) {\n    var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);\n    function scale(x) {\n      return linear(powp(x));\n    }\n    scale.invert = function(x) {\n      return powb(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      linear.domain((domain = x.map(Number)).map(powp));\n      return scale;\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      return scale.domain(d3_scale_linearNice(domain, m));\n    };\n    scale.exponent = function(x) {\n      if (!arguments.length) return exponent;\n      powp = d3_scale_powPow(exponent = x);\n      powb = d3_scale_powPow(1 / exponent);\n      linear.domain(domain.map(powp));\n      return scale;\n    };\n    scale.copy = function() {\n      return d3_scale_pow(linear.copy(), exponent, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_scale_powPow(e) {\n    return function(x) {\n      return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);\n    };\n  }\n  d3.scale.sqrt = function() {\n    return d3.scale.pow().exponent(.5);\n  };\n  d3.scale.ordinal = function() {\n    return d3_scale_ordinal([], {\n      t: \"range\",\n      a: [ [] ]\n    });\n  };\n  function d3_scale_ordinal(domain, ranger) {\n    var index, range, rangeBand;\n    function scale(x) {\n      return range[((index.get(x) || (ranger.t === \"range\" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];\n    }\n    function steps(start, step) {\n      return d3.range(domain.length).map(function(i) {\n        return start + step * i;\n      });\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = [];\n      index = new d3_Map();\n      var i = -1, n = x.length, xi;\n      while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));\n      return scale[ranger.t].apply(scale, ranger.a);\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      rangeBand = 0;\n      ranger = {\n        t: \"range\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangePoints = function(x, padding) {\n      if (arguments.length < 2) padding = 0;\n      var start = x[0], stop = x[1], step = (stop - start) / (Math.max(1, domain.length - 1) + padding);\n      range = steps(domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2, step);\n      rangeBand = 0;\n      ranger = {\n        t: \"rangePoints\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);\n      range = steps(start + step * outerPadding, step);\n      if (reverse) range.reverse();\n      rangeBand = step * (1 - padding);\n      ranger = {\n        t: \"rangeBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeRoundBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding)), error = stop - start - (domain.length - padding) * step;\n      range = steps(start + Math.round(error / 2), step);\n      if (reverse) range.reverse();\n      rangeBand = Math.round(step * (1 - padding));\n      ranger = {\n        t: \"rangeRoundBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBand = function() {\n      return rangeBand;\n    };\n    scale.rangeExtent = function() {\n      return d3_scaleExtent(ranger.a[0]);\n    };\n    scale.copy = function() {\n      return d3_scale_ordinal(domain, ranger);\n    };\n    return scale.domain(domain);\n  }\n  d3.scale.category10 = function() {\n    return d3.scale.ordinal().range(d3_category10);\n  };\n  d3.scale.category20 = function() {\n    return d3.scale.ordinal().range(d3_category20);\n  };\n  d3.scale.category20b = function() {\n    return d3.scale.ordinal().range(d3_category20b);\n  };\n  d3.scale.category20c = function() {\n    return d3.scale.ordinal().range(d3_category20c);\n  };\n  var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);\n  var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);\n  var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);\n  var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);\n  d3.scale.quantile = function() {\n    return d3_scale_quantile([], []);\n  };\n  function d3_scale_quantile(domain, range) {\n    var thresholds;\n    function rescale() {\n      var k = 0, q = range.length;\n      thresholds = [];\n      while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);\n      return scale;\n    }\n    function scale(x) {\n      if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.filter(d3_number).sort(d3_ascending);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.quantiles = function() {\n      return thresholds;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantile(domain, range);\n    };\n    return rescale();\n  }\n  d3.scale.quantize = function() {\n    return d3_scale_quantize(0, 1, [ 0, 1 ]);\n  };\n  function d3_scale_quantize(x0, x1, range) {\n    var kx, i;\n    function scale(x) {\n      return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];\n    }\n    function rescale() {\n      kx = range.length / (x1 - x0);\n      i = range.length - 1;\n      return scale;\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return [ x0, x1 ];\n      x0 = +x[0];\n      x1 = +x[x.length - 1];\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      y = y < 0 ? NaN : y / kx + x0;\n      return [ y, y + 1 / kx ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantize(x0, x1, range);\n    };\n    return rescale();\n  }\n  d3.scale.threshold = function() {\n    return d3_scale_threshold([ .5 ], [ 0, 1 ]);\n  };\n  function d3_scale_threshold(domain, range) {\n    function scale(x) {\n      if (x <= x) return range[d3.bisect(domain, x)];\n    }\n    scale.domain = function(_) {\n      if (!arguments.length) return domain;\n      domain = _;\n      return scale;\n    };\n    scale.range = function(_) {\n      if (!arguments.length) return range;\n      range = _;\n      return scale;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return [ domain[y - 1], domain[y] ];\n    };\n    scale.copy = function() {\n      return d3_scale_threshold(domain, range);\n    };\n    return scale;\n  }\n  d3.scale.identity = function() {\n    return d3_scale_identity([ 0, 1 ]);\n  };\n  function d3_scale_identity(domain) {\n    function identity(x) {\n      return +x;\n    }\n    identity.invert = identity;\n    identity.domain = identity.range = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(identity);\n      return identity;\n    };\n    identity.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    identity.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    identity.copy = function() {\n      return d3_scale_identity(domain);\n    };\n    return identity;\n  }\n  d3.svg = {};\n  d3.svg.arc = function() {\n    var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n    function arc() {\n      var r0 = innerRadius.apply(this, arguments), r1 = outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, da = (a1 < a0 && (da = a0, \n      a0 = a1, a1 = da), a1 - a0), df = da < π ? \"0\" : \"1\", c0 = Math.cos(a0), s0 = Math.sin(a0), c1 = Math.cos(a1), s1 = Math.sin(a1);\n      return da >= d3_svg_arcMax ? r0 ? \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,1 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,1 0,\" + r1 + \"M0,\" + r0 + \"A\" + r0 + \",\" + r0 + \" 0 1,0 0,\" + -r0 + \"A\" + r0 + \",\" + r0 + \" 0 1,0 0,\" + r0 + \"Z\" : \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,1 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,1 0,\" + r1 + \"Z\" : r0 ? \"M\" + r1 * c0 + \",\" + r1 * s0 + \"A\" + r1 + \",\" + r1 + \" 0 \" + df + \",1 \" + r1 * c1 + \",\" + r1 * s1 + \"L\" + r0 * c1 + \",\" + r0 * s1 + \"A\" + r0 + \",\" + r0 + \" 0 \" + df + \",0 \" + r0 * c0 + \",\" + r0 * s0 + \"Z\" : \"M\" + r1 * c0 + \",\" + r1 * s0 + \"A\" + r1 + \",\" + r1 + \" 0 \" + df + \",1 \" + r1 * c1 + \",\" + r1 * s1 + \"L0,0\" + \"Z\";\n    }\n    arc.innerRadius = function(v) {\n      if (!arguments.length) return innerRadius;\n      innerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.outerRadius = function(v) {\n      if (!arguments.length) return outerRadius;\n      outerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return arc;\n    };\n    arc.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return arc;\n    };\n    arc.centroid = function() {\n      var r = (innerRadius.apply(this, arguments) + outerRadius.apply(this, arguments)) / 2, a = (startAngle.apply(this, arguments) + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset;\n      return [ Math.cos(a) * r, Math.sin(a) * r ];\n    };\n    return arc;\n  };\n  var d3_svg_arcOffset = -halfπ, d3_svg_arcMax = τ - ε;\n  function d3_svg_arcInnerRadius(d) {\n    return d.innerRadius;\n  }\n  function d3_svg_arcOuterRadius(d) {\n    return d.outerRadius;\n  }\n  function d3_svg_arcStartAngle(d) {\n    return d.startAngle;\n  }\n  function d3_svg_arcEndAngle(d) {\n    return d.endAngle;\n  }\n  function d3_svg_line(projection) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;\n    function line(data) {\n      var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points), tension));\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);\n        } else if (points.length) {\n          segment();\n          points = [];\n        }\n      }\n      if (points.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    line.x = function(_) {\n      if (!arguments.length) return x;\n      x = _;\n      return line;\n    };\n    line.y = function(_) {\n      if (!arguments.length) return y;\n      y = _;\n      return line;\n    };\n    line.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return line;\n    };\n    line.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      return line;\n    };\n    line.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return line;\n    };\n    return line;\n  }\n  d3.svg.line = function() {\n    return d3_svg_line(d3_identity);\n  };\n  var d3_svg_lineInterpolators = d3.map({\n    linear: d3_svg_lineLinear,\n    \"linear-closed\": d3_svg_lineLinearClosed,\n    step: d3_svg_lineStep,\n    \"step-before\": d3_svg_lineStepBefore,\n    \"step-after\": d3_svg_lineStepAfter,\n    basis: d3_svg_lineBasis,\n    \"basis-open\": d3_svg_lineBasisOpen,\n    \"basis-closed\": d3_svg_lineBasisClosed,\n    bundle: d3_svg_lineBundle,\n    cardinal: d3_svg_lineCardinal,\n    \"cardinal-open\": d3_svg_lineCardinalOpen,\n    \"cardinal-closed\": d3_svg_lineCardinalClosed,\n    monotone: d3_svg_lineMonotone\n  });\n  d3_svg_lineInterpolators.forEach(function(key, value) {\n    value.key = key;\n    value.closed = /-closed$/.test(key);\n  });\n  function d3_svg_lineLinear(points) {\n    return points.join(\"L\");\n  }\n  function d3_svg_lineLinearClosed(points) {\n    return d3_svg_lineLinear(points) + \"Z\";\n  }\n  function d3_svg_lineStep(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p[0] + (p = points[i])[0]) / 2, \"V\", p[1]);\n    if (n > 1) path.push(\"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepBefore(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"V\", (p = points[i])[1], \"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepAfter(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p = points[i])[0], \"V\", p[1]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineCardinalOpen(points, tension) {\n    return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineCardinalClosed(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), \n    points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));\n  }\n  function d3_svg_lineCardinal(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineHermite(points, tangents) {\n    if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {\n      return d3_svg_lineLinear(points);\n    }\n    var quad = points.length != tangents.length, path = \"\", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;\n    if (quad) {\n      path += \"Q\" + (p[0] - t0[0] * 2 / 3) + \",\" + (p[1] - t0[1] * 2 / 3) + \",\" + p[0] + \",\" + p[1];\n      p0 = points[1];\n      pi = 2;\n    }\n    if (tangents.length > 1) {\n      t = tangents[1];\n      p = points[pi];\n      pi++;\n      path += \"C\" + (p0[0] + t0[0]) + \",\" + (p0[1] + t0[1]) + \",\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      for (var i = 2; i < tangents.length; i++, pi++) {\n        p = points[pi];\n        t = tangents[i];\n        path += \"S\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      }\n    }\n    if (quad) {\n      var lp = points[pi];\n      path += \"Q\" + (p[0] + t[0] * 2 / 3) + \",\" + (p[1] + t[1] * 2 / 3) + \",\" + lp[0] + \",\" + lp[1];\n    }\n    return path;\n  }\n  function d3_svg_lineCardinalTangents(points, tension) {\n    var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;\n    while (++i < n) {\n      p0 = p1;\n      p1 = p2;\n      p2 = points[i];\n      tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineBasis(points) {\n    if (points.length < 3) return d3_svg_lineLinear(points);\n    var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, \",\", y0, \"L\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    points.push(points[n - 1]);\n    while (++i <= n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    points.pop();\n    path.push(\"L\", pi);\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisOpen(points) {\n    if (points.length < 4) return d3_svg_lineLinear(points);\n    var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];\n    while (++i < 3) {\n      pi = points[i];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + \",\" + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));\n    --i;\n    while (++i < n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisClosed(points) {\n    var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];\n    while (++i < 4) {\n      pi = points[i % n];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    --i;\n    while (++i < m) {\n      pi = points[i % n];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBundle(points, tension) {\n    var n = points.length - 1;\n    if (n) {\n      var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;\n      while (++i <= n) {\n        p = points[i];\n        t = i / n;\n        p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);\n        p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);\n      }\n    }\n    return d3_svg_lineBasis(points);\n  }\n  function d3_svg_lineDot4(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n  }\n  var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];\n  function d3_svg_lineBasisBezier(path, x, y) {\n    path.push(\"C\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));\n  }\n  function d3_svg_lineSlope(p0, p1) {\n    return (p1[1] - p0[1]) / (p1[0] - p0[0]);\n  }\n  function d3_svg_lineFiniteDifferences(points) {\n    var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);\n    while (++i < j) {\n      m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;\n    }\n    m[i] = d;\n    return m;\n  }\n  function d3_svg_lineMonotoneTangents(points) {\n    var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;\n    while (++i < j) {\n      d = d3_svg_lineSlope(points[i], points[i + 1]);\n      if (abs(d) < ε) {\n        m[i] = m[i + 1] = 0;\n      } else {\n        a = m[i] / d;\n        b = m[i + 1] / d;\n        s = a * a + b * b;\n        if (s > 9) {\n          s = d * 3 / Math.sqrt(s);\n          m[i] = s * a;\n          m[i + 1] = s * b;\n        }\n      }\n    }\n    i = -1;\n    while (++i <= j) {\n      s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));\n      tangents.push([ s || 0, m[i] * s || 0 ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineMonotone(points) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));\n  }\n  d3.svg.line.radial = function() {\n    var line = d3_svg_line(d3_svg_lineRadial);\n    line.radius = line.x, delete line.x;\n    line.angle = line.y, delete line.y;\n    return line;\n  };\n  function d3_svg_lineRadial(points) {\n    var point, i = -1, n = points.length, r, a;\n    while (++i < n) {\n      point = points[i];\n      r = point[0];\n      a = point[1] + d3_svg_arcOffset;\n      point[0] = r * Math.cos(a);\n      point[1] = r * Math.sin(a);\n    }\n    return points;\n  }\n  function d3_svg_area(projection) {\n    var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = \"L\", tension = .7;\n    function area(data) {\n      var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {\n        return x;\n      } : d3_functor(x1), fy1 = y0 === y1 ? function() {\n        return y;\n      } : d3_functor(y1), x, y;\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), \"Z\");\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);\n          points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);\n        } else if (points0.length) {\n          segment();\n          points0 = [];\n          points1 = [];\n        }\n      }\n      if (points0.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    area.x = function(_) {\n      if (!arguments.length) return x1;\n      x0 = x1 = _;\n      return area;\n    };\n    area.x0 = function(_) {\n      if (!arguments.length) return x0;\n      x0 = _;\n      return area;\n    };\n    area.x1 = function(_) {\n      if (!arguments.length) return x1;\n      x1 = _;\n      return area;\n    };\n    area.y = function(_) {\n      if (!arguments.length) return y1;\n      y0 = y1 = _;\n      return area;\n    };\n    area.y0 = function(_) {\n      if (!arguments.length) return y0;\n      y0 = _;\n      return area;\n    };\n    area.y1 = function(_) {\n      if (!arguments.length) return y1;\n      y1 = _;\n      return area;\n    };\n    area.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return area;\n    };\n    area.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      interpolateReverse = interpolate.reverse || interpolate;\n      L = interpolate.closed ? \"M\" : \"L\";\n      return area;\n    };\n    area.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return area;\n    };\n    return area;\n  }\n  d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;\n  d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;\n  d3.svg.area = function() {\n    return d3_svg_area(d3_identity);\n  };\n  d3.svg.area.radial = function() {\n    var area = d3_svg_area(d3_svg_lineRadial);\n    area.radius = area.x, delete area.x;\n    area.innerRadius = area.x0, delete area.x0;\n    area.outerRadius = area.x1, delete area.x1;\n    area.angle = area.y, delete area.y;\n    area.startAngle = area.y0, delete area.y0;\n    area.endAngle = area.y1, delete area.y1;\n    return area;\n  };\n  d3.svg.chord = function() {\n    var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n    function chord(d, i) {\n      var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);\n      return \"M\" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + \"Z\";\n    }\n    function subgroup(self, f, d, i) {\n      var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset;\n      return {\n        r: r,\n        a0: a0,\n        a1: a1,\n        p0: [ r * Math.cos(a0), r * Math.sin(a0) ],\n        p1: [ r * Math.cos(a1), r * Math.sin(a1) ]\n      };\n    }\n    function equals(a, b) {\n      return a.a0 == b.a0 && a.a1 == b.a1;\n    }\n    function arc(r, p, a) {\n      return \"A\" + r + \",\" + r + \" 0 \" + +(a > π) + \",1 \" + p;\n    }\n    function curve(r0, p0, r1, p1) {\n      return \"Q 0,0 \" + p1;\n    }\n    chord.radius = function(v) {\n      if (!arguments.length) return radius;\n      radius = d3_functor(v);\n      return chord;\n    };\n    chord.source = function(v) {\n      if (!arguments.length) return source;\n      source = d3_functor(v);\n      return chord;\n    };\n    chord.target = function(v) {\n      if (!arguments.length) return target;\n      target = d3_functor(v);\n      return chord;\n    };\n    chord.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return chord;\n    };\n    chord.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return chord;\n    };\n    return chord;\n  };\n  function d3_svg_chordRadius(d) {\n    return d.radius;\n  }\n  d3.svg.diagonal = function() {\n    var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;\n    function diagonal(d, i) {\n      var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {\n        x: p0.x,\n        y: m\n      }, {\n        x: p3.x,\n        y: m\n      }, p3 ];\n      p = p.map(projection);\n      return \"M\" + p[0] + \"C\" + p[1] + \" \" + p[2] + \" \" + p[3];\n    }\n    diagonal.source = function(x) {\n      if (!arguments.length) return source;\n      source = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.target = function(x) {\n      if (!arguments.length) return target;\n      target = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.projection = function(x) {\n      if (!arguments.length) return projection;\n      projection = x;\n      return diagonal;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalProjection(d) {\n    return [ d.x, d.y ];\n  }\n  d3.svg.diagonal.radial = function() {\n    var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;\n    diagonal.projection = function(x) {\n      return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalRadialProjection(projection) {\n    return function() {\n      var d = projection.apply(this, arguments), r = d[0], a = d[1] + d3_svg_arcOffset;\n      return [ r * Math.cos(a), r * Math.sin(a) ];\n    };\n  }\n  d3.svg.symbol = function() {\n    var type = d3_svg_symbolType, size = d3_svg_symbolSize;\n    function symbol(d, i) {\n      return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));\n    }\n    symbol.type = function(x) {\n      if (!arguments.length) return type;\n      type = d3_functor(x);\n      return symbol;\n    };\n    symbol.size = function(x) {\n      if (!arguments.length) return size;\n      size = d3_functor(x);\n      return symbol;\n    };\n    return symbol;\n  };\n  function d3_svg_symbolSize() {\n    return 64;\n  }\n  function d3_svg_symbolType() {\n    return \"circle\";\n  }\n  function d3_svg_symbolCircle(size) {\n    var r = Math.sqrt(size / π);\n    return \"M0,\" + r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + -r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + r + \"Z\";\n  }\n  var d3_svg_symbols = d3.map({\n    circle: d3_svg_symbolCircle,\n    cross: function(size) {\n      var r = Math.sqrt(size / 5) / 2;\n      return \"M\" + -3 * r + \",\" + -r + \"H\" + -r + \"V\" + -3 * r + \"H\" + r + \"V\" + -r + \"H\" + 3 * r + \"V\" + r + \"H\" + r + \"V\" + 3 * r + \"H\" + -r + \"V\" + r + \"H\" + -3 * r + \"Z\";\n    },\n    diamond: function(size) {\n      var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;\n      return \"M0,\" + -ry + \"L\" + rx + \",0\" + \" 0,\" + ry + \" \" + -rx + \",0\" + \"Z\";\n    },\n    square: function(size) {\n      var r = Math.sqrt(size) / 2;\n      return \"M\" + -r + \",\" + -r + \"L\" + r + \",\" + -r + \" \" + r + \",\" + r + \" \" + -r + \",\" + r + \"Z\";\n    },\n    \"triangle-down\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + ry + \"L\" + rx + \",\" + -ry + \" \" + -rx + \",\" + -ry + \"Z\";\n    },\n    \"triangle-up\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + -ry + \"L\" + rx + \",\" + ry + \" \" + -rx + \",\" + ry + \"Z\";\n    }\n  });\n  d3.svg.symbolTypes = d3_svg_symbols.keys();\n  var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);\n  function d3_transition(groups, id) {\n    d3_subclass(groups, d3_transitionPrototype);\n    groups.id = id;\n    return groups;\n  }\n  var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;\n  d3_transitionPrototype.call = d3_selectionPrototype.call;\n  d3_transitionPrototype.empty = d3_selectionPrototype.empty;\n  d3_transitionPrototype.node = d3_selectionPrototype.node;\n  d3_transitionPrototype.size = d3_selectionPrototype.size;\n  d3.transition = function(selection) {\n    return arguments.length ? d3_transitionInheritId ? selection.transition() : selection : d3_selectionRoot.transition();\n  };\n  d3.transition.prototype = d3_transitionPrototype;\n  d3_transitionPrototype.select = function(selector) {\n    var id = this.id, subgroups = [], subgroup, subnode, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {\n          if (\"__data__\" in node) subnode.__data__ = node.__data__;\n          d3_transitionNode(subnode, i, id, node.__transition__[id]);\n          subgroup.push(subnode);\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_transition(subgroups, id);\n  };\n  d3_transitionPrototype.selectAll = function(selector) {\n    var id = this.id, subgroups = [], subgroup, subnodes, node, subnode, transition;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          transition = node.__transition__[id];\n          subnodes = selector.call(node, node.__data__, i, j);\n          subgroups.push(subgroup = []);\n          for (var k = -1, o = subnodes.length; ++k < o; ) {\n            if (subnode = subnodes[k]) d3_transitionNode(subnode, k, id, transition);\n            subgroup.push(subnode);\n          }\n        }\n      }\n    }\n    return d3_transition(subgroups, id);\n  };\n  d3_transitionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_transition(subgroups, this.id);\n  };\n  d3_transitionPrototype.tween = function(name, tween) {\n    var id = this.id;\n    if (arguments.length < 2) return this.node().__transition__[id].tween.get(name);\n    return d3_selection_each(this, tween == null ? function(node) {\n      node.__transition__[id].tween.remove(name);\n    } : function(node) {\n      node.__transition__[id].tween.set(name, tween);\n    });\n  };\n  function d3_transition_tween(groups, name, value, tween) {\n    var id = groups.id;\n    return d3_selection_each(groups, typeof value === \"function\" ? function(node, i, j) {\n      node.__transition__[id].tween.set(name, tween(value.call(node, node.__data__, i, j)));\n    } : (value = tween(value), function(node) {\n      node.__transition__[id].tween.set(name, value);\n    }));\n  }\n  d3_transitionPrototype.attr = function(nameNS, value) {\n    if (arguments.length < 2) {\n      for (value in nameNS) this.attr(value, nameNS[value]);\n      return this;\n    }\n    var interpolate = nameNS == \"transform\" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrTween(b) {\n      return b == null ? attrNull : (b += \"\", function() {\n        var a = this.getAttribute(name), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttribute(name, i(t));\n        });\n      });\n    }\n    function attrTweenNS(b) {\n      return b == null ? attrNullNS : (b += \"\", function() {\n        var a = this.getAttributeNS(name.space, name.local), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttributeNS(name.space, name.local, i(t));\n        });\n      });\n    }\n    return d3_transition_tween(this, \"attr.\" + nameNS, value, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.attrTween = function(nameNS, tween) {\n    var name = d3.ns.qualify(nameNS);\n    function attrTween(d, i) {\n      var f = tween.call(this, d, i, this.getAttribute(name));\n      return f && function(t) {\n        this.setAttribute(name, f(t));\n      };\n    }\n    function attrTweenNS(d, i) {\n      var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));\n      return f && function(t) {\n        this.setAttributeNS(name.space, name.local, f(t));\n      };\n    }\n    return this.tween(\"attr.\" + nameNS, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.style(priority, name[priority], value);\n        return this;\n      }\n      priority = \"\";\n    }\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleString(b) {\n      return b == null ? styleNull : (b += \"\", function() {\n        var a = d3_window.getComputedStyle(this, null).getPropertyValue(name), i;\n        return a !== b && (i = d3_interpolate(a, b), function(t) {\n          this.style.setProperty(name, i(t), priority);\n        });\n      });\n    }\n    return d3_transition_tween(this, \"style.\" + name, value, styleString);\n  };\n  d3_transitionPrototype.styleTween = function(name, tween, priority) {\n    if (arguments.length < 3) priority = \"\";\n    function styleTween(d, i) {\n      var f = tween.call(this, d, i, d3_window.getComputedStyle(this, null).getPropertyValue(name));\n      return f && function(t) {\n        this.style.setProperty(name, f(t), priority);\n      };\n    }\n    return this.tween(\"style.\" + name, styleTween);\n  };\n  d3_transitionPrototype.text = function(value) {\n    return d3_transition_tween(this, \"text\", value, d3_transition_text);\n  };\n  function d3_transition_text(b) {\n    if (b == null) b = \"\";\n    return function() {\n      this.textContent = b;\n    };\n  }\n  d3_transitionPrototype.remove = function() {\n    return this.each(\"end.transition\", function() {\n      var p;\n      if (this.__transition__.count < 2 && (p = this.parentNode)) p.removeChild(this);\n    });\n  };\n  d3_transitionPrototype.ease = function(value) {\n    var id = this.id;\n    if (arguments.length < 1) return this.node().__transition__[id].ease;\n    if (typeof value !== \"function\") value = d3.ease.apply(d3, arguments);\n    return d3_selection_each(this, function(node) {\n      node.__transition__[id].ease = value;\n    });\n  };\n  d3_transitionPrototype.delay = function(value) {\n    var id = this.id;\n    if (arguments.length < 1) return this.node().__transition__[id].delay;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node.__transition__[id].delay = +value.call(node, node.__data__, i, j);\n    } : (value = +value, function(node) {\n      node.__transition__[id].delay = value;\n    }));\n  };\n  d3_transitionPrototype.duration = function(value) {\n    var id = this.id;\n    if (arguments.length < 1) return this.node().__transition__[id].duration;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node.__transition__[id].duration = Math.max(1, value.call(node, node.__data__, i, j));\n    } : (value = Math.max(1, value), function(node) {\n      node.__transition__[id].duration = value;\n    }));\n  };\n  d3_transitionPrototype.each = function(type, listener) {\n    var id = this.id;\n    if (arguments.length < 2) {\n      var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;\n      d3_transitionInheritId = id;\n      d3_selection_each(this, function(node, i, j) {\n        d3_transitionInherit = node.__transition__[id];\n        type.call(node, node.__data__, i, j);\n      });\n      d3_transitionInherit = inherit;\n      d3_transitionInheritId = inheritId;\n    } else {\n      d3_selection_each(this, function(node) {\n        var transition = node.__transition__[id];\n        (transition.event || (transition.event = d3.dispatch(\"start\", \"end\"))).on(type, listener);\n      });\n    }\n    return this;\n  };\n  d3_transitionPrototype.transition = function() {\n    var id0 = this.id, id1 = ++d3_transitionId, subgroups = [], subgroup, group, node, transition;\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if (node = group[i]) {\n          transition = Object.create(node.__transition__[id0]);\n          transition.delay += transition.duration;\n          d3_transitionNode(node, i, id1, transition);\n        }\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, id1);\n  };\n  function d3_transitionNode(node, i, id, inherit) {\n    var lock = node.__transition__ || (node.__transition__ = {\n      active: 0,\n      count: 0\n    }), transition = lock[id];\n    if (!transition) {\n      var time = inherit.time;\n      transition = lock[id] = {\n        tween: new d3_Map(),\n        time: time,\n        ease: inherit.ease,\n        delay: inherit.delay,\n        duration: inherit.duration\n      };\n      ++lock.count;\n      d3.timer(function(elapsed) {\n        var d = node.__data__, ease = transition.ease, delay = transition.delay, duration = transition.duration, timer = d3_timer_active, tweened = [];\n        timer.t = delay + time;\n        if (delay <= elapsed) return start(elapsed - delay);\n        timer.c = start;\n        function start(elapsed) {\n          if (lock.active > id) return stop();\n          lock.active = id;\n          transition.event && transition.event.start.call(node, d, i);\n          transition.tween.forEach(function(key, value) {\n            if (value = value.call(node, d, i)) {\n              tweened.push(value);\n            }\n          });\n          d3.timer(function() {\n            timer.c = tick(elapsed || 1) ? d3_true : tick;\n            return 1;\n          }, 0, time);\n        }\n        function tick(elapsed) {\n          if (lock.active !== id) return stop();\n          var t = elapsed / duration, e = ease(t), n = tweened.length;\n          while (n > 0) {\n            tweened[--n].call(node, e);\n          }\n          if (t >= 1) {\n            transition.event && transition.event.end.call(node, d, i);\n            return stop();\n          }\n        }\n        function stop() {\n          if (--lock.count) delete lock[id]; else delete node.__transition__;\n          return 1;\n        }\n      }, 0, time);\n    }\n  }\n  d3.svg.axis = function() {\n    var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;\n    function axis(g) {\n      g.each(function() {\n        var g = d3.select(this);\n        var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();\n        var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(\".tick\").data(ticks, scale1), tickEnter = tick.enter().insert(\"g\", \".domain\").attr(\"class\", \"tick\").style(\"opacity\", ε), tickExit = d3.transition(tick.exit()).style(\"opacity\", ε).remove(), tickUpdate = d3.transition(tick.order()).style(\"opacity\", 1), tickTransform;\n        var range = d3_scaleRange(scale1), path = g.selectAll(\".domain\").data([ 0 ]), pathUpdate = (path.enter().append(\"path\").attr(\"class\", \"domain\"), \n        d3.transition(path));\n        tickEnter.append(\"line\");\n        tickEnter.append(\"text\");\n        var lineEnter = tickEnter.select(\"line\"), lineUpdate = tickUpdate.select(\"line\"), text = tick.select(\"text\").text(tickFormat), textEnter = tickEnter.select(\"text\"), textUpdate = tickUpdate.select(\"text\");\n        switch (orient) {\n         case \"bottom\":\n          {\n            tickTransform = d3_svg_axisX;\n            lineEnter.attr(\"y2\", innerTickSize);\n            textEnter.attr(\"y\", Math.max(innerTickSize, 0) + tickPadding);\n            lineUpdate.attr(\"x2\", 0).attr(\"y2\", innerTickSize);\n            textUpdate.attr(\"x\", 0).attr(\"y\", Math.max(innerTickSize, 0) + tickPadding);\n            text.attr(\"dy\", \".71em\").style(\"text-anchor\", \"middle\");\n            pathUpdate.attr(\"d\", \"M\" + range[0] + \",\" + outerTickSize + \"V0H\" + range[1] + \"V\" + outerTickSize);\n            break;\n          }\n\n         case \"top\":\n          {\n            tickTransform = d3_svg_axisX;\n            lineEnter.attr(\"y2\", -innerTickSize);\n            textEnter.attr(\"y\", -(Math.max(innerTickSize, 0) + tickPadding));\n            lineUpdate.attr(\"x2\", 0).attr(\"y2\", -innerTickSize);\n            textUpdate.attr(\"x\", 0).attr(\"y\", -(Math.max(innerTickSize, 0) + tickPadding));\n            text.attr(\"dy\", \"0em\").style(\"text-anchor\", \"middle\");\n            pathUpdate.attr(\"d\", \"M\" + range[0] + \",\" + -outerTickSize + \"V0H\" + range[1] + \"V\" + -outerTickSize);\n            break;\n          }\n\n         case \"left\":\n          {\n            tickTransform = d3_svg_axisY;\n            lineEnter.attr(\"x2\", -innerTickSize);\n            textEnter.attr(\"x\", -(Math.max(innerTickSize, 0) + tickPadding));\n            lineUpdate.attr(\"x2\", -innerTickSize).attr(\"y2\", 0);\n            textUpdate.attr(\"x\", -(Math.max(innerTickSize, 0) + tickPadding)).attr(\"y\", 0);\n            text.attr(\"dy\", \".32em\").style(\"text-anchor\", \"end\");\n            pathUpdate.attr(\"d\", \"M\" + -outerTickSize + \",\" + range[0] + \"H0V\" + range[1] + \"H\" + -outerTickSize);\n            break;\n          }\n\n         case \"right\":\n          {\n            tickTransform = d3_svg_axisY;\n            lineEnter.attr(\"x2\", innerTickSize);\n            textEnter.attr(\"x\", Math.max(innerTickSize, 0) + tickPadding);\n            lineUpdate.attr(\"x2\", innerTickSize).attr(\"y2\", 0);\n            textUpdate.attr(\"x\", Math.max(innerTickSize, 0) + tickPadding).attr(\"y\", 0);\n            text.attr(\"dy\", \".32em\").style(\"text-anchor\", \"start\");\n            pathUpdate.attr(\"d\", \"M\" + outerTickSize + \",\" + range[0] + \"H0V\" + range[1] + \"H\" + outerTickSize);\n            break;\n          }\n        }\n        if (scale1.rangeBand) {\n          var x = scale1, dx = x.rangeBand() / 2;\n          scale0 = scale1 = function(d) {\n            return x(d) + dx;\n          };\n        } else if (scale0.rangeBand) {\n          scale0 = scale1;\n        } else {\n          tickExit.call(tickTransform, scale1);\n        }\n        tickEnter.call(tickTransform, scale0);\n        tickUpdate.call(tickTransform, scale1);\n      });\n    }\n    axis.scale = function(x) {\n      if (!arguments.length) return scale;\n      scale = x;\n      return axis;\n    };\n    axis.orient = function(x) {\n      if (!arguments.length) return orient;\n      orient = x in d3_svg_axisOrients ? x + \"\" : d3_svg_axisDefaultOrient;\n      return axis;\n    };\n    axis.ticks = function() {\n      if (!arguments.length) return tickArguments_;\n      tickArguments_ = arguments;\n      return axis;\n    };\n    axis.tickValues = function(x) {\n      if (!arguments.length) return tickValues;\n      tickValues = x;\n      return axis;\n    };\n    axis.tickFormat = function(x) {\n      if (!arguments.length) return tickFormat_;\n      tickFormat_ = x;\n      return axis;\n    };\n    axis.tickSize = function(x) {\n      var n = arguments.length;\n      if (!n) return innerTickSize;\n      innerTickSize = +x;\n      outerTickSize = +arguments[n - 1];\n      return axis;\n    };\n    axis.innerTickSize = function(x) {\n      if (!arguments.length) return innerTickSize;\n      innerTickSize = +x;\n      return axis;\n    };\n    axis.outerTickSize = function(x) {\n      if (!arguments.length) return outerTickSize;\n      outerTickSize = +x;\n      return axis;\n    };\n    axis.tickPadding = function(x) {\n      if (!arguments.length) return tickPadding;\n      tickPadding = +x;\n      return axis;\n    };\n    axis.tickSubdivide = function() {\n      return arguments.length && axis;\n    };\n    return axis;\n  };\n  var d3_svg_axisDefaultOrient = \"bottom\", d3_svg_axisOrients = {\n    top: 1,\n    right: 1,\n    bottom: 1,\n    left: 1\n  };\n  function d3_svg_axisX(selection, x) {\n    selection.attr(\"transform\", function(d) {\n      return \"translate(\" + x(d) + \",0)\";\n    });\n  }\n  function d3_svg_axisY(selection, y) {\n    selection.attr(\"transform\", function(d) {\n      return \"translate(0,\" + y(d) + \")\";\n    });\n  }\n  d3.svg.brush = function() {\n    var event = d3_eventDispatch(brush, \"brushstart\", \"brush\", \"brushend\"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];\n    function brush(g) {\n      g.each(function() {\n        var g = d3.select(this).style(\"pointer-events\", \"all\").style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\").on(\"mousedown.brush\", brushstart).on(\"touchstart.brush\", brushstart);\n        var background = g.selectAll(\".background\").data([ 0 ]);\n        background.enter().append(\"rect\").attr(\"class\", \"background\").style(\"visibility\", \"hidden\").style(\"cursor\", \"crosshair\");\n        g.selectAll(\".extent\").data([ 0 ]).enter().append(\"rect\").attr(\"class\", \"extent\").style(\"cursor\", \"move\");\n        var resize = g.selectAll(\".resize\").data(resizes, d3_identity);\n        resize.exit().remove();\n        resize.enter().append(\"g\").attr(\"class\", function(d) {\n          return \"resize \" + d;\n        }).style(\"cursor\", function(d) {\n          return d3_svg_brushCursor[d];\n        }).append(\"rect\").attr(\"x\", function(d) {\n          return /[ew]$/.test(d) ? -3 : null;\n        }).attr(\"y\", function(d) {\n          return /^[ns]/.test(d) ? -3 : null;\n        }).attr(\"width\", 6).attr(\"height\", 6).style(\"visibility\", \"hidden\");\n        resize.style(\"display\", brush.empty() ? \"none\" : null);\n        var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;\n        if (x) {\n          range = d3_scaleRange(x);\n          backgroundUpdate.attr(\"x\", range[0]).attr(\"width\", range[1] - range[0]);\n          redrawX(gUpdate);\n        }\n        if (y) {\n          range = d3_scaleRange(y);\n          backgroundUpdate.attr(\"y\", range[0]).attr(\"height\", range[1] - range[0]);\n          redrawY(gUpdate);\n        }\n        redraw(gUpdate);\n      });\n    }\n    brush.event = function(g) {\n      g.each(function() {\n        var event_ = event.of(this, arguments), extent1 = {\n          x: xExtent,\n          y: yExtent,\n          i: xExtentDomain,\n          j: yExtentDomain\n        }, extent0 = this.__chart__ || extent1;\n        this.__chart__ = extent1;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.brush\", function() {\n            xExtentDomain = extent0.i;\n            yExtentDomain = extent0.j;\n            xExtent = extent0.x;\n            yExtent = extent0.y;\n            event_({\n              type: \"brushstart\"\n            });\n          }).tween(\"brush:brush\", function() {\n            var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);\n            xExtentDomain = yExtentDomain = null;\n            return function(t) {\n              xExtent = extent1.x = xi(t);\n              yExtent = extent1.y = yi(t);\n              event_({\n                type: \"brush\",\n                mode: \"resize\"\n              });\n            };\n          }).each(\"end.brush\", function() {\n            xExtentDomain = extent1.i;\n            yExtentDomain = extent1.j;\n            event_({\n              type: \"brush\",\n              mode: \"resize\"\n            });\n            event_({\n              type: \"brushend\"\n            });\n          });\n        } else {\n          event_({\n            type: \"brushstart\"\n          });\n          event_({\n            type: \"brush\",\n            mode: \"resize\"\n          });\n          event_({\n            type: \"brushend\"\n          });\n        }\n      });\n    };\n    function redraw(g) {\n      g.selectAll(\".resize\").attr(\"transform\", function(d) {\n        return \"translate(\" + xExtent[+/e$/.test(d)] + \",\" + yExtent[+/^s/.test(d)] + \")\";\n      });\n    }\n    function redrawX(g) {\n      g.select(\".extent\").attr(\"x\", xExtent[0]);\n      g.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\", xExtent[1] - xExtent[0]);\n    }\n    function redrawY(g) {\n      g.select(\".extent\").attr(\"y\", yExtent[0]);\n      g.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\", yExtent[1] - yExtent[0]);\n    }\n    function brushstart() {\n      var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed(\"extent\"), dragRestore = d3_event_dragSuppress(), center, origin = d3.mouse(target), offset;\n      var w = d3.select(d3_window).on(\"keydown.brush\", keydown).on(\"keyup.brush\", keyup);\n      if (d3.event.changedTouches) {\n        w.on(\"touchmove.brush\", brushmove).on(\"touchend.brush\", brushend);\n      } else {\n        w.on(\"mousemove.brush\", brushmove).on(\"mouseup.brush\", brushend);\n      }\n      g.interrupt().selectAll(\"*\").interrupt();\n      if (dragging) {\n        origin[0] = xExtent[0] - origin[0];\n        origin[1] = yExtent[0] - origin[1];\n      } else if (resizing) {\n        var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);\n        offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];\n        origin[0] = xExtent[ex];\n        origin[1] = yExtent[ey];\n      } else if (d3.event.altKey) center = origin.slice();\n      g.style(\"pointer-events\", \"none\").selectAll(\".resize\").style(\"display\", null);\n      d3.select(\"body\").style(\"cursor\", eventTarget.style(\"cursor\"));\n      event_({\n        type: \"brushstart\"\n      });\n      brushmove();\n      function keydown() {\n        if (d3.event.keyCode == 32) {\n          if (!dragging) {\n            center = null;\n            origin[0] -= xExtent[1];\n            origin[1] -= yExtent[1];\n            dragging = 2;\n          }\n          d3_eventPreventDefault();\n        }\n      }\n      function keyup() {\n        if (d3.event.keyCode == 32 && dragging == 2) {\n          origin[0] += xExtent[1];\n          origin[1] += yExtent[1];\n          dragging = 0;\n          d3_eventPreventDefault();\n        }\n      }\n      function brushmove() {\n        var point = d3.mouse(target), moved = false;\n        if (offset) {\n          point[0] += offset[0];\n          point[1] += offset[1];\n        }\n        if (!dragging) {\n          if (d3.event.altKey) {\n            if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];\n            origin[0] = xExtent[+(point[0] < center[0])];\n            origin[1] = yExtent[+(point[1] < center[1])];\n          } else center = null;\n        }\n        if (resizingX && move1(point, x, 0)) {\n          redrawX(g);\n          moved = true;\n        }\n        if (resizingY && move1(point, y, 1)) {\n          redrawY(g);\n          moved = true;\n        }\n        if (moved) {\n          redraw(g);\n          event_({\n            type: \"brush\",\n            mode: dragging ? \"move\" : \"resize\"\n          });\n        }\n      }\n      function move1(point, scale, i) {\n        var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;\n        if (dragging) {\n          r0 -= position;\n          r1 -= size + position;\n        }\n        min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];\n        if (dragging) {\n          max = (min += position) + size;\n        } else {\n          if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));\n          if (position < min) {\n            max = min;\n            min = position;\n          } else {\n            max = position;\n          }\n        }\n        if (extent[0] != min || extent[1] != max) {\n          if (i) yExtentDomain = null; else xExtentDomain = null;\n          extent[0] = min;\n          extent[1] = max;\n          return true;\n        }\n      }\n      function brushend() {\n        brushmove();\n        g.style(\"pointer-events\", \"all\").selectAll(\".resize\").style(\"display\", brush.empty() ? \"none\" : null);\n        d3.select(\"body\").style(\"cursor\", null);\n        w.on(\"mousemove.brush\", null).on(\"mouseup.brush\", null).on(\"touchmove.brush\", null).on(\"touchend.brush\", null).on(\"keydown.brush\", null).on(\"keyup.brush\", null);\n        dragRestore();\n        event_({\n          type: \"brushend\"\n        });\n      }\n    }\n    brush.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.clamp = function(z) {\n      if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;\n      if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;\n      return brush;\n    };\n    brush.extent = function(z) {\n      var x0, x1, y0, y1, t;\n      if (!arguments.length) {\n        if (x) {\n          if (xExtentDomain) {\n            x0 = xExtentDomain[0], x1 = xExtentDomain[1];\n          } else {\n            x0 = xExtent[0], x1 = xExtent[1];\n            if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);\n            if (x1 < x0) t = x0, x0 = x1, x1 = t;\n          }\n        }\n        if (y) {\n          if (yExtentDomain) {\n            y0 = yExtentDomain[0], y1 = yExtentDomain[1];\n          } else {\n            y0 = yExtent[0], y1 = yExtent[1];\n            if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);\n            if (y1 < y0) t = y0, y0 = y1, y1 = t;\n          }\n        }\n        return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];\n      }\n      if (x) {\n        x0 = z[0], x1 = z[1];\n        if (y) x0 = x0[0], x1 = x1[0];\n        xExtentDomain = [ x0, x1 ];\n        if (x.invert) x0 = x(x0), x1 = x(x1);\n        if (x1 < x0) t = x0, x0 = x1, x1 = t;\n        if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];\n      }\n      if (y) {\n        y0 = z[0], y1 = z[1];\n        if (x) y0 = y0[1], y1 = y1[1];\n        yExtentDomain = [ y0, y1 ];\n        if (y.invert) y0 = y(y0), y1 = y(y1);\n        if (y1 < y0) t = y0, y0 = y1, y1 = t;\n        if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];\n      }\n      return brush;\n    };\n    brush.clear = function() {\n      if (!brush.empty()) {\n        xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];\n        xExtentDomain = yExtentDomain = null;\n      }\n      return brush;\n    };\n    brush.empty = function() {\n      return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];\n    };\n    return d3.rebind(brush, event, \"on\");\n  };\n  var d3_svg_brushCursor = {\n    n: \"ns-resize\",\n    e: \"ew-resize\",\n    s: \"ns-resize\",\n    w: \"ew-resize\",\n    nw: \"nwse-resize\",\n    ne: \"nesw-resize\",\n    se: \"nwse-resize\",\n    sw: \"nesw-resize\"\n  };\n  var d3_svg_brushResizes = [ [ \"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\" ], [ \"e\", \"w\" ], [ \"n\", \"s\" ], [] ];\n  var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;\n  var d3_time_formatUtc = d3_time_format.utc;\n  var d3_time_formatIso = d3_time_formatUtc(\"%Y-%m-%dT%H:%M:%S.%LZ\");\n  d3_time_format.iso = Date.prototype.toISOString && +new Date(\"2000-01-01T00:00:00.000Z\") ? d3_time_formatIsoNative : d3_time_formatIso;\n  function d3_time_formatIsoNative(date) {\n    return date.toISOString();\n  }\n  d3_time_formatIsoNative.parse = function(string) {\n    var date = new Date(string);\n    return isNaN(date) ? null : date;\n  };\n  d3_time_formatIsoNative.toString = d3_time_formatIso.toString;\n  d3_time.second = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 1e3) * 1e3);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 1e3);\n  }, function(date) {\n    return date.getSeconds();\n  });\n  d3_time.seconds = d3_time.second.range;\n  d3_time.seconds.utc = d3_time.second.utc.range;\n  d3_time.minute = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 6e4) * 6e4);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 6e4);\n  }, function(date) {\n    return date.getMinutes();\n  });\n  d3_time.minutes = d3_time.minute.range;\n  d3_time.minutes.utc = d3_time.minute.utc.range;\n  d3_time.hour = d3_time_interval(function(date) {\n    var timezone = date.getTimezoneOffset() / 60;\n    return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 36e5);\n  }, function(date) {\n    return date.getHours();\n  });\n  d3_time.hours = d3_time.hour.range;\n  d3_time.hours.utc = d3_time.hour.utc.range;\n  d3_time.month = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setDate(1);\n    return date;\n  }, function(date, offset) {\n    date.setMonth(date.getMonth() + offset);\n  }, function(date) {\n    return date.getMonth();\n  });\n  d3_time.months = d3_time.month.range;\n  d3_time.months.utc = d3_time.month.utc.range;\n  function d3_time_scale(linear, methods, format) {\n    function scale(x) {\n      return linear(x);\n    }\n    scale.invert = function(x) {\n      return d3_time_scaleDate(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return linear.domain().map(d3_time_scaleDate);\n      linear.domain(x);\n      return scale;\n    };\n    function tickMethod(extent, count) {\n      var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);\n      return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {\n        return d / 31536e6;\n      }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];\n    }\n    scale.nice = function(interval, skip) {\n      var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" && tickMethod(extent, interval);\n      if (method) interval = method[0], skip = method[1];\n      function skipped(date) {\n        return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;\n      }\n      return scale.domain(d3_scale_nice(domain, skip > 1 ? {\n        floor: function(date) {\n          while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);\n          return date;\n        },\n        ceil: function(date) {\n          while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);\n          return date;\n        }\n      } : interval));\n    };\n    scale.ticks = function(interval, skip) {\n      var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" ? tickMethod(extent, interval) : !interval.range && [ {\n        range: interval\n      }, skip ];\n      if (method) interval = method[0], skip = method[1];\n      return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);\n    };\n    scale.tickFormat = function() {\n      return format;\n    };\n    scale.copy = function() {\n      return d3_time_scale(linear.copy(), methods, format);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_time_scaleDate(t) {\n    return new Date(t);\n  }\n  var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];\n  var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];\n  var d3_time_scaleLocalFormat = d3_time_format.multi([ [ \".%L\", function(d) {\n    return d.getMilliseconds();\n  } ], [ \":%S\", function(d) {\n    return d.getSeconds();\n  } ], [ \"%I:%M\", function(d) {\n    return d.getMinutes();\n  } ], [ \"%I %p\", function(d) {\n    return d.getHours();\n  } ], [ \"%a %d\", function(d) {\n    return d.getDay() && d.getDate() != 1;\n  } ], [ \"%b %d\", function(d) {\n    return d.getDate() != 1;\n  } ], [ \"%B\", function(d) {\n    return d.getMonth();\n  } ], [ \"%Y\", d3_true ] ]);\n  var d3_time_scaleMilliseconds = {\n    range: function(start, stop, step) {\n      return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);\n    },\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  d3_time_scaleLocalMethods.year = d3_time.year;\n  d3_time.scale = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);\n  };\n  var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {\n    return [ m[0].utc, m[1] ];\n  });\n  var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ \".%L\", function(d) {\n    return d.getUTCMilliseconds();\n  } ], [ \":%S\", function(d) {\n    return d.getUTCSeconds();\n  } ], [ \"%I:%M\", function(d) {\n    return d.getUTCMinutes();\n  } ], [ \"%I %p\", function(d) {\n    return d.getUTCHours();\n  } ], [ \"%a %d\", function(d) {\n    return d.getUTCDay() && d.getUTCDate() != 1;\n  } ], [ \"%b %d\", function(d) {\n    return d.getUTCDate() != 1;\n  } ], [ \"%B\", function(d) {\n    return d.getUTCMonth();\n  } ], [ \"%Y\", d3_true ] ]);\n  d3_time_scaleUtcMethods.year = d3_time.year.utc;\n  d3_time.scale.utc = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);\n  };\n  d3.text = d3_xhrType(function(request) {\n    return request.responseText;\n  });\n  d3.json = function(url, callback) {\n    return d3_xhr(url, \"application/json\", d3_json, callback);\n  };\n  function d3_json(request) {\n    return JSON.parse(request.responseText);\n  }\n  d3.html = function(url, callback) {\n    return d3_xhr(url, \"text/html\", d3_html, callback);\n  };\n  function d3_html(request) {\n    var range = d3_document.createRange();\n    range.selectNode(d3_document.body);\n    return range.createContextualFragment(request.responseText);\n  }\n  d3.xml = d3_xhrType(function(request) {\n    return request.responseXML;\n  });\n  if (typeof define === \"function\" && define.amd) define(d3); else if (typeof module === \"object\" && module.exports) module.exports = d3;\n  this.d3 = d3;\n}();","(function() {\n    !function() {\n        var d3 = {\n            version: \"3.4.4\"\n        };\n        d3.scale = {};\n        function d3_scaleExtent(domain) {\n            var start = domain[0], stop = domain[domain.length - 1];\n            return start < stop ? [ start, stop ] : [ stop, start ];\n        }\n        function d3_scaleRange(scale) {\n            return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());\n        }\n        var abs = Math.abs;\n        d3.range = function(start, stop, step) {\n            if (arguments.length < 3) {\n                step = 1;\n                if (arguments.length < 2) {\n                    stop = start;\n                    start = 0;\n                }\n            }\n            if ((stop - start) / step === Infinity) throw new Error(\"infinite range\");\n            var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;\n            start *= k, stop *= k, step *= k;\n            if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);\n            return range;\n        };\n        function d3_range_integerScale(x) {\n            var k = 1;\n            while (x * k % 1) k *= 10;\n            return k;\n        }\n        d3.rebind = function(target, source) {\n            var i = 1, n = arguments.length, method;\n            while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);\n            return target;\n        };\n        function d3_rebind(target, source, method) {\n            return function() {\n                var value = method.apply(source, arguments);\n                return value === source ? target : value;\n            };\n        }\n        function d3_Color() {}\n        d3_Color.prototype.toString = function() {\n            return this.rgb() + \"\";\n        };\n        function d3_class(ctor, properties) {\n            try {\n                for (var key in properties) {\n                    Object.defineProperty(ctor.prototype, key, {\n                        value: properties[key],\n                        enumerable: false\n                    });\n                }\n            } catch (e) {\n                ctor.prototype = properties;\n            }\n        }\n        d3.map = function(object) {\n            var map = new d3_Map();\n            if (object instanceof d3_Map) object.forEach(function(key, value) {\n                map.set(key, value);\n            }); else for (var key in object) map.set(key, object[key]);\n            return map;\n        };\n        function d3_Map() {}\n        d3_class(d3_Map, {\n            has: d3_map_has,\n            get: function(key) {\n                return this[d3_map_prefix + key];\n            },\n            set: function(key, value) {\n                return this[d3_map_prefix + key] = value;\n            },\n            remove: d3_map_remove,\n            keys: d3_map_keys,\n            values: function() {\n                var values = [];\n                this.forEach(function(key, value) {\n                    values.push(value);\n                });\n                return values;\n            },\n            entries: function() {\n                var entries = [];\n                this.forEach(function(key, value) {\n                    entries.push({\n                        key: key,\n                        value: value\n                    });\n                });\n                return entries;\n            },\n            size: d3_map_size,\n            empty: d3_map_empty,\n            forEach: function(f) {\n                for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) f.call(this, key.substring(1), this[key]);\n            }\n        });\n        var d3_map_prefix = \"\\x00\", d3_map_prefixCode = d3_map_prefix.charCodeAt(0);\n        function d3_map_has(key) {\n            return d3_map_prefix + key in this;\n        }\n        function d3_map_remove(key) {\n            key = d3_map_prefix + key;\n            return key in this && delete this[key];\n        }\n        function d3_map_keys() {\n            var keys = [];\n            this.forEach(function(key) {\n                keys.push(key);\n            });\n            return keys;\n        }\n        function d3_map_size() {\n            var size = 0;\n            for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) ++size;\n            return size;\n        }\n        function d3_map_empty() {\n            for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) return false;\n            return true;\n        }\n        d3.hsl = function(h, s, l) {\n            return arguments.length === 1 ? h instanceof d3_Hsl ? d3_hsl(h.h, h.s, h.l) : d3_rgb_parse(\"\" + h, d3_rgb_hsl, d3_hsl) : d3_hsl(+h, +s, +l);\n        };\n        function d3_hsl(h, s, l) {\n            return new d3_Hsl(h, s, l);\n        }\n        function d3_Hsl(h, s, l) {\n            this.h = h;\n            this.s = s;\n            this.l = l;\n        }\n        var d3_hslPrototype = d3_Hsl.prototype = new d3_Color();\n        d3_hslPrototype.brighter = function(k) {\n            k = Math.pow(.7, arguments.length ? k : 1);\n            return d3_hsl(this.h, this.s, this.l / k);\n        };\n        d3_hslPrototype.darker = function(k) {\n            k = Math.pow(.7, arguments.length ? k : 1);\n            return d3_hsl(this.h, this.s, k * this.l);\n        };\n        d3_hslPrototype.rgb = function() {\n            return d3_hsl_rgb(this.h, this.s, this.l);\n        };\n        function d3_hsl_rgb(h, s, l) {\n            var m1, m2;\n            h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;\n            s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;\n            l = l < 0 ? 0 : l > 1 ? 1 : l;\n            m2 = l <= .5 ? l * (1 + s) : l + s - l * s;\n            m1 = 2 * l - m2;\n            function v(h) {\n                if (h > 360) h -= 360; else if (h < 0) h += 360;\n                if (h < 60) return m1 + (m2 - m1) * h / 60;\n                if (h < 180) return m2;\n                if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;\n                return m1;\n            }\n            function vv(h) {\n                return Math.round(v(h) * 255);\n            }\n            return d3_rgb(vv(h + 120), vv(h), vv(h - 120));\n        }\n        var π = Math.PI, τ = 2 * π, halfπ = π / 2, ε = 1e-6, ε2 = ε * ε, d3_radians = π / 180, d3_degrees = 180 / π;\n        function d3_sgn(x) {\n            return x > 0 ? 1 : x < 0 ? -1 : 0;\n        }\n        function d3_cross2d(a, b, c) {\n            return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n        }\n        function d3_acos(x) {\n            return x > 1 ? 0 : x < -1 ? π : Math.acos(x);\n        }\n        function d3_asin(x) {\n            return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);\n        }\n        function d3_sinh(x) {\n            return ((x = Math.exp(x)) - 1 / x) / 2;\n        }\n        function d3_cosh(x) {\n            return ((x = Math.exp(x)) + 1 / x) / 2;\n        }\n        function d3_tanh(x) {\n            return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n        }\n        function d3_haversin(x) {\n            return (x = Math.sin(x / 2)) * x;\n        }\n        d3.hcl = function(h, c, l) {\n            return arguments.length === 1 ? h instanceof d3_Hcl ? d3_hcl(h.h, h.c, h.l) : h instanceof d3_Lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : d3_hcl(+h, +c, +l);\n        };\n        function d3_hcl(h, c, l) {\n            return new d3_Hcl(h, c, l);\n        }\n        function d3_Hcl(h, c, l) {\n            this.h = h;\n            this.c = c;\n            this.l = l;\n        }\n        var d3_hclPrototype = d3_Hcl.prototype = new d3_Color();\n        d3_hclPrototype.brighter = function(k) {\n            return d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));\n        };\n        d3_hclPrototype.darker = function(k) {\n            return d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));\n        };\n        d3_hclPrototype.rgb = function() {\n            return d3_hcl_lab(this.h, this.c, this.l).rgb();\n        };\n        function d3_hcl_lab(h, c, l) {\n            if (isNaN(h)) h = 0;\n            if (isNaN(c)) c = 0;\n            return d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);\n        }\n        d3.lab = function(l, a, b) {\n            return arguments.length === 1 ? l instanceof d3_Lab ? d3_lab(l.l, l.a, l.b) : l instanceof d3_Hcl ? d3_hcl_lab(l.l, l.c, l.h) : d3_rgb_lab((l = d3.rgb(l)).r, l.g, l.b) : d3_lab(+l, +a, +b);\n        };\n        function d3_lab(l, a, b) {\n            return new d3_Lab(l, a, b);\n        }\n        function d3_Lab(l, a, b) {\n            this.l = l;\n            this.a = a;\n            this.b = b;\n        }\n        var d3_lab_K = 18;\n        var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;\n        var d3_labPrototype = d3_Lab.prototype = new d3_Color();\n        d3_labPrototype.brighter = function(k) {\n            return d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n        };\n        d3_labPrototype.darker = function(k) {\n            return d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n        };\n        d3_labPrototype.rgb = function() {\n            return d3_lab_rgb(this.l, this.a, this.b);\n        };\n        function d3_lab_rgb(l, a, b) {\n            var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;\n            x = d3_lab_xyz(x) * d3_lab_X;\n            y = d3_lab_xyz(y) * d3_lab_Y;\n            z = d3_lab_xyz(z) * d3_lab_Z;\n            return d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));\n        }\n        function d3_lab_hcl(l, a, b) {\n            return l > 0 ? d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : d3_hcl(NaN, NaN, l);\n        }\n        function d3_lab_xyz(x) {\n            return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;\n        }\n        function d3_xyz_lab(x) {\n            return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;\n        }\n        function d3_xyz_rgb(r) {\n            return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));\n        }\n        d3.rgb = function(r, g, b) {\n            return arguments.length === 1 ? r instanceof d3_Rgb ? d3_rgb(r.r, r.g, r.b) : d3_rgb_parse(\"\" + r, d3_rgb, d3_hsl_rgb) : d3_rgb(~~r, ~~g, ~~b);\n        };\n        function d3_rgbNumber(value) {\n            return d3_rgb(value >> 16, value >> 8 & 255, value & 255);\n        }\n        function d3_rgbString(value) {\n            return d3_rgbNumber(value) + \"\";\n        }\n        function d3_rgb(r, g, b) {\n            return new d3_Rgb(r, g, b);\n        }\n        function d3_Rgb(r, g, b) {\n            this.r = r;\n            this.g = g;\n            this.b = b;\n        }\n        var d3_rgbPrototype = d3_Rgb.prototype = new d3_Color();\n        d3_rgbPrototype.brighter = function(k) {\n            k = Math.pow(.7, arguments.length ? k : 1);\n            var r = this.r, g = this.g, b = this.b, i = 30;\n            if (!r && !g && !b) return d3_rgb(i, i, i);\n            if (r && r < i) r = i;\n            if (g && g < i) g = i;\n            if (b && b < i) b = i;\n            return d3_rgb(Math.min(255, ~~(r / k)), Math.min(255, ~~(g / k)), Math.min(255, ~~(b / k)));\n        };\n        d3_rgbPrototype.darker = function(k) {\n            k = Math.pow(.7, arguments.length ? k : 1);\n            return d3_rgb(~~(k * this.r), ~~(k * this.g), ~~(k * this.b));\n        };\n        d3_rgbPrototype.hsl = function() {\n            return d3_rgb_hsl(this.r, this.g, this.b);\n        };\n        d3_rgbPrototype.toString = function() {\n            return \"#\" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);\n        };\n        function d3_rgb_hex(v) {\n            return v < 16 ? \"0\" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);\n        }\n        function d3_rgb_parse(format, rgb, hsl) {\n            var r = 0, g = 0, b = 0, m1, m2, color;\n            m1 = /([a-z]+)\\((.*)\\)/i.exec(format);\n            if (m1) {\n                m2 = m1[2].split(\",\");\n                switch (m1[1]) {\n                  case \"hsl\":\n                    {\n                        return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);\n                    }\n\n                  case \"rgb\":\n                    {\n                        return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));\n                    }\n                }\n            }\n            if (color = d3_rgb_names.get(format)) return rgb(color.r, color.g, color.b);\n            if (format != null && format.charAt(0) === \"#\" && !isNaN(color = parseInt(format.substring(1), 16))) {\n                if (format.length === 4) {\n                    r = (color & 3840) >> 4;\n                    r = r >> 4 | r;\n                    g = color & 240;\n                    g = g >> 4 | g;\n                    b = color & 15;\n                    b = b << 4 | b;\n                } else if (format.length === 7) {\n                    r = (color & 16711680) >> 16;\n                    g = (color & 65280) >> 8;\n                    b = color & 255;\n                }\n            }\n            return rgb(r, g, b);\n        }\n        function d3_rgb_hsl(r, g, b) {\n            var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;\n            if (d) {\n                s = l < .5 ? d / (max + min) : d / (2 - max - min);\n                if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;\n                h *= 60;\n            } else {\n                h = NaN;\n                s = l > 0 && l < 1 ? 0 : h;\n            }\n            return d3_hsl(h, s, l);\n        }\n        function d3_rgb_lab(r, g, b) {\n            r = d3_rgb_xyz(r);\n            g = d3_rgb_xyz(g);\n            b = d3_rgb_xyz(b);\n            var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);\n            return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));\n        }\n        function d3_rgb_xyz(r) {\n            return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);\n        }\n        function d3_rgb_parseNumber(c) {\n            var f = parseFloat(c);\n            return c.charAt(c.length - 1) === \"%\" ? Math.round(f * 2.55) : f;\n        }\n        var d3_rgb_names = d3.map({\n            aliceblue: 15792383,\n            antiquewhite: 16444375,\n            aqua: 65535,\n            aquamarine: 8388564,\n            azure: 15794175,\n            beige: 16119260,\n            bisque: 16770244,\n            black: 0,\n            blanchedalmond: 16772045,\n            blue: 255,\n            blueviolet: 9055202,\n            brown: 10824234,\n            burlywood: 14596231,\n            cadetblue: 6266528,\n            chartreuse: 8388352,\n            chocolate: 13789470,\n            coral: 16744272,\n            cornflowerblue: 6591981,\n            cornsilk: 16775388,\n            crimson: 14423100,\n            cyan: 65535,\n            darkblue: 139,\n            darkcyan: 35723,\n            darkgoldenrod: 12092939,\n            darkgray: 11119017,\n            darkgreen: 25600,\n            darkgrey: 11119017,\n            darkkhaki: 12433259,\n            darkmagenta: 9109643,\n            darkolivegreen: 5597999,\n            darkorange: 16747520,\n            darkorchid: 10040012,\n            darkred: 9109504,\n            darksalmon: 15308410,\n            darkseagreen: 9419919,\n            darkslateblue: 4734347,\n            darkslategray: 3100495,\n            darkslategrey: 3100495,\n            darkturquoise: 52945,\n            darkviolet: 9699539,\n            deeppink: 16716947,\n            deepskyblue: 49151,\n            dimgray: 6908265,\n            dimgrey: 6908265,\n            dodgerblue: 2003199,\n            firebrick: 11674146,\n            floralwhite: 16775920,\n            forestgreen: 2263842,\n            fuchsia: 16711935,\n            gainsboro: 14474460,\n            ghostwhite: 16316671,\n            gold: 16766720,\n            goldenrod: 14329120,\n            gray: 8421504,\n            green: 32768,\n            greenyellow: 11403055,\n            grey: 8421504,\n            honeydew: 15794160,\n            hotpink: 16738740,\n            indianred: 13458524,\n            indigo: 4915330,\n            ivory: 16777200,\n            khaki: 15787660,\n            lavender: 15132410,\n            lavenderblush: 16773365,\n            lawngreen: 8190976,\n            lemonchiffon: 16775885,\n            lightblue: 11393254,\n            lightcoral: 15761536,\n            lightcyan: 14745599,\n            lightgoldenrodyellow: 16448210,\n            lightgray: 13882323,\n            lightgreen: 9498256,\n            lightgrey: 13882323,\n            lightpink: 16758465,\n            lightsalmon: 16752762,\n            lightseagreen: 2142890,\n            lightskyblue: 8900346,\n            lightslategray: 7833753,\n            lightslategrey: 7833753,\n            lightsteelblue: 11584734,\n            lightyellow: 16777184,\n            lime: 65280,\n            limegreen: 3329330,\n            linen: 16445670,\n            magenta: 16711935,\n            maroon: 8388608,\n            mediumaquamarine: 6737322,\n            mediumblue: 205,\n            mediumorchid: 12211667,\n            mediumpurple: 9662683,\n            mediumseagreen: 3978097,\n            mediumslateblue: 8087790,\n            mediumspringgreen: 64154,\n            mediumturquoise: 4772300,\n            mediumvioletred: 13047173,\n            midnightblue: 1644912,\n            mintcream: 16121850,\n            mistyrose: 16770273,\n            moccasin: 16770229,\n            navajowhite: 16768685,\n            navy: 128,\n            oldlace: 16643558,\n            olive: 8421376,\n            olivedrab: 7048739,\n            orange: 16753920,\n            orangered: 16729344,\n            orchid: 14315734,\n            palegoldenrod: 15657130,\n            palegreen: 10025880,\n            paleturquoise: 11529966,\n            palevioletred: 14381203,\n            papayawhip: 16773077,\n            peachpuff: 16767673,\n            peru: 13468991,\n            pink: 16761035,\n            plum: 14524637,\n            powderblue: 11591910,\n            purple: 8388736,\n            red: 16711680,\n            rosybrown: 12357519,\n            royalblue: 4286945,\n            saddlebrown: 9127187,\n            salmon: 16416882,\n            sandybrown: 16032864,\n            seagreen: 3050327,\n            seashell: 16774638,\n            sienna: 10506797,\n            silver: 12632256,\n            skyblue: 8900331,\n            slateblue: 6970061,\n            slategray: 7372944,\n            slategrey: 7372944,\n            snow: 16775930,\n            springgreen: 65407,\n            steelblue: 4620980,\n            tan: 13808780,\n            teal: 32896,\n            thistle: 14204888,\n            tomato: 16737095,\n            turquoise: 4251856,\n            violet: 15631086,\n            wheat: 16113331,\n            white: 16777215,\n            whitesmoke: 16119285,\n            yellow: 16776960,\n            yellowgreen: 10145074\n        });\n        d3_rgb_names.forEach(function(key, value) {\n            d3_rgb_names.set(key, d3_rgbNumber(value));\n        });\n        d3.interpolateRgb = d3_interpolateRgb;\n        function d3_interpolateRgb(a, b) {\n            a = d3.rgb(a);\n            b = d3.rgb(b);\n            var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;\n            return function(t) {\n                return \"#\" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));\n            };\n        }\n        d3.interpolateObject = d3_interpolateObject;\n        function d3_interpolateObject(a, b) {\n            var i = {}, c = {}, k;\n            for (k in a) {\n                if (k in b) {\n                    i[k] = d3_interpolate(a[k], b[k]);\n                } else {\n                    c[k] = a[k];\n                }\n            }\n            for (k in b) {\n                if (!(k in a)) {\n                    c[k] = b[k];\n                }\n            }\n            return function(t) {\n                for (k in i) c[k] = i[k](t);\n                return c;\n            };\n        }\n        d3.interpolateArray = d3_interpolateArray;\n        function d3_interpolateArray(a, b) {\n            var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;\n            for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));\n            for (;i < na; ++i) c[i] = a[i];\n            for (;i < nb; ++i) c[i] = b[i];\n            return function(t) {\n                for (i = 0; i < n0; ++i) c[i] = x[i](t);\n                return c;\n            };\n        }\n        d3.interpolateNumber = d3_interpolateNumber;\n        function d3_interpolateNumber(a, b) {\n            b -= a = +a;\n            return function(t) {\n                return a + b * t;\n            };\n        }\n        d3.interpolateString = d3_interpolateString;\n        function d3_interpolateString(a, b) {\n            var m, i, j, s0 = 0, s1 = 0, s = [], q = [], n, o;\n            a = a + \"\", b = b + \"\";\n            d3_interpolate_number.lastIndex = 0;\n            for (i = 0; m = d3_interpolate_number.exec(b); ++i) {\n                if (m.index) s.push(b.substring(s0, s1 = m.index));\n                q.push({\n                    i: s.length,\n                    x: m[0]\n                });\n                s.push(null);\n                s0 = d3_interpolate_number.lastIndex;\n            }\n            if (s0 < b.length) s.push(b.substring(s0));\n            for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) {\n                o = q[i];\n                if (o.x == m[0]) {\n                    if (o.i) {\n                        if (s[o.i + 1] == null) {\n                            s[o.i - 1] += o.x;\n                            s.splice(o.i, 1);\n                            for (j = i + 1; j < n; ++j) q[j].i--;\n                        } else {\n                            s[o.i - 1] += o.x + s[o.i + 1];\n                            s.splice(o.i, 2);\n                            for (j = i + 1; j < n; ++j) q[j].i -= 2;\n                        }\n                    } else {\n                        if (s[o.i + 1] == null) {\n                            s[o.i] = o.x;\n                        } else {\n                            s[o.i] = o.x + s[o.i + 1];\n                            s.splice(o.i + 1, 1);\n                            for (j = i + 1; j < n; ++j) q[j].i--;\n                        }\n                    }\n                    q.splice(i, 1);\n                    n--;\n                    i--;\n                } else {\n                    o.x = d3_interpolateNumber(parseFloat(m[0]), parseFloat(o.x));\n                }\n            }\n            while (i < n) {\n                o = q.pop();\n                if (s[o.i + 1] == null) {\n                    s[o.i] = o.x;\n                } else {\n                    s[o.i] = o.x + s[o.i + 1];\n                    s.splice(o.i + 1, 1);\n                }\n                n--;\n            }\n            if (s.length === 1) {\n                return s[0] == null ? (o = q[0].x, function(t) {\n                    return o(t) + \"\";\n                }) : function() {\n                    return b;\n                };\n            }\n            return function(t) {\n                for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t);\n                return s.join(\"\");\n            };\n        }\n        var d3_interpolate_number = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g;\n        d3.interpolate = d3_interpolate;\n        function d3_interpolate(a, b) {\n            var i = d3.interpolators.length, f;\n            while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;\n            return f;\n        }\n        d3.interpolators = [ function(a, b) {\n            var t = typeof b;\n            return (t === \"string\" ? d3_rgb_names.has(b) || /^(#|rgb\\(|hsl\\()/.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_Color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === \"object\" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);\n        } ];\n        d3.interpolateRound = d3_interpolateRound;\n        function d3_interpolateRound(a, b) {\n            b -= a;\n            return function(t) {\n                return Math.round(a + b * t);\n            };\n        }\n        function d3_uninterpolateNumber(a, b) {\n            b = b - (a = +a) ? 1 / (b - a) : 0;\n            return function(x) {\n                return (x - a) * b;\n            };\n        }\n        function d3_uninterpolateClamp(a, b) {\n            b = b - (a = +a) ? 1 / (b - a) : 0;\n            return function(x) {\n                return Math.max(0, Math.min(1, (x - a) * b));\n            };\n        }\n        function d3_identity(d) {\n            return d;\n        }\n        function d3_format_precision(x, p) {\n            return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);\n        }\n        d3.round = function(x, n) {\n            return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);\n        };\n        var d3_formatPrefixes = [ \"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\" ].map(d3_formatPrefix);\n        d3.formatPrefix = function(value, precision) {\n            var i = 0;\n            if (value) {\n                if (value < 0) value *= -1;\n                if (precision) value = d3.round(value, d3_format_precision(value, precision));\n                i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);\n                i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));\n            }\n            return d3_formatPrefixes[8 + i / 3];\n        };\n        function d3_formatPrefix(d, i) {\n            var k = Math.pow(10, abs(8 - i) * 3);\n            return {\n                scale: i > 8 ? function(d) {\n                    return d / k;\n                } : function(d) {\n                    return d * k;\n                },\n                symbol: d\n            };\n        }\n        function d3_locale_numberFormat(locale) {\n            var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping ? function(value) {\n                var i = value.length, t = [], j = 0, g = locale_grouping[0];\n                while (i > 0 && g > 0) {\n                    t.push(value.substring(i -= g, i + g));\n                    g = locale_grouping[j = (j + 1) % locale_grouping.length];\n                }\n                return t.reverse().join(locale_thousands);\n            } : d3_identity;\n            return function(specifier) {\n                var match = d3_format_re.exec(specifier), fill = match[1] || \" \", align = match[2] || \">\", sign = match[3] || \"\", symbol = match[4] || \"\", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = \"\", suffix = \"\", integer = false;\n                if (precision) precision = +precision.substring(1);\n                if (zfill || fill === \"0\" && align === \"=\") {\n                    zfill = fill = \"0\";\n                    align = \"=\";\n                    if (comma) width -= Math.floor((width - 1) / 4);\n                }\n                switch (type) {\n                  case \"n\":\n                    comma = true;\n                    type = \"g\";\n                    break;\n\n                  case \"%\":\n                    scale = 100;\n                    suffix = \"%\";\n                    type = \"f\";\n                    break;\n\n                  case \"p\":\n                    scale = 100;\n                    suffix = \"%\";\n                    type = \"r\";\n                    break;\n\n                  case \"b\":\n                  case \"o\":\n                  case \"x\":\n                  case \"X\":\n                    if (symbol === \"#\") prefix = \"0\" + type.toLowerCase();\n\n                  case \"c\":\n                  case \"d\":\n                    integer = true;\n                    precision = 0;\n                    break;\n\n                  case \"s\":\n                    scale = -1;\n                    type = \"r\";\n                    break;\n                }\n                if (symbol === \"$\") prefix = locale_currency[0], suffix = locale_currency[1];\n                if (type == \"r\" && !precision) type = \"g\";\n                if (precision != null) {\n                    if (type == \"g\") precision = Math.max(1, Math.min(21, precision)); else if (type == \"e\" || type == \"f\") precision = Math.max(0, Math.min(20, precision));\n                }\n                type = d3_format_types.get(type) || d3_format_typeDefault;\n                var zcomma = zfill && comma;\n                return function(value) {\n                    var fullSuffix = suffix;\n                    if (integer && value % 1) return \"\";\n                    var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, \"-\") : sign;\n                    if (scale < 0) {\n                        var unit = d3.formatPrefix(value, precision);\n                        value = unit.scale(value);\n                        fullSuffix = unit.symbol + suffix;\n                    } else {\n                        value *= scale;\n                    }\n                    value = type(value, precision);\n                    var i = value.lastIndexOf(\".\"), before = i < 0 ? value : value.substring(0, i), after = i < 0 ? \"\" : locale_decimal + value.substring(i + 1);\n                    if (!zfill && comma) before = formatGroup(before);\n                    var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : \"\";\n                    if (zcomma) before = formatGroup(padding + before);\n                    negative += prefix;\n                    value = before + after;\n                    return (align === \"<\" ? negative + value + padding : align === \">\" ? padding + negative + value : align === \"^\" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;\n                };\n            };\n        }\n        var d3_format_re = /(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i;\n        var d3_format_types = d3.map({\n            b: function(x) {\n                return x.toString(2);\n            },\n            c: function(x) {\n                return String.fromCharCode(x);\n            },\n            o: function(x) {\n                return x.toString(8);\n            },\n            x: function(x) {\n                return x.toString(16);\n            },\n            X: function(x) {\n                return x.toString(16).toUpperCase();\n            },\n            g: function(x, p) {\n                return x.toPrecision(p);\n            },\n            e: function(x, p) {\n                return x.toExponential(p);\n            },\n            f: function(x, p) {\n                return x.toFixed(p);\n            },\n            r: function(x, p) {\n                return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));\n            }\n        });\n        function d3_format_typeDefault(x) {\n            return x + \"\";\n        }\n        d3.requote = function(s) {\n            return s.replace(d3_requote_re, \"\\\\$&\");\n        };\n        var d3_requote_re = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n        var d3_time = d3.time = {}, d3_date = Date;\n        function d3_date_utc() {\n            this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);\n        }\n        d3_date_utc.prototype = {\n            getDate: function() {\n                return this._.getUTCDate();\n            },\n            getDay: function() {\n                return this._.getUTCDay();\n            },\n            getFullYear: function() {\n                return this._.getUTCFullYear();\n            },\n            getHours: function() {\n                return this._.getUTCHours();\n            },\n            getMilliseconds: function() {\n                return this._.getUTCMilliseconds();\n            },\n            getMinutes: function() {\n                return this._.getUTCMinutes();\n            },\n            getMonth: function() {\n                return this._.getUTCMonth();\n            },\n            getSeconds: function() {\n                return this._.getUTCSeconds();\n            },\n            getTime: function() {\n                return this._.getTime();\n            },\n            getTimezoneOffset: function() {\n                return 0;\n            },\n            valueOf: function() {\n                return this._.valueOf();\n            },\n            setDate: function() {\n                d3_time_prototype.setUTCDate.apply(this._, arguments);\n            },\n            setDay: function() {\n                d3_time_prototype.setUTCDay.apply(this._, arguments);\n            },\n            setFullYear: function() {\n                d3_time_prototype.setUTCFullYear.apply(this._, arguments);\n            },\n            setHours: function() {\n                d3_time_prototype.setUTCHours.apply(this._, arguments);\n            },\n            setMilliseconds: function() {\n                d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);\n            },\n            setMinutes: function() {\n                d3_time_prototype.setUTCMinutes.apply(this._, arguments);\n            },\n            setMonth: function() {\n                d3_time_prototype.setUTCMonth.apply(this._, arguments);\n            },\n            setSeconds: function() {\n                d3_time_prototype.setUTCSeconds.apply(this._, arguments);\n            },\n            setTime: function() {\n                d3_time_prototype.setTime.apply(this._, arguments);\n            }\n        };\n        var d3_time_prototype = Date.prototype;\n        function d3_time_interval(local, step, number) {\n            function round(date) {\n                var d0 = local(date), d1 = offset(d0, 1);\n                return date - d0 < d1 - date ? d0 : d1;\n            }\n            function ceil(date) {\n                step(date = local(new d3_date(date - 1)), 1);\n                return date;\n            }\n            function offset(date, k) {\n                step(date = new d3_date(+date), k);\n                return date;\n            }\n            function range(t0, t1, dt) {\n                var time = ceil(t0), times = [];\n                if (dt > 1) {\n                    while (time < t1) {\n                        if (!(number(time) % dt)) times.push(new Date(+time));\n                        step(time, 1);\n                    }\n                } else {\n                    while (time < t1) times.push(new Date(+time)), step(time, 1);\n                }\n                return times;\n            }\n            function range_utc(t0, t1, dt) {\n                try {\n                    d3_date = d3_date_utc;\n                    var utc = new d3_date_utc();\n                    utc._ = t0;\n                    return range(utc, t1, dt);\n                } finally {\n                    d3_date = Date;\n                }\n            }\n            local.floor = local;\n            local.round = round;\n            local.ceil = ceil;\n            local.offset = offset;\n            local.range = range;\n            var utc = local.utc = d3_time_interval_utc(local);\n            utc.floor = utc;\n            utc.round = d3_time_interval_utc(round);\n            utc.ceil = d3_time_interval_utc(ceil);\n            utc.offset = d3_time_interval_utc(offset);\n            utc.range = range_utc;\n            return local;\n        }\n        function d3_time_interval_utc(method) {\n            return function(date, k) {\n                try {\n                    d3_date = d3_date_utc;\n                    var utc = new d3_date_utc();\n                    utc._ = date;\n                    return method(utc, k)._;\n                } finally {\n                    d3_date = Date;\n                }\n            };\n        }\n        d3_time.year = d3_time_interval(function(date) {\n            date = d3_time.day(date);\n            date.setMonth(0, 1);\n            return date;\n        }, function(date, offset) {\n            date.setFullYear(date.getFullYear() + offset);\n        }, function(date) {\n            return date.getFullYear();\n        });\n        d3_time.years = d3_time.year.range;\n        d3_time.years.utc = d3_time.year.utc.range;\n        d3_time.day = d3_time_interval(function(date) {\n            var day = new d3_date(2e3, 0);\n            day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n            return day;\n        }, function(date, offset) {\n            date.setDate(date.getDate() + offset);\n        }, function(date) {\n            return date.getDate() - 1;\n        });\n        d3_time.days = d3_time.day.range;\n        d3_time.days.utc = d3_time.day.utc.range;\n        d3_time.dayOfYear = function(date) {\n            var year = d3_time.year(date);\n            return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);\n        };\n        [ \"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\" ].forEach(function(day, i) {\n            i = 7 - i;\n            var interval = d3_time[day] = d3_time_interval(function(date) {\n                (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);\n                return date;\n            }, function(date, offset) {\n                date.setDate(date.getDate() + Math.floor(offset) * 7);\n            }, function(date) {\n                var day = d3_time.year(date).getDay();\n                return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);\n            });\n            d3_time[day + \"s\"] = interval.range;\n            d3_time[day + \"s\"].utc = interval.utc.range;\n            d3_time[day + \"OfYear\"] = function(date) {\n                var day = d3_time.year(date).getDay();\n                return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);\n            };\n        });\n        d3_time.week = d3_time.sunday;\n        d3_time.weeks = d3_time.sunday.range;\n        d3_time.weeks.utc = d3_time.sunday.utc.range;\n        d3_time.weekOfYear = d3_time.sundayOfYear;\n        function d3_locale_timeFormat(locale) {\n            var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;\n            function d3_time_format(template) {\n                var n = template.length;\n                function format(date) {\n                    var string = [], i = -1, j = 0, c, p, f;\n                    while (++i < n) {\n                        if (template.charCodeAt(i) === 37) {\n                            string.push(template.substring(j, i));\n                            if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);\n                            if (f = d3_time_formats[c]) c = f(date, p == null ? c === \"e\" ? \" \" : \"0\" : p);\n                            string.push(c);\n                            j = i + 1;\n                        }\n                    }\n                    string.push(template.substring(j, i));\n                    return string.join(\"\");\n                }\n                format.parse = function(string) {\n                    var d = {\n                        y: 1900,\n                        m: 0,\n                        d: 1,\n                        H: 0,\n                        M: 0,\n                        S: 0,\n                        L: 0,\n                        Z: null\n                    }, i = d3_time_parse(d, template, string, 0);\n                    if (i != string.length) return null;\n                    if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n                    var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();\n                    if (\"j\" in d) date.setFullYear(d.y, 0, d.j); else if (\"w\" in d && (\"W\" in d || \"U\" in d)) {\n                        date.setFullYear(d.y, 0, 1);\n                        date.setFullYear(d.y, 0, \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);\n                    } else date.setFullYear(d.y, d.m, d.d);\n                    date.setHours(d.H + Math.floor(d.Z / 100), d.M + d.Z % 100, d.S, d.L);\n                    return localZ ? date._ : date;\n                };\n                format.toString = function() {\n                    return template;\n                };\n                return format;\n            }\n            function d3_time_parse(date, template, string, j) {\n                var c, p, t, i = 0, n = template.length, m = string.length;\n                while (i < n) {\n                    if (j >= m) return -1;\n                    c = template.charCodeAt(i++);\n                    if (c === 37) {\n                        t = template.charAt(i++);\n                        p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];\n                        if (!p || (j = p(date, string, j)) < 0) return -1;\n                    } else if (c != string.charCodeAt(j++)) {\n                        return -1;\n                    }\n                }\n                return j;\n            }\n            d3_time_format.utc = function(template) {\n                var local = d3_time_format(template);\n                function format(date) {\n                    try {\n                        d3_date = d3_date_utc;\n                        var utc = new d3_date();\n                        utc._ = date;\n                        return local(utc);\n                    } finally {\n                        d3_date = Date;\n                    }\n                }\n                format.parse = function(string) {\n                    try {\n                        d3_date = d3_date_utc;\n                        var date = local.parse(string);\n                        return date && date._;\n                    } finally {\n                        d3_date = Date;\n                    }\n                };\n                format.toString = local.toString;\n                return format;\n            };\n            d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;\n            var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);\n            locale_periods.forEach(function(p, i) {\n                d3_time_periodLookup.set(p.toLowerCase(), i);\n            });\n            var d3_time_formats = {\n                a: function(d) {\n                    return locale_shortDays[d.getDay()];\n                },\n                A: function(d) {\n                    return locale_days[d.getDay()];\n                },\n                b: function(d) {\n                    return locale_shortMonths[d.getMonth()];\n                },\n                B: function(d) {\n                    return locale_months[d.getMonth()];\n                },\n                c: d3_time_format(locale_dateTime),\n                d: function(d, p) {\n                    return d3_time_formatPad(d.getDate(), p, 2);\n                },\n                e: function(d, p) {\n                    return d3_time_formatPad(d.getDate(), p, 2);\n                },\n                H: function(d, p) {\n                    return d3_time_formatPad(d.getHours(), p, 2);\n                },\n                I: function(d, p) {\n                    return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);\n                },\n                j: function(d, p) {\n                    return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);\n                },\n                L: function(d, p) {\n                    return d3_time_formatPad(d.getMilliseconds(), p, 3);\n                },\n                m: function(d, p) {\n                    return d3_time_formatPad(d.getMonth() + 1, p, 2);\n                },\n                M: function(d, p) {\n                    return d3_time_formatPad(d.getMinutes(), p, 2);\n                },\n                p: function(d) {\n                    return locale_periods[+(d.getHours() >= 12)];\n                },\n                S: function(d, p) {\n                    return d3_time_formatPad(d.getSeconds(), p, 2);\n                },\n                U: function(d, p) {\n                    return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);\n                },\n                w: function(d) {\n                    return d.getDay();\n                },\n                W: function(d, p) {\n                    return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);\n                },\n                x: d3_time_format(locale_date),\n                X: d3_time_format(locale_time),\n                y: function(d, p) {\n                    return d3_time_formatPad(d.getFullYear() % 100, p, 2);\n                },\n                Y: function(d, p) {\n                    return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);\n                },\n                Z: d3_time_zone,\n                \"%\": function() {\n                    return \"%\";\n                }\n            };\n            var d3_time_parsers = {\n                a: d3_time_parseWeekdayAbbrev,\n                A: d3_time_parseWeekday,\n                b: d3_time_parseMonthAbbrev,\n                B: d3_time_parseMonth,\n                c: d3_time_parseLocaleFull,\n                d: d3_time_parseDay,\n                e: d3_time_parseDay,\n                H: d3_time_parseHour24,\n                I: d3_time_parseHour24,\n                j: d3_time_parseDayOfYear,\n                L: d3_time_parseMilliseconds,\n                m: d3_time_parseMonthNumber,\n                M: d3_time_parseMinutes,\n                p: d3_time_parseAmPm,\n                S: d3_time_parseSeconds,\n                U: d3_time_parseWeekNumberSunday,\n                w: d3_time_parseWeekdayNumber,\n                W: d3_time_parseWeekNumberMonday,\n                x: d3_time_parseLocaleDate,\n                X: d3_time_parseLocaleTime,\n                y: d3_time_parseYear,\n                Y: d3_time_parseFullYear,\n                Z: d3_time_parseZone,\n                \"%\": d3_time_parseLiteralPercent\n            };\n            function d3_time_parseWeekdayAbbrev(date, string, i) {\n                d3_time_dayAbbrevRe.lastIndex = 0;\n                var n = d3_time_dayAbbrevRe.exec(string.substring(i));\n                return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n            }\n            function d3_time_parseWeekday(date, string, i) {\n                d3_time_dayRe.lastIndex = 0;\n                var n = d3_time_dayRe.exec(string.substring(i));\n                return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n            }\n            function d3_time_parseMonthAbbrev(date, string, i) {\n                d3_time_monthAbbrevRe.lastIndex = 0;\n                var n = d3_time_monthAbbrevRe.exec(string.substring(i));\n                return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n            }\n            function d3_time_parseMonth(date, string, i) {\n                d3_time_monthRe.lastIndex = 0;\n                var n = d3_time_monthRe.exec(string.substring(i));\n                return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n            }\n            function d3_time_parseLocaleFull(date, string, i) {\n                return d3_time_parse(date, d3_time_formats.c.toString(), string, i);\n            }\n            function d3_time_parseLocaleDate(date, string, i) {\n                return d3_time_parse(date, d3_time_formats.x.toString(), string, i);\n            }\n            function d3_time_parseLocaleTime(date, string, i) {\n                return d3_time_parse(date, d3_time_formats.X.toString(), string, i);\n            }\n            function d3_time_parseAmPm(date, string, i) {\n                var n = d3_time_periodLookup.get(string.substring(i, i += 2).toLowerCase());\n                return n == null ? -1 : (date.p = n, i);\n            }\n            return d3_time_format;\n        }\n        var d3_time_formatPads = {\n            \"-\": \"\",\n            _: \" \",\n            \"0\": \"0\"\n        }, d3_time_numberRe = /^\\s*\\d+/, d3_time_percentRe = /^%/;\n        function d3_time_formatPad(value, fill, width) {\n            var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n            return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n        }\n        function d3_time_formatRe(names) {\n            return new RegExp(\"^(?:\" + names.map(d3.requote).join(\"|\") + \")\", \"i\");\n        }\n        function d3_time_formatLookup(names) {\n            var map = new d3_Map(), i = -1, n = names.length;\n            while (++i < n) map.set(names[i].toLowerCase(), i);\n            return map;\n        }\n        function d3_time_parseWeekdayNumber(date, string, i) {\n            d3_time_numberRe.lastIndex = 0;\n            var n = d3_time_numberRe.exec(string.substring(i, i + 1));\n            return n ? (date.w = +n[0], i + n[0].length) : -1;\n        }\n        function d3_time_parseWeekNumberSunday(date, string, i) {\n            d3_time_numberRe.lastIndex = 0;\n            var n = d3_time_numberRe.exec(string.substring(i));\n            return n ? (date.U = +n[0], i + n[0].length) : -1;\n        }\n        function d3_time_parseWeekNumberMonday(date, string, i) {\n            d3_time_numberRe.lastIndex = 0;\n            var n = d3_time_numberRe.exec(string.substring(i));\n            return n ? (date.W = +n[0], i + n[0].length) : -1;\n        }\n        function d3_time_parseFullYear(date, string, i) {\n            d3_time_numberRe.lastIndex = 0;\n            var n = d3_time_numberRe.exec(string.substring(i, i + 4));\n            return n ? (date.y = +n[0], i + n[0].length) : -1;\n        }\n        function d3_time_parseYear(date, string, i) {\n            d3_time_numberRe.lastIndex = 0;\n            var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n            return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;\n        }\n        function d3_time_parseZone(date, string, i) {\n            return /^[+-]\\d{4}$/.test(string = string.substring(i, i + 5)) ? (date.Z = +string, \n            i + 5) : -1;\n        }\n        function d3_time_expandYear(d) {\n            return d + (d > 68 ? 1900 : 2e3);\n        }\n        function d3_time_parseMonthNumber(date, string, i) {\n            d3_time_numberRe.lastIndex = 0;\n            var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n            return n ? (date.m = n[0] - 1, i + n[0].length) : -1;\n        }\n        function d3_time_parseDay(date, string, i) {\n            d3_time_numberRe.lastIndex = 0;\n            var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n            return n ? (date.d = +n[0], i + n[0].length) : -1;\n        }\n        function d3_time_parseDayOfYear(date, string, i) {\n            d3_time_numberRe.lastIndex = 0;\n            var n = d3_time_numberRe.exec(string.substring(i, i + 3));\n            return n ? (date.j = +n[0], i + n[0].length) : -1;\n        }\n        function d3_time_parseHour24(date, string, i) {\n            d3_time_numberRe.lastIndex = 0;\n            var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n            return n ? (date.H = +n[0], i + n[0].length) : -1;\n        }\n        function d3_time_parseMinutes(date, string, i) {\n            d3_time_numberRe.lastIndex = 0;\n            var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n            return n ? (date.M = +n[0], i + n[0].length) : -1;\n        }\n        function d3_time_parseSeconds(date, string, i) {\n            d3_time_numberRe.lastIndex = 0;\n            var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n            return n ? (date.S = +n[0], i + n[0].length) : -1;\n        }\n        function d3_time_parseMilliseconds(date, string, i) {\n            d3_time_numberRe.lastIndex = 0;\n            var n = d3_time_numberRe.exec(string.substring(i, i + 3));\n            return n ? (date.L = +n[0], i + n[0].length) : -1;\n        }\n        function d3_time_zone(d) {\n            var z = d.getTimezoneOffset(), zs = z > 0 ? \"-\" : \"+\", zh = ~~(abs(z) / 60), zm = abs(z) % 60;\n            return zs + d3_time_formatPad(zh, \"0\", 2) + d3_time_formatPad(zm, \"0\", 2);\n        }\n        function d3_time_parseLiteralPercent(date, string, i) {\n            d3_time_percentRe.lastIndex = 0;\n            var n = d3_time_percentRe.exec(string.substring(i, i + 1));\n            return n ? i + n[0].length : -1;\n        }\n        function d3_time_formatMulti(formats) {\n            var n = formats.length, i = -1;\n            while (++i < n) formats[i][0] = this(formats[i][0]);\n            return function(date) {\n                var i = 0, f = formats[i];\n                while (!f[1](date)) f = formats[++i];\n                return f[0](date);\n            };\n        }\n        d3.locale = function(locale) {\n            return {\n                numberFormat: d3_locale_numberFormat(locale),\n                timeFormat: d3_locale_timeFormat(locale)\n            };\n        };\n        var d3_locale_enUS = d3.locale({\n            decimal: \".\",\n            thousands: \",\",\n            grouping: [ 3 ],\n            currency: [ \"$\", \"\" ],\n            dateTime: \"%a %b %e %X %Y\",\n            date: \"%m/%d/%Y\",\n            time: \"%H:%M:%S\",\n            periods: [ \"AM\", \"PM\" ],\n            days: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ],\n            shortDays: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ],\n            months: [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\" ],\n            shortMonths: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n        });\n        d3.format = d3_locale_enUS.numberFormat;\n        function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {\n            var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);\n            return function(x) {\n                return i(u(x));\n            };\n        }\n        function d3_scale_nice(domain, nice) {\n            var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;\n            if (x1 < x0) {\n                dx = i0, i0 = i1, i1 = dx;\n                dx = x0, x0 = x1, x1 = dx;\n            }\n            domain[i0] = nice.floor(x0);\n            domain[i1] = nice.ceil(x1);\n            return domain;\n        }\n        function d3_scale_niceStep(step) {\n            return step ? {\n                floor: function(x) {\n                    return Math.floor(x / step) * step;\n                },\n                ceil: function(x) {\n                    return Math.ceil(x / step) * step;\n                }\n            } : d3_scale_niceIdentity;\n        }\n        var d3_scale_niceIdentity = {\n            floor: d3_identity,\n            ceil: d3_identity\n        };\n        d3.ascending = d3_ascending;\n        function d3_ascending(a, b) {\n            return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n        }\n        function d3_bisector(compare) {\n            return {\n                left: function(a, x, lo, hi) {\n                    if (arguments.length < 3) lo = 0;\n                    if (arguments.length < 4) hi = a.length;\n                    while (lo < hi) {\n                        var mid = lo + hi >>> 1;\n                        if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;\n                    }\n                    return lo;\n                },\n                right: function(a, x, lo, hi) {\n                    if (arguments.length < 3) lo = 0;\n                    if (arguments.length < 4) hi = a.length;\n                    while (lo < hi) {\n                        var mid = lo + hi >>> 1;\n                        if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;\n                    }\n                    return lo;\n                }\n            };\n        }\n        var d3_bisect = d3_bisector(d3_ascending);\n        d3.bisectLeft = d3_bisect.left;\n        d3.bisect = d3.bisectRight = d3_bisect.right;\n        d3.bisector = function(f) {\n            return d3_bisector(f.length === 1 ? function(d, x) {\n                return d3_ascending(f(d), x);\n            } : f);\n        };\n        function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {\n            var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;\n            if (domain[k] < domain[0]) {\n                domain = domain.slice().reverse();\n                range = range.slice().reverse();\n            }\n            while (++j <= k) {\n                u.push(uninterpolate(domain[j - 1], domain[j]));\n                i.push(interpolate(range[j - 1], range[j]));\n            }\n            return function(x) {\n                var j = d3.bisect(domain, x, 1, k) - 1;\n                return i[j](u[j](x));\n            };\n        }\n        d3.scale.linear = function() {\n            return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);\n        };\n        function d3_scale_linear(domain, range, interpolate, clamp) {\n            var output, input;\n            function rescale() {\n                var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;\n                output = linear(domain, range, uninterpolate, interpolate);\n                input = linear(range, domain, uninterpolate, d3_interpolate);\n                return scale;\n            }\n            function scale(x) {\n                return output(x);\n            }\n            scale.invert = function(y) {\n                return input(y);\n            };\n            scale.domain = function(x) {\n                if (!arguments.length) return domain;\n                domain = x.map(Number);\n                return rescale();\n            };\n            scale.range = function(x) {\n                if (!arguments.length) return range;\n                range = x;\n                return rescale();\n            };\n            scale.rangeRound = function(x) {\n                return scale.range(x).interpolate(d3_interpolateRound);\n            };\n            scale.clamp = function(x) {\n                if (!arguments.length) return clamp;\n                clamp = x;\n                return rescale();\n            };\n            scale.interpolate = function(x) {\n                if (!arguments.length) return interpolate;\n                interpolate = x;\n                return rescale();\n            };\n            scale.ticks = function(m) {\n                return d3_scale_linearTicks(domain, m);\n            };\n            scale.tickFormat = function(m, format) {\n                return d3_scale_linearTickFormat(domain, m, format);\n            };\n            scale.nice = function(m) {\n                d3_scale_linearNice(domain, m);\n                return rescale();\n            };\n            scale.copy = function() {\n                return d3_scale_linear(domain, range, interpolate, clamp);\n            };\n            return rescale();\n        }\n        function d3_scale_linearRebind(scale, linear) {\n            return d3.rebind(scale, linear, \"range\", \"rangeRound\", \"interpolate\", \"clamp\");\n        }\n        function d3_scale_linearNice(domain, m) {\n            return d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n        }\n        function d3_scale_linearTickRange(domain, m) {\n            if (m == null) m = 10;\n            var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;\n            if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;\n            extent[0] = Math.ceil(extent[0] / step) * step;\n            extent[1] = Math.floor(extent[1] / step) * step + step * .5;\n            extent[2] = step;\n            return extent;\n        }\n        function d3_scale_linearTicks(domain, m) {\n            return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));\n        }\n        function d3_scale_linearTickFormat(domain, m, format) {\n            var range = d3_scale_linearTickRange(domain, m);\n            if (format) {\n                var match = d3_format_re.exec(format);\n                match.shift();\n                if (match[8] === \"s\") {\n                    var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));\n                    if (!match[7]) match[7] = \".\" + d3_scale_linearPrecision(prefix.scale(range[2]));\n                    match[8] = \"f\";\n                    format = d3.format(match.join(\"\"));\n                    return function(d) {\n                        return format(prefix.scale(d)) + prefix.symbol;\n                    };\n                }\n                if (!match[7]) match[7] = \".\" + d3_scale_linearFormatPrecision(match[8], range);\n                format = match.join(\"\");\n            } else {\n                format = \",.\" + d3_scale_linearPrecision(range[2]) + \"f\";\n            }\n            return d3.format(format);\n        }\n        var d3_scale_linearFormatSignificant = {\n            s: 1,\n            g: 1,\n            p: 1,\n            r: 1,\n            e: 1\n        };\n        function d3_scale_linearPrecision(value) {\n            return -Math.floor(Math.log(value) / Math.LN10 + .01);\n        }\n        function d3_scale_linearFormatPrecision(type, range) {\n            var p = d3_scale_linearPrecision(range[2]);\n            return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== \"e\") : p - (type === \"%\") * 2;\n        }\n        d3.scale.log = function() {\n            return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);\n        };\n        function d3_scale_log(linear, base, positive, domain) {\n            function log(x) {\n                return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);\n            }\n            function pow(x) {\n                return positive ? Math.pow(base, x) : -Math.pow(base, -x);\n            }\n            function scale(x) {\n                return linear(log(x));\n            }\n            scale.invert = function(x) {\n                return pow(linear.invert(x));\n            };\n            scale.domain = function(x) {\n                if (!arguments.length) return domain;\n                positive = x[0] >= 0;\n                linear.domain((domain = x.map(Number)).map(log));\n                return scale;\n            };\n            scale.base = function(_) {\n                if (!arguments.length) return base;\n                base = +_;\n                linear.domain(domain.map(log));\n                return scale;\n            };\n            scale.nice = function() {\n                var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);\n                linear.domain(niced);\n                domain = niced.map(pow);\n                return scale;\n            };\n            scale.ticks = function() {\n                var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;\n                if (isFinite(j - i)) {\n                    if (positive) {\n                        for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);\n                        ticks.push(pow(i));\n                    } else {\n                        ticks.push(pow(i));\n                        for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);\n                    }\n                    for (i = 0; ticks[i] < u; i++) {}\n                    for (j = ticks.length; ticks[j - 1] > v; j--) {}\n                    ticks = ticks.slice(i, j);\n                }\n                return ticks;\n            };\n            scale.tickFormat = function(n, format) {\n                if (!arguments.length) return d3_scale_logFormat;\n                if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== \"function\") format = d3.format(format);\n                var k = Math.max(.1, n / scale.ticks().length), f = positive ? (e = 1e-12, Math.ceil) : (e = -1e-12, \n                Math.floor), e;\n                return function(d) {\n                    return d / pow(f(log(d) + e)) <= k ? format(d) : \"\";\n                };\n            };\n            scale.copy = function() {\n                return d3_scale_log(linear.copy(), base, positive, domain);\n            };\n            return d3_scale_linearRebind(scale, linear);\n        }\n        var d3_scale_logFormat = d3.format(\".0e\"), d3_scale_logNiceNegative = {\n            floor: function(x) {\n                return -Math.ceil(-x);\n            },\n            ceil: function(x) {\n                return -Math.floor(-x);\n            }\n        };\n        d3.scale.pow = function() {\n            return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);\n        };\n        function d3_scale_pow(linear, exponent, domain) {\n            var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);\n            function scale(x) {\n                return linear(powp(x));\n            }\n            scale.invert = function(x) {\n                return powb(linear.invert(x));\n            };\n            scale.domain = function(x) {\n                if (!arguments.length) return domain;\n                linear.domain((domain = x.map(Number)).map(powp));\n                return scale;\n            };\n            scale.ticks = function(m) {\n                return d3_scale_linearTicks(domain, m);\n            };\n            scale.tickFormat = function(m, format) {\n                return d3_scale_linearTickFormat(domain, m, format);\n            };\n            scale.nice = function(m) {\n                return scale.domain(d3_scale_linearNice(domain, m));\n            };\n            scale.exponent = function(x) {\n                if (!arguments.length) return exponent;\n                powp = d3_scale_powPow(exponent = x);\n                powb = d3_scale_powPow(1 / exponent);\n                linear.domain(domain.map(powp));\n                return scale;\n            };\n            scale.copy = function() {\n                return d3_scale_pow(linear.copy(), exponent, domain);\n            };\n            return d3_scale_linearRebind(scale, linear);\n        }\n        function d3_scale_powPow(e) {\n            return function(x) {\n                return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);\n            };\n        }\n        d3.scale.sqrt = function() {\n            return d3.scale.pow().exponent(.5);\n        };\n        d3.scale.ordinal = function() {\n            return d3_scale_ordinal([], {\n                t: \"range\",\n                a: [ [] ]\n            });\n        };\n        function d3_scale_ordinal(domain, ranger) {\n            var index, range, rangeBand;\n            function scale(x) {\n                return range[((index.get(x) || (ranger.t === \"range\" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];\n            }\n            function steps(start, step) {\n                return d3.range(domain.length).map(function(i) {\n                    return start + step * i;\n                });\n            }\n            scale.domain = function(x) {\n                if (!arguments.length) return domain;\n                domain = [];\n                index = new d3_Map();\n                var i = -1, n = x.length, xi;\n                while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));\n                return scale[ranger.t].apply(scale, ranger.a);\n            };\n            scale.range = function(x) {\n                if (!arguments.length) return range;\n                range = x;\n                rangeBand = 0;\n                ranger = {\n                    t: \"range\",\n                    a: arguments\n                };\n                return scale;\n            };\n            scale.rangePoints = function(x, padding) {\n                if (arguments.length < 2) padding = 0;\n                var start = x[0], stop = x[1], step = (stop - start) / (Math.max(1, domain.length - 1) + padding);\n                range = steps(domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2, step);\n                rangeBand = 0;\n                ranger = {\n                    t: \"rangePoints\",\n                    a: arguments\n                };\n                return scale;\n            };\n            scale.rangeBands = function(x, padding, outerPadding) {\n                if (arguments.length < 2) padding = 0;\n                if (arguments.length < 3) outerPadding = padding;\n                var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);\n                range = steps(start + step * outerPadding, step);\n                if (reverse) range.reverse();\n                rangeBand = step * (1 - padding);\n                ranger = {\n                    t: \"rangeBands\",\n                    a: arguments\n                };\n                return scale;\n            };\n            scale.rangeRoundBands = function(x, padding, outerPadding) {\n                if (arguments.length < 2) padding = 0;\n                if (arguments.length < 3) outerPadding = padding;\n                var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding)), error = stop - start - (domain.length - padding) * step;\n                range = steps(start + Math.round(error / 2), step);\n                if (reverse) range.reverse();\n                rangeBand = Math.round(step * (1 - padding));\n                ranger = {\n                    t: \"rangeRoundBands\",\n                    a: arguments\n                };\n                return scale;\n            };\n            scale.rangeBand = function() {\n                return rangeBand;\n            };\n            scale.rangeExtent = function() {\n                return d3_scaleExtent(ranger.a[0]);\n            };\n            scale.copy = function() {\n                return d3_scale_ordinal(domain, ranger);\n            };\n            return scale.domain(domain);\n        }\n        d3.scale.category10 = function() {\n            return d3.scale.ordinal().range(d3_category10);\n        };\n        d3.scale.category20 = function() {\n            return d3.scale.ordinal().range(d3_category20);\n        };\n        d3.scale.category20b = function() {\n            return d3.scale.ordinal().range(d3_category20b);\n        };\n        d3.scale.category20c = function() {\n            return d3.scale.ordinal().range(d3_category20c);\n        };\n        var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);\n        var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);\n        var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);\n        var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);\n        d3.quantile = function(values, p) {\n            var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;\n            return e ? v + e * (values[h] - v) : v;\n        };\n        d3.scale.quantile = function() {\n            return d3_scale_quantile([], []);\n        };\n        function d3_scale_quantile(domain, range) {\n            var thresholds;\n            function rescale() {\n                var k = 0, q = range.length;\n                thresholds = [];\n                while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);\n                return scale;\n            }\n            function scale(x) {\n                if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];\n            }\n            scale.domain = function(x) {\n                if (!arguments.length) return domain;\n                domain = x.filter(function(d) {\n                    return !isNaN(d);\n                }).sort(d3_ascending);\n                return rescale();\n            };\n            scale.range = function(x) {\n                if (!arguments.length) return range;\n                range = x;\n                return rescale();\n            };\n            scale.quantiles = function() {\n                return thresholds;\n            };\n            scale.invertExtent = function(y) {\n                y = range.indexOf(y);\n                return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];\n            };\n            scale.copy = function() {\n                return d3_scale_quantile(domain, range);\n            };\n            return rescale();\n        }\n        d3.scale.quantize = function() {\n            return d3_scale_quantize(0, 1, [ 0, 1 ]);\n        };\n        function d3_scale_quantize(x0, x1, range) {\n            var kx, i;\n            function scale(x) {\n                return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];\n            }\n            function rescale() {\n                kx = range.length / (x1 - x0);\n                i = range.length - 1;\n                return scale;\n            }\n            scale.domain = function(x) {\n                if (!arguments.length) return [ x0, x1 ];\n                x0 = +x[0];\n                x1 = +x[x.length - 1];\n                return rescale();\n            };\n            scale.range = function(x) {\n                if (!arguments.length) return range;\n                range = x;\n                return rescale();\n            };\n            scale.invertExtent = function(y) {\n                y = range.indexOf(y);\n                y = y < 0 ? NaN : y / kx + x0;\n                return [ y, y + 1 / kx ];\n            };\n            scale.copy = function() {\n                return d3_scale_quantize(x0, x1, range);\n            };\n            return rescale();\n        }\n        d3.scale.threshold = function() {\n            return d3_scale_threshold([ .5 ], [ 0, 1 ]);\n        };\n        function d3_scale_threshold(domain, range) {\n            function scale(x) {\n                if (x <= x) return range[d3.bisect(domain, x)];\n            }\n            scale.domain = function(_) {\n                if (!arguments.length) return domain;\n                domain = _;\n                return scale;\n            };\n            scale.range = function(_) {\n                if (!arguments.length) return range;\n                range = _;\n                return scale;\n            };\n            scale.invertExtent = function(y) {\n                y = range.indexOf(y);\n                return [ domain[y - 1], domain[y] ];\n            };\n            scale.copy = function() {\n                return d3_scale_threshold(domain, range);\n            };\n            return scale;\n        }\n        d3.scale.identity = function() {\n            return d3_scale_identity([ 0, 1 ]);\n        };\n        function d3_scale_identity(domain) {\n            function identity(x) {\n                return +x;\n            }\n            identity.invert = identity;\n            identity.domain = identity.range = function(x) {\n                if (!arguments.length) return domain;\n                domain = x.map(identity);\n                return identity;\n            };\n            identity.ticks = function(m) {\n                return d3_scale_linearTicks(domain, m);\n            };\n            identity.tickFormat = function(m, format) {\n                return d3_scale_linearTickFormat(domain, m, format);\n            };\n            identity.copy = function() {\n                return d3_scale_identity(domain);\n            };\n            return identity;\n        }\n        if (typeof define === \"function\" && define.amd) {\n            define(d3);\n        } else if (typeof module === \"object\" && module.exports) {\n            module.exports = d3;\n        } else {\n            this.d3 = d3;\n        }\n    }();\n})();","(function (global){\n/**\n * @license\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\n * Build: `lodash modern -o ./dist/lodash.js`\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <http://lodash.com/license>\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\n  var undefined;\n\n  /** Used to pool arrays and objects used internally */\n  var arrayPool = [],\n      objectPool = [];\n\n  /** Used to generate unique IDs */\n  var idCounter = 0;\n\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\n  var keyPrefix = +new Date + '';\n\n  /** Used as the size when optimizations are enabled for large arrays */\n  var largeArraySize = 75;\n\n  /** Used as the max size of the `arrayPool` and `objectPool` */\n  var maxPoolSize = 40;\n\n  /** Used to detect and test whitespace */\n  var whitespace = (\n    // whitespace\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\n\n    // line terminators\n    '\\n\\r\\u2028\\u2029' +\n\n    // unicode category \"Zs\" space separators\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\n  );\n\n  /** Used to match empty string literals in compiled template source */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /**\n   * Used to match ES6 template delimiters\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match regexp flags from their coerced string values */\n  var reFlags = /\\w*$/;\n\n  /** Used to detected named functions */\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\n\n  /** Used to match \"interpolate\" template delimiters */\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match leading whitespace and zeros to be removed */\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\n\n  /** Used to ensure capturing order of template delimiters */\n  var reNoMatch = /($^)/;\n\n  /** Used to detect functions containing a `this` reference */\n  var reThis = /\\bthis\\b/;\n\n  /** Used to match unescaped characters in compiled string literals */\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\n\n  /** Used to assign default `context` object properties */\n  var contextProps = [\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\n    'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify */\n  var templateCounter = 0;\n\n  /** `Object#toString` result shortcuts */\n  var argsClass = '[object Arguments]',\n      arrayClass = '[object Array]',\n      boolClass = '[object Boolean]',\n      dateClass = '[object Date]',\n      funcClass = '[object Function]',\n      numberClass = '[object Number]',\n      objectClass = '[object Object]',\n      regexpClass = '[object RegExp]',\n      stringClass = '[object String]';\n\n  /** Used to identify object classifications that `_.clone` supports */\n  var cloneableClasses = {};\n  cloneableClasses[funcClass] = false;\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\n\n  /** Used as an internal `_.debounce` options object */\n  var debounceOptions = {\n    'leading': false,\n    'maxWait': 0,\n    'trailing': false\n  };\n\n  /** Used as the property descriptor for `__bindData__` */\n  var descriptor = {\n    'configurable': false,\n    'enumerable': false,\n    'value': null,\n    'writable': false\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var objectTypes = {\n    'boolean': false,\n    'function': true,\n    'object': true,\n    'number': false,\n    'string': false,\n    'undefined': false\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\t': 't',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Used as a reference to the global object */\n  var root = (objectTypes[typeof window] && window) || this;\n\n  /** Detect free variable `exports` */\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module` */\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports` */\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\n  var freeGlobal = objectTypes[typeof global] && global;\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The base implementation of `_.indexOf` without support for binary searches\n   * or `fromIndex` constraints.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {*} value The value to search for.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @returns {number} Returns the index of the matched value or `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    var index = (fromIndex || 0) - 1,\n        length = array ? array.length : 0;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * An implementation of `_.contains` for cache objects that mimics the return\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\n   *\n   * @private\n   * @param {Object} cache The cache object to inspect.\n   * @param {*} value The value to search for.\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\n   */\n  function cacheIndexOf(cache, value) {\n    var type = typeof value;\n    cache = cache.cache;\n\n    if (type == 'boolean' || value == null) {\n      return cache[value] ? 0 : -1;\n    }\n    if (type != 'number' && type != 'string') {\n      type = 'object';\n    }\n    var key = type == 'number' ? value : keyPrefix + value;\n    cache = (cache = cache[type]) && cache[key];\n\n    return type == 'object'\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\n      : (cache ? 0 : -1);\n  }\n\n  /**\n   * Adds a given value to the corresponding cache object.\n   *\n   * @private\n   * @param {*} value The value to add to the cache.\n   */\n  function cachePush(value) {\n    var cache = this.cache,\n        type = typeof value;\n\n    if (type == 'boolean' || value == null) {\n      cache[value] = true;\n    } else {\n      if (type != 'number' && type != 'string') {\n        type = 'object';\n      }\n      var key = type == 'number' ? value : keyPrefix + value,\n          typeCache = cache[type] || (cache[type] = {});\n\n      if (type == 'object') {\n        (typeCache[key] || (typeCache[key] = [])).push(value);\n      } else {\n        typeCache[key] = true;\n      }\n    }\n  }\n\n  /**\n   * Used by `_.max` and `_.min` as the default callback when a given\n   * collection is a string value.\n   *\n   * @private\n   * @param {string} value The character to inspect.\n   * @returns {number} Returns the code unit of given character.\n   */\n  function charAtCallback(value) {\n    return value.charCodeAt(0);\n  }\n\n  /**\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\n   * them in ascending order.\n   *\n   * @private\n   * @param {Object} a The object to compare to `b`.\n   * @param {Object} b The object to compare to `a`.\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\n   */\n  function compareAscending(a, b) {\n    var ac = a.criteria,\n        bc = b.criteria,\n        index = -1,\n        length = ac.length;\n\n    while (++index < length) {\n      var value = ac[index],\n          other = bc[index];\n\n      if (value !== other) {\n        if (value > other || typeof value == 'undefined') {\n          return 1;\n        }\n        if (value < other || typeof other == 'undefined') {\n          return -1;\n        }\n      }\n    }\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n    // that causes it, under certain circumstances, to return the same value for\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\n    //\n    // This also ensures a stable sort in V8 and other engines.\n    // See http://code.google.com/p/v8/issues/detail?id=90\n    return a.index - b.index;\n  }\n\n  /**\n   * Creates a cache object to optimize linear searches of large arrays.\n   *\n   * @private\n   * @param {Array} [array=[]] The array to search.\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\n   */\n  function createCache(array) {\n    var index = -1,\n        length = array.length,\n        first = array[0],\n        mid = array[(length / 2) | 0],\n        last = array[length - 1];\n\n    if (first && typeof first == 'object' &&\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\n      return false;\n    }\n    var cache = getObject();\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\n\n    var result = getObject();\n    result.array = array;\n    result.cache = cache;\n    result.push = cachePush;\n\n    while (++index < length) {\n      result.push(array[index]);\n    }\n    return result;\n  }\n\n  /**\n   * Used by `template` to escape characters for inclusion in compiled\n   * string literals.\n   *\n   * @private\n   * @param {string} match The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(match) {\n    return '\\\\' + stringEscapes[match];\n  }\n\n  /**\n   * Gets an array from the array pool or creates a new one if the pool is empty.\n   *\n   * @private\n   * @returns {Array} The array from the pool.\n   */\n  function getArray() {\n    return arrayPool.pop() || [];\n  }\n\n  /**\n   * Gets an object from the object pool or creates a new one if the pool is empty.\n   *\n   * @private\n   * @returns {Object} The object from the pool.\n   */\n  function getObject() {\n    return objectPool.pop() || {\n      'array': null,\n      'cache': null,\n      'criteria': null,\n      'false': false,\n      'index': 0,\n      'null': false,\n      'number': null,\n      'object': null,\n      'push': null,\n      'string': null,\n      'true': false,\n      'undefined': false,\n      'value': null\n    };\n  }\n\n  /**\n   * Releases the given array back to the array pool.\n   *\n   * @private\n   * @param {Array} [array] The array to release.\n   */\n  function releaseArray(array) {\n    array.length = 0;\n    if (arrayPool.length < maxPoolSize) {\n      arrayPool.push(array);\n    }\n  }\n\n  /**\n   * Releases the given object back to the object pool.\n   *\n   * @private\n   * @param {Object} [object] The object to release.\n   */\n  function releaseObject(object) {\n    var cache = object.cache;\n    if (cache) {\n      releaseObject(cache);\n    }\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\n    if (objectPool.length < maxPoolSize) {\n      objectPool.push(object);\n    }\n  }\n\n  /**\n   * Slices the `collection` from the `start` index up to, but not including,\n   * the `end` index.\n   *\n   * Note: This function is used instead of `Array#slice` to support node lists\n   * in IE < 9 and to ensure dense arrays are returned.\n   *\n   * @private\n   * @param {Array|Object|string} collection The collection to slice.\n   * @param {number} start The start index.\n   * @param {number} end The end index.\n   * @returns {Array} Returns the new array.\n   */\n  function slice(array, start, end) {\n    start || (start = 0);\n    if (typeof end == 'undefined') {\n      end = array ? array.length : 0;\n    }\n    var index = -1,\n        length = end - start || 0,\n        result = Array(length < 0 ? 0 : length);\n\n    while (++index < length) {\n      result[index] = array[start + index];\n    }\n    return result;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new `lodash` function using the given context object.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns the `lodash` function.\n   */\n  function runInContext(context) {\n    // Avoid issues with some ES3 environments that attempt to use values, named\n    // after built-in constructors like `Object`, for the creation of literals.\n    // ES5 clears this up by stating that literals must use built-in constructors.\n    // See http://es5.github.io/#x11.1.5.\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\n\n    /** Native constructor references */\n    var Array = context.Array,\n        Boolean = context.Boolean,\n        Date = context.Date,\n        Function = context.Function,\n        Math = context.Math,\n        Number = context.Number,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /**\n     * Used for `Array` method references.\n     *\n     * Normally `Array.prototype` would suffice, however, using an array literal\n     * avoids issues in Narwhal.\n     */\n    var arrayRef = [];\n\n    /** Used for native method references */\n    var objectProto = Object.prototype;\n\n    /** Used to restore the original `_` reference in `noConflict` */\n    var oldDash = context._;\n\n    /** Used to resolve the internal [[Class]] of values */\n    var toString = objectProto.toString;\n\n    /** Used to detect if a method is native */\n    var reNative = RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    /** Native method shortcuts */\n    var ceil = Math.ceil,\n        clearTimeout = context.clearTimeout,\n        floor = Math.floor,\n        fnToString = Function.prototype.toString,\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\n        hasOwnProperty = objectProto.hasOwnProperty,\n        push = arrayRef.push,\n        setTimeout = context.setTimeout,\n        splice = arrayRef.splice,\n        unshift = arrayRef.unshift;\n\n    /** Used to set meta data on functions */\n    var defineProperty = (function() {\n      // IE 8 only accepts DOM elements\n      try {\n        var o = {},\n            func = isNative(func = Object.defineProperty) && func,\n            result = func(o, o, o) && func;\n      } catch(e) { }\n      return result;\n    }());\n\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\n        nativeIsFinite = context.isFinite,\n        nativeIsNaN = context.isNaN,\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random;\n\n    /** Used to lookup a built-in constructor by [[Class]] */\n    var ctorByClass = {};\n    ctorByClass[arrayClass] = Array;\n    ctorByClass[boolClass] = Boolean;\n    ctorByClass[dateClass] = Date;\n    ctorByClass[funcClass] = Function;\n    ctorByClass[objectClass] = Object;\n    ctorByClass[numberClass] = Number;\n    ctorByClass[regexpClass] = RegExp;\n    ctorByClass[stringClass] = String;\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps the given value to enable intuitive\n     * method chaining.\n     *\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\n     * and `unshift`\n     *\n     * Chaining is supported in custom builds as long as the `value` method is\n     * implicitly or explicitly included in the build.\n     *\n     * The chainable wrapper functions are:\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\n     * and `zip`\n     *\n     * The non-chainable wrapper functions are:\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\n     * `template`, `unescape`, `uniqueId`, and `value`\n     *\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\n     * provided, otherwise they return unwrapped values.\n     *\n     * Explicit chaining can be enabled by using the `_.chain` method.\n     *\n     * @name _\n     * @constructor\n     * @category Chaining\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns a `lodash` instance.\n     * @example\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // returns an unwrapped value\n     * wrapped.reduce(function(sum, num) {\n     *   return sum + num;\n     * });\n     * // => 6\n     *\n     * // returns a wrapped value\n     * var squares = wrapped.map(function(num) {\n     *   return num * num;\n     * });\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\n       ? value\n       : new lodashWrapper(value);\n    }\n\n    /**\n     * A fast path for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @param {boolean} chainAll A flag to enable chaining for all methods\n     * @returns {Object} Returns a `lodash` instance.\n     */\n    function lodashWrapper(value, chainAll) {\n      this.__chain__ = !!chainAll;\n      this.__wrapped__ = value;\n    }\n    // ensure `new lodashWrapper` is an instance of `lodash`\n    lodashWrapper.prototype = lodash.prototype;\n\n    /**\n     * An object used to flag environments features.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    var support = lodash.support = {};\n\n    /**\n     * Detect if functions can be decompiled by `Function#toString`\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\n     *\n     * @memberOf _.support\n     * @type boolean\n     */\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\n\n    /**\n     * Detect if `Function#name` is supported (all but IE).\n     *\n     * @memberOf _.support\n     * @type boolean\n     */\n    support.funcNames = typeof Function.name == 'string';\n\n    /**\n     * By default, the template delimiters used by Lo-Dash are similar to those in\n     * embedded Ruby (ERB). Change the following template settings to use alternative\n     * delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'escape': /<%-([\\s\\S]+?)%>/g,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'evaluate': /<%([\\s\\S]+?)%>/g,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type string\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type Object\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type Function\n         */\n        '_': lodash\n      }\n    };\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * The base implementation of `_.bind` that creates the bound function and\n     * sets its meta data.\n     *\n     * @private\n     * @param {Array} bindData The bind data array.\n     * @returns {Function} Returns the new bound function.\n     */\n    function baseBind(bindData) {\n      var func = bindData[0],\n          partialArgs = bindData[2],\n          thisArg = bindData[4];\n\n      function bound() {\n        // `Function#bind` spec\n        // http://es5.github.io/#x15.3.4.5\n        if (partialArgs) {\n          // avoid `arguments` object deoptimizations by using `slice` instead\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\n          // variable as a ternary expression\n          var args = slice(partialArgs);\n          push.apply(args, arguments);\n        }\n        // mimic the constructor's `return` behavior\n        // http://es5.github.io/#x13.2.2\n        if (this instanceof bound) {\n          // ensure `new bound` is an instance of `func`\n          var thisBinding = baseCreate(func.prototype),\n              result = func.apply(thisBinding, args || arguments);\n          return isObject(result) ? result : thisBinding;\n        }\n        return func.apply(thisArg, args || arguments);\n      }\n      setBindData(bound, bindData);\n      return bound;\n    }\n\n    /**\n     * The base implementation of `_.clone` without argument juggling or support\n     * for `thisArg` binding.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep=false] Specify a deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, isDeep, callback, stackA, stackB) {\n      if (callback) {\n        var result = callback(value);\n        if (typeof result != 'undefined') {\n          return result;\n        }\n      }\n      // inspect [[Class]]\n      var isObj = isObject(value);\n      if (isObj) {\n        var className = toString.call(value);\n        if (!cloneableClasses[className]) {\n          return value;\n        }\n        var ctor = ctorByClass[className];\n        switch (className) {\n          case boolClass:\n          case dateClass:\n            return new ctor(+value);\n\n          case numberClass:\n          case stringClass:\n            return new ctor(value);\n\n          case regexpClass:\n            result = ctor(value.source, reFlags.exec(value));\n            result.lastIndex = value.lastIndex;\n            return result;\n        }\n      } else {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isDeep) {\n        // check for circular references and return corresponding clone\n        var initedStack = !stackA;\n        stackA || (stackA = getArray());\n        stackB || (stackB = getArray());\n\n        var length = stackA.length;\n        while (length--) {\n          if (stackA[length] == value) {\n            return stackB[length];\n          }\n        }\n        result = isArr ? ctor(value.length) : {};\n      }\n      else {\n        result = isArr ? slice(value) : assign({}, value);\n      }\n      // add array properties assigned by `RegExp#exec`\n      if (isArr) {\n        if (hasOwnProperty.call(value, 'index')) {\n          result.index = value.index;\n        }\n        if (hasOwnProperty.call(value, 'input')) {\n          result.input = value.input;\n        }\n      }\n      // exit for shallow clone\n      if (!isDeep) {\n        return result;\n      }\n      // add the source value to the stack of traversed objects\n      // and associate it with its clone\n      stackA.push(value);\n      stackB.push(result);\n\n      // recursively populate clone (susceptible to call stack limits)\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\n      });\n\n      if (initedStack) {\n        releaseArray(stackA);\n        releaseArray(stackB);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} prototype The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    function baseCreate(prototype, properties) {\n      return isObject(prototype) ? nativeCreate(prototype) : {};\n    }\n    // fallback for browsers without `Object.create`\n    if (!nativeCreate) {\n      baseCreate = (function() {\n        function Object() {}\n        return function(prototype) {\n          if (isObject(prototype)) {\n            Object.prototype = prototype;\n            var result = new Object;\n            Object.prototype = null;\n          }\n          return result || context.Object();\n        };\n      }());\n    }\n\n    /**\n     * The base implementation of `_.createCallback` without support for creating\n     * \"_.pluck\" or \"_.where\" style callbacks.\n     *\n     * @private\n     * @param {*} [func=identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of the created callback.\n     * @param {number} [argCount] The number of arguments the callback accepts.\n     * @returns {Function} Returns a callback function.\n     */\n    function baseCreateCallback(func, thisArg, argCount) {\n      if (typeof func != 'function') {\n        return identity;\n      }\n      // exit early for no `thisArg` or already bound by `Function#bind`\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\n        return func;\n      }\n      var bindData = func.__bindData__;\n      if (typeof bindData == 'undefined') {\n        if (support.funcNames) {\n          bindData = !func.name;\n        }\n        bindData = bindData || !support.funcDecomp;\n        if (!bindData) {\n          var source = fnToString.call(func);\n          if (!support.funcNames) {\n            bindData = !reFuncName.test(source);\n          }\n          if (!bindData) {\n            // checks if `func` references the `this` keyword and stores the result\n            bindData = reThis.test(source);\n            setBindData(func, bindData);\n          }\n        }\n      }\n      // exit early if there are no `this` references or `func` is bound\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\n        return func;\n      }\n      switch (argCount) {\n        case 1: return function(value) {\n          return func.call(thisArg, value);\n        };\n        case 2: return function(a, b) {\n          return func.call(thisArg, a, b);\n        };\n        case 3: return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n        case 4: return function(accumulator, value, index, collection) {\n          return func.call(thisArg, accumulator, value, index, collection);\n        };\n      }\n      return bind(func, thisArg);\n    }\n\n    /**\n     * The base implementation of `createWrapper` that creates the wrapper and\n     * sets its meta data.\n     *\n     * @private\n     * @param {Array} bindData The bind data array.\n     * @returns {Function} Returns the new function.\n     */\n    function baseCreateWrapper(bindData) {\n      var func = bindData[0],\n          bitmask = bindData[1],\n          partialArgs = bindData[2],\n          partialRightArgs = bindData[3],\n          thisArg = bindData[4],\n          arity = bindData[5];\n\n      var isBind = bitmask & 1,\n          isBindKey = bitmask & 2,\n          isCurry = bitmask & 4,\n          isCurryBound = bitmask & 8,\n          key = func;\n\n      function bound() {\n        var thisBinding = isBind ? thisArg : this;\n        if (partialArgs) {\n          var args = slice(partialArgs);\n          push.apply(args, arguments);\n        }\n        if (partialRightArgs || isCurry) {\n          args || (args = slice(arguments));\n          if (partialRightArgs) {\n            push.apply(args, partialRightArgs);\n          }\n          if (isCurry && args.length < arity) {\n            bitmask |= 16 & ~32;\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\n          }\n        }\n        args || (args = arguments);\n        if (isBindKey) {\n          func = thisBinding[key];\n        }\n        if (this instanceof bound) {\n          thisBinding = baseCreate(func.prototype);\n          var result = func.apply(thisBinding, args);\n          return isObject(result) ? result : thisBinding;\n        }\n        return func.apply(thisBinding, args);\n      }\n      setBindData(bound, bindData);\n      return bound;\n    }\n\n    /**\n     * The base implementation of `_.difference` that accepts a single array\n     * of values to exclude.\n     *\n     * @private\n     * @param {Array} array The array to process.\n     * @param {Array} [values] The array of values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     */\n    function baseDifference(array, values) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array ? array.length : 0,\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\n          result = [];\n\n      if (isLarge) {\n        var cache = createCache(values);\n        if (cache) {\n          indexOf = cacheIndexOf;\n          values = cache;\n        } else {\n          isLarge = false;\n        }\n      }\n      while (++index < length) {\n        var value = array[index];\n        if (indexOf(values, value) < 0) {\n          result.push(value);\n        }\n      }\n      if (isLarge) {\n        releaseObject(values);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` without support for callback\n     * shorthands or `thisArg` binding.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\n     * @param {number} [fromIndex=0] The index to start from.\n     * @returns {Array} Returns a new flattened array.\n     */\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\n      var index = (fromIndex || 0) - 1,\n          length = array ? array.length : 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n\n        if (value && typeof value == 'object' && typeof value.length == 'number'\n            && (isArray(value) || isArguments(value))) {\n          // recursively flatten arrays (susceptible to call stack limits)\n          if (!isShallow) {\n            value = baseFlatten(value, isShallow, isStrict);\n          }\n          var valIndex = -1,\n              valLength = value.length,\n              resIndex = result.length;\n\n          result.length += valLength;\n          while (++valIndex < valLength) {\n            result[resIndex++] = value[valIndex];\n          }\n        } else if (!isStrict) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\n     * that allows partial \"_.where\" style comparisons.\n     *\n     * @private\n     * @param {*} a The value to compare.\n     * @param {*} b The other value to compare.\n     * @param {Function} [callback] The function to customize comparing values.\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\n      if (callback) {\n        var result = callback(a, b);\n        if (typeof result != 'undefined') {\n          return !!result;\n        }\n      }\n      // exit early for identical values\n      if (a === b) {\n        // treat `+0` vs. `-0` as not equal\n        return a !== 0 || (1 / a == 1 / b);\n      }\n      var type = typeof a,\n          otherType = typeof b;\n\n      // exit early for unlike primitive values\n      if (a === a &&\n          !(a && objectTypes[type]) &&\n          !(b && objectTypes[otherType])) {\n        return false;\n      }\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\n      // http://es5.github.io/#x15.3.4.4\n      if (a == null || b == null) {\n        return a === b;\n      }\n      // compare [[Class]] names\n      var className = toString.call(a),\n          otherClass = toString.call(b);\n\n      if (className == argsClass) {\n        className = objectClass;\n      }\n      if (otherClass == argsClass) {\n        otherClass = objectClass;\n      }\n      if (className != otherClass) {\n        return false;\n      }\n      switch (className) {\n        case boolClass:\n        case dateClass:\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\n          return +a == +b;\n\n        case numberClass:\n          // treat `NaN` vs. `NaN` as equal\n          return (a != +a)\n            ? b != +b\n            // but treat `+0` vs. `-0` as not equal\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\n\n        case regexpClass:\n        case stringClass:\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\n          // treat string primitives and their corresponding object instances as equal\n          return a == String(b);\n      }\n      var isArr = className == arrayClass;\n      if (!isArr) {\n        // unwrap any `lodash` wrapped values\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\n\n        if (aWrapped || bWrapped) {\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\n        }\n        // exit for functions and DOM nodes\n        if (className != objectClass) {\n          return false;\n        }\n        // in older versions of Opera, `arguments` objects have `Array` constructors\n        var ctorA = a.constructor,\n            ctorB = b.constructor;\n\n        // non `Object` object instances with different constructors are not equal\n        if (ctorA != ctorB &&\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\n              ('constructor' in a && 'constructor' in b)\n            ) {\n          return false;\n        }\n      }\n      // assume cyclic structures are equal\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\n      var initedStack = !stackA;\n      stackA || (stackA = getArray());\n      stackB || (stackB = getArray());\n\n      var length = stackA.length;\n      while (length--) {\n        if (stackA[length] == a) {\n          return stackB[length] == b;\n        }\n      }\n      var size = 0;\n      result = true;\n\n      // add `a` and `b` to the stack of traversed objects\n      stackA.push(a);\n      stackB.push(b);\n\n      // recursively compare objects and arrays (susceptible to call stack limits)\n      if (isArr) {\n        // compare lengths to determine if a deep comparison is necessary\n        length = a.length;\n        size = b.length;\n        result = size == length;\n\n        if (result || isWhere) {\n          // deep compare the contents, ignoring non-numeric properties\n          while (size--) {\n            var index = length,\n                value = b[size];\n\n            if (isWhere) {\n              while (index--) {\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\n                  break;\n                }\n              }\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\n              break;\n            }\n          }\n        }\n      }\n      else {\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\n        // which, in this case, is more costly\n        forIn(b, function(value, key, b) {\n          if (hasOwnProperty.call(b, key)) {\n            // count the number of properties.\n            size++;\n            // deep compare each property value.\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\n          }\n        });\n\n        if (result && !isWhere) {\n          // ensure both objects have the same number of properties\n          forIn(a, function(value, key, a) {\n            if (hasOwnProperty.call(a, key)) {\n              // `size` will be `-1` if `a` has more properties than `b`\n              return (result = --size > -1);\n            }\n          });\n        }\n      }\n      stackA.pop();\n      stackB.pop();\n\n      if (initedStack) {\n        releaseArray(stackA);\n        releaseArray(stackB);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.merge` without argument juggling or support\n     * for `thisArg` binding.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {Function} [callback] The function to customize merging properties.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\n     */\n    function baseMerge(object, source, callback, stackA, stackB) {\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\n        var found,\n            isArr,\n            result = source,\n            value = object[key];\n\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\n          // avoid merging previously merged cyclic sources\n          var stackLength = stackA.length;\n          while (stackLength--) {\n            if ((found = stackA[stackLength] == source)) {\n              value = stackB[stackLength];\n              break;\n            }\n          }\n          if (!found) {\n            var isShallow;\n            if (callback) {\n              result = callback(value, source);\n              if ((isShallow = typeof result != 'undefined')) {\n                value = result;\n              }\n            }\n            if (!isShallow) {\n              value = isArr\n                ? (isArray(value) ? value : [])\n                : (isPlainObject(value) ? value : {});\n            }\n            // add `source` and associated `value` to the stack of traversed objects\n            stackA.push(source);\n            stackB.push(value);\n\n            // recursively merge objects and arrays (susceptible to call stack limits)\n            if (!isShallow) {\n              baseMerge(value, source, callback, stackA, stackB);\n            }\n          }\n        }\n        else {\n          if (callback) {\n            result = callback(value, source);\n            if (typeof result == 'undefined') {\n              result = source;\n            }\n          }\n          if (typeof result != 'undefined') {\n            value = result;\n          }\n        }\n        object[key] = value;\n      });\n    }\n\n    /**\n     * The base implementation of `_.random` without argument juggling or support\n     * for returning floating-point numbers.\n     *\n     * @private\n     * @param {number} min The minimum possible value.\n     * @param {number} max The maximum possible value.\n     * @returns {number} Returns a random number.\n     */\n    function baseRandom(min, max) {\n      return min + floor(nativeRandom() * (max - min + 1));\n    }\n\n    /**\n     * The base implementation of `_.uniq` without support for callback shorthands\n     * or `thisArg` binding.\n     *\n     * @private\n     * @param {Array} array The array to process.\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n     * @param {Function} [callback] The function called per iteration.\n     * @returns {Array} Returns a duplicate-value-free array.\n     */\n    function baseUniq(array, isSorted, callback) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array ? array.length : 0,\n          result = [];\n\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\n          seen = (callback || isLarge) ? getArray() : result;\n\n      if (isLarge) {\n        var cache = createCache(seen);\n        indexOf = cacheIndexOf;\n        seen = cache;\n      }\n      while (++index < length) {\n        var value = array[index],\n            computed = callback ? callback(value, index, array) : value;\n\n        if (isSorted\n              ? !index || seen[seen.length - 1] !== computed\n              : indexOf(seen, computed) < 0\n            ) {\n          if (callback || isLarge) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      if (isLarge) {\n        releaseArray(seen.array);\n        releaseObject(seen);\n      } else if (callback) {\n        releaseArray(seen);\n      }\n      return result;\n    }\n\n    /**\n     * Creates a function that aggregates a collection, creating an object composed\n     * of keys generated from the results of running each element of the collection\n     * through a callback. The given `setter` function sets the keys and values\n     * of the composed object.\n     *\n     * @private\n     * @param {Function} setter The setter function.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter) {\n      return function(collection, callback, thisArg) {\n        var result = {};\n        callback = lodash.createCallback(callback, thisArg, 3);\n\n        var index = -1,\n            length = collection ? collection.length : 0;\n\n        if (typeof length == 'number') {\n          while (++index < length) {\n            var value = collection[index];\n            setter(result, value, callback(value, index, collection), collection);\n          }\n        } else {\n          forOwn(collection, function(value, key, collection) {\n            setter(result, value, callback(value, key, collection), collection);\n          });\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that, when called, either curries or invokes `func`\n     * with an optional `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to reference.\n     * @param {number} bitmask The bitmask of method flags to compose.\n     *  The bitmask may be composed of the following flags:\n     *  1 - `_.bind`\n     *  2 - `_.bindKey`\n     *  4 - `_.curry`\n     *  8 - `_.curry` (bound)\n     *  16 - `_.partial`\n     *  32 - `_.partialRight`\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\n     *  provided to the new function.\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\n     *  provided to the new function.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new function.\n     */\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\n      var isBind = bitmask & 1,\n          isBindKey = bitmask & 2,\n          isCurry = bitmask & 4,\n          isCurryBound = bitmask & 8,\n          isPartial = bitmask & 16,\n          isPartialRight = bitmask & 32;\n\n      if (!isBindKey && !isFunction(func)) {\n        throw new TypeError;\n      }\n      if (isPartial && !partialArgs.length) {\n        bitmask &= ~16;\n        isPartial = partialArgs = false;\n      }\n      if (isPartialRight && !partialRightArgs.length) {\n        bitmask &= ~32;\n        isPartialRight = partialRightArgs = false;\n      }\n      var bindData = func && func.__bindData__;\n      if (bindData && bindData !== true) {\n        // clone `bindData`\n        bindData = slice(bindData);\n        if (bindData[2]) {\n          bindData[2] = slice(bindData[2]);\n        }\n        if (bindData[3]) {\n          bindData[3] = slice(bindData[3]);\n        }\n        // set `thisBinding` is not previously bound\n        if (isBind && !(bindData[1] & 1)) {\n          bindData[4] = thisArg;\n        }\n        // set if previously bound but not currently (subsequent curried functions)\n        if (!isBind && bindData[1] & 1) {\n          bitmask |= 8;\n        }\n        // set curried arity if not yet set\n        if (isCurry && !(bindData[1] & 4)) {\n          bindData[5] = arity;\n        }\n        // append partial left arguments\n        if (isPartial) {\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\n        }\n        // append partial right arguments\n        if (isPartialRight) {\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\n        }\n        // merge flags\n        bindData[1] |= bitmask;\n        return createWrapper.apply(null, bindData);\n      }\n      // fast path for `_.bind`\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\n    }\n\n    /**\n     * Used by `escape` to convert characters to HTML entities.\n     *\n     * @private\n     * @param {string} match The matched character to escape.\n     * @returns {string} Returns the escaped character.\n     */\n    function escapeHtmlChar(match) {\n      return htmlEscapes[match];\n    }\n\n    /**\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\n     * customized, this method returns the custom method, otherwise it returns\n     * the `baseIndexOf` function.\n     *\n     * @private\n     * @returns {Function} Returns the \"indexOf\" function.\n     */\n    function getIndexOf() {\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\n      return result;\n    }\n\n    /**\n     * Checks if `value` is a native function.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\n     */\n    function isNative(value) {\n      return typeof value == 'function' && reNative.test(value);\n    }\n\n    /**\n     * Sets `this` binding data on a given function.\n     *\n     * @private\n     * @param {Function} func The function to set data on.\n     * @param {Array} value The data array to set.\n     */\n    var setBindData = !defineProperty ? noop : function(func, value) {\n      descriptor.value = value;\n      defineProperty(func, '__bindData__', descriptor);\n    };\n\n    /**\n     * A fallback implementation of `isPlainObject` which checks if a given value\n     * is an object created by the `Object` constructor, assuming objects created\n     * by the `Object` constructor have no inherited enumerable properties and that\n     * there are no `Object.prototype` extensions.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     */\n    function shimIsPlainObject(value) {\n      var ctor,\n          result;\n\n      // avoid non Object objects, `arguments` objects, and DOM elements\n      if (!(value && toString.call(value) == objectClass) ||\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\n        return false;\n      }\n      // In most environments an object's own properties are iterated before\n      // its inherited properties. If the last iterated property is an object's\n      // own property then there are no inherited enumerable properties.\n      forIn(value, function(value, key) {\n        result = key;\n      });\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\n    }\n\n    /**\n     * Used by `unescape` to convert HTML entities to characters.\n     *\n     * @private\n     * @param {string} match The matched character to unescape.\n     * @returns {string} Returns the unescaped character.\n     */\n    function unescapeHtmlChar(match) {\n      return htmlUnescapes[match];\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Checks if `value` is an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\n     * @example\n     *\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    function isArguments(value) {\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\n        toString.call(value) == argsClass || false;\n    }\n\n    /**\n     * Checks if `value` is an array.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\n     * @example\n     *\n     * (function() { return _.isArray(arguments); })();\n     * // => false\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     */\n    var isArray = nativeIsArray || function(value) {\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\n        toString.call(value) == arrayClass || false;\n    };\n\n    /**\n     * A fallback implementation of `Object.keys` which produces an array of the\n     * given object's own enumerable property names.\n     *\n     * @private\n     * @type Function\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names.\n     */\n    var shimKeys = function(object) {\n      var index, iterable = object, result = [];\n      if (!iterable) return result;\n      if (!(objectTypes[typeof object])) return result;\n        for (index in iterable) {\n          if (hasOwnProperty.call(iterable, index)) {\n            result.push(index);\n          }\n        }\n      return result\n    };\n\n    /**\n     * Creates an array composed of the own enumerable property names of an object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names.\n     * @example\n     *\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\n     */\n    var keys = !nativeKeys ? shimKeys : function(object) {\n      if (!isObject(object)) {\n        return [];\n      }\n      return nativeKeys(object);\n    };\n\n    /**\n     * Used to convert characters to HTML entities:\n     *\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\n     * don't require escaping in HTML and have no special meaning unless they're part\n     * of a tag or an unquoted attribute value.\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\n     */\n    var htmlEscapes = {\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      \"'\": '&#39;'\n    };\n\n    /** Used to convert HTML entities to characters */\n    var htmlUnescapes = invert(htmlEscapes);\n\n    /** Used to match HTML entities and HTML characters */\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object. Subsequent sources will overwrite property assignments of previous\n     * sources. If a callback is provided it will be executed to produce the\n     * assigned values. The callback is bound to `thisArg` and invoked with two\n     * arguments; (objectValue, sourceValue).\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @alias extend\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param {Function} [callback] The function to customize assigning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\n     * // => { 'name': 'fred', 'employer': 'slate' }\n     *\n     * var defaults = _.partialRight(_.assign, function(a, b) {\n     *   return typeof a == 'undefined' ? b : a;\n     * });\n     *\n     * var object = { 'name': 'barney' };\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\n     * // => { 'name': 'barney', 'employer': 'slate' }\n     */\n    var assign = function(object, source, guard) {\n      var index, iterable = object, result = iterable;\n      if (!iterable) return result;\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = typeof guard == 'number' ? 2 : args.length;\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\n        callback = args[--argsLength];\n      }\n      while (++argsIndex < argsLength) {\n        iterable = args[argsIndex];\n        if (iterable && objectTypes[typeof iterable]) {\n        var ownIndex = -1,\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\n            length = ownProps ? ownProps.length : 0;\n\n        while (++ownIndex < length) {\n          index = ownProps[ownIndex];\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\n        }\n        }\n      }\n      return result\n    };\n\n    /**\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\n     * be cloned, otherwise they will be assigned by reference. If a callback\n     * is provided it will be executed to produce the cloned values. If the\n     * callback returns `undefined` cloning will be handled by the method instead.\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep=false] Specify a deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the cloned value.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * var shallow = _.clone(characters);\n     * shallow[0] === characters[0];\n     * // => true\n     *\n     * var deep = _.clone(characters, true);\n     * deep[0] === characters[0];\n     * // => false\n     *\n     * _.mixin({\n     *   'clone': _.partialRight(_.clone, function(value) {\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\n     *   })\n     * });\n     *\n     * var clone = _.clone(document.body);\n     * clone.childNodes.length;\n     * // => 0\n     */\n    function clone(value, isDeep, callback, thisArg) {\n      // allows working with \"Collections\" methods without using their `index`\n      // and `collection` arguments for `isDeep` and `callback`\n      if (typeof isDeep != 'boolean' && isDeep != null) {\n        thisArg = callback;\n        callback = isDeep;\n        isDeep = false;\n      }\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\n    }\n\n    /**\n     * Creates a deep clone of `value`. If a callback is provided it will be\n     * executed to produce the cloned values. If the callback returns `undefined`\n     * cloning will be handled by the method instead. The callback is bound to\n     * `thisArg` and invoked with one argument; (value).\n     *\n     * Note: This method is loosely based on the structured clone algorithm. Functions\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the deep cloned value.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * var deep = _.cloneDeep(characters);\n     * deep[0] === characters[0];\n     * // => false\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'node': element\n     * };\n     *\n     * var clone = _.cloneDeep(view, function(value) {\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\n     * });\n     *\n     * clone.node == view.node;\n     * // => false\n     */\n    function cloneDeep(value, callback, thisArg) {\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\n    }\n\n    /**\n     * Creates an object that inherits from the given `prototype` object. If a\n     * `properties` object is provided its own enumerable properties are assigned\n     * to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties ? assign(result, properties) : result;\n    }\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object for all destination properties that resolve to `undefined`. Once a\n     * property is set, additional defaults of the same property will be ignored.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\n     *  `key` and `object` arguments as sources.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * var object = { 'name': 'barney' };\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\n     * // => { 'name': 'barney', 'employer': 'slate' }\n     */\n    var defaults = function(object, source, guard) {\n      var index, iterable = object, result = iterable;\n      if (!iterable) return result;\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = typeof guard == 'number' ? 2 : args.length;\n      while (++argsIndex < argsLength) {\n        iterable = args[argsIndex];\n        if (iterable && objectTypes[typeof iterable]) {\n        var ownIndex = -1,\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\n            length = ownProps ? ownProps.length : 0;\n\n        while (++ownIndex < length) {\n          index = ownProps[ownIndex];\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\n        }\n        }\n      }\n      return result\n    };\n\n    /**\n     * This method is like `_.findIndex` except that it returns the key of the\n     * first element that passes the callback check, instead of the element itself.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [callback=identity] The function called per\n     *  iteration. If a property name or object is provided it will be used to\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\n     * @example\n     *\n     * var characters = {\n     *   'barney': {  'age': 36, 'blocked': false },\n     *   'fred': {    'age': 40, 'blocked': true },\n     *   'pebbles': { 'age': 1,  'blocked': false }\n     * };\n     *\n     * _.findKey(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => 'barney' (property order is not guaranteed across environments)\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findKey(characters, { 'age': 1 });\n     * // => 'pebbles'\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findKey(characters, 'blocked');\n     * // => 'fred'\n     */\n    function findKey(object, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forOwn(object, function(value, key, object) {\n        if (callback(value, key, object)) {\n          result = key;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [callback=identity] The function called per\n     *  iteration. If a property name or object is provided it will be used to\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\n     * @example\n     *\n     * var characters = {\n     *   'barney': {  'age': 36, 'blocked': true },\n     *   'fred': {    'age': 40, 'blocked': false },\n     *   'pebbles': { 'age': 1,  'blocked': true }\n     * };\n     *\n     * _.findLastKey(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findLastKey(characters, { 'age': 40 });\n     * // => 'fred'\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findLastKey(characters, 'blocked');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forOwnRight(object, function(value, key, object) {\n        if (callback(value, key, object)) {\n          result = key;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Iterates over own and inherited enumerable properties of an object,\n     * executing the callback for each property. The callback is bound to `thisArg`\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * Shape.prototype.move = function(x, y) {\n     *   this.x += x;\n     *   this.y += y;\n     * };\n     *\n     * _.forIn(new Shape, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\n     */\n    var forIn = function(collection, callback, thisArg) {\n      var index, iterable = collection, result = iterable;\n      if (!iterable) return result;\n      if (!objectTypes[typeof iterable]) return result;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n        for (index in iterable) {\n          if (callback(iterable[index], index, collection) === false) return result;\n        }\n      return result\n    };\n\n    /**\n     * This method is like `_.forIn` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * Shape.prototype.move = function(x, y) {\n     *   this.x += x;\n     *   this.y += y;\n     * };\n     *\n     * _.forInRight(new Shape, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\n     */\n    function forInRight(object, callback, thisArg) {\n      var pairs = [];\n\n      forIn(object, function(value, key) {\n        pairs.push(key, value);\n      });\n\n      var length = pairs.length;\n      callback = baseCreateCallback(callback, thisArg, 3);\n      while (length--) {\n        if (callback(pairs[length--], pairs[length], object) === false) {\n          break;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Iterates over own enumerable properties of an object, executing the callback\n     * for each property. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, key, object). Callbacks may exit iteration early by\n     * explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n     *   console.log(key);\n     * });\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\n     */\n    var forOwn = function(collection, callback, thisArg) {\n      var index, iterable = collection, result = iterable;\n      if (!iterable) return result;\n      if (!objectTypes[typeof iterable]) return result;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n        var ownIndex = -1,\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\n            length = ownProps ? ownProps.length : 0;\n\n        while (++ownIndex < length) {\n          index = ownProps[ownIndex];\n          if (callback(iterable[index], index, collection) === false) return result;\n        }\n      return result\n    };\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\n     */\n    function forOwnRight(object, callback, thisArg) {\n      var props = keys(object),\n          length = props.length;\n\n      callback = baseCreateCallback(callback, thisArg, 3);\n      while (length--) {\n        var key = props[length];\n        if (callback(object[key], key, object) === false) {\n          break;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Creates a sorted array of property names of all enumerable properties,\n     * own and inherited, of `object` that have function values.\n     *\n     * @static\n     * @memberOf _\n     * @alias methods\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names that have function values.\n     * @example\n     *\n     * _.functions(_);\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\n     */\n    function functions(object) {\n      var result = [];\n      forIn(object, function(value, key) {\n        if (isFunction(value)) {\n          result.push(key);\n        }\n      });\n      return result.sort();\n    }\n\n    /**\n     * Checks if the specified property name exists as a direct property of `object`,\n     * instead of an inherited property.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @param {string} key The name of the property to check.\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\n     * @example\n     *\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\n     * // => true\n     */\n    function has(object, key) {\n      return object ? hasOwnProperty.call(object, key) : false;\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of the given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the created inverted object.\n     * @example\n     *\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\n     * // => { 'fred': 'first', 'barney': 'second' }\n     */\n    function invert(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = {};\n\n      while (++index < length) {\n        var key = props[index];\n        result[object[key]] = key;\n      }\n      return result;\n    }\n\n    /**\n     * Checks if `value` is a boolean value.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\n     * @example\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\n    }\n\n    /**\n     * Checks if `value` is a date.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     */\n    function isDate(value) {\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\n    }\n\n    /**\n     * Checks if `value` is a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     */\n    function isElement(value) {\n      return value && value.nodeType === 1 || false;\n    }\n\n    /**\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\n     * length of `0` and objects with no own enumerable properties are considered\n     * \"empty\".\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Array|Object|string} value The value to inspect.\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({});\n     * // => true\n     *\n     * _.isEmpty('');\n     * // => true\n     */\n    function isEmpty(value) {\n      var result = true;\n      if (!value) {\n        return result;\n      }\n      var className = toString.call(value),\n          length = value.length;\n\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\n        return !length;\n      }\n      forOwn(value, function() {\n        return (result = false);\n      });\n      return result;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent to each other. If a callback is provided it will be executed\n     * to compare values. If the callback returns `undefined` comparisons will\n     * be handled by the method instead. The callback is bound to `thisArg` and\n     * invoked with two arguments; (a, b).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} a The value to compare.\n     * @param {*} b The other value to compare.\n     * @param {Function} [callback] The function to customize comparing values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * var copy = { 'name': 'fred' };\n     *\n     * object == copy;\n     * // => false\n     *\n     * _.isEqual(object, copy);\n     * // => true\n     *\n     * var words = ['hello', 'goodbye'];\n     * var otherWords = ['hi', 'goodbye'];\n     *\n     * _.isEqual(words, otherWords, function(a, b) {\n     *   var reGreet = /^(?:hello|hi)$/i,\n     *       aGreet = _.isString(a) && reGreet.test(a),\n     *       bGreet = _.isString(b) && reGreet.test(b);\n     *\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\n     * });\n     * // => true\n     */\n    function isEqual(a, b, callback, thisArg) {\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\n    }\n\n    /**\n     * Checks if `value` is, or can be coerced to, a finite number.\n     *\n     * Note: This is not the same as native `isFinite` which will return true for\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\n     * @example\n     *\n     * _.isFinite(-101);\n     * // => true\n     *\n     * _.isFinite('10');\n     * // => true\n     *\n     * _.isFinite(true);\n     * // => false\n     *\n     * _.isFinite('');\n     * // => false\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     */\n    function isFinite(value) {\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\n    }\n\n    /**\n     * Checks if `value` is a function.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     */\n    function isFunction(value) {\n      return typeof value == 'function';\n    }\n\n    /**\n     * Checks if `value` is the language type of Object.\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(1);\n     * // => false\n     */\n    function isObject(value) {\n      // check if the value is the ECMAScript language type of Object\n      // http://es5.github.io/#x8\n      // and avoid a V8 bug\n      // http://code.google.com/p/v8/issues/detail?id=2291\n      return !!(value && objectTypes[typeof value]);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * Note: This is not the same as native `isNaN` which will return `true` for\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // `NaN` as a primitive is the only value that is not equal to itself\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(undefined);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is a number.\n     *\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(8.4 * 5);\n     * // => true\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\n    }\n\n    /**\n     * Checks if `value` is an object created by the `Object` constructor.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * _.isPlainObject(new Shape);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     */\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\n      if (!(value && toString.call(value) == objectClass)) {\n        return false;\n      }\n      var valueOf = value.valueOf,\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\n\n      return objProto\n        ? (value == objProto || getPrototypeOf(value) == objProto)\n        : shimIsPlainObject(value);\n    };\n\n    /**\n     * Checks if `value` is a regular expression.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\n     * @example\n     *\n     * _.isRegExp(/fred/);\n     * // => true\n     */\n    function isRegExp(value) {\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\n    }\n\n    /**\n     * Checks if `value` is a string.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('fred');\n     * // => true\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\n    }\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     */\n    function isUndefined(value) {\n      return typeof value == 'undefined';\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated by\n     * running each own enumerable property of `object` through the callback.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\n     * @example\n     *\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     *\n     * var characters = {\n     *   'fred': { 'name': 'fred', 'age': 40 },\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.mapValues(characters, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 }\n     */\n    function mapValues(object, callback, thisArg) {\n      var result = {};\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      forOwn(object, function(value, key, object) {\n        result[key] = callback(value, key, object);\n      });\n      return result;\n    }\n\n    /**\n     * Recursively merges own enumerable properties of the source object(s), that\n     * don't resolve to `undefined` into the destination object. Subsequent sources\n     * will overwrite property assignments of previous sources. If a callback is\n     * provided it will be executed to produce the merged values of the destination\n     * and source properties. If the callback returns `undefined` merging will\n     * be handled by the method instead. The callback is bound to `thisArg` and\n     * invoked with two arguments; (objectValue, sourceValue).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param {Function} [callback] The function to customize merging properties.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * var names = {\n     *   'characters': [\n     *     { 'name': 'barney' },\n     *     { 'name': 'fred' }\n     *   ]\n     * };\n     *\n     * var ages = {\n     *   'characters': [\n     *     { 'age': 36 },\n     *     { 'age': 40 }\n     *   ]\n     * };\n     *\n     * _.merge(names, ages);\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\n     *\n     * var food = {\n     *   'fruits': ['apple'],\n     *   'vegetables': ['beet']\n     * };\n     *\n     * var otherFood = {\n     *   'fruits': ['banana'],\n     *   'vegetables': ['carrot']\n     * };\n     *\n     * _.merge(food, otherFood, function(a, b) {\n     *   return _.isArray(a) ? a.concat(b) : undefined;\n     * });\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\n     */\n    function merge(object) {\n      var args = arguments,\n          length = 2;\n\n      if (!isObject(object)) {\n        return object;\n      }\n      // allows working with `_.reduce` and `_.reduceRight` without using\n      // their `index` and `collection` arguments\n      if (typeof args[2] != 'number') {\n        length = args.length;\n      }\n      if (length > 3 && typeof args[length - 2] == 'function') {\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\n        callback = args[--length];\n      }\n      var sources = slice(arguments, 1, length),\n          index = -1,\n          stackA = getArray(),\n          stackB = getArray();\n\n      while (++index < length) {\n        baseMerge(object, sources[index], callback, stackA, stackB);\n      }\n      releaseArray(stackA);\n      releaseArray(stackB);\n      return object;\n    }\n\n    /**\n     * Creates a shallow clone of `object` excluding the specified properties.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If a callback is provided it will be executed for each\n     * property of `object` omitting the properties the callback returns truey\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The source object.\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\n     *  function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns an object without the omitted properties.\n     * @example\n     *\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\n     * // => { 'name': 'fred' }\n     *\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\n     *   return typeof value == 'number';\n     * });\n     * // => { 'name': 'fred' }\n     */\n    function omit(object, callback, thisArg) {\n      var result = {};\n      if (typeof callback != 'function') {\n        var props = [];\n        forIn(object, function(value, key) {\n          props.push(key);\n        });\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\n\n        var index = -1,\n            length = props.length;\n\n        while (++index < length) {\n          var key = props[index];\n          result[key] = object[key];\n        }\n      } else {\n        callback = lodash.createCallback(callback, thisArg, 3);\n        forIn(object, function(value, key, object) {\n          if (!callback(value, key, object)) {\n            result[key] = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Creates a two dimensional array of an object's key-value pairs,\n     * i.e. `[[key1, value1], [key2, value2]]`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns new array of key-value pairs.\n     * @example\n     *\n     * _.pairs({ 'barney': 36, 'fred': 40 });\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\n     */\n    function pairs(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        var key = props[index];\n        result[index] = [key, object[key]];\n      }\n      return result;\n    }\n\n    /**\n     * Creates a shallow clone of `object` composed of the specified properties.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If a callback is provided it will be executed for each\n     * property of `object` picking the properties the callback returns truey\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The source object.\n     * @param {Function|...string|string[]} [callback] The function called per\n     *  iteration or property names to pick, specified as individual property\n     *  names or arrays of property names.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns an object composed of the picked properties.\n     * @example\n     *\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\n     * // => { 'name': 'fred' }\n     *\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\n     *   return key.charAt(0) != '_';\n     * });\n     * // => { 'name': 'fred' }\n     */\n    function pick(object, callback, thisArg) {\n      var result = {};\n      if (typeof callback != 'function') {\n        var index = -1,\n            props = baseFlatten(arguments, true, false, 1),\n            length = isObject(object) ? props.length : 0;\n\n        while (++index < length) {\n          var key = props[index];\n          if (key in object) {\n            result[key] = object[key];\n          }\n        }\n      } else {\n        callback = lodash.createCallback(callback, thisArg, 3);\n        forIn(object, function(value, key, object) {\n          if (callback(value, key, object)) {\n            result[key] = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * An alternative to `_.reduce` this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable properties through a callback, with each callback execution\n     * potentially mutating the `accumulator` object. The callback is bound to\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\n     * Callbacks may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Array|Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\n     *   num *= num;\n     *   if (num % 2) {\n     *     return result.push(num) < 3;\n     *   }\n     * });\n     * // => [1, 9, 25]\n     *\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n     *   result[key] = num * 3;\n     * });\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     */\n    function transform(object, callback, accumulator, thisArg) {\n      var isArr = isArray(object);\n      if (accumulator == null) {\n        if (isArr) {\n          accumulator = [];\n        } else {\n          var ctor = object && object.constructor,\n              proto = ctor && ctor.prototype;\n\n          accumulator = baseCreate(proto);\n        }\n      }\n      if (callback) {\n        callback = lodash.createCallback(callback, thisArg, 4);\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\n          return callback(accumulator, value, index, object);\n        });\n      }\n      return accumulator;\n    }\n\n    /**\n     * Creates an array composed of the own enumerable property values of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property values.\n     * @example\n     *\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\n     */\n    function values(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = object[props[index]];\n      }\n      return result;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements from the specified indexes, or keys, of the\n     * `collection`. Indexes may be specified as individual arguments or as arrays\n     * of indexes.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\n     *   to retrieve, specified as individual indexes or arrays of indexes.\n     * @returns {Array} Returns a new array of elements corresponding to the\n     *  provided indexes.\n     * @example\n     *\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\n     * // => ['a', 'c', 'e']\n     *\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\n     * // => ['fred', 'pebbles']\n     */\n    function at(collection) {\n      var args = arguments,\n          index = -1,\n          props = baseFlatten(args, true, false, 1),\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\n          result = Array(length);\n\n      while(++index < length) {\n        result[index] = collection[props[index]];\n      }\n      return result;\n    }\n\n    /**\n     * Checks if a given value is present in a collection using strict equality\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\n     * offset from the end of the collection.\n     *\n     * @static\n     * @memberOf _\n     * @alias include\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {*} target The value to check for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\n     * @example\n     *\n     * _.contains([1, 2, 3], 1);\n     * // => true\n     *\n     * _.contains([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\n     * // => true\n     *\n     * _.contains('pebbles', 'eb');\n     * // => true\n     */\n    function contains(collection, target, fromIndex) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = collection ? collection.length : 0,\n          result = false;\n\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\n      if (isArray(collection)) {\n        result = indexOf(collection, target, fromIndex) > -1;\n      } else if (typeof length == 'number') {\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\n      } else {\n        forOwn(collection, function(value) {\n          if (++index >= fromIndex) {\n            return !(result = value === target);\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through the callback. The corresponding value\n     * of each key is the number of times the key was returned by the callback.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\n    });\n\n    /**\n     * Checks if the given callback returns truey value for **all** elements of\n     * a collection. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias all\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes']);\n     * // => false\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.every(characters, 'age');\n     * // => true\n     *\n     * // using \"_.where\" callback shorthand\n     * _.every(characters, { 'age': 36 });\n     * // => false\n     */\n    function every(collection, callback, thisArg) {\n      var result = true;\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if (!(result = !!callback(collection[index], index, collection))) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          return (result = !!callback(value, index, collection));\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, returning an array of all elements\n     * the callback returns truey for. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias select\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of elements that passed the callback check.\n     * @example\n     *\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n     * // => [2, 4, 6]\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.filter(characters, 'blocked');\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.filter(characters, { 'age': 36 });\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n     */\n    function filter(collection, callback, thisArg) {\n      var result = [];\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          var value = collection[index];\n          if (callback(value, index, collection)) {\n            result.push(value);\n          }\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          if (callback(value, index, collection)) {\n            result.push(value);\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, returning the first element that\n     * the callback returns truey for. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias detect, findWhere\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the found element, else `undefined`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\n     * ];\n     *\n     * _.find(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\n     *\n     * // using \"_.where\" callback shorthand\n     * _.find(characters, { 'age': 1 });\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.find(characters, 'blocked');\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\n     */\n    function find(collection, callback, thisArg) {\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          var value = collection[index];\n          if (callback(value, index, collection)) {\n            return value;\n          }\n        }\n      } else {\n        var result;\n        forOwn(collection, function(value, index, collection) {\n          if (callback(value, index, collection)) {\n            result = value;\n            return false;\n          }\n        });\n        return result;\n      }\n    }\n\n    /**\n     * This method is like `_.find` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the found element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(num) {\n     *   return num % 2 == 1;\n     * });\n     * // => 3\n     */\n    function findLast(collection, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forEachRight(collection, function(value, index, collection) {\n        if (callback(value, index, collection)) {\n          result = value;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, executing the callback for each\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection). Callbacks may exit iteration early by\n     * explicitly returning `false`.\n     *\n     * Note: As with other \"Collections\" methods, objects with a `length` property\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n     * may be used for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @alias each\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\n     * // => logs each number and returns '1,2,3'\n     *\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\n     */\n    function forEach(collection, callback, thisArg) {\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if (callback(collection[index], index, collection) === false) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, callback);\n      }\n      return collection;\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias eachRight\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\n     * // => logs each number from right to left and returns '3,2,1'\n     */\n    function forEachRight(collection, callback, thisArg) {\n      var length = collection ? collection.length : 0;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        while (length--) {\n          if (callback(collection[length], length, collection) === false) {\n            break;\n          }\n        }\n      } else {\n        var props = keys(collection);\n        length = props.length;\n        forOwn(collection, function(value, key, collection) {\n          key = props ? props[--length] : --length;\n          return callback(collection[key], key, collection);\n        });\n      }\n      return collection;\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of a collection through the callback. The corresponding value\n     * of each key is an array of the elements responsible for generating the key.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of the collection through the given callback. The corresponding\n     * value of each key is the last element responsible for generating the key.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var keys = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.indexBy(keys, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     */\n    var indexBy = createAggregator(function(result, value, key) {\n      result[key] = value;\n    });\n\n    /**\n     * Invokes the method named by `methodName` on each element in the `collection`\n     * returning an array of the results of each invoked method. Additional arguments\n     * will be provided to each invoked method. If `methodName` is a function it\n     * will be invoked for, and `this` bound to, each element in the `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|string} methodName The name of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [arg] Arguments to invoke the method with.\n     * @returns {Array} Returns a new array of the results of each invoked method.\n     * @example\n     *\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invoke([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    function invoke(collection, methodName) {\n      var args = slice(arguments, 2),\n          index = -1,\n          isFunc = typeof methodName == 'function',\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      forEach(collection, function(value) {\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an array of values by running each element in the collection\n     * through the callback. The callback is bound to `thisArg` and invoked with\n     * three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias collect\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\n     * @example\n     *\n     * _.map([1, 2, 3], function(num) { return num * 3; });\n     * // => [3, 6, 9]\n     *\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.map(characters, 'name');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, callback, thisArg) {\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        var result = Array(length);\n        while (++index < length) {\n          result[index] = callback(collection[index], index, collection);\n        }\n      } else {\n        result = [];\n        forOwn(collection, function(value, key, collection) {\n          result[++index] = callback(value, key, collection);\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the maximum value of a collection. If the collection is empty or\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\n     * for each value in the collection to generate the criterion by which the value\n     * is ranked. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.max(characters, function(chr) { return chr.age; });\n     * // => { 'name': 'fred', 'age': 40 };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.max(characters, 'age');\n     * // => { 'name': 'fred', 'age': 40 };\n     */\n    function max(collection, callback, thisArg) {\n      var computed = -Infinity,\n          result = computed;\n\n      // allows working with functions like `_.map` without using\n      // their `index` argument as a callback\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n        callback = null;\n      }\n      if (callback == null && isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          var value = collection[index];\n          if (value > result) {\n            result = value;\n          }\n        }\n      } else {\n        callback = (callback == null && isString(collection))\n          ? charAtCallback\n          : lodash.createCallback(callback, thisArg, 3);\n\n        forEach(collection, function(value, index, collection) {\n          var current = callback(value, index, collection);\n          if (current > computed) {\n            computed = current;\n            result = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the minimum value of a collection. If the collection is empty or\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\n     * for each value in the collection to generate the criterion by which the value\n     * is ranked. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.min(characters, function(chr) { return chr.age; });\n     * // => { 'name': 'barney', 'age': 36 };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.min(characters, 'age');\n     * // => { 'name': 'barney', 'age': 36 };\n     */\n    function min(collection, callback, thisArg) {\n      var computed = Infinity,\n          result = computed;\n\n      // allows working with functions like `_.map` without using\n      // their `index` argument as a callback\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n        callback = null;\n      }\n      if (callback == null && isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          var value = collection[index];\n          if (value < result) {\n            result = value;\n          }\n        }\n      } else {\n        callback = (callback == null && isString(collection))\n          ? charAtCallback\n          : lodash.createCallback(callback, thisArg, 3);\n\n        forEach(collection, function(value, index, collection) {\n          var current = callback(value, index, collection);\n          if (current < computed) {\n            computed = current;\n            result = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the value of a specified property from all elements in the collection.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {string} property The name of the property to pluck.\n     * @returns {Array} Returns a new array of property values.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.pluck(characters, 'name');\n     * // => ['barney', 'fred']\n     */\n    var pluck = map;\n\n    /**\n     * Reduces a collection to a value which is the accumulated result of running\n     * each element in the collection through the callback, where each successive\n     * callback execution consumes the return value of the previous execution. If\n     * `accumulator` is not provided the first element of the collection will be\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @alias foldl, inject\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] Initial value of the accumulator.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\n     *   return sum + num;\n     * });\n     * // => 6\n     *\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n     *   result[key] = num * 3;\n     *   return result;\n     * }, {});\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     */\n    function reduce(collection, callback, accumulator, thisArg) {\n      if (!collection) return accumulator;\n      var noaccum = arguments.length < 3;\n      callback = lodash.createCallback(callback, thisArg, 4);\n\n      var index = -1,\n          length = collection.length;\n\n      if (typeof length == 'number') {\n        if (noaccum) {\n          accumulator = collection[++index];\n        }\n        while (++index < length) {\n          accumulator = callback(accumulator, collection[index], index, collection);\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          accumulator = noaccum\n            ? (noaccum = false, value)\n            : callback(accumulator, value, index, collection)\n        });\n      }\n      return accumulator;\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias foldr\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] Initial value of the accumulator.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var list = [[0, 1], [2, 3], [4, 5]];\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, callback, accumulator, thisArg) {\n      var noaccum = arguments.length < 3;\n      callback = lodash.createCallback(callback, thisArg, 4);\n      forEachRight(collection, function(value, index, collection) {\n        accumulator = noaccum\n          ? (noaccum = false, value)\n          : callback(accumulator, value, index, collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The opposite of `_.filter` this method returns the elements of a\n     * collection that the callback does **not** return truey for.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of elements that failed the callback check.\n     * @example\n     *\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n     * // => [1, 3, 5]\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.reject(characters, 'blocked');\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.reject(characters, { 'age': 36 });\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n     */\n    function reject(collection, callback, thisArg) {\n      callback = lodash.createCallback(callback, thisArg, 3);\n      return filter(collection, function(value, index, collection) {\n        return !callback(value, index, collection);\n      });\n    }\n\n    /**\n     * Retrieves a random element or `n` random elements from a collection.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to sample.\n     * @param {number} [n] The number of elements to sample.\n     * @param- {Object} [guard] Allows working with functions like `_.map`\n     *  without using their `index` arguments as `n`.\n     * @returns {Array} Returns the random sample(s) of `collection`.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     *\n     * _.sample([1, 2, 3, 4], 2);\n     * // => [3, 1]\n     */\n    function sample(collection, n, guard) {\n      if (collection && typeof collection.length != 'number') {\n        collection = values(collection);\n      }\n      if (n == null || guard) {\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\n      }\n      var result = shuffle(collection);\n      result.length = nativeMin(nativeMax(0, n), result.length);\n      return result;\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to shuffle.\n     * @returns {Array} Returns a new shuffled collection.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\n     * // => [4, 1, 6, 3, 5, 2]\n     */\n    function shuffle(collection) {\n      var index = -1,\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      forEach(collection, function(value) {\n        var rand = baseRandom(0, ++index);\n        result[index] = result[rand];\n        result[rand] = value;\n      });\n      return result;\n    }\n\n    /**\n     * Gets the size of the `collection` by returning `collection.length` for arrays\n     * and array-like objects or the number of own enumerable properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\n     * @example\n     *\n     * _.size([1, 2]);\n     * // => 2\n     *\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => 3\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      var length = collection ? collection.length : 0;\n      return typeof length == 'number' ? length : keys(collection).length;\n    }\n\n    /**\n     * Checks if the callback returns a truey value for **any** element of a\n     * collection. The function returns as soon as it finds a passing value and\n     * does not iterate over the entire collection. The callback is bound to\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias any\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if any element passed the callback check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.some(characters, 'blocked');\n     * // => true\n     *\n     * // using \"_.where\" callback shorthand\n     * _.some(characters, { 'age': 1 });\n     * // => false\n     */\n    function some(collection, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if ((result = callback(collection[index], index, collection))) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          return !(result = callback(value, index, collection));\n        });\n      }\n      return !!result;\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection through the callback. This method\n     * performs a stable sort, that is, it will preserve the original sort order\n     * of equal elements. The callback is bound to `thisArg` and invoked with\n     * three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an array of property names is provided for `callback` the collection\n     * will be sorted by each property value.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Array|Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of sorted elements.\n     * @example\n     *\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\n     * // => [3, 1, 2]\n     *\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\n     * // => [3, 1, 2]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36 },\n     *   { 'name': 'fred',    'age': 40 },\n     *   { 'name': 'barney',  'age': 26 },\n     *   { 'name': 'fred',    'age': 30 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.map(_.sortBy(characters, 'age'), _.values);\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\n     *\n     * // sorting by multiple properties\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\n     */\n    function sortBy(collection, callback, thisArg) {\n      var index = -1,\n          isArr = isArray(callback),\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      if (!isArr) {\n        callback = lodash.createCallback(callback, thisArg, 3);\n      }\n      forEach(collection, function(value, key, collection) {\n        var object = result[++index] = getObject();\n        if (isArr) {\n          object.criteria = map(callback, function(key) { return value[key]; });\n        } else {\n          (object.criteria = getArray())[0] = callback(value, key, collection);\n        }\n        object.index = index;\n        object.value = value;\n      });\n\n      length = result.length;\n      result.sort(compareAscending);\n      while (length--) {\n        var object = result[length];\n        result[length] = object.value;\n        if (!isArr) {\n          releaseArray(object.criteria);\n        }\n        releaseObject(object);\n      }\n      return result;\n    }\n\n    /**\n     * Converts the `collection` to an array.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to convert.\n     * @returns {Array} Returns the new converted array.\n     * @example\n     *\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\n     * // => [2, 3, 4]\n     */\n    function toArray(collection) {\n      if (collection && typeof collection.length == 'number') {\n        return slice(collection);\n      }\n      return values(collection);\n    }\n\n    /**\n     * Performs a deep comparison of each element in a `collection` to the given\n     * `properties` object, returning an array of all elements that have equivalent\n     * property values.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Object} props The object of property values to filter by.\n     * @returns {Array} Returns a new array of elements that have the given properties.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * _.where(characters, { 'age': 36 });\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\n     *\n     * _.where(characters, { 'pets': ['dino'] });\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\n     */\n    var where = filter;\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array excluding all values of the provided arrays using strict\n     * equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to process.\n     * @param {...Array} [values] The arrays of values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\n     * // => [1, 3, 4]\n     */\n    function difference(array) {\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element that passes the callback check, instead of the element itself.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\n     * ];\n     *\n     * _.findIndex(characters, function(chr) {\n     *   return chr.age < 20;\n     * });\n     * // => 2\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findIndex(characters, { 'age': 36 });\n     * // => 0\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findIndex(characters, 'blocked');\n     * // => 1\n     */\n    function findIndex(array, callback, thisArg) {\n      var index = -1,\n          length = array ? array.length : 0;\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (++index < length) {\n        if (callback(array[index], index, array)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\n     * ];\n     *\n     * _.findLastIndex(characters, function(chr) {\n     *   return chr.age > 30;\n     * });\n     * // => 1\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findLastIndex(characters, { 'age': 36 });\n     * // => 0\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findLastIndex(characters, 'blocked');\n     * // => 2\n     */\n    function findLastIndex(array, callback, thisArg) {\n      var length = array ? array.length : 0;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (length--) {\n        if (callback(array[length], length, array)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Gets the first element or first `n` elements of an array. If a callback\n     * is provided elements at the beginning of the array are returned as long\n     * as the callback returns truey. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias head, take\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback] The function called\n     *  per element or the number of elements to return. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the first element(s) of `array`.\n     * @example\n     *\n     * _.first([1, 2, 3]);\n     * // => 1\n     *\n     * _.first([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.first([1, 2, 3], function(num) {\n     *   return num < 3;\n     * });\n     * // => [1, 2]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.first(characters, 'blocked');\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\n     * // => ['barney', 'fred']\n     */\n    function first(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = -1;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (++index < length && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = callback;\n        if (n == null || thisArg) {\n          return array ? array[0] : undefined;\n        }\n      }\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\n    }\n\n    /**\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\n     * is truey, the array will only be flattened a single level. If a callback\n     * is provided each element of the array is passed through the callback before\n     * flattening. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2], [3, [[4]]]]);\n     * // => [1, 2, 3, 4];\n     *\n     * _.flatten([1, [2], [3, [[4]]]], true);\n     * // => [1, 2, 3, [[4]]];\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.flatten(characters, 'pets');\n     * // => ['hoppy', 'baby puss', 'dino']\n     */\n    function flatten(array, isShallow, callback, thisArg) {\n      // juggle arguments\n      if (typeof isShallow != 'boolean' && isShallow != null) {\n        thisArg = callback;\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\n        isShallow = false;\n      }\n      if (callback != null) {\n        array = map(array, callback, thisArg);\n      }\n      return baseFlatten(array, isShallow);\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found using\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\n     * providing `true` for `fromIndex` will run a faster binary search.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n     *  to perform a binary search on a sorted array.\n     * @returns {number} Returns the index of the matched value or `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\n     * // => 1\n     *\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\n     * // => 4\n     *\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\n     * // => 2\n     */\n    function indexOf(array, value, fromIndex) {\n      if (typeof fromIndex == 'number') {\n        var length = array ? array.length : 0;\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\n      } else if (fromIndex) {\n        var index = sortedIndex(array, value);\n        return array[index] === value ? index : -1;\n      }\n      return baseIndexOf(array, value, fromIndex);\n    }\n\n    /**\n     * Gets all but the last element or last `n` elements of an array. If a\n     * callback is provided elements at the end of the array are excluded from\n     * the result as long as the callback returns truey. The callback is bound\n     * to `thisArg` and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback=1] The function called\n     *  per element or the number of elements to exclude. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.initial([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.initial([1, 2, 3], function(num) {\n     *   return num > 1;\n     * });\n     * // => [1]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.initial(characters, 'blocked');\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\n     * // => ['barney', 'fred']\n     */\n    function initial(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = length;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (index-- && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = (callback == null || thisArg) ? 1 : callback || n;\n      }\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\n    }\n\n    /**\n     * Creates an array of unique values present in all provided arrays using\n     * strict equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of shared values.\n     * @example\n     *\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n     * // => [1, 2]\n     */\n    function intersection() {\n      var args = [],\n          argsIndex = -1,\n          argsLength = arguments.length,\n          caches = getArray(),\n          indexOf = getIndexOf(),\n          trustIndexOf = indexOf === baseIndexOf,\n          seen = getArray();\n\n      while (++argsIndex < argsLength) {\n        var value = arguments[argsIndex];\n        if (isArray(value) || isArguments(value)) {\n          args.push(value);\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\n            createCache(argsIndex ? args[argsIndex] : seen));\n        }\n      }\n      var array = args[0],\n          index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      outer:\n      while (++index < length) {\n        var cache = caches[0];\n        value = array[index];\n\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\n          argsIndex = argsLength;\n          (cache || seen).push(value);\n          while (--argsIndex) {\n            cache = caches[argsIndex];\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n      }\n      while (argsLength--) {\n        cache = caches[argsLength];\n        if (cache) {\n          releaseObject(cache);\n        }\n      }\n      releaseArray(caches);\n      releaseArray(seen);\n      return result;\n    }\n\n    /**\n     * Gets the last element or last `n` elements of an array. If a callback is\n     * provided elements at the end of the array are returned as long as the\n     * callback returns truey. The callback is bound to `thisArg` and invoked\n     * with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback] The function called\n     *  per element or the number of elements to return. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the last element(s) of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     *\n     * _.last([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.last([1, 2, 3], function(num) {\n     *   return num > 1;\n     * });\n     * // => [2, 3]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.pluck(_.last(characters, 'blocked'), 'name');\n     * // => ['fred', 'pebbles']\n     *\n     * // using \"_.where\" callback shorthand\n     * _.last(characters, { 'employer': 'na' });\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n     */\n    function last(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = length;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (index-- && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = callback;\n        if (n == null || thisArg) {\n          return array ? array[length - 1] : undefined;\n        }\n      }\n      return slice(array, nativeMax(0, length - n));\n    }\n\n    /**\n     * Gets the index at which the last occurrence of `value` is found using strict\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\n     * as the offset from the end of the collection.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value or `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\n     * // => 4\n     *\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var index = array ? array.length : 0;\n      if (typeof fromIndex == 'number') {\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\n      }\n      while (index--) {\n        if (array[index] === value) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Removes all provided values from the given array using strict equality for\n     * comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to modify.\n     * @param {...*} [value] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3, 1, 2, 3];\n     * _.pull(array, 2, 3);\n     * console.log(array);\n     * // => [1, 1]\n     */\n    function pull(array) {\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = args.length,\n          length = array ? array.length : 0;\n\n      while (++argsIndex < argsLength) {\n        var index = -1,\n            value = args[argsIndex];\n        while (++index < length) {\n          if (array[index] === value) {\n            splice.call(array, index--, 1);\n            length--;\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to but not including `end`. If `start` is less than `stop` a\n     * zero-length range is created unless a negative `step` is specified.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns a new range array.\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    function range(start, end, step) {\n      start = +start || 0;\n      step = typeof step == 'number' ? step : (+step || 1);\n\n      if (end == null) {\n        end = start;\n        start = 0;\n      }\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\n      var index = -1,\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * Removes all elements from an array that the callback returns truey for\n     * and returns an array of removed elements. The callback is bound to `thisArg`\n     * and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to modify.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4, 5, 6];\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\n     *\n     * console.log(array);\n     * // => [1, 3, 5]\n     *\n     * console.log(evens);\n     * // => [2, 4, 6]\n     */\n    function remove(array, callback, thisArg) {\n      var index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (callback(value, index, array)) {\n          result.push(value);\n          splice.call(array, index--, 1);\n          length--;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The opposite of `_.initial` this method gets all but the first element or\n     * first `n` elements of an array. If a callback function is provided elements\n     * at the beginning of the array are excluded from the result as long as the\n     * callback returns truey. The callback is bound to `thisArg` and invoked\n     * with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias drop, tail\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback=1] The function called\n     *  per element or the number of elements to exclude. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a slice of `array`.\n     * @example\n     *\n     * _.rest([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.rest([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.rest([1, 2, 3], function(num) {\n     *   return num < 3;\n     * });\n     * // => [3]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\n     * // => ['fred', 'pebbles']\n     *\n     * // using \"_.where\" callback shorthand\n     * _.rest(characters, { 'employer': 'slate' });\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n     */\n    function rest(array, callback, thisArg) {\n      if (typeof callback != 'number' && callback != null) {\n        var n = 0,\n            index = -1,\n            length = array ? array.length : 0;\n\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (++index < length && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\n      }\n      return slice(array, n);\n    }\n\n    /**\n     * Uses a binary search to determine the smallest index at which a value\n     * should be inserted into a given sorted array in order to maintain the sort\n     * order of the array. If a callback is provided it will be executed for\n     * `value` and each element of `array` to compute their sort ranking. The\n     * callback is bound to `thisArg` and invoked with one argument; (value).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([20, 30, 50], 40);\n     * // => 2\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\n     * // => 2\n     *\n     * var dict = {\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\n     * };\n     *\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n     *   return dict.wordToNumber[word];\n     * });\n     * // => 2\n     *\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n     *   return this.wordToNumber[word];\n     * }, dict);\n     * // => 2\n     */\n    function sortedIndex(array, value, callback, thisArg) {\n      var low = 0,\n          high = array ? array.length : low;\n\n      // explicitly reference `identity` for better inlining in Firefox\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\n      value = callback(value);\n\n      while (low < high) {\n        var mid = (low + high) >>> 1;\n        (callback(array[mid]) < value)\n          ? low = mid + 1\n          : high = mid;\n      }\n      return low;\n    }\n\n    /**\n     * Creates an array of unique values, in order, of the provided arrays using\n     * strict equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of combined values.\n     * @example\n     *\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n     * // => [1, 2, 3, 5, 4]\n     */\n    function union() {\n      return baseUniq(baseFlatten(arguments, true, true));\n    }\n\n    /**\n     * Creates a duplicate-value-free version of an array using strict equality\n     * for comparisons, i.e. `===`. If the array is sorted, providing\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\n     * each element of `array` is passed through the callback before uniqueness\n     * is computed. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias unique\n     * @category Arrays\n     * @param {Array} array The array to process.\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a duplicate-value-free array.\n     * @example\n     *\n     * _.uniq([1, 2, 1, 3, 1]);\n     * // => [1, 2, 3]\n     *\n     * _.uniq([1, 1, 2, 2, 3], true);\n     * // => [1, 2, 3]\n     *\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\n     * // => ['A', 'b', 'C']\n     *\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\n     * // => [1, 2.5, 3]\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniq(array, isSorted, callback, thisArg) {\n      // juggle arguments\n      if (typeof isSorted != 'boolean' && isSorted != null) {\n        thisArg = callback;\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\n        isSorted = false;\n      }\n      if (callback != null) {\n        callback = lodash.createCallback(callback, thisArg, 3);\n      }\n      return baseUniq(array, isSorted, callback);\n    }\n\n    /**\n     * Creates an array excluding all provided values using strict equality for\n     * comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to filter.\n     * @param {...*} [value] The values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\n     * // => [2, 3, 4]\n     */\n    function without(array) {\n      return baseDifference(array, slice(arguments, 1));\n    }\n\n    /**\n     * Creates an array that is the symmetric difference of the provided arrays.\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of values.\n     * @example\n     *\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\n     * // => [3, 5, 4]\n     *\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\n     * // => [1, 4, 5]\n     */\n    function xor() {\n      var index = -1,\n          length = arguments.length;\n\n      while (++index < length) {\n        var array = arguments[index];\n        if (isArray(array) || isArguments(array)) {\n          var result = result\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\n            : array;\n        }\n      }\n      return result || [];\n    }\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the first\n     * elements of the given arrays, the second of which contains the second\n     * elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @alias unzip\n     * @category Arrays\n     * @param {...Array} [array] Arrays to process.\n     * @returns {Array} Returns a new array of grouped elements.\n     * @example\n     *\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\n     * // => [['fred', 30, true], ['barney', 40, false]]\n     */\n    function zip() {\n      var array = arguments.length > 1 ? arguments : arguments[0],\n          index = -1,\n          length = array ? max(pluck(array, 'length')) : 0,\n          result = Array(length < 0 ? 0 : length);\n\n      while (++index < length) {\n        result[index] = pluck(array, index);\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed from arrays of `keys` and `values`. Provide\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\n     * or two arrays, one of `keys` and one of corresponding `values`.\n     *\n     * @static\n     * @memberOf _\n     * @alias object\n     * @category Arrays\n     * @param {Array} keys The array of keys.\n     * @param {Array} [values=[]] The array of values.\n     * @returns {Object} Returns an object composed of the given keys and\n     *  corresponding values.\n     * @example\n     *\n     * _.zipObject(['fred', 'barney'], [30, 40]);\n     * // => { 'fred': 30, 'barney': 40 }\n     */\n    function zipObject(keys, values) {\n      var index = -1,\n          length = keys ? keys.length : 0,\n          result = {};\n\n      if (!values && length && !isArray(keys[0])) {\n        values = [];\n      }\n      while (++index < length) {\n        var key = keys[index];\n        if (values) {\n          result[key] = values[index];\n        } else if (key) {\n          result[key[0]] = key[1];\n        }\n      }\n      return result;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a function that executes `func`, with  the `this` binding and\n     * arguments of the created function, only after being called `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {number} n The number of times the function must be called before\n     *  `func` is executed.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('Done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => logs 'Done saving!', after all saves have completed\n     */\n    function after(n, func) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that, when called, invokes `func` with the `this`\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\n     * provided to the bound function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to bind.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var func = function(greeting) {\n     *   return greeting + ' ' + this.name;\n     * };\n     *\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\n     * func();\n     * // => 'hi fred'\n     */\n    function bind(func, thisArg) {\n      return arguments.length > 2\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\n        : createWrapper(func, 1, null, null, thisArg);\n    }\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method. Method names may be specified as individual arguments or as arrays\n     * of method names. If no method names are provided all the function properties\n     * of `object` will be bound.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...string} [methodName] The object method names to\n     *  bind, specified as individual method names or arrays of method names.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'onClick': function() { console.log('clicked ' + this.label); }\n     * };\n     *\n     * _.bindAll(view);\n     * jQuery('#docs').on('click', view.onClick);\n     * // => logs 'clicked docs', when the button is clicked\n     */\n    function bindAll(object) {\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\n          index = -1,\n          length = funcs.length;\n\n      while (++index < length) {\n        var key = funcs[index];\n        object[key] = createWrapper(object[key], 1, null, null, object);\n      }\n      return object;\n    }\n\n    /**\n     * Creates a function that, when called, invokes the method at `object[key]`\n     * and prepends any additional `bindKey` arguments to those provided to the bound\n     * function. This method differs from `_.bind` by allowing bound functions to\n     * reference methods that will be redefined or don't yet exist.\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Object} object The object the method belongs to.\n     * @param {string} key The key of the method.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'name': 'fred',\n     *   'greet': function(greeting) {\n     *     return greeting + ' ' + this.name;\n     *   }\n     * };\n     *\n     * var func = _.bindKey(object, 'greet', 'hi');\n     * func();\n     * // => 'hi fred'\n     *\n     * object.greet = function(greeting) {\n     *   return greeting + 'ya ' + this.name + '!';\n     * };\n     *\n     * func();\n     * // => 'hiya fred!'\n     */\n    function bindKey(object, key) {\n      return arguments.length > 2\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\n        : createWrapper(key, 3, null, null, object);\n    }\n\n    /**\n     * Creates a function that is the composition of the provided functions,\n     * where each function consumes the return value of the function that follows.\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\n     * Each function is executed with the `this` binding of the composed function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {...Function} [func] Functions to compose.\n     * @returns {Function} Returns the new composed function.\n     * @example\n     *\n     * var realNameMap = {\n     *   'pebbles': 'penelope'\n     * };\n     *\n     * var format = function(name) {\n     *   name = realNameMap[name.toLowerCase()] || name;\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\n     * };\n     *\n     * var greet = function(formatted) {\n     *   return 'Hiya ' + formatted + '!';\n     * };\n     *\n     * var welcome = _.compose(greet, format);\n     * welcome('pebbles');\n     * // => 'Hiya Penelope!'\n     */\n    function compose() {\n      var funcs = arguments,\n          length = funcs.length;\n\n      while (length--) {\n        if (!isFunction(funcs[length])) {\n          throw new TypeError;\n        }\n      }\n      return function() {\n        var args = arguments,\n            length = funcs.length;\n\n        while (length--) {\n          args = [funcs[length].apply(this, args)];\n        }\n        return args[0];\n      };\n    }\n\n    /**\n     * Creates a function which accepts one or more arguments of `func` that when\n     * invoked either executes `func` returning its result, if all `func` arguments\n     * have been provided, or returns a function that accepts one or more of the\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\n     * if `func.length` is not sufficient.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var curried = _.curry(function(a, b, c) {\n     *   console.log(a + b + c);\n     * });\n     *\n     * curried(1)(2)(3);\n     * // => 6\n     *\n     * curried(1, 2)(3);\n     * // => 6\n     *\n     * curried(1, 2, 3);\n     * // => 6\n     */\n    function curry(func, arity) {\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\n      return createWrapper(func, 4, null, null, null, arity);\n    }\n\n    /**\n     * Creates a function that will delay the execution of `func` until after\n     * `wait` milliseconds have elapsed since the last time it was invoked.\n     * Provide an options object to indicate that `func` should be invoked on\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\n     * to the debounced function will return the result of the last `func` call.\n     *\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\n     * on the trailing edge of the timeout only if the the debounced function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to debounce.\n     * @param {number} wait The number of milliseconds to delay.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // avoid costly calculations while the window size is in flux\n     * var lazyLayout = _.debounce(calculateLayout, 150);\n     * jQuery(window).on('resize', lazyLayout);\n     *\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * });\n     *\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\n     * var source = new EventSource('/stream');\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\n     *   'maxWait': 1000\n     * }, false);\n     */\n    function debounce(func, wait, options) {\n      var args,\n          maxTimeoutId,\n          result,\n          stamp,\n          thisArg,\n          timeoutId,\n          trailingCall,\n          lastCalled = 0,\n          maxWait = false,\n          trailing = true;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      wait = nativeMax(0, wait) || 0;\n      if (options === true) {\n        var leading = true;\n        trailing = false;\n      } else if (isObject(options)) {\n        leading = options.leading;\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\n        trailing = 'trailing' in options ? options.trailing : trailing;\n      }\n      var delayed = function() {\n        var remaining = wait - (now() - stamp);\n        if (remaining <= 0) {\n          if (maxTimeoutId) {\n            clearTimeout(maxTimeoutId);\n          }\n          var isCalled = trailingCall;\n          maxTimeoutId = timeoutId = trailingCall = undefined;\n          if (isCalled) {\n            lastCalled = now();\n            result = func.apply(thisArg, args);\n            if (!timeoutId && !maxTimeoutId) {\n              args = thisArg = null;\n            }\n          }\n        } else {\n          timeoutId = setTimeout(delayed, remaining);\n        }\n      };\n\n      var maxDelayed = function() {\n        if (timeoutId) {\n          clearTimeout(timeoutId);\n        }\n        maxTimeoutId = timeoutId = trailingCall = undefined;\n        if (trailing || (maxWait !== wait)) {\n          lastCalled = now();\n          result = func.apply(thisArg, args);\n          if (!timeoutId && !maxTimeoutId) {\n            args = thisArg = null;\n          }\n        }\n      };\n\n      return function() {\n        args = arguments;\n        stamp = now();\n        thisArg = this;\n        trailingCall = trailing && (timeoutId || !leading);\n\n        if (maxWait === false) {\n          var leadingCall = leading && !timeoutId;\n        } else {\n          if (!maxTimeoutId && !leading) {\n            lastCalled = stamp;\n          }\n          var remaining = maxWait - (stamp - lastCalled),\n              isCalled = remaining <= 0;\n\n          if (isCalled) {\n            if (maxTimeoutId) {\n              maxTimeoutId = clearTimeout(maxTimeoutId);\n            }\n            lastCalled = stamp;\n            result = func.apply(thisArg, args);\n          }\n          else if (!maxTimeoutId) {\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\n          }\n        }\n        if (isCalled && timeoutId) {\n          timeoutId = clearTimeout(timeoutId);\n        }\n        else if (!timeoutId && wait !== maxWait) {\n          timeoutId = setTimeout(delayed, wait);\n        }\n        if (leadingCall) {\n          isCalled = true;\n          result = func.apply(thisArg, args);\n        }\n        if (isCalled && !timeoutId && !maxTimeoutId) {\n          args = thisArg = null;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Defers executing the `func` function until the current call stack has cleared.\n     * Additional arguments will be provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to defer.\n     * @param {...*} [arg] Arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) { console.log(text); }, 'deferred');\n     * // logs 'deferred' after one or more milliseconds\n     */\n    function defer(func) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var args = slice(arguments, 1);\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\n    }\n\n    /**\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\n     * will be provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay execution.\n     * @param {...*} [arg] Arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\n     * // => logs 'later' after one second\n     */\n    function delay(func, wait) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var args = slice(arguments, 2);\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided it will be used to determine the cache key for storing the result\n     * based on the arguments provided to the memoized function. By default, the\n     * first argument provided to the memoized function is used as the cache key.\n     * The `func` is executed with the `this` binding of the memoized function.\n     * The result cache is exposed as the `cache` property on the memoized function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] A function used to resolve the cache key.\n     * @returns {Function} Returns the new memoizing function.\n     * @example\n     *\n     * var fibonacci = _.memoize(function(n) {\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\n     * });\n     *\n     * fibonacci(9)\n     * // => 34\n     *\n     * var data = {\n     *   'fred': { 'name': 'fred', 'age': 40 },\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // modifying the result cache\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\n     * get('pebbles');\n     * // => { 'name': 'pebbles', 'age': 1 }\n     *\n     * get.cache.pebbles.name = 'penelope';\n     * get('pebbles');\n     * // => { 'name': 'penelope', 'age': 1 }\n     */\n    function memoize(func, resolver) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var memoized = function() {\n        var cache = memoized.cache,\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\n\n        return hasOwnProperty.call(cache, key)\n          ? cache[key]\n          : (cache[key] = func.apply(this, arguments));\n      }\n      memoized.cache = {};\n      return memoized;\n    }\n\n    /**\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\n     * the function will return the value of the first call. The `func` is executed\n     * with the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // `initialize` executes `createApplication` once\n     */\n    function once(func) {\n      var ran,\n          result;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      return function() {\n        if (ran) {\n          return result;\n        }\n        ran = true;\n        result = func.apply(this, arguments);\n\n        // clear the `func` variable so the function may be garbage collected\n        func = null;\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that, when called, invokes `func` with any additional\n     * `partial` arguments prepended to those provided to the new function. This\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\n     * var hi = _.partial(greet, 'hi');\n     * hi('fred');\n     * // => 'hi fred'\n     */\n    function partial(func) {\n      return createWrapper(func, 16, slice(arguments, 1));\n    }\n\n    /**\n     * This method is like `_.partial` except that `partial` arguments are\n     * appended to those provided to the new function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\n     *\n     * var options = {\n     *   'variable': 'data',\n     *   'imports': { 'jq': $ }\n     * };\n     *\n     * defaultsDeep(options, _.templateSettings);\n     *\n     * options.variable\n     * // => 'data'\n     *\n     * options.imports\n     * // => { '_': _, 'jq': $ }\n     */\n    function partialRight(func) {\n      return createWrapper(func, 32, null, slice(arguments, 1));\n    }\n\n    /**\n     * Creates a function that, when executed, will only call the `func` function\n     * at most once per every `wait` milliseconds. Provide an options object to\n     * indicate that `func` should be invoked on the leading and/or trailing edge\n     * of the `wait` timeout. Subsequent calls to the throttled function will\n     * return the result of the last `func` call.\n     *\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\n     * on the trailing edge of the timeout only if the the throttled function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to throttle.\n     * @param {number} wait The number of milliseconds to throttle executions to.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // avoid excessively updating the position while scrolling\n     * var throttled = _.throttle(updatePosition, 100);\n     * jQuery(window).on('scroll', throttled);\n     *\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n     *   'trailing': false\n     * }));\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      if (options === false) {\n        leading = false;\n      } else if (isObject(options)) {\n        leading = 'leading' in options ? options.leading : leading;\n        trailing = 'trailing' in options ? options.trailing : trailing;\n      }\n      debounceOptions.leading = leading;\n      debounceOptions.maxWait = wait;\n      debounceOptions.trailing = trailing;\n\n      return debounce(func, wait, debounceOptions);\n    }\n\n    /**\n     * Creates a function that provides `value` to the wrapper function as its\n     * first argument. Additional arguments provided to the function are appended\n     * to those provided to the wrapper function. The wrapper is executed with\n     * the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {*} value The value to wrap.\n     * @param {Function} wrapper The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('Fred, Wilma, & Pebbles');\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return createWrapper(wrapper, 16, [value]);\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * var getter = _.constant(object);\n     * getter() === object;\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\n     * name the created callback will return the property value for a given element.\n     * If `func` is an object the created callback will return `true` for elements\n     * that contain the equivalent object properties, otherwise it will return `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} [func=identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of the created callback.\n     * @param {number} [argCount] The number of arguments the callback accepts.\n     * @returns {Function} Returns a callback function.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // wrap to create custom callback shorthands\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\n     *   return !match ? func(callback, thisArg) : function(object) {\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\n     *   };\n     * });\n     *\n     * _.filter(characters, 'age__gt38');\n     * // => [{ 'name': 'fred', 'age': 40 }]\n     */\n    function createCallback(func, thisArg, argCount) {\n      var type = typeof func;\n      if (func == null || type == 'function') {\n        return baseCreateCallback(func, thisArg, argCount);\n      }\n      // handle \"_.pluck\" style callback shorthands\n      if (type != 'object') {\n        return property(func);\n      }\n      var props = keys(func),\n          key = props[0],\n          a = func[key];\n\n      // handle \"_.where\" style callback shorthands\n      if (props.length == 1 && a === a && !isObject(a)) {\n        // fast path the common case of providing an object with a single\n        // property containing a primitive value\n        return function(object) {\n          var b = object[key];\n          return a === b && (a !== 0 || (1 / a == 1 / b));\n        };\n      }\n      return function(object) {\n        var length = props.length,\n            result = false;\n\n        while (length--) {\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\n            break;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\n     * corresponding HTML entities.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} string The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('Fred, Wilma, & Pebbles');\n     * // => 'Fred, Wilma, &amp; Pebbles'\n     */\n    function escape(string) {\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\n    }\n\n    /**\n     * This method returns the first argument provided to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * _.identity(object) === object;\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Adds function properties of a source object to the destination object.\n     * If `object` is a function methods will be added to its prototype as well.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {Function|Object} [object=lodash] object The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\n     * @example\n     *\n     * function capitalize(string) {\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\n     * }\n     *\n     * _.mixin({ 'capitalize': capitalize });\n     * _.capitalize('fred');\n     * // => 'Fred'\n     *\n     * _('fred').capitalize().value();\n     * // => 'Fred'\n     *\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\n     * _('fred').capitalize();\n     * // => 'Fred'\n     */\n    function mixin(object, source, options) {\n      var chain = true,\n          methodNames = source && functions(source);\n\n      if (!source || (!options && !methodNames.length)) {\n        if (options == null) {\n          options = source;\n        }\n        ctor = lodashWrapper;\n        source = object;\n        object = lodash;\n        methodNames = functions(source);\n      }\n      if (options === false) {\n        chain = false;\n      } else if (isObject(options) && 'chain' in options) {\n        chain = options.chain;\n      }\n      var ctor = object,\n          isFunc = isFunction(ctor);\n\n      forEach(methodNames, function(methodName) {\n        var func = object[methodName] = source[methodName];\n        if (isFunc) {\n          ctor.prototype[methodName] = function() {\n            var chainAll = this.__chain__,\n                value = this.__wrapped__,\n                args = [value];\n\n            push.apply(args, arguments);\n            var result = func.apply(object, args);\n            if (chain || chainAll) {\n              if (value === result && isObject(result)) {\n                return this;\n              }\n              result = new ctor(result);\n              result.__chain__ = chainAll;\n            }\n            return result;\n          };\n        }\n      });\n    }\n\n    /**\n     * Reverts the '_' variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      context._ = oldDash;\n      return this;\n    }\n\n    /**\n     * A no-operation function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * _.noop(object) === undefined;\n     * // => true\n     */\n    function noop() {\n      // no operation performed\n    }\n\n    /**\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\n     * (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @example\n     *\n     * var stamp = _.now();\n     * _.defer(function() { console.log(_.now() - stamp); });\n     * // => logs the number of milliseconds it took for the deferred function to be called\n     */\n    var now = isNative(now = Date.now) && now || function() {\n      return new Date().getTime();\n    };\n\n    /**\n     * Converts the given value into an integer of the specified radix.\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\n     * implementations. See http://es5.github.io/#E.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} value The value to parse.\n     * @param {number} [radix] The radix used to interpret the value to parse.\n     * @returns {number} Returns the new integer value.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     */\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\n    };\n\n    /**\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\n     * given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} key The name of the property to retrieve.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'fred',   'age': 40 },\n     *   { 'name': 'barney', 'age': 36 }\n     * ];\n     *\n     * var getName = _.property('name');\n     *\n     * _.map(characters, getName);\n     * // => ['barney', 'fred']\n     *\n     * _.sortBy(characters, getName);\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\n     */\n    function property(key) {\n      return function(object) {\n        return object[key];\n      };\n    }\n\n    /**\n     * Produces a random number between `min` and `max` (inclusive). If only one\n     * argument is provided a number between `0` and the given number will be\n     * returned. If `floating` is truey or either `min` or `max` are floats a\n     * floating-point number will be returned instead of an integer.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {number} [min=0] The minimum possible value.\n     * @param {number} [max=1] The maximum possible value.\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\n     * @returns {number} Returns a random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(min, max, floating) {\n      var noMin = min == null,\n          noMax = max == null;\n\n      if (floating == null) {\n        if (typeof min == 'boolean' && noMax) {\n          floating = min;\n          min = 1;\n        }\n        else if (!noMax && typeof max == 'boolean') {\n          floating = max;\n          noMax = true;\n        }\n      }\n      if (noMin && noMax) {\n        max = 1;\n      }\n      min = +min || 0;\n      if (noMax) {\n        max = min;\n        min = 0;\n      } else {\n        max = +max || 0;\n      }\n      if (floating || min % 1 || max % 1) {\n        var rand = nativeRandom();\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\n      }\n      return baseRandom(min, max);\n    }\n\n    /**\n     * Resolves the value of property `key` on `object`. If `key` is a function\n     * it will be invoked with the `this` binding of `object` and its result returned,\n     * else the property value is returned. If `object` is falsey then `undefined`\n     * is returned.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {Object} object The object to inspect.\n     * @param {string} key The name of the property to resolve.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = {\n     *   'cheese': 'crumpets',\n     *   'stuff': function() {\n     *     return 'nonsense';\n     *   }\n     * };\n     *\n     * _.result(object, 'cheese');\n     * // => 'crumpets'\n     *\n     * _.result(object, 'stuff');\n     * // => 'nonsense'\n     */\n    function result(object, key) {\n      if (object) {\n        var value = object[key];\n        return isFunction(value) ? object[key]() : value;\n      }\n    }\n\n    /**\n     * A micro-templating method that handles arbitrary delimiters, preserves\n     * whitespace, and correctly escapes quotes within interpolated code.\n     *\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\n     *\n     * For more information on precompiling templates see:\n     * http://lodash.com/custom-builds\n     *\n     * For more information on Chrome extension sandboxes see:\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} text The template text.\n     * @param {Object} data The data object used to populate the text.\n     * @param {Object} [options] The options object.\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\n     * @param {Object} [options.imports] An object to import into the template as local variables.\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\n     * @param {string} [variable] The data object variable name.\n     * @returns {Function|string} Returns a compiled function when no `data` object\n     *  is given, else it returns the interpolated text.\n     * @example\n     *\n     * // using the \"interpolate\" delimiter to create a compiled template\n     * var compiled = _.template('hello <%= name %>');\n     * compiled({ 'name': 'fred' });\n     * // => 'hello fred'\n     *\n     * // using the \"escape\" delimiter to escape HTML in data property values\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // using the \"evaluate\" delimiter to generate HTML\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\n     * _.template(list, { 'people': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\n     * // => 'hello pebbles'\n     *\n     * // using the internal `print` function in \"evaluate\" delimiters\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // using a custom template delimiters\n     * _.templateSettings = {\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\n     * };\n     *\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // using the `imports` option to import jQuery\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\n     *\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     *   var __t, __p = '', __e = _.escape;\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\n     *   return __p;\n     * }\n     *\n     * // using the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and a stack trace\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(text, data, options) {\n      // based on John Resig's `tmpl` implementation\n      // http://ejohn.org/blog/javascript-micro-templating/\n      // and Laura Doktorova's doT.js\n      // https://github.com/olado/doT\n      var settings = lodash.templateSettings;\n      text = String(text || '');\n\n      // avoid missing dependencies when `iteratorTemplate` is not defined\n      options = defaults({}, options, settings);\n\n      var imports = defaults({}, options.imports, settings.imports),\n          importsKeys = keys(imports),\n          importsValues = values(imports);\n\n      var isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // compile the regexp to match each delimiter\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // escape characters that cannot be included in string literals\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // replace delimiters with snippets\n        if (escapeValue) {\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // the JS engine embedded in Adobe products requires returning the `match`\n        // string in order to produce the correct `offset` value\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // if `variable` is not specified, wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain\n      var variable = options.variable,\n          hasVariable = variable;\n\n      if (!hasVariable) {\n        variable = 'obj';\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\n      }\n      // cleanup code by stripping empty strings\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // frame code as the function body\n      source = 'function(' + variable + ') {\\n' +\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\n        \"var __t, __p = '', __e = _.escape\" +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      // Use a sourceURL for easier debugging.\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\n\n      try {\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\n      } catch(e) {\n        e.source = source;\n        throw e;\n      }\n      if (data) {\n        return result(data);\n      }\n      // provide the compiled function's source by its `toString` method, in\n      // supported environments, or the `source` property as a convenience for\n      // inlining compiled templates during the build process\n      result.source = source;\n      return result;\n    }\n\n    /**\n     * Executes the callback `n` times, returning an array of the results\n     * of each callback execution. The callback is bound to `thisArg` and invoked\n     * with one argument; (index).\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {number} n The number of times to execute the callback.\n     * @param {Function} callback The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns an array of the results of each `callback` execution.\n     * @example\n     *\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\n     * // => [3, 6, 4]\n     *\n     * _.times(3, function(n) { mage.castSpell(n); });\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\n     *\n     * _.times(3, function(n) { this.cast(n); }, mage);\n     * // => also calls `mage.castSpell(n)` three times\n     */\n    function times(n, callback, thisArg) {\n      n = (n = +n) > -1 ? n : 0;\n      var index = -1,\n          result = Array(n);\n\n      callback = baseCreateCallback(callback, thisArg, 1);\n      while (++index < n) {\n        result[index] = callback(index);\n      }\n      return result;\n    }\n\n    /**\n     * The inverse of `_.escape` this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\n     * corresponding characters.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} string The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('Fred, Barney &amp; Pebbles');\n     * // => 'Fred, Barney & Pebbles'\n     */\n    function unescape(string) {\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} [prefix] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return String(prefix == null ? '' : prefix) + id;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object that wraps the given value with explicit\n     * method chaining enabled.\n     *\n     * @static\n     * @memberOf _\n     * @category Chaining\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36 },\n     *   { 'name': 'fred',    'age': 40 },\n     *   { 'name': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _.chain(characters)\n     *     .sortBy('age')\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\n     *     .first()\n     *     .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      value = new lodashWrapper(value);\n      value.__chain__ = true;\n      return value;\n    }\n\n    /**\n     * Invokes `interceptor` with the `value` as the first argument and then\n     * returns `value`. The purpose of this method is to \"tap into\" a method\n     * chain in order to perform operations on intermediate results within\n     * the chain.\n     *\n     * @static\n     * @memberOf _\n     * @category Chaining\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3, 4])\n     *  .tap(function(array) { array.pop(); })\n     *  .reverse()\n     *  .value();\n     * // => [3, 2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * Enables explicit method chaining on the wrapper object.\n     *\n     * @name chain\n     * @memberOf _\n     * @category Chaining\n     * @returns {*} Returns the wrapper object.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // without explicit chaining\n     * _(characters).first();\n     * // => { 'name': 'barney', 'age': 36 }\n     *\n     * // with explicit chaining\n     * _(characters).chain()\n     *   .first()\n     *   .pick('age')\n     *   .value();\n     * // => { 'age': 36 }\n     */\n    function wrapperChain() {\n      this.__chain__ = true;\n      return this;\n    }\n\n    /**\n     * Produces the `toString` result of the wrapped value.\n     *\n     * @name toString\n     * @memberOf _\n     * @category Chaining\n     * @returns {string} Returns the string result.\n     * @example\n     *\n     * _([1, 2, 3]).toString();\n     * // => '1,2,3'\n     */\n    function wrapperToString() {\n      return String(this.__wrapped__);\n    }\n\n    /**\n     * Extracts the wrapped value.\n     *\n     * @name valueOf\n     * @memberOf _\n     * @alias value\n     * @category Chaining\n     * @returns {*} Returns the wrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).valueOf();\n     * // => [1, 2, 3]\n     */\n    function wrapperValueOf() {\n      return this.__wrapped__;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions that return wrapped values when chaining\n    lodash.after = after;\n    lodash.assign = assign;\n    lodash.at = at;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.chain = chain;\n    lodash.compact = compact;\n    lodash.compose = compose;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.createCallback = createCallback;\n    lodash.curry = curry;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.filter = filter;\n    lodash.flatten = flatten;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.functions = functions;\n    lodash.groupBy = groupBy;\n    lodash.indexBy = indexBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.invert = invert;\n    lodash.invoke = invoke;\n    lodash.keys = keys;\n    lodash.map = map;\n    lodash.mapValues = mapValues;\n    lodash.max = max;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.min = min;\n    lodash.omit = omit;\n    lodash.once = once;\n    lodash.pairs = pairs;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.pick = pick;\n    lodash.pluck = pluck;\n    lodash.property = property;\n    lodash.pull = pull;\n    lodash.range = range;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.shuffle = shuffle;\n    lodash.sortBy = sortBy;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.times = times;\n    lodash.toArray = toArray;\n    lodash.transform = transform;\n    lodash.union = union;\n    lodash.uniq = uniq;\n    lodash.values = values;\n    lodash.where = where;\n    lodash.without = without;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n\n    // add aliases\n    lodash.collect = map;\n    lodash.drop = rest;\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.extend = assign;\n    lodash.methods = functions;\n    lodash.object = zipObject;\n    lodash.select = filter;\n    lodash.tail = rest;\n    lodash.unique = uniq;\n    lodash.unzip = zip;\n\n    // add functions to `lodash.prototype`\n    mixin(lodash);\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions that return unwrapped values when chaining\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.contains = contains;\n    lodash.escape = escape;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.has = has;\n    lodash.identity = identity;\n    lodash.indexOf = indexOf;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isBoolean = isBoolean;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isNaN = isNaN;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isString = isString;\n    lodash.isUndefined = isUndefined;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.mixin = mixin;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.result = result;\n    lodash.runInContext = runInContext;\n    lodash.size = size;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.template = template;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n\n    // add aliases\n    lodash.all = every;\n    lodash.any = some;\n    lodash.detect = find;\n    lodash.findWhere = find;\n    lodash.foldl = reduce;\n    lodash.foldr = reduceRight;\n    lodash.include = contains;\n    lodash.inject = reduce;\n\n    mixin(function() {\n      var source = {}\n      forOwn(lodash, function(func, methodName) {\n        if (!lodash.prototype[methodName]) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }(), false);\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions capable of returning wrapped and unwrapped values when chaining\n    lodash.first = first;\n    lodash.last = last;\n    lodash.sample = sample;\n\n    // add aliases\n    lodash.take = first;\n    lodash.head = first;\n\n    forOwn(lodash, function(func, methodName) {\n      var callbackable = methodName !== 'sample';\n      if (!lodash.prototype[methodName]) {\n        lodash.prototype[methodName]= function(n, guard) {\n          var chainAll = this.__chain__,\n              result = func(this.__wrapped__, n, guard);\n\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\n            ? result\n            : new lodashWrapper(result, chainAll);\n        };\n      }\n    });\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type string\n     */\n    lodash.VERSION = '2.4.1';\n\n    // add \"Chaining\" functions to the wrapper\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.toString = wrapperToString;\n    lodash.prototype.value = wrapperValueOf;\n    lodash.prototype.valueOf = wrapperValueOf;\n\n    // add `Array` functions that return unwrapped values\n    forEach(['join', 'pop', 'shift'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        var chainAll = this.__chain__,\n            result = func.apply(this.__wrapped__, arguments);\n\n        return chainAll\n          ? new lodashWrapper(result, chainAll)\n          : result;\n      };\n    });\n\n    // add `Array` functions that return the existing wrapped value\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        func.apply(this.__wrapped__, arguments);\n        return this;\n      };\n    });\n\n    // add `Array` functions that return new wrapped values\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\n      };\n    });\n\n    return lodash;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  // expose Lo-Dash\n  var _ = runInContext();\n\n  // some AMD build optimizers like r.js check for condition patterns like the following:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\n    // case Lo-Dash is loaded with a RequireJS shim config.\n    // See http://requirejs.org/docs/api.html#config-shim\n    root._ = _;\n\n    // define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module\n    define(function() {\n      return _;\n    });\n  }\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\n  else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = _)._ = _;\n    }\n    // in Narwhal or Rhino -require\n    else {\n      freeExports._ = _;\n    }\n  }\n  else {\n    // in a browser or Rhino\n    root._ = _;\n  }\n}.call(this));\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})","/**\n * @jsx React.DOM\n */\n\nvar d3 = require('d3');\nvar React = require('react/addons');\nvar mousePosition = require('mouse-position');\nvar mouse = mousePosition();\nvar pathTween = require('./lib/pathCoordsTween')\n\nmodule.exports = React.createClass({displayName: 'exports',\n\n  getInitialState: function() {\n\n    var centroid = [this.props.datum.x, this.props.datum.y],\n        radius = this.props.datum.r,\n        coordinates = this.circle({centroid: centroid, radius: radius });\n\n    return {\n      shape: 'circle',\n      radius: radius,\n      centroid: centroid,\n      translate: [0,0],\n      coordinates: coordinates,\n      fill: this.props.datum.color,\n      dragStart: this.props.dragStart\n    };\n  },\n\n  animate: require('./lib/animate'),\n  circle: require('./lib/circleGenerator'),\n  arc: require('./lib/arcGenerator'),\n\n  render: function() {\n\n    // console.log(this.state.coordinates, 'on render ')\n    var d = 'M' + this.state.coordinates.join('L') + 'Z'\n    var translate = 'translate(' + this.state.translate[0] + ',' + this.state.translate[1] + ')'\n    return (\n      React.DOM.path({\n        onMouseDown: this.state.dragStart, \n        d: d, \n        fill: this.state.fill, \n        transform: translate\n        }\n      )        \n     );\n  },\n\n  compontWillRecieveProps: function(nextProps) {\n\n  },\n\n  arcForm: function(options) {\n    options['coordinates'] = this.state.coordinates;\n    var arcCoords = this.arc(options);\n    var interpolator = pathTween(this.state.coordinates, arcCoords)();\n    this.animate('coordinates', interpolator, 500);\n  }, \n\n  circleForm: function(options) {\n    console.log('test circleForm')\n    var circleCoords = this.circle(options)\n    var interpolator = pathTween(this.state.coordinates, circleCoords)();\n    this.animate('coordinates', interpolator, 500)\n  },\n\n  onDrag: function() {\n    var dx = mouse.x - mouse.prevX;\n    var dy = mouse.y - mouse.prevY;\n\n    this.setState({\n      translate: [\n        this.state.translate[0] + dx,\n        this.state.translate[1] + dy\n      ]\n    })\n\n  }\n\n});","/**\n * @jsx React.DOM\n */\n\nvar React = require('react/addons');\nvar AnimateMixin = ('react-animate');\nvar d3 = require('d3');\nvar Arc = d3.svg.arc();\nvar _ = require('lodash');\n\nmodule.exports = React.createClass({displayName: 'exports',\n\n  getInitialState: function() {\n    var target = this.props.datum.target;\n    var scale = this.props.scale;\n    var allocated = this.props.datum.allocated;\n    var target = this.props.datum.target;\n    var targetR = scale(target);\n    var initAngle = 2*Math.PI*(allocated/target);\n    var arc = Arc.innerRadius(0).startAngle(0)\n\n    return {\n      targetR: targetR,\n      allocated: this.props.datum.allocated,\n      x: this.props.datum.x,\n      y: this.props.datum.y,\n      fill: this.props.datum.color,\n      arcAngle: 0,\n      initAngle: initAngle,\n      arc: arc,\n      translate: \"translate(\"+this.props.datum.x+','+this.props.datum.y+')'\n    }\n  },\n\n  render: function() {\n    var arc = this.state.arc\n      .endAngle(this.state.arcAngle)\n      .outerRadius(this.state.targetR);\n\n    var segmentArc = arc();\n\n     return (\n      React.DOM.g(null, \n        React.DOM.circle({\n          className: \"target\", \n          cx: this.state.x, \n          cy: this.state.y, \n          r: this.state.targetR, \n          fill: \"white\", \n          stroke: this.state.fill}\n        ), \n        React.DOM.path({\n          className: \"allocated\", \n          transform: this.state.translate, \n          d: segmentArc, \n          fill: this.state.fill}\n        )\n\n      )\n      );\n  },\n\n  animate: require('./lib/animate'),\n\n  activate: function() {\n    console.log('activating')\n  },\n\n\n  animateArc: function() {\n    this.animate('arcAngle', this.state.initAngle, 700)\n\n  },\n\n  componentDidMount: function() {\n    var cmp = this;\n    var delay = 500;\n    window.setTimeout(function() {\n      cmp.animateArc();\n    }, delay)\n\n  }\n\n});","(function (Buffer){\n//     uuid.js\n//\n//     Copyright (c) 2010-2012 Robert Kieffer\n//     MIT License - http://opensource.org/licenses/mit-license.php\n\n// Unique ID creation requires a high quality random # generator.  We feature\n// detect to determine the best RNG source, normalizing to a function that\n// returns 128-bits of randomness, since that's what's usually required\nvar _rng = require('./rng');\n\n// Buffer class to use\nvar BufferClass = typeof(Buffer) == 'function' ? Buffer : Array;\n\n// Maps for number <-> hex string conversion\nvar _byteToHex = [];\nvar _hexToByte = {};\nfor (var i = 0; i < 256; i++) {\n  _byteToHex[i] = (i + 0x100).toString(16).substr(1);\n  _hexToByte[_byteToHex[i]] = i;\n}\n\n// **`parse()` - Parse a UUID into it's component bytes**\nfunction parse(s, buf, offset) {\n  var i = (buf && offset) || 0, ii = 0;\n\n  buf = buf || [];\n  s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) {\n    if (ii < 16) { // Don't overflow!\n      buf[i + ii++] = _hexToByte[oct];\n    }\n  });\n\n  // Zero out remaining bytes if string was short\n  while (ii < 16) {\n    buf[i + ii++] = 0;\n  }\n\n  return buf;\n}\n\n// **`unparse()` - Convert UUID byte array (ala parse()) into a string**\nfunction unparse(buf, offset) {\n  var i = offset || 0, bth = _byteToHex;\n  return  bth[buf[i++]] + bth[buf[i++]] +\n          bth[buf[i++]] + bth[buf[i++]] + '-' +\n          bth[buf[i++]] + bth[buf[i++]] + '-' +\n          bth[buf[i++]] + bth[buf[i++]] + '-' +\n          bth[buf[i++]] + bth[buf[i++]] + '-' +\n          bth[buf[i++]] + bth[buf[i++]] +\n          bth[buf[i++]] + bth[buf[i++]] +\n          bth[buf[i++]] + bth[buf[i++]];\n}\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\n// random #'s we need to init node and clockseq\nvar _seedBytes = _rng();\n\n// Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\nvar _nodeId = [\n  _seedBytes[0] | 0x01,\n  _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5]\n];\n\n// Per 4.2.2, randomize (14 bit) clockseq\nvar _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff;\n\n// Previous uuid creation time\nvar _lastMSecs = 0, _lastNSecs = 0;\n\n// See https://github.com/broofa/node-uuid for API details\nfunction v1(options, buf, offset) {\n  var i = buf && offset || 0;\n  var b = buf || [];\n\n  options = options || {};\n\n  var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;\n\n  // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so\n  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n  var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();\n\n  // Per 4.2.1.2, use count of uuid's generated during the current clock\n  // cycle to simulate higher resolution clock\n  var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;\n\n  // Time since last uuid creation (in msecs)\n  var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;\n\n  // Per 4.2.1.2, Bump clockseq on clock regression\n  if (dt < 0 && options.clockseq === undefined) {\n    clockseq = clockseq + 1 & 0x3fff;\n  }\n\n  // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n  // time interval\n  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n    nsecs = 0;\n  }\n\n  // Per 4.2.1.2 Throw error if too many uuids are requested\n  if (nsecs >= 10000) {\n    throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n  }\n\n  _lastMSecs = msecs;\n  _lastNSecs = nsecs;\n  _clockseq = clockseq;\n\n  // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n  msecs += 12219292800000;\n\n  // `time_low`\n  var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n  b[i++] = tl >>> 24 & 0xff;\n  b[i++] = tl >>> 16 & 0xff;\n  b[i++] = tl >>> 8 & 0xff;\n  b[i++] = tl & 0xff;\n\n  // `time_mid`\n  var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n  b[i++] = tmh >>> 8 & 0xff;\n  b[i++] = tmh & 0xff;\n\n  // `time_high_and_version`\n  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n  b[i++] = tmh >>> 16 & 0xff;\n\n  // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n  b[i++] = clockseq >>> 8 | 0x80;\n\n  // `clock_seq_low`\n  b[i++] = clockseq & 0xff;\n\n  // `node`\n  var node = options.node || _nodeId;\n  for (var n = 0; n < 6; n++) {\n    b[i + n] = node[n];\n  }\n\n  return buf ? buf : unparse(b);\n}\n\n// **`v4()` - Generate random UUID**\n\n// See https://github.com/broofa/node-uuid for API details\nfunction v4(options, buf, offset) {\n  // Deprecated - 'format' argument, as supported in v1.2\n  var i = buf && offset || 0;\n\n  if (typeof(options) == 'string') {\n    buf = options == 'binary' ? new BufferClass(16) : null;\n    options = null;\n  }\n  options = options || {};\n\n  var rnds = options.random || (options.rng || _rng)();\n\n  // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n  rnds[6] = (rnds[6] & 0x0f) | 0x40;\n  rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n  // Copy bytes to buffer, if provided\n  if (buf) {\n    for (var ii = 0; ii < 16; ii++) {\n      buf[i + ii] = rnds[ii];\n    }\n  }\n\n  return buf || unparse(rnds);\n}\n\n// Export public API\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\nuuid.parse = parse;\nuuid.unparse = unparse;\nuuid.BufferClass = BufferClass;\n\nmodule.exports = uuid;\n\n}).call(this,require(\"buffer\").Buffer)","module.exports = require('./lib/React');\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactWithAddons\n */\n\n/**\n * This module exists purely in the open source project, and is meant as a way\n * to create a separate standalone build of React. This build has \"addons\", or\n * functionality we've built and think might be useful but doesn't have a good\n * place to live inside React core.\n */\n\n\"use strict\";\n\nvar LinkedStateMixin = require(\"./LinkedStateMixin\");\nvar React = require(\"./React\");\nvar ReactComponentWithPureRenderMixin =\n  require(\"./ReactComponentWithPureRenderMixin\");\nvar ReactCSSTransitionGroup = require(\"./ReactCSSTransitionGroup\");\nvar ReactTransitionGroup = require(\"./ReactTransitionGroup\");\n\nvar cx = require(\"./cx\");\nvar cloneWithProps = require(\"./cloneWithProps\");\nvar update = require(\"./update\");\n\nReact.addons = {\n  CSSTransitionGroup: ReactCSSTransitionGroup,\n  LinkedStateMixin: LinkedStateMixin,\n  PureRenderMixin: ReactComponentWithPureRenderMixin,\n  TransitionGroup: ReactTransitionGroup,\n\n  classSet: cx,\n  cloneWithProps: cloneWithProps,\n  update: update\n};\n\nif (\"production\" !== process.env.NODE_ENV) {\n  React.addons.Perf = require(\"./ReactDefaultPerf\");\n  React.addons.TestUtils = require(\"./ReactTestUtils\");\n}\n\nmodule.exports = React;\n\n\n}).call(this,require('_process'))","(function (global){\n\nvar rng;\n\nif (global.crypto && crypto.getRandomValues) {\n  // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto\n  // Moderately fast, high quality\n  var _rnds8 = new Uint8Array(16);\n  rng = function whatwgRNG() {\n    crypto.getRandomValues(_rnds8);\n    return _rnds8;\n  };\n}\n\nif (!rng) {\n  // Math.random()-based (RNG)\n  //\n  // If all else fails, use Math.random().  It's fast, but is of unspecified\n  // quality.\n  var  _rnds = new Array(16);\n  rng = function() {\n    for (var i = 0, r; i < 16; i++) {\n      if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n      _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n    }\n\n    return _rnds;\n  };\n}\n\nmodule.exports = rng;\n\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = Buffer\nexports.INSPECT_MAX_BYTES = 50\nBuffer.poolSize = 8192\n\n/**\n * If `TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Note:\n *\n * - Implementation must support adding new properties to `Uint8Array` instances.\n *   Firefox 4-29 lacked support, fixed in Firefox 30+.\n *   See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *  - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *  - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *    incorrect length in some situations.\n *\n * We detect these buggy browsers and set `TYPED_ARRAY_SUPPORT` to `false` so they will\n * get the Object implementation, which is slower but will work correctly.\n */\nvar TYPED_ARRAY_SUPPORT = (function () {\n  try {\n    var buf = new ArrayBuffer(0)\n    var arr = new Uint8Array(buf)\n    arr.foo = function () { return 42 }\n    return 42 === arr.foo() && // typed array instances can be augmented\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n})()\n\n/**\n * Class: Buffer\n * =============\n *\n * The Buffer constructor returns instances of `Uint8Array` that are augmented\n * with function properties for all the node `Buffer` API functions. We use\n * `Uint8Array` so that square bracket notation works as expected -- it returns\n * a single octet.\n *\n * By augmenting the instances, we can avoid modifying the `Uint8Array`\n * prototype.\n */\nfunction Buffer (subject, encoding, noZero) {\n  if (!(this instanceof Buffer))\n    return new Buffer(subject, encoding, noZero)\n\n  var type = typeof subject\n\n  // Find the length\n  var length\n  if (type === 'number')\n    length = subject > 0 ? subject >>> 0 : 0\n  else if (type === 'string') {\n    if (encoding === 'base64')\n      subject = base64clean(subject)\n    length = Buffer.byteLength(subject, encoding)\n  } else if (type === 'object' && subject !== null) { // assume object is array-like\n    if (subject.type === 'Buffer' && isArray(subject.data))\n      subject = subject.data\n    length = +subject.length > 0 ? Math.floor(+subject.length) : 0\n  } else\n    throw new Error('First argument needs to be a number, array or string.')\n\n  var buf\n  if (TYPED_ARRAY_SUPPORT) {\n    // Preferred: Return an augmented `Uint8Array` instance for best performance\n    buf = Buffer._augment(new Uint8Array(length))\n  } else {\n    // Fallback: Return THIS instance of Buffer (created by `new`)\n    buf = this\n    buf.length = length\n    buf._isBuffer = true\n  }\n\n  var i\n  if (TYPED_ARRAY_SUPPORT && typeof subject.byteLength === 'number') {\n    // Speed optimization -- use set if we're copying from a typed array\n    buf._set(subject)\n  } else if (isArrayish(subject)) {\n    // Treat array-ish objects as a byte array\n    if (Buffer.isBuffer(subject)) {\n      for (i = 0; i < length; i++)\n        buf[i] = subject.readUInt8(i)\n    } else {\n      for (i = 0; i < length; i++)\n        buf[i] = ((subject[i] % 256) + 256) % 256\n    }\n  } else if (type === 'string') {\n    buf.write(subject, 0, encoding)\n  } else if (type === 'number' && !TYPED_ARRAY_SUPPORT && !noZero) {\n    for (i = 0; i < length; i++) {\n      buf[i] = 0\n    }\n  }\n\n  return buf\n}\n\n// STATIC METHODS\n// ==============\n\nBuffer.isEncoding = function (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'binary':\n    case 'base64':\n    case 'raw':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.isBuffer = function (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.byteLength = function (str, encoding) {\n  var ret\n  str = str.toString()\n  switch (encoding || 'utf8') {\n    case 'hex':\n      ret = str.length / 2\n      break\n    case 'utf8':\n    case 'utf-8':\n      ret = utf8ToBytes(str).length\n      break\n    case 'ascii':\n    case 'binary':\n    case 'raw':\n      ret = str.length\n      break\n    case 'base64':\n      ret = base64ToBytes(str).length\n      break\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      ret = str.length * 2\n      break\n    default:\n      throw new Error('Unknown encoding')\n  }\n  return ret\n}\n\nBuffer.concat = function (list, totalLength) {\n  assert(isArray(list), 'Usage: Buffer.concat(list[, length])')\n\n  if (list.length === 0) {\n    return new Buffer(0)\n  } else if (list.length === 1) {\n    return list[0]\n  }\n\n  var i\n  if (totalLength === undefined) {\n    totalLength = 0\n    for (i = 0; i < list.length; i++) {\n      totalLength += list[i].length\n    }\n  }\n\n  var buf = new Buffer(totalLength)\n  var pos = 0\n  for (i = 0; i < list.length; i++) {\n    var item = list[i]\n    item.copy(buf, pos)\n    pos += item.length\n  }\n  return buf\n}\n\nBuffer.compare = function (a, b) {\n  assert(Buffer.isBuffer(a) && Buffer.isBuffer(b), 'Arguments must be Buffers')\n  var x = a.length\n  var y = b.length\n  for (var i = 0, len = Math.min(x, y); i < len && a[i] === b[i]; i++) {}\n  if (i !== len) {\n    x = a[i]\n    y = b[i]\n  }\n  if (x < y) {\n    return -1\n  }\n  if (y < x) {\n    return 1\n  }\n  return 0\n}\n\n// BUFFER INSTANCE METHODS\n// =======================\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  assert(strLen % 2 === 0, 'Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; i++) {\n    var byte = parseInt(string.substr(i * 2, 2), 16)\n    assert(!isNaN(byte), 'Invalid hex string')\n    buf[offset + i] = byte\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  var charsWritten = blitBuffer(utf8ToBytes(string), buf, offset, length)\n  return charsWritten\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  var charsWritten = blitBuffer(asciiToBytes(string), buf, offset, length)\n  return charsWritten\n}\n\nfunction binaryWrite (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  var charsWritten = blitBuffer(base64ToBytes(string), buf, offset, length)\n  return charsWritten\n}\n\nfunction utf16leWrite (buf, string, offset, length) {\n  var charsWritten = blitBuffer(utf16leToBytes(string), buf, offset, length)\n  return charsWritten\n}\n\nBuffer.prototype.write = function (string, offset, length, encoding) {\n  // Support both (string, offset, length, encoding)\n  // and the legacy (string, encoding, offset, length)\n  if (isFinite(offset)) {\n    if (!isFinite(length)) {\n      encoding = length\n      length = undefined\n    }\n  } else {  // legacy\n    var swap = encoding\n    encoding = offset\n    offset = length\n    length = swap\n  }\n\n  offset = Number(offset) || 0\n  var remaining = this.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n  encoding = String(encoding || 'utf8').toLowerCase()\n\n  var ret\n  switch (encoding) {\n    case 'hex':\n      ret = hexWrite(this, string, offset, length)\n      break\n    case 'utf8':\n    case 'utf-8':\n      ret = utf8Write(this, string, offset, length)\n      break\n    case 'ascii':\n      ret = asciiWrite(this, string, offset, length)\n      break\n    case 'binary':\n      ret = binaryWrite(this, string, offset, length)\n      break\n    case 'base64':\n      ret = base64Write(this, string, offset, length)\n      break\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      ret = utf16leWrite(this, string, offset, length)\n      break\n    default:\n      throw new Error('Unknown encoding')\n  }\n  return ret\n}\n\nBuffer.prototype.toString = function (encoding, start, end) {\n  var self = this\n\n  encoding = String(encoding || 'utf8').toLowerCase()\n  start = Number(start) || 0\n  end = (end === undefined) ? self.length : Number(end)\n\n  // Fastpath empty strings\n  if (end === start)\n    return ''\n\n  var ret\n  switch (encoding) {\n    case 'hex':\n      ret = hexSlice(self, start, end)\n      break\n    case 'utf8':\n    case 'utf-8':\n      ret = utf8Slice(self, start, end)\n      break\n    case 'ascii':\n      ret = asciiSlice(self, start, end)\n      break\n    case 'binary':\n      ret = binarySlice(self, start, end)\n      break\n    case 'base64':\n      ret = base64Slice(self, start, end)\n      break\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      ret = utf16leSlice(self, start, end)\n      break\n    default:\n      throw new Error('Unknown encoding')\n  }\n  return ret\n}\n\nBuffer.prototype.toJSON = function () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nBuffer.prototype.equals = function (b) {\n  assert(Buffer.isBuffer(b), 'Argument must be a Buffer')\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.compare = function (b) {\n  assert(Buffer.isBuffer(b), 'Argument must be a Buffer')\n  return Buffer.compare(this, b)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function (target, target_start, start, end) {\n  var source = this\n\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (!target_start) target_start = 0\n\n  // Copy 0 bytes; we're done\n  if (end === start) return\n  if (target.length === 0 || source.length === 0) return\n\n  // Fatal error conditions\n  assert(end >= start, 'sourceEnd < sourceStart')\n  assert(target_start >= 0 && target_start < target.length,\n      'targetStart out of bounds')\n  assert(start >= 0 && start < source.length, 'sourceStart out of bounds')\n  assert(end >= 0 && end <= source.length, 'sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length)\n    end = this.length\n  if (target.length - target_start < end - start)\n    end = target.length - target_start + start\n\n  var len = end - start\n\n  if (len < 100 || !TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < len; i++) {\n      target[i + target_start] = this[i + start]\n    }\n  } else {\n    target._set(this.subarray(start, start + len), target_start)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  var res = ''\n  var tmp = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; i++) {\n    if (buf[i] <= 0x7F) {\n      res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i])\n      tmp = ''\n    } else {\n      tmp += '%' + buf[i].toString(16)\n    }\n  }\n\n  return res + decodeUtf8Char(tmp)\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; i++) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction binarySlice (buf, start, end) {\n  return asciiSlice(buf, start, end)\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; i++) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len;\n    if (start < 0)\n      start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0)\n      end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start)\n    end = start\n\n  if (TYPED_ARRAY_SUPPORT) {\n    return Buffer._augment(this.subarray(start, end))\n  } else {\n    var sliceLen = end - start\n    var newBuf = new Buffer(sliceLen, undefined, true)\n    for (var i = 0; i < sliceLen; i++) {\n      newBuf[i] = this[i + start]\n    }\n    return newBuf\n  }\n}\n\n// `get` will be removed in Node 0.13+\nBuffer.prototype.get = function (offset) {\n  console.log('.get() is deprecated. Access using array indexes instead.')\n  return this.readUInt8(offset)\n}\n\n// `set` will be removed in Node 0.13+\nBuffer.prototype.set = function (v, offset) {\n  console.log('.set() is deprecated. Access using array indexes instead.')\n  return this.writeUInt8(v, offset)\n}\n\nBuffer.prototype.readUInt8 = function (offset, noAssert) {\n  if (!noAssert) {\n    assert(offset !== undefined && offset !== null, 'missing offset')\n    assert(offset < this.length, 'Trying to read beyond buffer length')\n  }\n\n  if (offset >= this.length)\n    return\n\n  return this[offset]\n}\n\nfunction readUInt16 (buf, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    assert(typeof littleEndian === 'boolean', 'missing or invalid endian')\n    assert(offset !== undefined && offset !== null, 'missing offset')\n    assert(offset + 1 < buf.length, 'Trying to read beyond buffer length')\n  }\n\n  var len = buf.length\n  if (offset >= len)\n    return\n\n  var val\n  if (littleEndian) {\n    val = buf[offset]\n    if (offset + 1 < len)\n      val |= buf[offset + 1] << 8\n  } else {\n    val = buf[offset] << 8\n    if (offset + 1 < len)\n      val |= buf[offset + 1]\n  }\n  return val\n}\n\nBuffer.prototype.readUInt16LE = function (offset, noAssert) {\n  return readUInt16(this, offset, true, noAssert)\n}\n\nBuffer.prototype.readUInt16BE = function (offset, noAssert) {\n  return readUInt16(this, offset, false, noAssert)\n}\n\nfunction readUInt32 (buf, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    assert(typeof littleEndian === 'boolean', 'missing or invalid endian')\n    assert(offset !== undefined && offset !== null, 'missing offset')\n    assert(offset + 3 < buf.length, 'Trying to read beyond buffer length')\n  }\n\n  var len = buf.length\n  if (offset >= len)\n    return\n\n  var val\n  if (littleEndian) {\n    if (offset + 2 < len)\n      val = buf[offset + 2] << 16\n    if (offset + 1 < len)\n      val |= buf[offset + 1] << 8\n    val |= buf[offset]\n    if (offset + 3 < len)\n      val = val + (buf[offset + 3] << 24 >>> 0)\n  } else {\n    if (offset + 1 < len)\n      val = buf[offset + 1] << 16\n    if (offset + 2 < len)\n      val |= buf[offset + 2] << 8\n    if (offset + 3 < len)\n      val |= buf[offset + 3]\n    val = val + (buf[offset] << 24 >>> 0)\n  }\n  return val\n}\n\nBuffer.prototype.readUInt32LE = function (offset, noAssert) {\n  return readUInt32(this, offset, true, noAssert)\n}\n\nBuffer.prototype.readUInt32BE = function (offset, noAssert) {\n  return readUInt32(this, offset, false, noAssert)\n}\n\nBuffer.prototype.readInt8 = function (offset, noAssert) {\n  if (!noAssert) {\n    assert(offset !== undefined && offset !== null,\n        'missing offset')\n    assert(offset < this.length, 'Trying to read beyond buffer length')\n  }\n\n  if (offset >= this.length)\n    return\n\n  var neg = this[offset] & 0x80\n  if (neg)\n    return (0xff - this[offset] + 1) * -1\n  else\n    return this[offset]\n}\n\nfunction readInt16 (buf, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    assert(typeof littleEndian === 'boolean', 'missing or invalid endian')\n    assert(offset !== undefined && offset !== null, 'missing offset')\n    assert(offset + 1 < buf.length, 'Trying to read beyond buffer length')\n  }\n\n  var len = buf.length\n  if (offset >= len)\n    return\n\n  var val = readUInt16(buf, offset, littleEndian, true)\n  var neg = val & 0x8000\n  if (neg)\n    return (0xffff - val + 1) * -1\n  else\n    return val\n}\n\nBuffer.prototype.readInt16LE = function (offset, noAssert) {\n  return readInt16(this, offset, true, noAssert)\n}\n\nBuffer.prototype.readInt16BE = function (offset, noAssert) {\n  return readInt16(this, offset, false, noAssert)\n}\n\nfunction readInt32 (buf, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    assert(typeof littleEndian === 'boolean', 'missing or invalid endian')\n    assert(offset !== undefined && offset !== null, 'missing offset')\n    assert(offset + 3 < buf.length, 'Trying to read beyond buffer length')\n  }\n\n  var len = buf.length\n  if (offset >= len)\n    return\n\n  var val = readUInt32(buf, offset, littleEndian, true)\n  var neg = val & 0x80000000\n  if (neg)\n    return (0xffffffff - val + 1) * -1\n  else\n    return val\n}\n\nBuffer.prototype.readInt32LE = function (offset, noAssert) {\n  return readInt32(this, offset, true, noAssert)\n}\n\nBuffer.prototype.readInt32BE = function (offset, noAssert) {\n  return readInt32(this, offset, false, noAssert)\n}\n\nfunction readFloat (buf, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    assert(typeof littleEndian === 'boolean', 'missing or invalid endian')\n    assert(offset + 3 < buf.length, 'Trying to read beyond buffer length')\n  }\n\n  return ieee754.read(buf, offset, littleEndian, 23, 4)\n}\n\nBuffer.prototype.readFloatLE = function (offset, noAssert) {\n  return readFloat(this, offset, true, noAssert)\n}\n\nBuffer.prototype.readFloatBE = function (offset, noAssert) {\n  return readFloat(this, offset, false, noAssert)\n}\n\nfunction readDouble (buf, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    assert(typeof littleEndian === 'boolean', 'missing or invalid endian')\n    assert(offset + 7 < buf.length, 'Trying to read beyond buffer length')\n  }\n\n  return ieee754.read(buf, offset, littleEndian, 52, 8)\n}\n\nBuffer.prototype.readDoubleLE = function (offset, noAssert) {\n  return readDouble(this, offset, true, noAssert)\n}\n\nBuffer.prototype.readDoubleBE = function (offset, noAssert) {\n  return readDouble(this, offset, false, noAssert)\n}\n\nBuffer.prototype.writeUInt8 = function (value, offset, noAssert) {\n  if (!noAssert) {\n    assert(value !== undefined && value !== null, 'missing value')\n    assert(offset !== undefined && offset !== null, 'missing offset')\n    assert(offset < this.length, 'trying to write beyond buffer length')\n    verifuint(value, 0xff)\n  }\n\n  if (offset >= this.length) return\n\n  this[offset] = value\n  return offset + 1\n}\n\nfunction writeUInt16 (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    assert(value !== undefined && value !== null, 'missing value')\n    assert(typeof littleEndian === 'boolean', 'missing or invalid endian')\n    assert(offset !== undefined && offset !== null, 'missing offset')\n    assert(offset + 1 < buf.length, 'trying to write beyond buffer length')\n    verifuint(value, 0xffff)\n  }\n\n  var len = buf.length\n  if (offset >= len)\n    return\n\n  for (var i = 0, j = Math.min(len - offset, 2); i < j; i++) {\n    buf[offset + i] =\n        (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n            (littleEndian ? i : 1 - i) * 8\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16LE = function (value, offset, noAssert) {\n  return writeUInt16(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeUInt16BE = function (value, offset, noAssert) {\n  return writeUInt16(this, value, offset, false, noAssert)\n}\n\nfunction writeUInt32 (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    assert(value !== undefined && value !== null, 'missing value')\n    assert(typeof littleEndian === 'boolean', 'missing or invalid endian')\n    assert(offset !== undefined && offset !== null, 'missing offset')\n    assert(offset + 3 < buf.length, 'trying to write beyond buffer length')\n    verifuint(value, 0xffffffff)\n  }\n\n  var len = buf.length\n  if (offset >= len)\n    return\n\n  for (var i = 0, j = Math.min(len - offset, 4); i < j; i++) {\n    buf[offset + i] =\n        (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32LE = function (value, offset, noAssert) {\n  return writeUInt32(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeUInt32BE = function (value, offset, noAssert) {\n  return writeUInt32(this, value, offset, false, noAssert)\n}\n\nBuffer.prototype.writeInt8 = function (value, offset, noAssert) {\n  if (!noAssert) {\n    assert(value !== undefined && value !== null, 'missing value')\n    assert(offset !== undefined && offset !== null, 'missing offset')\n    assert(offset < this.length, 'Trying to write beyond buffer length')\n    verifsint(value, 0x7f, -0x80)\n  }\n\n  if (offset >= this.length)\n    return\n\n  if (value >= 0)\n    this.writeUInt8(value, offset, noAssert)\n  else\n    this.writeUInt8(0xff + value + 1, offset, noAssert)\n  return offset + 1\n}\n\nfunction writeInt16 (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    assert(value !== undefined && value !== null, 'missing value')\n    assert(typeof littleEndian === 'boolean', 'missing or invalid endian')\n    assert(offset !== undefined && offset !== null, 'missing offset')\n    assert(offset + 1 < buf.length, 'Trying to write beyond buffer length')\n    verifsint(value, 0x7fff, -0x8000)\n  }\n\n  var len = buf.length\n  if (offset >= len)\n    return\n\n  if (value >= 0)\n    writeUInt16(buf, value, offset, littleEndian, noAssert)\n  else\n    writeUInt16(buf, 0xffff + value + 1, offset, littleEndian, noAssert)\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16LE = function (value, offset, noAssert) {\n  return writeInt16(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeInt16BE = function (value, offset, noAssert) {\n  return writeInt16(this, value, offset, false, noAssert)\n}\n\nfunction writeInt32 (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    assert(value !== undefined && value !== null, 'missing value')\n    assert(typeof littleEndian === 'boolean', 'missing or invalid endian')\n    assert(offset !== undefined && offset !== null, 'missing offset')\n    assert(offset + 3 < buf.length, 'Trying to write beyond buffer length')\n    verifsint(value, 0x7fffffff, -0x80000000)\n  }\n\n  var len = buf.length\n  if (offset >= len)\n    return\n\n  if (value >= 0)\n    writeUInt32(buf, value, offset, littleEndian, noAssert)\n  else\n    writeUInt32(buf, 0xffffffff + value + 1, offset, littleEndian, noAssert)\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32LE = function (value, offset, noAssert) {\n  return writeInt32(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeInt32BE = function (value, offset, noAssert) {\n  return writeInt32(this, value, offset, false, noAssert)\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    assert(value !== undefined && value !== null, 'missing value')\n    assert(typeof littleEndian === 'boolean', 'missing or invalid endian')\n    assert(offset !== undefined && offset !== null, 'missing offset')\n    assert(offset + 3 < buf.length, 'Trying to write beyond buffer length')\n    verifIEEE754(value, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n\n  var len = buf.length\n  if (offset >= len)\n    return\n\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    assert(value !== undefined && value !== null, 'missing value')\n    assert(typeof littleEndian === 'boolean', 'missing or invalid endian')\n    assert(offset !== undefined && offset !== null, 'missing offset')\n    assert(offset + 7 < buf.length,\n        'Trying to write beyond buffer length')\n    verifIEEE754(value, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n\n  var len = buf.length\n  if (offset >= len)\n    return\n\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// fill(value, start=0, end=buffer.length)\nBuffer.prototype.fill = function (value, start, end) {\n  if (!value) value = 0\n  if (!start) start = 0\n  if (!end) end = this.length\n\n  assert(end >= start, 'end < start')\n\n  // Fill 0 bytes; we're done\n  if (end === start) return\n  if (this.length === 0) return\n\n  assert(start >= 0 && start < this.length, 'start out of bounds')\n  assert(end >= 0 && end <= this.length, 'end out of bounds')\n\n  var i\n  if (typeof value === 'number') {\n    for (i = start; i < end; i++) {\n      this[i] = value\n    }\n  } else {\n    var bytes = utf8ToBytes(value.toString())\n    var len = bytes.length\n    for (i = start; i < end; i++) {\n      this[i] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\nBuffer.prototype.inspect = function () {\n  var out = []\n  var len = this.length\n  for (var i = 0; i < len; i++) {\n    out[i] = toHex(this[i])\n    if (i === exports.INSPECT_MAX_BYTES) {\n      out[i + 1] = '...'\n      break\n    }\n  }\n  return '<Buffer ' + out.join(' ') + '>'\n}\n\n/**\n * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.\n * Added in Node 0.12. Only available in browsers that support ArrayBuffer.\n */\nBuffer.prototype.toArrayBuffer = function () {\n  if (typeof Uint8Array !== 'undefined') {\n    if (TYPED_ARRAY_SUPPORT) {\n      return (new Buffer(this)).buffer\n    } else {\n      var buf = new Uint8Array(this.length)\n      for (var i = 0, len = buf.length; i < len; i += 1) {\n        buf[i] = this[i]\n      }\n      return buf.buffer\n    }\n  } else {\n    throw new Error('Buffer.toArrayBuffer not supported in this browser')\n  }\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar BP = Buffer.prototype\n\n/**\n * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods\n */\nBuffer._augment = function (arr) {\n  arr._isBuffer = true\n\n  // save reference to original Uint8Array get/set methods before overwriting\n  arr._get = arr.get\n  arr._set = arr.set\n\n  // deprecated, will be removed in node 0.13+\n  arr.get = BP.get\n  arr.set = BP.set\n\n  arr.write = BP.write\n  arr.toString = BP.toString\n  arr.toLocaleString = BP.toString\n  arr.toJSON = BP.toJSON\n  arr.equals = BP.equals\n  arr.compare = BP.compare\n  arr.copy = BP.copy\n  arr.slice = BP.slice\n  arr.readUInt8 = BP.readUInt8\n  arr.readUInt16LE = BP.readUInt16LE\n  arr.readUInt16BE = BP.readUInt16BE\n  arr.readUInt32LE = BP.readUInt32LE\n  arr.readUInt32BE = BP.readUInt32BE\n  arr.readInt8 = BP.readInt8\n  arr.readInt16LE = BP.readInt16LE\n  arr.readInt16BE = BP.readInt16BE\n  arr.readInt32LE = BP.readInt32LE\n  arr.readInt32BE = BP.readInt32BE\n  arr.readFloatLE = BP.readFloatLE\n  arr.readFloatBE = BP.readFloatBE\n  arr.readDoubleLE = BP.readDoubleLE\n  arr.readDoubleBE = BP.readDoubleBE\n  arr.writeUInt8 = BP.writeUInt8\n  arr.writeUInt16LE = BP.writeUInt16LE\n  arr.writeUInt16BE = BP.writeUInt16BE\n  arr.writeUInt32LE = BP.writeUInt32LE\n  arr.writeUInt32BE = BP.writeUInt32BE\n  arr.writeInt8 = BP.writeInt8\n  arr.writeInt16LE = BP.writeInt16LE\n  arr.writeInt16BE = BP.writeInt16BE\n  arr.writeInt32LE = BP.writeInt32LE\n  arr.writeInt32BE = BP.writeInt32BE\n  arr.writeFloatLE = BP.writeFloatLE\n  arr.writeFloatBE = BP.writeFloatBE\n  arr.writeDoubleLE = BP.writeDoubleLE\n  arr.writeDoubleBE = BP.writeDoubleBE\n  arr.fill = BP.fill\n  arr.inspect = BP.inspect\n  arr.toArrayBuffer = BP.toArrayBuffer\n\n  return arr\n}\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-z]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction isArray (subject) {\n  return (Array.isArray || function (subject) {\n    return Object.prototype.toString.call(subject) === '[object Array]'\n  })(subject)\n}\n\nfunction isArrayish (subject) {\n  return isArray(subject) || Buffer.isBuffer(subject) ||\n      subject && typeof subject === 'object' &&\n      typeof subject.length === 'number'\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; i++) {\n    var b = str.charCodeAt(i)\n    if (b <= 0x7F) {\n      byteArray.push(b)\n    } else {\n      var start = i\n      if (b >= 0xD800 && b <= 0xDFFF) i++\n      var h = encodeURIComponent(str.slice(start, i+1)).substr(1).split('%')\n      for (var j = 0; j < h.length; j++) {\n        byteArray.push(parseInt(h[j], 16))\n      }\n    }\n  }\n  return byteArray\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; i++) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; i++) {\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(str)\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; i++) {\n    if ((i + offset >= dst.length) || (i >= src.length))\n      break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\nfunction decodeUtf8Char (str) {\n  try {\n    return decodeURIComponent(str)\n  } catch (err) {\n    return String.fromCharCode(0xFFFD) // UTF 8 invalid char\n  }\n}\n\n/*\n * We have to make sure that the value is a valid integer. This means that it\n * is non-negative. It has no fractional component and that it does not\n * exceed the maximum allowed value.\n */\nfunction verifuint (value, max) {\n  assert(typeof value === 'number', 'cannot write a non-number as a number')\n  assert(value >= 0, 'specified a negative value for writing an unsigned value')\n  assert(value <= max, 'value is larger than maximum value for type')\n  assert(Math.floor(value) === value, 'value has a fractional component')\n}\n\nfunction verifsint (value, max, min) {\n  assert(typeof value === 'number', 'cannot write a non-number as a number')\n  assert(value <= max, 'value larger than maximum allowed value')\n  assert(value >= min, 'value smaller than minimum allowed value')\n  assert(Math.floor(value) === value, 'value has a fractional component')\n}\n\nfunction verifIEEE754 (value, max, min) {\n  assert(typeof value === 'number', 'cannot write a non-number as a number')\n  assert(value <= max, 'value larger than maximum allowed value')\n  assert(value >= min, 'value smaller than minimum allowed value')\n}\n\nfunction assert (test, message) {\n  if (!test) throw new Error(message || 'Failed assertion')\n}\n","//based on https://gist.github.com/mbostock/3916621\n\nvar d3 = require('d3');\n\nmodule.exports = function (coords0, coords1) {\n  if (coords0.length !== coords1.length) return; //error\n\n  return function() {\n    // Compute point-interpolators at each distance.\n    var points = coords0.map(function(pair0, i) {\n      return d3.interpolate([pair0[0], pair0[1]], [coords1[i][0], coords1[i][1]]);\n    });\n \n    return function(t) {\n      return points.map(function(p) { return p(t); });\n    };\n  };\n}","// based heavily on https://github.com/pleasetrythisathome/react.animate\n\n\nvar d3 = require('d3');\nvar _ = require('lodash');\n\n\n\nmodule.exports = function(attr, targetValue, duration, ease) {\n    var cmp = this;\n    var interpolator;\n    if (_.isFunction(targetValue)) {\n      interpolator = targetValue;\n      console.log('is function', interpolator)\n    } else {\n      interpolator = d3.interpolate(this.state[attr], targetValue);\n      console.log('not a function')\n    }\n    var ease = d3.ease(ease || 'cubic-in-out');\n    var start = null;\n    var duration = duration || 500;\n\n    var tick = function(timeStamp) {\n      var t0,t1,value; \n      if (start === null) start = timeStamp;\n      t0 = (timeStamp - start)/duration;\n      t1 = ease(t0);\n      cmp.setState(_.object([attr], [interpolator(t1)]));\n      if (t0 < 1) {\n        requestAnimationFrame(tick)\n      }\n    }\n    \n    requestAnimationFrame(tick);\n\n  }","// based on http://bl.ocks.org/mbostock/3081153\nvar d3 = require('d3');\n\nmodule.exports = function(options) {\n  var circle = [],\n      length = 0,\n      lengths = [length],\n      coordinates = options.coordinates || null,\n      n = coordinates ? coordinates.length : 40,\n      p0,\n      p1,\n      x,\n      y,\n      i = 0;\n\n  var area, radius, centroid, polygon, circumference;\n      \n  if (coordinates) {\n    p0 = coordinates[0];\n    polygon = d3.geom.polygon(coordinates);\n    area = polygon.area();\n    radius = Math.sqrt(Math.abs(area) / Math.PI);\n    centroid = polygon.centroid() //polygon.centroid(-1 / (6 * area));\n\n    while (++i < n) {\n      p1 = coordinates[i];\n      x = p1[0] - p0[0];\n      y = p1[1] - p0[1];\n      lengths.push(length += Math.sqrt(x * x + y * y));\n      p0 = p1;\n    };\n\n    console.log(lengths)\n\n  } else {\n    radius = options.radius;\n    circumference = 2*Math.PI*radius;\n    centroid = options.centroid;\n    circumferenceOffset = circumference/n;\n    while (++i < n) {\n      length += circumferenceOffset\n      lengths.push(length)\n    }\n\n  }\n  // Compute the distances of each coordinate.\n  var angleOffset = -Math.PI / 2, // TODO compute automatically\n      angle,\n      i = -1,\n      k = 2 * Math.PI / lengths[lengths.length - 1],\n      angleIncrement = (2 * Math.PI) / n;\n\n  var test = [];\n  var a = angleOffset;\n\n  // Compute points along the circle’s circumference at equivalent distances.\n\n  //TODO tidy this up\n  while (++i < n) {\n\n    test.push([\n      centroid[0] + radius * Math.cos(a),\n      centroid[1] + radius * Math.sin(a)\n      ])\n    a = angleOffset + (angleIncrement * i)\n   \n\n\n    angle = angleOffset + lengths[i] * k;\n     console.log(a, angle, Math.cos(a))\n    circle.push([\n      centroid[0] + radius * Math.cos(angle),\n      centroid[1] + radius * Math.sin(angle)\n    ]);\n    console.log(centroid[0] + radius * Math.sin(angle), 'y')\n    console.log(centroid[0] + radius * Math.sin(a), 'testy')\n\n  };\n\n  console.log(test, 'test', circle)\n\n  return test;\n\n}","var Emitter = require('events/')\n\nmodule.exports = attach\n\nfunction attach(element, listener) {\n  var position = new Emitter\n\n  position.x = 0\n  position.y = 0\n  position.prevX = 0\n  position.prevY = 0\n  position.flush = flush\n\n  if (typeof window === 'undefined') {\n    return position\n  }\n\n  listener = listener || element || window\n  element  = element  || document.body\n  listener.addEventListener('mousemove', (\n       element === document.body\n    || element === window\n  ) ? function(e) {\n      position.prevX = position.x\n      position.prevY = position.y\n      position.x = e.clientX\n      position.y = e.clientY\n      position.emit('move', e)\n    }\n    : function(e) {\n      position.prevX = position.x\n      position.prevY = position.y\n      var bounds = element.getBoundingClientRect()\n      position.x = e.clientX - bounds.left\n      position.y = e.clientY - bounds.top\n      position.emit('move', e)\n    }\n  , false)\n\n  return position\n\n  function flush() {\n    this.prevX = this.x\n    this.prevY = this.y\n  }\n}\n","// shim for using process in browser\n\nvar process = module.exports = {};\n\nprocess.nextTick = (function () {\n    var canSetImmediate = typeof window !== 'undefined'\n    && window.setImmediate;\n    var canPost = typeof window !== 'undefined'\n    && window.postMessage && window.addEventListener\n    ;\n\n    if (canSetImmediate) {\n        return function (f) { return window.setImmediate(f) };\n    }\n\n    if (canPost) {\n        var queue = [];\n        window.addEventListener('message', function (ev) {\n            var source = ev.source;\n            if ((source === window || source === null) && ev.data === 'process-tick') {\n                ev.stopPropagation();\n                if (queue.length > 0) {\n                    var fn = queue.shift();\n                    fn();\n                }\n            }\n        }, true);\n\n        return function nextTick(fn) {\n            queue.push(fn);\n            window.postMessage('process-tick', '*');\n        };\n    }\n\n    return function nextTick(fn) {\n        setTimeout(fn, 0);\n    };\n})();\n\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n}\n\n// TODO(shtylman)\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule React\n */\n\n\"use strict\";\n\nvar DOMPropertyOperations = require(\"./DOMPropertyOperations\");\nvar EventPluginUtils = require(\"./EventPluginUtils\");\nvar ReactChildren = require(\"./ReactChildren\");\nvar ReactComponent = require(\"./ReactComponent\");\nvar ReactCompositeComponent = require(\"./ReactCompositeComponent\");\nvar ReactContext = require(\"./ReactContext\");\nvar ReactCurrentOwner = require(\"./ReactCurrentOwner\");\nvar ReactDescriptor = require(\"./ReactDescriptor\");\nvar ReactDOM = require(\"./ReactDOM\");\nvar ReactDOMComponent = require(\"./ReactDOMComponent\");\nvar ReactDefaultInjection = require(\"./ReactDefaultInjection\");\nvar ReactInstanceHandles = require(\"./ReactInstanceHandles\");\nvar ReactMount = require(\"./ReactMount\");\nvar ReactMultiChild = require(\"./ReactMultiChild\");\nvar ReactPerf = require(\"./ReactPerf\");\nvar ReactPropTypes = require(\"./ReactPropTypes\");\nvar ReactServerRendering = require(\"./ReactServerRendering\");\nvar ReactTextComponent = require(\"./ReactTextComponent\");\n\nvar onlyChild = require(\"./onlyChild\");\n\nReactDefaultInjection.inject();\n\nvar React = {\n  Children: {\n    map: ReactChildren.map,\n    forEach: ReactChildren.forEach,\n    count: ReactChildren.count,\n    only: onlyChild\n  },\n  DOM: ReactDOM,\n  PropTypes: ReactPropTypes,\n  initializeTouchEvents: function(shouldUseTouch) {\n    EventPluginUtils.useTouchEvents = shouldUseTouch;\n  },\n  createClass: ReactCompositeComponent.createClass,\n  createDescriptor: function(type, props, children) {\n    var args = Array.prototype.slice.call(arguments, 1);\n    return type.apply(null, args);\n  },\n  constructAndRenderComponent: ReactMount.constructAndRenderComponent,\n  constructAndRenderComponentByID: ReactMount.constructAndRenderComponentByID,\n  renderComponent: ReactPerf.measure(\n    'React',\n    'renderComponent',\n    ReactMount.renderComponent\n  ),\n  renderComponentToString: ReactServerRendering.renderComponentToString,\n  renderComponentToStaticMarkup:\n    ReactServerRendering.renderComponentToStaticMarkup,\n  unmountComponentAtNode: ReactMount.unmountComponentAtNode,\n  isValidClass: ReactDescriptor.isValidFactory,\n  isValidComponent: ReactDescriptor.isValidDescriptor,\n  withContext: ReactContext.withContext,\n  __internals: {\n    Component: ReactComponent,\n    CurrentOwner: ReactCurrentOwner,\n    DOMComponent: ReactDOMComponent,\n    DOMPropertyOperations: DOMPropertyOperations,\n    InstanceHandles: ReactInstanceHandles,\n    Mount: ReactMount,\n    MultiChild: ReactMultiChild,\n    TextComponent: ReactTextComponent\n  }\n};\n\nif (\"production\" !== process.env.NODE_ENV) {\n  var ExecutionEnvironment = require(\"./ExecutionEnvironment\");\n  if (ExecutionEnvironment.canUseDOM &&\n      window.top === window.self &&\n      navigator.userAgent.indexOf('Chrome') > -1) {\n    console.debug(\n      'Download the React DevTools for a better development experience: ' +\n      'http://fb.me/react-devtools'\n    );\n\n    var expectedFeatures = [\n      // shims\n      Array.isArray,\n      Array.prototype.every,\n      Array.prototype.forEach,\n      Array.prototype.indexOf,\n      Array.prototype.map,\n      Date.now,\n      Function.prototype.bind,\n      Object.keys,\n      String.prototype.split,\n      String.prototype.trim,\n\n      // shams\n      Object.create,\n      Object.freeze\n    ];\n\n    for (var i in expectedFeatures) {\n      if (!expectedFeatures[i]) {\n        console.error(\n          'One or more ES5 shim/shams expected by React are not available: ' +\n          'http://fb.me/react-warning-polyfills'\n        );\n        break;\n      }\n    }\n  }\n}\n\n// Version exists only in the open-source version of React, not in Facebook's\n// internal version.\nReact.version = '0.11.1';\n\nmodule.exports = React;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule LinkedStateMixin\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar ReactLink = require(\"./ReactLink\");\nvar ReactStateSetters = require(\"./ReactStateSetters\");\n\n/**\n * A simple mixin around ReactLink.forState().\n */\nvar LinkedStateMixin = {\n  /**\n   * Create a ReactLink that's linked to part of this component's state. The\n   * ReactLink will have the current value of this.state[key] and will call\n   * setState() when a change is requested.\n   *\n   * @param {string} key state key to update. Note: you may want to use keyOf()\n   * if you're using Google Closure Compiler advanced mode.\n   * @return {ReactLink} ReactLink instance linking to the state.\n   */\n  linkState: function(key) {\n    return new ReactLink(\n      this.state[key],\n      ReactStateSetters.createStateKeySetter(this, key)\n    );\n  }\n};\n\nmodule.exports = LinkedStateMixin;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n* @providesModule ReactComponentWithPureRenderMixin\n*/\n\n\"use strict\";\n\nvar shallowEqual = require(\"./shallowEqual\");\n\n/**\n * If your React component's render function is \"pure\", e.g. it will render the\n * same result given the same props and state, provide this Mixin for a\n * considerable performance boost.\n *\n * Most React components have pure render functions.\n *\n * Example:\n *\n *   var ReactComponentWithPureRenderMixin =\n *     require('ReactComponentWithPureRenderMixin');\n *   React.createClass({\n *     mixins: [ReactComponentWithPureRenderMixin],\n *\n *     render: function() {\n *       return <div className={this.props.className}>foo</div>;\n *     }\n *   });\n *\n * Note: This only checks shallow equality for props and state. If these contain\n * complex data structures this mixin may have false-negatives for deeper\n * differences. Only mixin to components which have simple props and state, or\n * use `forceUpdate()` when you know deep data structures have changed.\n */\nvar ReactComponentWithPureRenderMixin = {\n  shouldComponentUpdate: function(nextProps, nextState) {\n    return !shallowEqual(this.props, nextProps) ||\n           !shallowEqual(this.state, nextState);\n  }\n};\n\nmodule.exports = ReactComponentWithPureRenderMixin;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @typechecks\n * @providesModule ReactCSSTransitionGroup\n */\n\n\"use strict\";\n\nvar React = require(\"./React\");\n\nvar ReactTransitionGroup = require(\"./ReactTransitionGroup\");\nvar ReactCSSTransitionGroupChild = require(\"./ReactCSSTransitionGroupChild\");\n\nvar ReactCSSTransitionGroup = React.createClass({\n  displayName: 'ReactCSSTransitionGroup',\n\n  propTypes: {\n    transitionName: React.PropTypes.string.isRequired,\n    transitionEnter: React.PropTypes.bool,\n    transitionLeave: React.PropTypes.bool\n  },\n\n  getDefaultProps: function() {\n    return {\n      transitionEnter: true,\n      transitionLeave: true\n    };\n  },\n\n  _wrapChild: function(child) {\n    // We need to provide this childFactory so that\n    // ReactCSSTransitionGroupChild can receive updates to name, enter, and\n    // leave while it is leaving.\n    return ReactCSSTransitionGroupChild(\n      {\n        name: this.props.transitionName,\n        enter: this.props.transitionEnter,\n        leave: this.props.transitionLeave\n      },\n      child\n    );\n  },\n\n  render: function() {\n    return this.transferPropsTo(\n      ReactTransitionGroup(\n        {childFactory: this._wrapChild},\n        this.props.children\n      )\n    );\n  }\n});\n\nmodule.exports = ReactCSSTransitionGroup;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactTransitionGroup\n */\n\n\"use strict\";\n\nvar React = require(\"./React\");\nvar ReactTransitionChildMapping = require(\"./ReactTransitionChildMapping\");\n\nvar cloneWithProps = require(\"./cloneWithProps\");\nvar emptyFunction = require(\"./emptyFunction\");\nvar merge = require(\"./merge\");\n\nvar ReactTransitionGroup = React.createClass({\n  displayName: 'ReactTransitionGroup',\n\n  propTypes: {\n    component: React.PropTypes.func,\n    childFactory: React.PropTypes.func\n  },\n\n  getDefaultProps: function() {\n    return {\n      component: React.DOM.span,\n      childFactory: emptyFunction.thatReturnsArgument\n    };\n  },\n\n  getInitialState: function() {\n    return {\n      children: ReactTransitionChildMapping.getChildMapping(this.props.children)\n    };\n  },\n\n  componentWillReceiveProps: function(nextProps) {\n    var nextChildMapping = ReactTransitionChildMapping.getChildMapping(\n      nextProps.children\n    );\n    var prevChildMapping = this.state.children;\n\n    this.setState({\n      children: ReactTransitionChildMapping.mergeChildMappings(\n        prevChildMapping,\n        nextChildMapping\n      )\n    });\n\n    var key;\n\n    for (key in nextChildMapping) {\n      var hasPrev = prevChildMapping && prevChildMapping.hasOwnProperty(key);\n      if (nextChildMapping[key] && !hasPrev &&\n          !this.currentlyTransitioningKeys[key]) {\n        this.keysToEnter.push(key);\n      }\n    }\n\n    for (key in prevChildMapping) {\n      var hasNext = nextChildMapping && nextChildMapping.hasOwnProperty(key);\n      if (prevChildMapping[key] && !hasNext &&\n          !this.currentlyTransitioningKeys[key]) {\n        this.keysToLeave.push(key);\n      }\n    }\n\n    // If we want to someday check for reordering, we could do it here.\n  },\n\n  componentWillMount: function() {\n    this.currentlyTransitioningKeys = {};\n    this.keysToEnter = [];\n    this.keysToLeave = [];\n  },\n\n  componentDidUpdate: function() {\n    var keysToEnter = this.keysToEnter;\n    this.keysToEnter = [];\n    keysToEnter.forEach(this.performEnter);\n\n    var keysToLeave = this.keysToLeave;\n    this.keysToLeave = [];\n    keysToLeave.forEach(this.performLeave);\n  },\n\n  performEnter: function(key) {\n    this.currentlyTransitioningKeys[key] = true;\n\n    var component = this.refs[key];\n\n    if (component.componentWillEnter) {\n      component.componentWillEnter(\n        this._handleDoneEntering.bind(this, key)\n      );\n    } else {\n      this._handleDoneEntering(key);\n    }\n  },\n\n  _handleDoneEntering: function(key) {\n    var component = this.refs[key];\n    if (component.componentDidEnter) {\n      component.componentDidEnter();\n    }\n\n    delete this.currentlyTransitioningKeys[key];\n\n    var currentChildMapping = ReactTransitionChildMapping.getChildMapping(\n      this.props.children\n    );\n\n    if (!currentChildMapping || !currentChildMapping.hasOwnProperty(key)) {\n      // This was removed before it had fully entered. Remove it.\n      this.performLeave(key);\n    }\n  },\n\n  performLeave: function(key) {\n    this.currentlyTransitioningKeys[key] = true;\n\n    var component = this.refs[key];\n    if (component.componentWillLeave) {\n      component.componentWillLeave(this._handleDoneLeaving.bind(this, key));\n    } else {\n      // Note that this is somewhat dangerous b/c it calls setState()\n      // again, effectively mutating the component before all the work\n      // is done.\n      this._handleDoneLeaving(key);\n    }\n  },\n\n  _handleDoneLeaving: function(key) {\n    var component = this.refs[key];\n\n    if (component.componentDidLeave) {\n      component.componentDidLeave();\n    }\n\n    delete this.currentlyTransitioningKeys[key];\n\n    var currentChildMapping = ReactTransitionChildMapping.getChildMapping(\n      this.props.children\n    );\n\n    if (currentChildMapping && currentChildMapping.hasOwnProperty(key)) {\n      // This entered again before it fully left. Add it again.\n      this.performEnter(key);\n    } else {\n      var newChildren = merge(this.state.children);\n      delete newChildren[key];\n      this.setState({children: newChildren});\n    }\n  },\n\n  render: function() {\n    // TODO: we could get rid of the need for the wrapper node\n    // by cloning a single child\n    var childrenToRender = {};\n    for (var key in this.state.children) {\n      var child = this.state.children[key];\n      if (child) {\n        // You may need to apply reactive updates to a child as it is leaving.\n        // The normal React way to do it won't work since the child will have\n        // already been removed. In case you need this behavior you can provide\n        // a childFactory function to wrap every child, even the ones that are\n        // leaving.\n        childrenToRender[key] = cloneWithProps(\n          this.props.childFactory(child),\n          {ref: key}\n        );\n      }\n    }\n    return this.transferPropsTo(this.props.component(null, childrenToRender));\n  }\n});\n\nmodule.exports = ReactTransitionGroup;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule cx\n */\n\n/**\n * This function is used to mark string literals representing CSS class names\n * so that they can be transformed statically. This allows for modularization\n * and minification of CSS class names.\n *\n * In static_upstream, this function is actually implemented, but it should\n * eventually be replaced with something more descriptive, and the transform\n * that is used in the main stack should be ported for use elsewhere.\n *\n * @param string|object className to modularize, or an object of key/values.\n *                      In the object case, the values are conditions that\n *                      determine if the className keys should be included.\n * @param [string ...]  Variable list of classNames in the string case.\n * @return string       Renderable space-separated CSS className.\n */\nfunction cx(classNames) {\n  if (typeof classNames == 'object') {\n    return Object.keys(classNames).filter(function(className) {\n      return classNames[className];\n    }).join(' ');\n  } else {\n    return Array.prototype.join.call(arguments, ' ');\n  }\n}\n\nmodule.exports = cx;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @typechecks\n * @providesModule cloneWithProps\n */\n\n\"use strict\";\n\nvar ReactPropTransferer = require(\"./ReactPropTransferer\");\n\nvar keyOf = require(\"./keyOf\");\nvar warning = require(\"./warning\");\n\nvar CHILDREN_PROP = keyOf({children: null});\n\n/**\n * Sometimes you want to change the props of a child passed to you. Usually\n * this is to add a CSS class.\n *\n * @param {object} child child component you'd like to clone\n * @param {object} props props you'd like to modify. They will be merged\n * as if you used `transferPropsTo()`.\n * @return {object} a clone of child with props merged in.\n */\nfunction cloneWithProps(child, props) {\n  if (\"production\" !== process.env.NODE_ENV) {\n    (\"production\" !== process.env.NODE_ENV ? warning(\n      !child.props.ref,\n      'You are calling cloneWithProps() on a child with a ref. This is ' +\n      'dangerous because you\\'re creating a new child which will not be ' +\n      'added as a ref to its parent.'\n    ) : null);\n  }\n\n  var newProps = ReactPropTransferer.mergeProps(props, child.props);\n\n  // Use `child.props.children` if it is provided.\n  if (!newProps.hasOwnProperty(CHILDREN_PROP) &&\n      child.props.hasOwnProperty(CHILDREN_PROP)) {\n    newProps.children = child.props.children;\n  }\n\n  // The current API doesn't retain _owner and _context, which is why this\n  // doesn't use ReactDescriptor.cloneAndReplaceProps.\n  return child.constructor(newProps);\n}\n\nmodule.exports = cloneWithProps;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule update\n */\n\n\"use strict\";\n\nvar copyProperties = require(\"./copyProperties\");\nvar keyOf = require(\"./keyOf\");\nvar invariant = require(\"./invariant\");\n\nfunction shallowCopy(x) {\n  if (Array.isArray(x)) {\n    return x.concat();\n  } else if (x && typeof x === 'object') {\n    return copyProperties(new x.constructor(), x);\n  } else {\n    return x;\n  }\n}\n\nvar COMMAND_PUSH = keyOf({$push: null});\nvar COMMAND_UNSHIFT = keyOf({$unshift: null});\nvar COMMAND_SPLICE = keyOf({$splice: null});\nvar COMMAND_SET = keyOf({$set: null});\nvar COMMAND_MERGE = keyOf({$merge: null});\nvar COMMAND_APPLY = keyOf({$apply: null});\n\nvar ALL_COMMANDS_LIST = [\n  COMMAND_PUSH,\n  COMMAND_UNSHIFT,\n  COMMAND_SPLICE,\n  COMMAND_SET,\n  COMMAND_MERGE,\n  COMMAND_APPLY\n];\n\nvar ALL_COMMANDS_SET = {};\n\nALL_COMMANDS_LIST.forEach(function(command) {\n  ALL_COMMANDS_SET[command] = true;\n});\n\nfunction invariantArrayCase(value, spec, command) {\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    Array.isArray(value),\n    'update(): expected target of %s to be an array; got %s.',\n    command,\n    value\n  ) : invariant(Array.isArray(value)));\n  var specValue = spec[command];\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    Array.isArray(specValue),\n    'update(): expected spec of %s to be an array; got %s. ' +\n    'Did you forget to wrap your parameter in an array?',\n    command,\n    specValue\n  ) : invariant(Array.isArray(specValue)));\n}\n\nfunction update(value, spec) {\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    typeof spec === 'object',\n    'update(): You provided a key path to update() that did not contain one ' +\n    'of %s. Did you forget to include {%s: ...}?',\n    ALL_COMMANDS_LIST.join(', '),\n    COMMAND_SET\n  ) : invariant(typeof spec === 'object'));\n\n  if (spec.hasOwnProperty(COMMAND_SET)) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      Object.keys(spec).length === 1,\n      'Cannot have more than one key in an object with %s',\n      COMMAND_SET\n    ) : invariant(Object.keys(spec).length === 1));\n\n    return spec[COMMAND_SET];\n  }\n\n  var nextValue = shallowCopy(value);\n\n  if (spec.hasOwnProperty(COMMAND_MERGE)) {\n    var mergeObj = spec[COMMAND_MERGE];\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      mergeObj && typeof mergeObj === 'object',\n      'update(): %s expects a spec of type \\'object\\'; got %s',\n      COMMAND_MERGE,\n      mergeObj\n    ) : invariant(mergeObj && typeof mergeObj === 'object'));\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      nextValue && typeof nextValue === 'object',\n      'update(): %s expects a target of type \\'object\\'; got %s',\n      COMMAND_MERGE,\n      nextValue\n    ) : invariant(nextValue && typeof nextValue === 'object'));\n    copyProperties(nextValue, spec[COMMAND_MERGE]);\n  }\n\n  if (spec.hasOwnProperty(COMMAND_PUSH)) {\n    invariantArrayCase(value, spec, COMMAND_PUSH);\n    spec[COMMAND_PUSH].forEach(function(item) {\n      nextValue.push(item);\n    });\n  }\n\n  if (spec.hasOwnProperty(COMMAND_UNSHIFT)) {\n    invariantArrayCase(value, spec, COMMAND_UNSHIFT);\n    spec[COMMAND_UNSHIFT].forEach(function(item) {\n      nextValue.unshift(item);\n    });\n  }\n\n  if (spec.hasOwnProperty(COMMAND_SPLICE)) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      Array.isArray(value),\n      'Expected %s target to be an array; got %s',\n      COMMAND_SPLICE,\n      value\n    ) : invariant(Array.isArray(value)));\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      Array.isArray(spec[COMMAND_SPLICE]),\n      'update(): expected spec of %s to be an array of arrays; got %s. ' +\n      'Did you forget to wrap your parameters in an array?',\n      COMMAND_SPLICE,\n      spec[COMMAND_SPLICE]\n    ) : invariant(Array.isArray(spec[COMMAND_SPLICE])));\n    spec[COMMAND_SPLICE].forEach(function(args) {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        Array.isArray(args),\n        'update(): expected spec of %s to be an array of arrays; got %s. ' +\n        'Did you forget to wrap your parameters in an array?',\n        COMMAND_SPLICE,\n        spec[COMMAND_SPLICE]\n      ) : invariant(Array.isArray(args)));\n      nextValue.splice.apply(nextValue, args);\n    });\n  }\n\n  if (spec.hasOwnProperty(COMMAND_APPLY)) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      typeof spec[COMMAND_APPLY] === 'function',\n      'update(): expected spec of %s to be a function; got %s.',\n      COMMAND_APPLY,\n      spec[COMMAND_APPLY]\n    ) : invariant(typeof spec[COMMAND_APPLY] === 'function'));\n    nextValue = spec[COMMAND_APPLY](nextValue);\n  }\n\n  for (var k in spec) {\n    if (!(ALL_COMMANDS_SET.hasOwnProperty(k) && ALL_COMMANDS_SET[k])) {\n      nextValue[k] = update(value[k], spec[k]);\n    }\n  }\n\n  return nextValue;\n}\n\nmodule.exports = update;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDefaultPerf\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar DOMProperty = require(\"./DOMProperty\");\nvar ReactDefaultPerfAnalysis = require(\"./ReactDefaultPerfAnalysis\");\nvar ReactMount = require(\"./ReactMount\");\nvar ReactPerf = require(\"./ReactPerf\");\n\nvar performanceNow = require(\"./performanceNow\");\n\nfunction roundFloat(val) {\n  return Math.floor(val * 100) / 100;\n}\n\nfunction addValue(obj, key, val) {\n  obj[key] = (obj[key] || 0) + val;\n}\n\nvar ReactDefaultPerf = {\n  _allMeasurements: [], // last item in the list is the current one\n  _mountStack: [0],\n  _injected: false,\n\n  start: function() {\n    if (!ReactDefaultPerf._injected) {\n      ReactPerf.injection.injectMeasure(ReactDefaultPerf.measure);\n    }\n\n    ReactDefaultPerf._allMeasurements.length = 0;\n    ReactPerf.enableMeasure = true;\n  },\n\n  stop: function() {\n    ReactPerf.enableMeasure = false;\n  },\n\n  getLastMeasurements: function() {\n    return ReactDefaultPerf._allMeasurements;\n  },\n\n  printExclusive: function(measurements) {\n    measurements = measurements || ReactDefaultPerf._allMeasurements;\n    var summary = ReactDefaultPerfAnalysis.getExclusiveSummary(measurements);\n    console.table(summary.map(function(item) {\n      return {\n        'Component class name': item.componentName,\n        'Total inclusive time (ms)': roundFloat(item.inclusive),\n        'Exclusive mount time (ms)': roundFloat(item.exclusive),\n        'Exclusive render time (ms)': roundFloat(item.render),\n        'Mount time per instance (ms)': roundFloat(item.exclusive / item.count),\n        'Render time per instance (ms)': roundFloat(item.render / item.count),\n        'Instances': item.count\n      };\n    }));\n    // TODO: ReactDefaultPerfAnalysis.getTotalTime() does not return the correct\n    // number.\n  },\n\n  printInclusive: function(measurements) {\n    measurements = measurements || ReactDefaultPerf._allMeasurements;\n    var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(measurements);\n    console.table(summary.map(function(item) {\n      return {\n        'Owner > component': item.componentName,\n        'Inclusive time (ms)': roundFloat(item.time),\n        'Instances': item.count\n      };\n    }));\n    console.log(\n      'Total time:',\n      ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'\n    );\n  },\n\n  printWasted: function(measurements) {\n    measurements = measurements || ReactDefaultPerf._allMeasurements;\n    var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(\n      measurements,\n      true\n    );\n    console.table(summary.map(function(item) {\n      return {\n        'Owner > component': item.componentName,\n        'Wasted time (ms)': item.time,\n        'Instances': item.count\n      };\n    }));\n    console.log(\n      'Total time:',\n      ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'\n    );\n  },\n\n  printDOM: function(measurements) {\n    measurements = measurements || ReactDefaultPerf._allMeasurements;\n    var summary = ReactDefaultPerfAnalysis.getDOMSummary(measurements);\n    console.table(summary.map(function(item) {\n      var result = {};\n      result[DOMProperty.ID_ATTRIBUTE_NAME] = item.id;\n      result['type'] = item.type;\n      result['args'] = JSON.stringify(item.args);\n      return result;\n    }));\n    console.log(\n      'Total time:',\n      ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'\n    );\n  },\n\n  _recordWrite: function(id, fnName, totalTime, args) {\n    // TODO: totalTime isn't that useful since it doesn't count paints/reflows\n    var writes =\n      ReactDefaultPerf\n        ._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1]\n        .writes;\n    writes[id] = writes[id] || [];\n    writes[id].push({\n      type: fnName,\n      time: totalTime,\n      args: args\n    });\n  },\n\n  measure: function(moduleName, fnName, func) {\n    return function() {var args=Array.prototype.slice.call(arguments,0);\n      var totalTime;\n      var rv;\n      var start;\n\n      if (fnName === '_renderNewRootComponent' ||\n          fnName === 'flushBatchedUpdates') {\n        // A \"measurement\" is a set of metrics recorded for each flush. We want\n        // to group the metrics for a given flush together so we can look at the\n        // components that rendered and the DOM operations that actually\n        // happened to determine the amount of \"wasted work\" performed.\n        ReactDefaultPerf._allMeasurements.push({\n          exclusive: {},\n          inclusive: {},\n          render: {},\n          counts: {},\n          writes: {},\n          displayNames: {},\n          totalTime: 0\n        });\n        start = performanceNow();\n        rv = func.apply(this, args);\n        ReactDefaultPerf._allMeasurements[\n          ReactDefaultPerf._allMeasurements.length - 1\n        ].totalTime = performanceNow() - start;\n        return rv;\n      } else if (moduleName === 'ReactDOMIDOperations' ||\n        moduleName === 'ReactComponentBrowserEnvironment') {\n        start = performanceNow();\n        rv = func.apply(this, args);\n        totalTime = performanceNow() - start;\n\n        if (fnName === 'mountImageIntoNode') {\n          var mountID = ReactMount.getID(args[1]);\n          ReactDefaultPerf._recordWrite(mountID, fnName, totalTime, args[0]);\n        } else if (fnName === 'dangerouslyProcessChildrenUpdates') {\n          // special format\n          args[0].forEach(function(update) {\n            var writeArgs = {};\n            if (update.fromIndex !== null) {\n              writeArgs.fromIndex = update.fromIndex;\n            }\n            if (update.toIndex !== null) {\n              writeArgs.toIndex = update.toIndex;\n            }\n            if (update.textContent !== null) {\n              writeArgs.textContent = update.textContent;\n            }\n            if (update.markupIndex !== null) {\n              writeArgs.markup = args[1][update.markupIndex];\n            }\n            ReactDefaultPerf._recordWrite(\n              update.parentID,\n              update.type,\n              totalTime,\n              writeArgs\n            );\n          });\n        } else {\n          // basic format\n          ReactDefaultPerf._recordWrite(\n            args[0],\n            fnName,\n            totalTime,\n            Array.prototype.slice.call(args, 1)\n          );\n        }\n        return rv;\n      } else if (moduleName === 'ReactCompositeComponent' && (\n        fnName === 'mountComponent' ||\n        fnName === 'updateComponent' || // TODO: receiveComponent()?\n        fnName === '_renderValidatedComponent')) {\n\n        var rootNodeID = fnName === 'mountComponent' ?\n          args[0] :\n          this._rootNodeID;\n        var isRender = fnName === '_renderValidatedComponent';\n        var isMount = fnName === 'mountComponent';\n\n        var mountStack = ReactDefaultPerf._mountStack;\n        var entry = ReactDefaultPerf._allMeasurements[\n          ReactDefaultPerf._allMeasurements.length - 1\n        ];\n\n        if (isRender) {\n          addValue(entry.counts, rootNodeID, 1);\n        } else if (isMount) {\n          mountStack.push(0);\n        }\n\n        start = performanceNow();\n        rv = func.apply(this, args);\n        totalTime = performanceNow() - start;\n\n        if (isRender) {\n          addValue(entry.render, rootNodeID, totalTime);\n        } else if (isMount) {\n          var subMountTime = mountStack.pop();\n          mountStack[mountStack.length - 1] += totalTime;\n          addValue(entry.exclusive, rootNodeID, totalTime - subMountTime);\n          addValue(entry.inclusive, rootNodeID, totalTime);\n        } else {\n          addValue(entry.inclusive, rootNodeID, totalTime);\n        }\n\n        entry.displayNames[rootNodeID] = {\n          current: this.constructor.displayName,\n          owner: this._owner ? this._owner.constructor.displayName : '<root>'\n        };\n\n        return rv;\n      } else {\n        return func.apply(this, args);\n      }\n    };\n  }\n};\n\nmodule.exports = ReactDefaultPerf;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactTestUtils\n */\n\n\"use strict\";\n\nvar EventConstants = require(\"./EventConstants\");\nvar EventPluginHub = require(\"./EventPluginHub\");\nvar EventPropagators = require(\"./EventPropagators\");\nvar React = require(\"./React\");\nvar ReactDescriptor = require(\"./ReactDescriptor\");\nvar ReactDOM = require(\"./ReactDOM\");\nvar ReactBrowserEventEmitter = require(\"./ReactBrowserEventEmitter\");\nvar ReactMount = require(\"./ReactMount\");\nvar ReactTextComponent = require(\"./ReactTextComponent\");\nvar ReactUpdates = require(\"./ReactUpdates\");\nvar SyntheticEvent = require(\"./SyntheticEvent\");\n\nvar mergeInto = require(\"./mergeInto\");\nvar copyProperties = require(\"./copyProperties\");\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\nfunction Event(suffix) {}\n\n/**\n * @class ReactTestUtils\n */\n\n/**\n * Todo: Support the entire DOM.scry query syntax. For now, these simple\n * utilities will suffice for testing purposes.\n * @lends ReactTestUtils\n */\nvar ReactTestUtils = {\n  renderIntoDocument: function(instance) {\n    var div = document.createElement('div');\n    // None of our tests actually require attaching the container to the\n    // DOM, and doing so creates a mess that we rely on test isolation to\n    // clean up, so we're going to stop honoring the name of this method\n    // (and probably rename it eventually) if no problems arise.\n    // document.documentElement.appendChild(div);\n    return React.renderComponent(instance, div);\n  },\n\n  isDescriptor: function(descriptor) {\n    return ReactDescriptor.isValidDescriptor(descriptor);\n  },\n\n  isDescriptorOfType: function(inst, convenienceConstructor) {\n    return (\n      ReactDescriptor.isValidDescriptor(inst) &&\n      inst.type === convenienceConstructor.type\n    );\n  },\n\n  isDOMComponent: function(inst) {\n    return !!(inst && inst.mountComponent && inst.tagName);\n  },\n\n  isDOMComponentDescriptor: function(inst) {\n    return !!(inst &&\n              ReactDescriptor.isValidDescriptor(inst) &&\n              !!inst.tagName);\n  },\n\n  isCompositeComponent: function(inst) {\n    return typeof inst.render === 'function' &&\n           typeof inst.setState === 'function';\n  },\n\n  isCompositeComponentWithType: function(inst, type) {\n    return !!(ReactTestUtils.isCompositeComponent(inst) &&\n             (inst.constructor === type.type));\n  },\n\n  isCompositeComponentDescriptor: function(inst) {\n    if (!ReactDescriptor.isValidDescriptor(inst)) {\n      return false;\n    }\n    // We check the prototype of the type that will get mounted, not the\n    // instance itself. This is a future proof way of duck typing.\n    var prototype = inst.type.prototype;\n    return (\n      typeof prototype.render === 'function' &&\n      typeof prototype.setState === 'function'\n    );\n  },\n\n  isCompositeComponentDescriptorWithType: function(inst, type) {\n    return !!(ReactTestUtils.isCompositeComponentDescriptor(inst) &&\n             (inst.constructor === type));\n  },\n\n  isTextComponent: function(inst) {\n    return inst instanceof ReactTextComponent.type;\n  },\n\n  findAllInRenderedTree: function(inst, test) {\n    if (!inst) {\n      return [];\n    }\n    var ret = test(inst) ? [inst] : [];\n    if (ReactTestUtils.isDOMComponent(inst)) {\n      var renderedChildren = inst._renderedChildren;\n      var key;\n      for (key in renderedChildren) {\n        if (!renderedChildren.hasOwnProperty(key)) {\n          continue;\n        }\n        ret = ret.concat(\n          ReactTestUtils.findAllInRenderedTree(renderedChildren[key], test)\n        );\n      }\n    } else if (ReactTestUtils.isCompositeComponent(inst)) {\n      ret = ret.concat(\n        ReactTestUtils.findAllInRenderedTree(inst._renderedComponent, test)\n      );\n    }\n    return ret;\n  },\n\n  /**\n   * Finds all instance of components in the rendered tree that are DOM\n   * components with the class name matching `className`.\n   * @return an array of all the matches.\n   */\n  scryRenderedDOMComponentsWithClass: function(root, className) {\n    return ReactTestUtils.findAllInRenderedTree(root, function(inst) {\n      var instClassName = inst.props.className;\n      return ReactTestUtils.isDOMComponent(inst) && (\n        instClassName &&\n        (' ' + instClassName + ' ').indexOf(' ' + className + ' ') !== -1\n      );\n    });\n  },\n\n  /**\n   * Like scryRenderedDOMComponentsWithClass but expects there to be one result,\n   * and returns that one result, or throws exception if there is any other\n   * number of matches besides one.\n   * @return {!ReactDOMComponent} The one match.\n   */\n  findRenderedDOMComponentWithClass: function(root, className) {\n    var all =\n      ReactTestUtils.scryRenderedDOMComponentsWithClass(root, className);\n    if (all.length !== 1) {\n      throw new Error('Did not find exactly one match for class:' + className);\n    }\n    return all[0];\n  },\n\n\n  /**\n   * Finds all instance of components in the rendered tree that are DOM\n   * components with the tag name matching `tagName`.\n   * @return an array of all the matches.\n   */\n  scryRenderedDOMComponentsWithTag: function(root, tagName) {\n    return ReactTestUtils.findAllInRenderedTree(root, function(inst) {\n      return ReactTestUtils.isDOMComponent(inst) &&\n            inst.tagName === tagName.toUpperCase();\n    });\n  },\n\n  /**\n   * Like scryRenderedDOMComponentsWithTag but expects there to be one result,\n   * and returns that one result, or throws exception if there is any other\n   * number of matches besides one.\n   * @return {!ReactDOMComponent} The one match.\n   */\n  findRenderedDOMComponentWithTag: function(root, tagName) {\n    var all = ReactTestUtils.scryRenderedDOMComponentsWithTag(root, tagName);\n    if (all.length !== 1) {\n      throw new Error('Did not find exactly one match for tag:' + tagName);\n    }\n    return all[0];\n  },\n\n\n  /**\n   * Finds all instances of components with type equal to `componentType`.\n   * @return an array of all the matches.\n   */\n  scryRenderedComponentsWithType: function(root, componentType) {\n    return ReactTestUtils.findAllInRenderedTree(root, function(inst) {\n      return ReactTestUtils.isCompositeComponentWithType(\n        inst,\n        componentType\n      );\n    });\n  },\n\n  /**\n   * Same as `scryRenderedComponentsWithType` but expects there to be one result\n   * and returns that one result, or throws exception if there is any other\n   * number of matches besides one.\n   * @return {!ReactComponent} The one match.\n   */\n  findRenderedComponentWithType: function(root, componentType) {\n    var all = ReactTestUtils.scryRenderedComponentsWithType(\n      root,\n      componentType\n    );\n    if (all.length !== 1) {\n      throw new Error(\n        'Did not find exactly one match for componentType:' + componentType\n      );\n    }\n    return all[0];\n  },\n\n  /**\n   * Pass a mocked component module to this method to augment it with\n   * useful methods that allow it to be used as a dummy React component.\n   * Instead of rendering as usual, the component will become a simple\n   * <div> containing any provided children.\n   *\n   * @param {object} module the mock function object exported from a\n   *                        module that defines the component to be mocked\n   * @param {?string} mockTagName optional dummy root tag name to return\n   *                              from render method (overrides\n   *                              module.mockTagName if provided)\n   * @return {object} the ReactTestUtils object (for chaining)\n   */\n  mockComponent: function(module, mockTagName) {\n    var ConvenienceConstructor = React.createClass({\n      render: function() {\n        var mockTagName = mockTagName || module.mockTagName || \"div\";\n        return ReactDOM[mockTagName](null, this.props.children);\n      }\n    });\n\n    copyProperties(module, ConvenienceConstructor);\n    module.mockImplementation(ConvenienceConstructor);\n\n    return this;\n  },\n\n  /**\n   * Simulates a top level event being dispatched from a raw event that occured\n   * on an `Element` node.\n   * @param topLevelType {Object} A type from `EventConstants.topLevelTypes`\n   * @param {!Element} node The dom to simulate an event occurring on.\n   * @param {?Event} fakeNativeEvent Fake native event to use in SyntheticEvent.\n   */\n  simulateNativeEventOnNode: function(topLevelType, node, fakeNativeEvent) {\n    fakeNativeEvent.target = node;\n    ReactBrowserEventEmitter.ReactEventListener.dispatchEvent(\n      topLevelType,\n      fakeNativeEvent\n    );\n  },\n\n  /**\n   * Simulates a top level event being dispatched from a raw event that occured\n   * on the `ReactDOMComponent` `comp`.\n   * @param topLevelType {Object} A type from `EventConstants.topLevelTypes`.\n   * @param comp {!ReactDOMComponent}\n   * @param {?Event} fakeNativeEvent Fake native event to use in SyntheticEvent.\n   */\n  simulateNativeEventOnDOMComponent: function(\n      topLevelType,\n      comp,\n      fakeNativeEvent) {\n    ReactTestUtils.simulateNativeEventOnNode(\n      topLevelType,\n      comp.getDOMNode(),\n      fakeNativeEvent\n    );\n  },\n\n  nativeTouchData: function(x, y) {\n    return {\n      touches: [\n        {pageX: x, pageY: y}\n      ]\n    };\n  },\n\n  Simulate: null,\n  SimulateNative: {}\n};\n\n/**\n * Exports:\n *\n * - `ReactTestUtils.Simulate.click(Element/ReactDOMComponent)`\n * - `ReactTestUtils.Simulate.mouseMove(Element/ReactDOMComponent)`\n * - `ReactTestUtils.Simulate.change(Element/ReactDOMComponent)`\n * - ... (All keys from event plugin `eventTypes` objects)\n */\nfunction makeSimulator(eventType) {\n  return function(domComponentOrNode, eventData) {\n    var node;\n    if (ReactTestUtils.isDOMComponent(domComponentOrNode)) {\n      node = domComponentOrNode.getDOMNode();\n    } else if (domComponentOrNode.tagName) {\n      node = domComponentOrNode;\n    }\n\n    var fakeNativeEvent = new Event();\n    fakeNativeEvent.target = node;\n    // We don't use SyntheticEvent.getPooled in order to not have to worry about\n    // properly destroying any properties assigned from `eventData` upon release\n    var event = new SyntheticEvent(\n      ReactBrowserEventEmitter.eventNameDispatchConfigs[eventType],\n      ReactMount.getID(node),\n      fakeNativeEvent\n    );\n    mergeInto(event, eventData);\n    EventPropagators.accumulateTwoPhaseDispatches(event);\n\n    ReactUpdates.batchedUpdates(function() {\n      EventPluginHub.enqueueEvents(event);\n      EventPluginHub.processEventQueue();\n    });\n  };\n}\n\nfunction buildSimulators() {\n  ReactTestUtils.Simulate = {};\n\n  var eventType;\n  for (eventType in ReactBrowserEventEmitter.eventNameDispatchConfigs) {\n    /**\n     * @param {!Element || ReactDOMComponent} domComponentOrNode\n     * @param {?object} eventData Fake event data to use in SyntheticEvent.\n     */\n    ReactTestUtils.Simulate[eventType] = makeSimulator(eventType);\n  }\n}\n\n// Rebuild ReactTestUtils.Simulate whenever event plugins are injected\nvar oldInjectEventPluginOrder = EventPluginHub.injection.injectEventPluginOrder;\nEventPluginHub.injection.injectEventPluginOrder = function() {\n  oldInjectEventPluginOrder.apply(this, arguments);\n  buildSimulators();\n};\nvar oldInjectEventPlugins = EventPluginHub.injection.injectEventPluginsByName;\nEventPluginHub.injection.injectEventPluginsByName = function() {\n  oldInjectEventPlugins.apply(this, arguments);\n  buildSimulators();\n};\n\nbuildSimulators();\n\n/**\n * Exports:\n *\n * - `ReactTestUtils.SimulateNative.click(Element/ReactDOMComponent)`\n * - `ReactTestUtils.SimulateNative.mouseMove(Element/ReactDOMComponent)`\n * - `ReactTestUtils.SimulateNative.mouseIn/ReactDOMComponent)`\n * - `ReactTestUtils.SimulateNative.mouseOut(Element/ReactDOMComponent)`\n * - ... (All keys from `EventConstants.topLevelTypes`)\n *\n * Note: Top level event types are a subset of the entire set of handler types\n * (which include a broader set of \"synthetic\" events). For example, onDragDone\n * is a synthetic event. Except when testing an event plugin or React's event\n * handling code specifically, you probably want to use ReactTestUtils.Simulate\n * to dispatch synthetic events.\n */\n\nfunction makeNativeSimulator(eventType) {\n  return function(domComponentOrNode, nativeEventData) {\n    var fakeNativeEvent = new Event(eventType);\n    mergeInto(fakeNativeEvent, nativeEventData);\n    if (ReactTestUtils.isDOMComponent(domComponentOrNode)) {\n      ReactTestUtils.simulateNativeEventOnDOMComponent(\n        eventType,\n        domComponentOrNode,\n        fakeNativeEvent\n      );\n    } else if (!!domComponentOrNode.tagName) {\n      // Will allow on actual dom nodes.\n      ReactTestUtils.simulateNativeEventOnNode(\n        eventType,\n        domComponentOrNode,\n        fakeNativeEvent\n      );\n    }\n  };\n}\n\nvar eventType;\nfor (eventType in topLevelTypes) {\n  // Event type is stored as 'topClick' - we transform that to 'click'\n  var convenienceName = eventType.indexOf('top') === 0 ?\n    eventType.charAt(3).toLowerCase() + eventType.substr(4) : eventType;\n  /**\n   * @param {!Element || ReactDOMComponent} domComponentOrNode\n   * @param {?Event} nativeEventData Fake native event to use in SyntheticEvent.\n   */\n  ReactTestUtils.SimulateNative[convenienceName] =\n    makeNativeSimulator(eventType);\n}\n\nmodule.exports = ReactTestUtils;\n","exports.read = function(buffer, offset, isLE, mLen, nBytes) {\n  var e, m,\n      eLen = nBytes * 8 - mLen - 1,\n      eMax = (1 << eLen) - 1,\n      eBias = eMax >> 1,\n      nBits = -7,\n      i = isLE ? (nBytes - 1) : 0,\n      d = isLE ? -1 : 1,\n      s = buffer[offset + i];\n\n  i += d;\n\n  e = s & ((1 << (-nBits)) - 1);\n  s >>= (-nBits);\n  nBits += eLen;\n  for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8);\n\n  m = e & ((1 << (-nBits)) - 1);\n  e >>= (-nBits);\n  nBits += mLen;\n  for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8);\n\n  if (e === 0) {\n    e = 1 - eBias;\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity);\n  } else {\n    m = m + Math.pow(2, mLen);\n    e = e - eBias;\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen);\n};\n\nexports.write = function(buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c,\n      eLen = nBytes * 8 - mLen - 1,\n      eMax = (1 << eLen) - 1,\n      eBias = eMax >> 1,\n      rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0),\n      i = isLE ? 0 : (nBytes - 1),\n      d = isLE ? 1 : -1,\n      s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;\n\n  value = Math.abs(value);\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0;\n    e = eMax;\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2);\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--;\n      c *= 2;\n    }\n    if (e + eBias >= 1) {\n      value += rt / c;\n    } else {\n      value += rt * Math.pow(2, 1 - eBias);\n    }\n    if (value * c >= 2) {\n      e++;\n      c /= 2;\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0;\n      e = eMax;\n    } else if (e + eBias >= 1) {\n      m = (value * c - 1) * Math.pow(2, mLen);\n      e = e + eBias;\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);\n      e = 0;\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8);\n\n  e = (e << mLen) | m;\n  eLen += mLen;\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8);\n\n  buffer[offset + i - d] |= s * 128;\n};\n","var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n;(function (exports) {\n\t'use strict';\n\n  var Arr = (typeof Uint8Array !== 'undefined')\n    ? Uint8Array\n    : Array\n\n\tvar PLUS   = '+'.charCodeAt(0)\n\tvar SLASH  = '/'.charCodeAt(0)\n\tvar NUMBER = '0'.charCodeAt(0)\n\tvar LOWER  = 'a'.charCodeAt(0)\n\tvar UPPER  = 'A'.charCodeAt(0)\n\n\tfunction decode (elt) {\n\t\tvar code = elt.charCodeAt(0)\n\t\tif (code === PLUS)\n\t\t\treturn 62 // '+'\n\t\tif (code === SLASH)\n\t\t\treturn 63 // '/'\n\t\tif (code < NUMBER)\n\t\t\treturn -1 //no match\n\t\tif (code < NUMBER + 10)\n\t\t\treturn code - NUMBER + 26 + 26\n\t\tif (code < UPPER + 26)\n\t\t\treturn code - UPPER\n\t\tif (code < LOWER + 26)\n\t\t\treturn code - LOWER + 26\n\t}\n\n\tfunction b64ToByteArray (b64) {\n\t\tvar i, j, l, tmp, placeHolders, arr\n\n\t\tif (b64.length % 4 > 0) {\n\t\t\tthrow new Error('Invalid string. Length must be a multiple of 4')\n\t\t}\n\n\t\t// the number of equal signs (place holders)\n\t\t// if there are two placeholders, than the two characters before it\n\t\t// represent one byte\n\t\t// if there is only one, then the three characters before it represent 2 bytes\n\t\t// this is just a cheap hack to not do indexOf twice\n\t\tvar len = b64.length\n\t\tplaceHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0\n\n\t\t// base64 is 4/3 + up to two characters of the original data\n\t\tarr = new Arr(b64.length * 3 / 4 - placeHolders)\n\n\t\t// if there are placeholders, only get up to the last complete 4 chars\n\t\tl = placeHolders > 0 ? b64.length - 4 : b64.length\n\n\t\tvar L = 0\n\n\t\tfunction push (v) {\n\t\t\tarr[L++] = v\n\t\t}\n\n\t\tfor (i = 0, j = 0; i < l; i += 4, j += 3) {\n\t\t\ttmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))\n\t\t\tpush((tmp & 0xFF0000) >> 16)\n\t\t\tpush((tmp & 0xFF00) >> 8)\n\t\t\tpush(tmp & 0xFF)\n\t\t}\n\n\t\tif (placeHolders === 2) {\n\t\t\ttmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)\n\t\t\tpush(tmp & 0xFF)\n\t\t} else if (placeHolders === 1) {\n\t\t\ttmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)\n\t\t\tpush((tmp >> 8) & 0xFF)\n\t\t\tpush(tmp & 0xFF)\n\t\t}\n\n\t\treturn arr\n\t}\n\n\tfunction uint8ToBase64 (uint8) {\n\t\tvar i,\n\t\t\textraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes\n\t\t\toutput = \"\",\n\t\t\ttemp, length\n\n\t\tfunction encode (num) {\n\t\t\treturn lookup.charAt(num)\n\t\t}\n\n\t\tfunction tripletToBase64 (num) {\n\t\t\treturn encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)\n\t\t}\n\n\t\t// go through the array every three bytes, we'll deal with trailing stuff later\n\t\tfor (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {\n\t\t\ttemp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])\n\t\t\toutput += tripletToBase64(temp)\n\t\t}\n\n\t\t// pad the end with zeros, but make sure to not forget the extra bytes\n\t\tswitch (extraBytes) {\n\t\t\tcase 1:\n\t\t\t\ttemp = uint8[uint8.length - 1]\n\t\t\t\toutput += encode(temp >> 2)\n\t\t\t\toutput += encode((temp << 4) & 0x3F)\n\t\t\t\toutput += '=='\n\t\t\t\tbreak\n\t\t\tcase 2:\n\t\t\t\ttemp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])\n\t\t\t\toutput += encode(temp >> 10)\n\t\t\t\toutput += encode((temp >> 4) & 0x3F)\n\t\t\t\toutput += encode((temp << 2) & 0x3F)\n\t\t\t\toutput += '='\n\t\t\t\tbreak\n\t\t}\n\n\t\treturn output\n\t}\n\n\texports.toByteArray = b64ToByteArray\n\texports.fromByteArray = uint8ToBase64\n}(typeof exports === 'undefined' ? (this.base64js = {}) : exports))\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n\n  // If there is no 'error' event listener then throw.\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      } else {\n        throw TypeError('Uncaught, unspecified \"error\" event.');\n      }\n      return false;\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        len = arguments.length;\n        args = new Array(len - 1);\n        for (i = 1; i < len; i++)\n          args[i - 1] = arguments[i];\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    len = arguments.length;\n    args = new Array(len - 1);\n    for (i = 1; i < len; i++)\n      args[i - 1] = arguments[i];\n\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n\n  // To avoid recursion in the case that type === \"newListener\"! Before\n  // adding it to the listeners, first emit \"newListener\".\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  else\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n\n  // Check for listener leak\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    var m;\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      if (typeof console.trace === 'function') {\n        // not supported in IE 10\n        console.trace();\n      }\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n\n  // not listening for removeListener, no need to emit\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n\n  // emit removeListener for all listeners on all events\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else {\n    // LIFO order\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  var ret;\n  if (!emitter._events || !emitter._events[type])\n    ret = 0;\n  else if (isFunction(emitter._events[type]))\n    ret = 1;\n  else\n    ret = emitter._events[type].length;\n  return ret;\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule DOMPropertyOperations\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar DOMProperty = require(\"./DOMProperty\");\n\nvar escapeTextForBrowser = require(\"./escapeTextForBrowser\");\nvar memoizeStringOnly = require(\"./memoizeStringOnly\");\nvar warning = require(\"./warning\");\n\nfunction shouldIgnoreValue(name, value) {\n  return value == null ||\n    (DOMProperty.hasBooleanValue[name] && !value) ||\n    (DOMProperty.hasNumericValue[name] && isNaN(value)) ||\n    (DOMProperty.hasPositiveNumericValue[name] && (value < 1)) ||\n    (DOMProperty.hasOverloadedBooleanValue[name] && value === false);\n}\n\nvar processAttributeNameAndPrefix = memoizeStringOnly(function(name) {\n  return escapeTextForBrowser(name) + '=\"';\n});\n\nif (\"production\" !== process.env.NODE_ENV) {\n  var reactProps = {\n    children: true,\n    dangerouslySetInnerHTML: true,\n    key: true,\n    ref: true\n  };\n  var warnedProperties = {};\n\n  var warnUnknownProperty = function(name) {\n    if (reactProps.hasOwnProperty(name) && reactProps[name] ||\n        warnedProperties.hasOwnProperty(name) && warnedProperties[name]) {\n      return;\n    }\n\n    warnedProperties[name] = true;\n    var lowerCasedName = name.toLowerCase();\n\n    // data-* attributes should be lowercase; suggest the lowercase version\n    var standardName = (\n      DOMProperty.isCustomAttribute(lowerCasedName) ?\n        lowerCasedName :\n      DOMProperty.getPossibleStandardName.hasOwnProperty(lowerCasedName) ?\n        DOMProperty.getPossibleStandardName[lowerCasedName] :\n        null\n    );\n\n    // For now, only warn when we have a suggested correction. This prevents\n    // logging too much when using transferPropsTo.\n    (\"production\" !== process.env.NODE_ENV ? warning(\n      standardName == null,\n      'Unknown DOM property ' + name + '. Did you mean ' + standardName + '?'\n    ) : null);\n\n  };\n}\n\n/**\n * Operations for dealing with DOM properties.\n */\nvar DOMPropertyOperations = {\n\n  /**\n   * Creates markup for the ID property.\n   *\n   * @param {string} id Unescaped ID.\n   * @return {string} Markup string.\n   */\n  createMarkupForID: function(id) {\n    return processAttributeNameAndPrefix(DOMProperty.ID_ATTRIBUTE_NAME) +\n      escapeTextForBrowser(id) + '\"';\n  },\n\n  /**\n   * Creates markup for a property.\n   *\n   * @param {string} name\n   * @param {*} value\n   * @return {?string} Markup string, or null if the property was invalid.\n   */\n  createMarkupForProperty: function(name, value) {\n    if (DOMProperty.isStandardName.hasOwnProperty(name) &&\n        DOMProperty.isStandardName[name]) {\n      if (shouldIgnoreValue(name, value)) {\n        return '';\n      }\n      var attributeName = DOMProperty.getAttributeName[name];\n      if (DOMProperty.hasBooleanValue[name] ||\n          (DOMProperty.hasOverloadedBooleanValue[name] && value === true)) {\n        return escapeTextForBrowser(attributeName);\n      }\n      return processAttributeNameAndPrefix(attributeName) +\n        escapeTextForBrowser(value) + '\"';\n    } else if (DOMProperty.isCustomAttribute(name)) {\n      if (value == null) {\n        return '';\n      }\n      return processAttributeNameAndPrefix(name) +\n        escapeTextForBrowser(value) + '\"';\n    } else if (\"production\" !== process.env.NODE_ENV) {\n      warnUnknownProperty(name);\n    }\n    return null;\n  },\n\n  /**\n   * Sets the value for a property on a node.\n   *\n   * @param {DOMElement} node\n   * @param {string} name\n   * @param {*} value\n   */\n  setValueForProperty: function(node, name, value) {\n    if (DOMProperty.isStandardName.hasOwnProperty(name) &&\n        DOMProperty.isStandardName[name]) {\n      var mutationMethod = DOMProperty.getMutationMethod[name];\n      if (mutationMethod) {\n        mutationMethod(node, value);\n      } else if (shouldIgnoreValue(name, value)) {\n        this.deleteValueForProperty(node, name);\n      } else if (DOMProperty.mustUseAttribute[name]) {\n        node.setAttribute(DOMProperty.getAttributeName[name], '' + value);\n      } else {\n        var propName = DOMProperty.getPropertyName[name];\n        if (!DOMProperty.hasSideEffects[name] || node[propName] !== value) {\n          node[propName] = value;\n        }\n      }\n    } else if (DOMProperty.isCustomAttribute(name)) {\n      if (value == null) {\n        node.removeAttribute(name);\n      } else {\n        node.setAttribute(name, '' + value);\n      }\n    } else if (\"production\" !== process.env.NODE_ENV) {\n      warnUnknownProperty(name);\n    }\n  },\n\n  /**\n   * Deletes the value for a property on a node.\n   *\n   * @param {DOMElement} node\n   * @param {string} name\n   */\n  deleteValueForProperty: function(node, name) {\n    if (DOMProperty.isStandardName.hasOwnProperty(name) &&\n        DOMProperty.isStandardName[name]) {\n      var mutationMethod = DOMProperty.getMutationMethod[name];\n      if (mutationMethod) {\n        mutationMethod(node, undefined);\n      } else if (DOMProperty.mustUseAttribute[name]) {\n        node.removeAttribute(DOMProperty.getAttributeName[name]);\n      } else {\n        var propName = DOMProperty.getPropertyName[name];\n        var defaultValue = DOMProperty.getDefaultValueForProperty(\n          node.nodeName,\n          propName\n        );\n        if (!DOMProperty.hasSideEffects[name] ||\n            node[propName] !== defaultValue) {\n          node[propName] = defaultValue;\n        }\n      }\n    } else if (DOMProperty.isCustomAttribute(name)) {\n      node.removeAttribute(name);\n    } else if (\"production\" !== process.env.NODE_ENV) {\n      warnUnknownProperty(name);\n    }\n  }\n\n};\n\nmodule.exports = DOMPropertyOperations;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule EventPluginUtils\n */\n\n\"use strict\";\n\nvar EventConstants = require(\"./EventConstants\");\n\nvar invariant = require(\"./invariant\");\n\n/**\n * Injected dependencies:\n */\n\n/**\n * - `Mount`: [required] Module that can convert between React dom IDs and\n *   actual node references.\n */\nvar injection = {\n  Mount: null,\n  injectMount: function(InjectedMount) {\n    injection.Mount = InjectedMount;\n    if (\"production\" !== process.env.NODE_ENV) {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        InjectedMount && InjectedMount.getNode,\n        'EventPluginUtils.injection.injectMount(...): Injected Mount module ' +\n        'is missing getNode.'\n      ) : invariant(InjectedMount && InjectedMount.getNode));\n    }\n  }\n};\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\nfunction isEndish(topLevelType) {\n  return topLevelType === topLevelTypes.topMouseUp ||\n         topLevelType === topLevelTypes.topTouchEnd ||\n         topLevelType === topLevelTypes.topTouchCancel;\n}\n\nfunction isMoveish(topLevelType) {\n  return topLevelType === topLevelTypes.topMouseMove ||\n         topLevelType === topLevelTypes.topTouchMove;\n}\nfunction isStartish(topLevelType) {\n  return topLevelType === topLevelTypes.topMouseDown ||\n         topLevelType === topLevelTypes.topTouchStart;\n}\n\n\nvar validateEventDispatches;\nif (\"production\" !== process.env.NODE_ENV) {\n  validateEventDispatches = function(event) {\n    var dispatchListeners = event._dispatchListeners;\n    var dispatchIDs = event._dispatchIDs;\n\n    var listenersIsArr = Array.isArray(dispatchListeners);\n    var idsIsArr = Array.isArray(dispatchIDs);\n    var IDsLen = idsIsArr ? dispatchIDs.length : dispatchIDs ? 1 : 0;\n    var listenersLen = listenersIsArr ?\n      dispatchListeners.length :\n      dispatchListeners ? 1 : 0;\n\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      idsIsArr === listenersIsArr && IDsLen === listenersLen,\n      'EventPluginUtils: Invalid `event`.'\n    ) : invariant(idsIsArr === listenersIsArr && IDsLen === listenersLen));\n  };\n}\n\n/**\n * Invokes `cb(event, listener, id)`. Avoids using call if no scope is\n * provided. The `(listener,id)` pair effectively forms the \"dispatch\" but are\n * kept separate to conserve memory.\n */\nfunction forEachEventDispatch(event, cb) {\n  var dispatchListeners = event._dispatchListeners;\n  var dispatchIDs = event._dispatchIDs;\n  if (\"production\" !== process.env.NODE_ENV) {\n    validateEventDispatches(event);\n  }\n  if (Array.isArray(dispatchListeners)) {\n    for (var i = 0; i < dispatchListeners.length; i++) {\n      if (event.isPropagationStopped()) {\n        break;\n      }\n      // Listeners and IDs are two parallel arrays that are always in sync.\n      cb(event, dispatchListeners[i], dispatchIDs[i]);\n    }\n  } else if (dispatchListeners) {\n    cb(event, dispatchListeners, dispatchIDs);\n  }\n}\n\n/**\n * Default implementation of PluginModule.executeDispatch().\n * @param {SyntheticEvent} SyntheticEvent to handle\n * @param {function} Application-level callback\n * @param {string} domID DOM id to pass to the callback.\n */\nfunction executeDispatch(event, listener, domID) {\n  event.currentTarget = injection.Mount.getNode(domID);\n  var returnValue = listener(event, domID);\n  event.currentTarget = null;\n  return returnValue;\n}\n\n/**\n * Standard/simple iteration through an event's collected dispatches.\n */\nfunction executeDispatchesInOrder(event, executeDispatch) {\n  forEachEventDispatch(event, executeDispatch);\n  event._dispatchListeners = null;\n  event._dispatchIDs = null;\n}\n\n/**\n * Standard/simple iteration through an event's collected dispatches, but stops\n * at the first dispatch execution returning true, and returns that id.\n *\n * @return id of the first dispatch execution who's listener returns true, or\n * null if no listener returned true.\n */\nfunction executeDispatchesInOrderStopAtTrueImpl(event) {\n  var dispatchListeners = event._dispatchListeners;\n  var dispatchIDs = event._dispatchIDs;\n  if (\"production\" !== process.env.NODE_ENV) {\n    validateEventDispatches(event);\n  }\n  if (Array.isArray(dispatchListeners)) {\n    for (var i = 0; i < dispatchListeners.length; i++) {\n      if (event.isPropagationStopped()) {\n        break;\n      }\n      // Listeners and IDs are two parallel arrays that are always in sync.\n      if (dispatchListeners[i](event, dispatchIDs[i])) {\n        return dispatchIDs[i];\n      }\n    }\n  } else if (dispatchListeners) {\n    if (dispatchListeners(event, dispatchIDs)) {\n      return dispatchIDs;\n    }\n  }\n  return null;\n}\n\n/**\n * @see executeDispatchesInOrderStopAtTrueImpl\n */\nfunction executeDispatchesInOrderStopAtTrue(event) {\n  var ret = executeDispatchesInOrderStopAtTrueImpl(event);\n  event._dispatchIDs = null;\n  event._dispatchListeners = null;\n  return ret;\n}\n\n/**\n * Execution of a \"direct\" dispatch - there must be at most one dispatch\n * accumulated on the event or it is considered an error. It doesn't really make\n * sense for an event with multiple dispatches (bubbled) to keep track of the\n * return values at each dispatch execution, but it does tend to make sense when\n * dealing with \"direct\" dispatches.\n *\n * @return The return value of executing the single dispatch.\n */\nfunction executeDirectDispatch(event) {\n  if (\"production\" !== process.env.NODE_ENV) {\n    validateEventDispatches(event);\n  }\n  var dispatchListener = event._dispatchListeners;\n  var dispatchID = event._dispatchIDs;\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    !Array.isArray(dispatchListener),\n    'executeDirectDispatch(...): Invalid `event`.'\n  ) : invariant(!Array.isArray(dispatchListener)));\n  var res = dispatchListener ?\n    dispatchListener(event, dispatchID) :\n    null;\n  event._dispatchListeners = null;\n  event._dispatchIDs = null;\n  return res;\n}\n\n/**\n * @param {SyntheticEvent} event\n * @return {bool} True iff number of dispatches accumulated is greater than 0.\n */\nfunction hasDispatches(event) {\n  return !!event._dispatchListeners;\n}\n\n/**\n * General utilities that are useful in creating custom Event Plugins.\n */\nvar EventPluginUtils = {\n  isEndish: isEndish,\n  isMoveish: isMoveish,\n  isStartish: isStartish,\n\n  executeDirectDispatch: executeDirectDispatch,\n  executeDispatch: executeDispatch,\n  executeDispatchesInOrder: executeDispatchesInOrder,\n  executeDispatchesInOrderStopAtTrue: executeDispatchesInOrderStopAtTrue,\n  hasDispatches: hasDispatches,\n  injection: injection,\n  useTouchEvents: false\n};\n\nmodule.exports = EventPluginUtils;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactChildren\n */\n\n\"use strict\";\n\nvar PooledClass = require(\"./PooledClass\");\n\nvar traverseAllChildren = require(\"./traverseAllChildren\");\nvar warning = require(\"./warning\");\n\nvar twoArgumentPooler = PooledClass.twoArgumentPooler;\nvar threeArgumentPooler = PooledClass.threeArgumentPooler;\n\n/**\n * PooledClass representing the bookkeeping associated with performing a child\n * traversal. Allows avoiding binding callbacks.\n *\n * @constructor ForEachBookKeeping\n * @param {!function} forEachFunction Function to perform traversal with.\n * @param {?*} forEachContext Context to perform context with.\n */\nfunction ForEachBookKeeping(forEachFunction, forEachContext) {\n  this.forEachFunction = forEachFunction;\n  this.forEachContext = forEachContext;\n}\nPooledClass.addPoolingTo(ForEachBookKeeping, twoArgumentPooler);\n\nfunction forEachSingleChild(traverseContext, child, name, i) {\n  var forEachBookKeeping = traverseContext;\n  forEachBookKeeping.forEachFunction.call(\n    forEachBookKeeping.forEachContext, child, i);\n}\n\n/**\n * Iterates through children that are typically specified as `props.children`.\n *\n * The provided forEachFunc(child, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} forEachFunc.\n * @param {*} forEachContext Context for forEachContext.\n */\nfunction forEachChildren(children, forEachFunc, forEachContext) {\n  if (children == null) {\n    return children;\n  }\n\n  var traverseContext =\n    ForEachBookKeeping.getPooled(forEachFunc, forEachContext);\n  traverseAllChildren(children, forEachSingleChild, traverseContext);\n  ForEachBookKeeping.release(traverseContext);\n}\n\n/**\n * PooledClass representing the bookkeeping associated with performing a child\n * mapping. Allows avoiding binding callbacks.\n *\n * @constructor MapBookKeeping\n * @param {!*} mapResult Object containing the ordered map of results.\n * @param {!function} mapFunction Function to perform mapping with.\n * @param {?*} mapContext Context to perform mapping with.\n */\nfunction MapBookKeeping(mapResult, mapFunction, mapContext) {\n  this.mapResult = mapResult;\n  this.mapFunction = mapFunction;\n  this.mapContext = mapContext;\n}\nPooledClass.addPoolingTo(MapBookKeeping, threeArgumentPooler);\n\nfunction mapSingleChildIntoContext(traverseContext, child, name, i) {\n  var mapBookKeeping = traverseContext;\n  var mapResult = mapBookKeeping.mapResult;\n\n  var keyUnique = !mapResult.hasOwnProperty(name);\n  (\"production\" !== process.env.NODE_ENV ? warning(\n    keyUnique,\n    'ReactChildren.map(...): Encountered two children with the same key, ' +\n    '`%s`. Child keys must be unique; when two children share a key, only ' +\n    'the first child will be used.',\n    name\n  ) : null);\n\n  if (keyUnique) {\n    var mappedChild =\n      mapBookKeeping.mapFunction.call(mapBookKeeping.mapContext, child, i);\n    mapResult[name] = mappedChild;\n  }\n}\n\n/**\n * Maps children that are typically specified as `props.children`.\n *\n * The provided mapFunction(child, key, index) will be called for each\n * leaf child.\n *\n * TODO: This may likely break any calls to `ReactChildren.map` that were\n * previously relying on the fact that we guarded against null children.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} mapFunction.\n * @param {*} mapContext Context for mapFunction.\n * @return {object} Object containing the ordered map of results.\n */\nfunction mapChildren(children, func, context) {\n  if (children == null) {\n    return children;\n  }\n\n  var mapResult = {};\n  var traverseContext = MapBookKeeping.getPooled(mapResult, func, context);\n  traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);\n  MapBookKeeping.release(traverseContext);\n  return mapResult;\n}\n\nfunction forEachSingleChildDummy(traverseContext, child, name, i) {\n  return null;\n}\n\n/**\n * Count the number of children that are typically specified as\n * `props.children`.\n *\n * @param {?*} children Children tree container.\n * @return {number} The number of children.\n */\nfunction countChildren(children, context) {\n  return traverseAllChildren(children, forEachSingleChildDummy, null);\n}\n\nvar ReactChildren = {\n  forEach: forEachChildren,\n  map: mapChildren,\n  count: countChildren\n};\n\nmodule.exports = ReactChildren;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactComponent\n */\n\n\"use strict\";\n\nvar ReactDescriptor = require(\"./ReactDescriptor\");\nvar ReactOwner = require(\"./ReactOwner\");\nvar ReactUpdates = require(\"./ReactUpdates\");\n\nvar invariant = require(\"./invariant\");\nvar keyMirror = require(\"./keyMirror\");\nvar merge = require(\"./merge\");\n\n/**\n * Every React component is in one of these life cycles.\n */\nvar ComponentLifeCycle = keyMirror({\n  /**\n   * Mounted components have a DOM node representation and are capable of\n   * receiving new props.\n   */\n  MOUNTED: null,\n  /**\n   * Unmounted components are inactive and cannot receive new props.\n   */\n  UNMOUNTED: null\n});\n\nvar injected = false;\n\n/**\n * Optionally injectable environment dependent cleanup hook. (server vs.\n * browser etc). Example: A browser system caches DOM nodes based on component\n * ID and must remove that cache entry when this instance is unmounted.\n *\n * @private\n */\nvar unmountIDFromEnvironment = null;\n\n/**\n * The \"image\" of a component tree, is the platform specific (typically\n * serialized) data that represents a tree of lower level UI building blocks.\n * On the web, this \"image\" is HTML markup which describes a construction of\n * low level `div` and `span` nodes. Other platforms may have different\n * encoding of this \"image\". This must be injected.\n *\n * @private\n */\nvar mountImageIntoNode = null;\n\n/**\n * Components are the basic units of composition in React.\n *\n * Every component accepts a set of keyed input parameters known as \"props\" that\n * are initialized by the constructor. Once a component is mounted, the props\n * can be mutated using `setProps` or `replaceProps`.\n *\n * Every component is capable of the following operations:\n *\n *   `mountComponent`\n *     Initializes the component, renders markup, and registers event listeners.\n *\n *   `receiveComponent`\n *     Updates the rendered DOM nodes to match the given component.\n *\n *   `unmountComponent`\n *     Releases any resources allocated by this component.\n *\n * Components can also be \"owned\" by other components. Being owned by another\n * component means being constructed by that component. This is different from\n * being the child of a component, which means having a DOM representation that\n * is a child of the DOM representation of that component.\n *\n * @class ReactComponent\n */\nvar ReactComponent = {\n\n  injection: {\n    injectEnvironment: function(ReactComponentEnvironment) {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        !injected,\n        'ReactComponent: injectEnvironment() can only be called once.'\n      ) : invariant(!injected));\n      mountImageIntoNode = ReactComponentEnvironment.mountImageIntoNode;\n      unmountIDFromEnvironment =\n        ReactComponentEnvironment.unmountIDFromEnvironment;\n      ReactComponent.BackendIDOperations =\n        ReactComponentEnvironment.BackendIDOperations;\n      injected = true;\n    }\n  },\n\n  /**\n   * @internal\n   */\n  LifeCycle: ComponentLifeCycle,\n\n  /**\n   * Injected module that provides ability to mutate individual properties.\n   * Injected into the base class because many different subclasses need access\n   * to this.\n   *\n   * @internal\n   */\n  BackendIDOperations: null,\n\n  /**\n   * Base functionality for every ReactComponent constructor. Mixed into the\n   * `ReactComponent` prototype, but exposed statically for easy access.\n   *\n   * @lends {ReactComponent.prototype}\n   */\n  Mixin: {\n\n    /**\n     * Checks whether or not this component is mounted.\n     *\n     * @return {boolean} True if mounted, false otherwise.\n     * @final\n     * @protected\n     */\n    isMounted: function() {\n      return this._lifeCycleState === ComponentLifeCycle.MOUNTED;\n    },\n\n    /**\n     * Sets a subset of the props.\n     *\n     * @param {object} partialProps Subset of the next props.\n     * @param {?function} callback Called after props are updated.\n     * @final\n     * @public\n     */\n    setProps: function(partialProps, callback) {\n      // Merge with the pending descriptor if it exists, otherwise with existing\n      // descriptor props.\n      var descriptor = this._pendingDescriptor || this._descriptor;\n      this.replaceProps(\n        merge(descriptor.props, partialProps),\n        callback\n      );\n    },\n\n    /**\n     * Replaces all of the props.\n     *\n     * @param {object} props New props.\n     * @param {?function} callback Called after props are updated.\n     * @final\n     * @public\n     */\n    replaceProps: function(props, callback) {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        this.isMounted(),\n        'replaceProps(...): Can only update a mounted component.'\n      ) : invariant(this.isMounted()));\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        this._mountDepth === 0,\n        'replaceProps(...): You called `setProps` or `replaceProps` on a ' +\n        'component with a parent. This is an anti-pattern since props will ' +\n        'get reactively updated when rendered. Instead, change the owner\\'s ' +\n        '`render` method to pass the correct value as props to the component ' +\n        'where it is created.'\n      ) : invariant(this._mountDepth === 0));\n      // This is a deoptimized path. We optimize for always having a descriptor.\n      // This creates an extra internal descriptor.\n      this._pendingDescriptor = ReactDescriptor.cloneAndReplaceProps(\n        this._pendingDescriptor || this._descriptor,\n        props\n      );\n      ReactUpdates.enqueueUpdate(this, callback);\n    },\n\n    /**\n     * Schedule a partial update to the props. Only used for internal testing.\n     *\n     * @param {object} partialProps Subset of the next props.\n     * @param {?function} callback Called after props are updated.\n     * @final\n     * @internal\n     */\n    _setPropsInternal: function(partialProps, callback) {\n      // This is a deoptimized path. We optimize for always having a descriptor.\n      // This creates an extra internal descriptor.\n      var descriptor = this._pendingDescriptor || this._descriptor;\n      this._pendingDescriptor = ReactDescriptor.cloneAndReplaceProps(\n        descriptor,\n        merge(descriptor.props, partialProps)\n      );\n      ReactUpdates.enqueueUpdate(this, callback);\n    },\n\n    /**\n     * Base constructor for all React components.\n     *\n     * Subclasses that override this method should make sure to invoke\n     * `ReactComponent.Mixin.construct.call(this, ...)`.\n     *\n     * @param {ReactDescriptor} descriptor\n     * @internal\n     */\n    construct: function(descriptor) {\n      // This is the public exposed props object after it has been processed\n      // with default props. The descriptor's props represents the true internal\n      // state of the props.\n      this.props = descriptor.props;\n      // Record the component responsible for creating this component.\n      // This is accessible through the descriptor but we maintain an extra\n      // field for compatibility with devtools and as a way to make an\n      // incremental update. TODO: Consider deprecating this field.\n      this._owner = descriptor._owner;\n\n      // All components start unmounted.\n      this._lifeCycleState = ComponentLifeCycle.UNMOUNTED;\n\n      // See ReactUpdates.\n      this._pendingCallbacks = null;\n\n      // We keep the old descriptor and a reference to the pending descriptor\n      // to track updates.\n      this._descriptor = descriptor;\n      this._pendingDescriptor = null;\n    },\n\n    /**\n     * Initializes the component, renders markup, and registers event listeners.\n     *\n     * NOTE: This does not insert any nodes into the DOM.\n     *\n     * Subclasses that override this method should make sure to invoke\n     * `ReactComponent.Mixin.mountComponent.call(this, ...)`.\n     *\n     * @param {string} rootID DOM ID of the root node.\n     * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n     * @param {number} mountDepth number of components in the owner hierarchy.\n     * @return {?string} Rendered markup to be inserted into the DOM.\n     * @internal\n     */\n    mountComponent: function(rootID, transaction, mountDepth) {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        !this.isMounted(),\n        'mountComponent(%s, ...): Can only mount an unmounted component. ' +\n        'Make sure to avoid storing components between renders or reusing a ' +\n        'single component instance in multiple places.',\n        rootID\n      ) : invariant(!this.isMounted()));\n      var props = this._descriptor.props;\n      if (props.ref != null) {\n        var owner = this._descriptor._owner;\n        ReactOwner.addComponentAsRefTo(this, props.ref, owner);\n      }\n      this._rootNodeID = rootID;\n      this._lifeCycleState = ComponentLifeCycle.MOUNTED;\n      this._mountDepth = mountDepth;\n      // Effectively: return '';\n    },\n\n    /**\n     * Releases any resources allocated by `mountComponent`.\n     *\n     * NOTE: This does not remove any nodes from the DOM.\n     *\n     * Subclasses that override this method should make sure to invoke\n     * `ReactComponent.Mixin.unmountComponent.call(this)`.\n     *\n     * @internal\n     */\n    unmountComponent: function() {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        this.isMounted(),\n        'unmountComponent(): Can only unmount a mounted component.'\n      ) : invariant(this.isMounted()));\n      var props = this.props;\n      if (props.ref != null) {\n        ReactOwner.removeComponentAsRefFrom(this, props.ref, this._owner);\n      }\n      unmountIDFromEnvironment(this._rootNodeID);\n      this._rootNodeID = null;\n      this._lifeCycleState = ComponentLifeCycle.UNMOUNTED;\n    },\n\n    /**\n     * Given a new instance of this component, updates the rendered DOM nodes\n     * as if that instance was rendered instead.\n     *\n     * Subclasses that override this method should make sure to invoke\n     * `ReactComponent.Mixin.receiveComponent.call(this, ...)`.\n     *\n     * @param {object} nextComponent Next set of properties.\n     * @param {ReactReconcileTransaction} transaction\n     * @internal\n     */\n    receiveComponent: function(nextDescriptor, transaction) {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        this.isMounted(),\n        'receiveComponent(...): Can only update a mounted component.'\n      ) : invariant(this.isMounted()));\n      this._pendingDescriptor = nextDescriptor;\n      this.performUpdateIfNecessary(transaction);\n    },\n\n    /**\n     * If `_pendingDescriptor` is set, update the component.\n     *\n     * @param {ReactReconcileTransaction} transaction\n     * @internal\n     */\n    performUpdateIfNecessary: function(transaction) {\n      if (this._pendingDescriptor == null) {\n        return;\n      }\n      var prevDescriptor = this._descriptor;\n      var nextDescriptor = this._pendingDescriptor;\n      this._descriptor = nextDescriptor;\n      this.props = nextDescriptor.props;\n      this._owner = nextDescriptor._owner;\n      this._pendingDescriptor = null;\n      this.updateComponent(transaction, prevDescriptor);\n    },\n\n    /**\n     * Updates the component's currently mounted representation.\n     *\n     * @param {ReactReconcileTransaction} transaction\n     * @param {object} prevDescriptor\n     * @internal\n     */\n    updateComponent: function(transaction, prevDescriptor) {\n      var nextDescriptor = this._descriptor;\n\n      // If either the owner or a `ref` has changed, make sure the newest owner\n      // has stored a reference to `this`, and the previous owner (if different)\n      // has forgotten the reference to `this`. We use the descriptor instead\n      // of the public this.props because the post processing cannot determine\n      // a ref. The ref conceptually lives on the descriptor.\n\n      // TODO: Should this even be possible? The owner cannot change because\n      // it's forbidden by shouldUpdateReactComponent. The ref can change\n      // if you swap the keys of but not the refs. Reconsider where this check\n      // is made. It probably belongs where the key checking and\n      // instantiateReactComponent is done.\n\n      if (nextDescriptor._owner !== prevDescriptor._owner ||\n          nextDescriptor.props.ref !== prevDescriptor.props.ref) {\n        if (prevDescriptor.props.ref != null) {\n          ReactOwner.removeComponentAsRefFrom(\n            this, prevDescriptor.props.ref, prevDescriptor._owner\n          );\n        }\n        // Correct, even if the owner is the same, and only the ref has changed.\n        if (nextDescriptor.props.ref != null) {\n          ReactOwner.addComponentAsRefTo(\n            this,\n            nextDescriptor.props.ref,\n            nextDescriptor._owner\n          );\n        }\n      }\n    },\n\n    /**\n     * Mounts this component and inserts it into the DOM.\n     *\n     * @param {string} rootID DOM ID of the root node.\n     * @param {DOMElement} container DOM element to mount into.\n     * @param {boolean} shouldReuseMarkup If true, do not insert markup\n     * @final\n     * @internal\n     * @see {ReactMount.renderComponent}\n     */\n    mountComponentIntoNode: function(rootID, container, shouldReuseMarkup) {\n      var transaction = ReactUpdates.ReactReconcileTransaction.getPooled();\n      transaction.perform(\n        this._mountComponentIntoNode,\n        this,\n        rootID,\n        container,\n        transaction,\n        shouldReuseMarkup\n      );\n      ReactUpdates.ReactReconcileTransaction.release(transaction);\n    },\n\n    /**\n     * @param {string} rootID DOM ID of the root node.\n     * @param {DOMElement} container DOM element to mount into.\n     * @param {ReactReconcileTransaction} transaction\n     * @param {boolean} shouldReuseMarkup If true, do not insert markup\n     * @final\n     * @private\n     */\n    _mountComponentIntoNode: function(\n        rootID,\n        container,\n        transaction,\n        shouldReuseMarkup) {\n      var markup = this.mountComponent(rootID, transaction, 0);\n      mountImageIntoNode(markup, container, shouldReuseMarkup);\n    },\n\n    /**\n     * Checks if this component is owned by the supplied `owner` component.\n     *\n     * @param {ReactComponent} owner Component to check.\n     * @return {boolean} True if `owners` owns this component.\n     * @final\n     * @internal\n     */\n    isOwnedBy: function(owner) {\n      return this._owner === owner;\n    },\n\n    /**\n     * Gets another component, that shares the same owner as this one, by ref.\n     *\n     * @param {string} ref of a sibling Component.\n     * @return {?ReactComponent} the actual sibling Component.\n     * @final\n     * @internal\n     */\n    getSiblingByRef: function(ref) {\n      var owner = this._owner;\n      if (!owner || !owner.refs) {\n        return null;\n      }\n      return owner.refs[ref];\n    }\n  }\n};\n\nmodule.exports = ReactComponent;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactCompositeComponent\n */\n\n\"use strict\";\n\nvar ReactComponent = require(\"./ReactComponent\");\nvar ReactContext = require(\"./ReactContext\");\nvar ReactCurrentOwner = require(\"./ReactCurrentOwner\");\nvar ReactDescriptor = require(\"./ReactDescriptor\");\nvar ReactDescriptorValidator = require(\"./ReactDescriptorValidator\");\nvar ReactEmptyComponent = require(\"./ReactEmptyComponent\");\nvar ReactErrorUtils = require(\"./ReactErrorUtils\");\nvar ReactOwner = require(\"./ReactOwner\");\nvar ReactPerf = require(\"./ReactPerf\");\nvar ReactPropTransferer = require(\"./ReactPropTransferer\");\nvar ReactPropTypeLocations = require(\"./ReactPropTypeLocations\");\nvar ReactPropTypeLocationNames = require(\"./ReactPropTypeLocationNames\");\nvar ReactUpdates = require(\"./ReactUpdates\");\n\nvar instantiateReactComponent = require(\"./instantiateReactComponent\");\nvar invariant = require(\"./invariant\");\nvar keyMirror = require(\"./keyMirror\");\nvar merge = require(\"./merge\");\nvar mixInto = require(\"./mixInto\");\nvar monitorCodeUse = require(\"./monitorCodeUse\");\nvar mapObject = require(\"./mapObject\");\nvar shouldUpdateReactComponent = require(\"./shouldUpdateReactComponent\");\nvar warning = require(\"./warning\");\n\n/**\n * Policies that describe methods in `ReactCompositeComponentInterface`.\n */\nvar SpecPolicy = keyMirror({\n  /**\n   * These methods may be defined only once by the class specification or mixin.\n   */\n  DEFINE_ONCE: null,\n  /**\n   * These methods may be defined by both the class specification and mixins.\n   * Subsequent definitions will be chained. These methods must return void.\n   */\n  DEFINE_MANY: null,\n  /**\n   * These methods are overriding the base ReactCompositeComponent class.\n   */\n  OVERRIDE_BASE: null,\n  /**\n   * These methods are similar to DEFINE_MANY, except we assume they return\n   * objects. We try to merge the keys of the return values of all the mixed in\n   * functions. If there is a key conflict we throw.\n   */\n  DEFINE_MANY_MERGED: null\n});\n\n\nvar injectedMixins = [];\n\n/**\n * Composite components are higher-level components that compose other composite\n * or native components.\n *\n * To create a new type of `ReactCompositeComponent`, pass a specification of\n * your new class to `React.createClass`. The only requirement of your class\n * specification is that you implement a `render` method.\n *\n *   var MyComponent = React.createClass({\n *     render: function() {\n *       return <div>Hello World</div>;\n *     }\n *   });\n *\n * The class specification supports a specific protocol of methods that have\n * special meaning (e.g. `render`). See `ReactCompositeComponentInterface` for\n * more the comprehensive protocol. Any other properties and methods in the\n * class specification will available on the prototype.\n *\n * @interface ReactCompositeComponentInterface\n * @internal\n */\nvar ReactCompositeComponentInterface = {\n\n  /**\n   * An array of Mixin objects to include when defining your component.\n   *\n   * @type {array}\n   * @optional\n   */\n  mixins: SpecPolicy.DEFINE_MANY,\n\n  /**\n   * An object containing properties and methods that should be defined on\n   * the component's constructor instead of its prototype (static methods).\n   *\n   * @type {object}\n   * @optional\n   */\n  statics: SpecPolicy.DEFINE_MANY,\n\n  /**\n   * Definition of prop types for this component.\n   *\n   * @type {object}\n   * @optional\n   */\n  propTypes: SpecPolicy.DEFINE_MANY,\n\n  /**\n   * Definition of context types for this component.\n   *\n   * @type {object}\n   * @optional\n   */\n  contextTypes: SpecPolicy.DEFINE_MANY,\n\n  /**\n   * Definition of context types this component sets for its children.\n   *\n   * @type {object}\n   * @optional\n   */\n  childContextTypes: SpecPolicy.DEFINE_MANY,\n\n  // ==== Definition methods ====\n\n  /**\n   * Invoked when the component is mounted. Values in the mapping will be set on\n   * `this.props` if that prop is not specified (i.e. using an `in` check).\n   *\n   * This method is invoked before `getInitialState` and therefore cannot rely\n   * on `this.state` or use `this.setState`.\n   *\n   * @return {object}\n   * @optional\n   */\n  getDefaultProps: SpecPolicy.DEFINE_MANY_MERGED,\n\n  /**\n   * Invoked once before the component is mounted. The return value will be used\n   * as the initial value of `this.state`.\n   *\n   *   getInitialState: function() {\n   *     return {\n   *       isOn: false,\n   *       fooBaz: new BazFoo()\n   *     }\n   *   }\n   *\n   * @return {object}\n   * @optional\n   */\n  getInitialState: SpecPolicy.DEFINE_MANY_MERGED,\n\n  /**\n   * @return {object}\n   * @optional\n   */\n  getChildContext: SpecPolicy.DEFINE_MANY_MERGED,\n\n  /**\n   * Uses props from `this.props` and state from `this.state` to render the\n   * structure of the component.\n   *\n   * No guarantees are made about when or how often this method is invoked, so\n   * it must not have side effects.\n   *\n   *   render: function() {\n   *     var name = this.props.name;\n   *     return <div>Hello, {name}!</div>;\n   *   }\n   *\n   * @return {ReactComponent}\n   * @nosideeffects\n   * @required\n   */\n  render: SpecPolicy.DEFINE_ONCE,\n\n\n\n  // ==== Delegate methods ====\n\n  /**\n   * Invoked when the component is initially created and about to be mounted.\n   * This may have side effects, but any external subscriptions or data created\n   * by this method must be cleaned up in `componentWillUnmount`.\n   *\n   * @optional\n   */\n  componentWillMount: SpecPolicy.DEFINE_MANY,\n\n  /**\n   * Invoked when the component has been mounted and has a DOM representation.\n   * However, there is no guarantee that the DOM node is in the document.\n   *\n   * Use this as an opportunity to operate on the DOM when the component has\n   * been mounted (initialized and rendered) for the first time.\n   *\n   * @param {DOMElement} rootNode DOM element representing the component.\n   * @optional\n   */\n  componentDidMount: SpecPolicy.DEFINE_MANY,\n\n  /**\n   * Invoked before the component receives new props.\n   *\n   * Use this as an opportunity to react to a prop transition by updating the\n   * state using `this.setState`. Current props are accessed via `this.props`.\n   *\n   *   componentWillReceiveProps: function(nextProps, nextContext) {\n   *     this.setState({\n   *       likesIncreasing: nextProps.likeCount > this.props.likeCount\n   *     });\n   *   }\n   *\n   * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop\n   * transition may cause a state change, but the opposite is not true. If you\n   * need it, you are probably looking for `componentWillUpdate`.\n   *\n   * @param {object} nextProps\n   * @optional\n   */\n  componentWillReceiveProps: SpecPolicy.DEFINE_MANY,\n\n  /**\n   * Invoked while deciding if the component should be updated as a result of\n   * receiving new props, state and/or context.\n   *\n   * Use this as an opportunity to `return false` when you're certain that the\n   * transition to the new props/state/context will not require a component\n   * update.\n   *\n   *   shouldComponentUpdate: function(nextProps, nextState, nextContext) {\n   *     return !equal(nextProps, this.props) ||\n   *       !equal(nextState, this.state) ||\n   *       !equal(nextContext, this.context);\n   *   }\n   *\n   * @param {object} nextProps\n   * @param {?object} nextState\n   * @param {?object} nextContext\n   * @return {boolean} True if the component should update.\n   * @optional\n   */\n  shouldComponentUpdate: SpecPolicy.DEFINE_ONCE,\n\n  /**\n   * Invoked when the component is about to update due to a transition from\n   * `this.props`, `this.state` and `this.context` to `nextProps`, `nextState`\n   * and `nextContext`.\n   *\n   * Use this as an opportunity to perform preparation before an update occurs.\n   *\n   * NOTE: You **cannot** use `this.setState()` in this method.\n   *\n   * @param {object} nextProps\n   * @param {?object} nextState\n   * @param {?object} nextContext\n   * @param {ReactReconcileTransaction} transaction\n   * @optional\n   */\n  componentWillUpdate: SpecPolicy.DEFINE_MANY,\n\n  /**\n   * Invoked when the component's DOM representation has been updated.\n   *\n   * Use this as an opportunity to operate on the DOM when the component has\n   * been updated.\n   *\n   * @param {object} prevProps\n   * @param {?object} prevState\n   * @param {?object} prevContext\n   * @param {DOMElement} rootNode DOM element representing the component.\n   * @optional\n   */\n  componentDidUpdate: SpecPolicy.DEFINE_MANY,\n\n  /**\n   * Invoked when the component is about to be removed from its parent and have\n   * its DOM representation destroyed.\n   *\n   * Use this as an opportunity to deallocate any external resources.\n   *\n   * NOTE: There is no `componentDidUnmount` since your component will have been\n   * destroyed by that point.\n   *\n   * @optional\n   */\n  componentWillUnmount: SpecPolicy.DEFINE_MANY,\n\n\n\n  // ==== Advanced methods ====\n\n  /**\n   * Updates the component's currently mounted DOM representation.\n   *\n   * By default, this implements React's rendering and reconciliation algorithm.\n   * Sophisticated clients may wish to override this.\n   *\n   * @param {ReactReconcileTransaction} transaction\n   * @internal\n   * @overridable\n   */\n  updateComponent: SpecPolicy.OVERRIDE_BASE\n\n};\n\n/**\n * Mapping from class specification keys to special processing functions.\n *\n * Although these are declared like instance properties in the specification\n * when defining classes using `React.createClass`, they are actually static\n * and are accessible on the constructor instead of the prototype. Despite\n * being static, they must be defined outside of the \"statics\" key under\n * which all other static methods are defined.\n */\nvar RESERVED_SPEC_KEYS = {\n  displayName: function(Constructor, displayName) {\n    Constructor.displayName = displayName;\n  },\n  mixins: function(Constructor, mixins) {\n    if (mixins) {\n      for (var i = 0; i < mixins.length; i++) {\n        mixSpecIntoComponent(Constructor, mixins[i]);\n      }\n    }\n  },\n  childContextTypes: function(Constructor, childContextTypes) {\n    validateTypeDef(\n      Constructor,\n      childContextTypes,\n      ReactPropTypeLocations.childContext\n    );\n    Constructor.childContextTypes = merge(\n      Constructor.childContextTypes,\n      childContextTypes\n    );\n  },\n  contextTypes: function(Constructor, contextTypes) {\n    validateTypeDef(\n      Constructor,\n      contextTypes,\n      ReactPropTypeLocations.context\n    );\n    Constructor.contextTypes = merge(Constructor.contextTypes, contextTypes);\n  },\n  /**\n   * Special case getDefaultProps which should move into statics but requires\n   * automatic merging.\n   */\n  getDefaultProps: function(Constructor, getDefaultProps) {\n    if (Constructor.getDefaultProps) {\n      Constructor.getDefaultProps = createMergedResultFunction(\n        Constructor.getDefaultProps,\n        getDefaultProps\n      );\n    } else {\n      Constructor.getDefaultProps = getDefaultProps;\n    }\n  },\n  propTypes: function(Constructor, propTypes) {\n    validateTypeDef(\n      Constructor,\n      propTypes,\n      ReactPropTypeLocations.prop\n    );\n    Constructor.propTypes = merge(Constructor.propTypes, propTypes);\n  },\n  statics: function(Constructor, statics) {\n    mixStaticSpecIntoComponent(Constructor, statics);\n  }\n};\n\nfunction getDeclarationErrorAddendum(component) {\n  var owner = component._owner || null;\n  if (owner && owner.constructor && owner.constructor.displayName) {\n    return ' Check the render method of `' + owner.constructor.displayName +\n      '`.';\n  }\n  return '';\n}\n\nfunction validateTypeDef(Constructor, typeDef, location) {\n  for (var propName in typeDef) {\n    if (typeDef.hasOwnProperty(propName)) {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        typeof typeDef[propName] == 'function',\n        '%s: %s type `%s` is invalid; it must be a function, usually from ' +\n        'React.PropTypes.',\n        Constructor.displayName || 'ReactCompositeComponent',\n        ReactPropTypeLocationNames[location],\n        propName\n      ) : invariant(typeof typeDef[propName] == 'function'));\n    }\n  }\n}\n\nfunction validateMethodOverride(proto, name) {\n  var specPolicy = ReactCompositeComponentInterface.hasOwnProperty(name) ?\n    ReactCompositeComponentInterface[name] :\n    null;\n\n  // Disallow overriding of base class methods unless explicitly allowed.\n  if (ReactCompositeComponentMixin.hasOwnProperty(name)) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      specPolicy === SpecPolicy.OVERRIDE_BASE,\n      'ReactCompositeComponentInterface: You are attempting to override ' +\n      '`%s` from your class specification. Ensure that your method names ' +\n      'do not overlap with React methods.',\n      name\n    ) : invariant(specPolicy === SpecPolicy.OVERRIDE_BASE));\n  }\n\n  // Disallow defining methods more than once unless explicitly allowed.\n  if (proto.hasOwnProperty(name)) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      specPolicy === SpecPolicy.DEFINE_MANY ||\n      specPolicy === SpecPolicy.DEFINE_MANY_MERGED,\n      'ReactCompositeComponentInterface: You are attempting to define ' +\n      '`%s` on your component more than once. This conflict may be due ' +\n      'to a mixin.',\n      name\n    ) : invariant(specPolicy === SpecPolicy.DEFINE_MANY ||\n    specPolicy === SpecPolicy.DEFINE_MANY_MERGED));\n  }\n}\n\nfunction validateLifeCycleOnReplaceState(instance) {\n  var compositeLifeCycleState = instance._compositeLifeCycleState;\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    instance.isMounted() ||\n      compositeLifeCycleState === CompositeLifeCycle.MOUNTING,\n    'replaceState(...): Can only update a mounted or mounting component.'\n  ) : invariant(instance.isMounted() ||\n    compositeLifeCycleState === CompositeLifeCycle.MOUNTING));\n  (\"production\" !== process.env.NODE_ENV ? invariant(compositeLifeCycleState !== CompositeLifeCycle.RECEIVING_STATE,\n    'replaceState(...): Cannot update during an existing state transition ' +\n    '(such as within `render`). This could potentially cause an infinite ' +\n    'loop so it is forbidden.'\n  ) : invariant(compositeLifeCycleState !== CompositeLifeCycle.RECEIVING_STATE));\n  (\"production\" !== process.env.NODE_ENV ? invariant(compositeLifeCycleState !== CompositeLifeCycle.UNMOUNTING,\n    'replaceState(...): Cannot update while unmounting component. This ' +\n    'usually means you called setState() on an unmounted component.'\n  ) : invariant(compositeLifeCycleState !== CompositeLifeCycle.UNMOUNTING));\n}\n\n/**\n * Custom version of `mixInto` which handles policy validation and reserved\n * specification keys when building `ReactCompositeComponent` classses.\n */\nfunction mixSpecIntoComponent(Constructor, spec) {\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    !ReactDescriptor.isValidFactory(spec),\n    'ReactCompositeComponent: You\\'re attempting to ' +\n    'use a component class as a mixin. Instead, just use a regular object.'\n  ) : invariant(!ReactDescriptor.isValidFactory(spec)));\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    !ReactDescriptor.isValidDescriptor(spec),\n    'ReactCompositeComponent: You\\'re attempting to ' +\n    'use a component as a mixin. Instead, just use a regular object.'\n  ) : invariant(!ReactDescriptor.isValidDescriptor(spec)));\n\n  var proto = Constructor.prototype;\n  for (var name in spec) {\n    var property = spec[name];\n    if (!spec.hasOwnProperty(name)) {\n      continue;\n    }\n\n    validateMethodOverride(proto, name);\n\n    if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) {\n      RESERVED_SPEC_KEYS[name](Constructor, property);\n    } else {\n      // Setup methods on prototype:\n      // The following member methods should not be automatically bound:\n      // 1. Expected ReactCompositeComponent methods (in the \"interface\").\n      // 2. Overridden methods (that were mixed in).\n      var isCompositeComponentMethod =\n        ReactCompositeComponentInterface.hasOwnProperty(name);\n      var isAlreadyDefined = proto.hasOwnProperty(name);\n      var markedDontBind = property && property.__reactDontBind;\n      var isFunction = typeof property === 'function';\n      var shouldAutoBind =\n        isFunction &&\n        !isCompositeComponentMethod &&\n        !isAlreadyDefined &&\n        !markedDontBind;\n\n      if (shouldAutoBind) {\n        if (!proto.__reactAutoBindMap) {\n          proto.__reactAutoBindMap = {};\n        }\n        proto.__reactAutoBindMap[name] = property;\n        proto[name] = property;\n      } else {\n        if (isAlreadyDefined) {\n          var specPolicy = ReactCompositeComponentInterface[name];\n\n          // These cases should already be caught by validateMethodOverride\n          (\"production\" !== process.env.NODE_ENV ? invariant(\n            isCompositeComponentMethod && (\n              specPolicy === SpecPolicy.DEFINE_MANY_MERGED ||\n              specPolicy === SpecPolicy.DEFINE_MANY\n            ),\n            'ReactCompositeComponent: Unexpected spec policy %s for key %s ' +\n            'when mixing in component specs.',\n            specPolicy,\n            name\n          ) : invariant(isCompositeComponentMethod && (\n            specPolicy === SpecPolicy.DEFINE_MANY_MERGED ||\n            specPolicy === SpecPolicy.DEFINE_MANY\n          )));\n\n          // For methods which are defined more than once, call the existing\n          // methods before calling the new property, merging if appropriate.\n          if (specPolicy === SpecPolicy.DEFINE_MANY_MERGED) {\n            proto[name] = createMergedResultFunction(proto[name], property);\n          } else if (specPolicy === SpecPolicy.DEFINE_MANY) {\n            proto[name] = createChainedFunction(proto[name], property);\n          }\n        } else {\n          proto[name] = property;\n          if (\"production\" !== process.env.NODE_ENV) {\n            // Add verbose displayName to the function, which helps when looking\n            // at profiling tools.\n            if (typeof property === 'function' && spec.displayName) {\n              proto[name].displayName = spec.displayName + '_' + name;\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\nfunction mixStaticSpecIntoComponent(Constructor, statics) {\n  if (!statics) {\n    return;\n  }\n  for (var name in statics) {\n    var property = statics[name];\n    if (!statics.hasOwnProperty(name)) {\n      continue;\n    }\n\n    var isInherited = name in Constructor;\n    var result = property;\n    if (isInherited) {\n      var existingProperty = Constructor[name];\n      var existingType = typeof existingProperty;\n      var propertyType = typeof property;\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        existingType === 'function' && propertyType === 'function',\n        'ReactCompositeComponent: You are attempting to define ' +\n        '`%s` on your component more than once, but that is only supported ' +\n        'for functions, which are chained together. This conflict may be ' +\n        'due to a mixin.',\n        name\n      ) : invariant(existingType === 'function' && propertyType === 'function'));\n      result = createChainedFunction(existingProperty, property);\n    }\n    Constructor[name] = result;\n  }\n}\n\n/**\n * Merge two objects, but throw if both contain the same key.\n *\n * @param {object} one The first object, which is mutated.\n * @param {object} two The second object\n * @return {object} one after it has been mutated to contain everything in two.\n */\nfunction mergeObjectsWithNoDuplicateKeys(one, two) {\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    one && two && typeof one === 'object' && typeof two === 'object',\n    'mergeObjectsWithNoDuplicateKeys(): Cannot merge non-objects'\n  ) : invariant(one && two && typeof one === 'object' && typeof two === 'object'));\n\n  mapObject(two, function(value, key) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      one[key] === undefined,\n      'mergeObjectsWithNoDuplicateKeys(): ' +\n      'Tried to merge two objects with the same key: %s',\n      key\n    ) : invariant(one[key] === undefined));\n    one[key] = value;\n  });\n  return one;\n}\n\n/**\n * Creates a function that invokes two functions and merges their return values.\n *\n * @param {function} one Function to invoke first.\n * @param {function} two Function to invoke second.\n * @return {function} Function that invokes the two argument functions.\n * @private\n */\nfunction createMergedResultFunction(one, two) {\n  return function mergedResult() {\n    var a = one.apply(this, arguments);\n    var b = two.apply(this, arguments);\n    if (a == null) {\n      return b;\n    } else if (b == null) {\n      return a;\n    }\n    return mergeObjectsWithNoDuplicateKeys(a, b);\n  };\n}\n\n/**\n * Creates a function that invokes two functions and ignores their return vales.\n *\n * @param {function} one Function to invoke first.\n * @param {function} two Function to invoke second.\n * @return {function} Function that invokes the two argument functions.\n * @private\n */\nfunction createChainedFunction(one, two) {\n  return function chainedFunction() {\n    one.apply(this, arguments);\n    two.apply(this, arguments);\n  };\n}\n\n/**\n * `ReactCompositeComponent` maintains an auxiliary life cycle state in\n * `this._compositeLifeCycleState` (which can be null).\n *\n * This is different from the life cycle state maintained by `ReactComponent` in\n * `this._lifeCycleState`. The following diagram shows how the states overlap in\n * time. There are times when the CompositeLifeCycle is null - at those times it\n * is only meaningful to look at ComponentLifeCycle alone.\n *\n * Top Row: ReactComponent.ComponentLifeCycle\n * Low Row: ReactComponent.CompositeLifeCycle\n *\n * +-------+------------------------------------------------------+--------+\n * |  UN   |                    MOUNTED                           |   UN   |\n * |MOUNTED|                                                      | MOUNTED|\n * +-------+------------------------------------------------------+--------+\n * |       ^--------+   +------+   +------+   +------+   +--------^        |\n * |       |        |   |      |   |      |   |      |   |        |        |\n * |    0--|MOUNTING|-0-|RECEIV|-0-|RECEIV|-0-|RECEIV|-0-|   UN   |--->0   |\n * |       |        |   |PROPS |   | PROPS|   | STATE|   |MOUNTING|        |\n * |       |        |   |      |   |      |   |      |   |        |        |\n * |       |        |   |      |   |      |   |      |   |        |        |\n * |       +--------+   +------+   +------+   +------+   +--------+        |\n * |       |                                                      |        |\n * +-------+------------------------------------------------------+--------+\n */\nvar CompositeLifeCycle = keyMirror({\n  /**\n   * Components in the process of being mounted respond to state changes\n   * differently.\n   */\n  MOUNTING: null,\n  /**\n   * Components in the process of being unmounted are guarded against state\n   * changes.\n   */\n  UNMOUNTING: null,\n  /**\n   * Components that are mounted and receiving new props respond to state\n   * changes differently.\n   */\n  RECEIVING_PROPS: null,\n  /**\n   * Components that are mounted and receiving new state are guarded against\n   * additional state changes.\n   */\n  RECEIVING_STATE: null\n});\n\n/**\n * @lends {ReactCompositeComponent.prototype}\n */\nvar ReactCompositeComponentMixin = {\n\n  /**\n   * Base constructor for all composite component.\n   *\n   * @param {ReactDescriptor} descriptor\n   * @final\n   * @internal\n   */\n  construct: function(descriptor) {\n    // Children can be either an array or more than one argument\n    ReactComponent.Mixin.construct.apply(this, arguments);\n    ReactOwner.Mixin.construct.apply(this, arguments);\n\n    this.state = null;\n    this._pendingState = null;\n\n    // This is the public post-processed context. The real context and pending\n    // context lives on the descriptor.\n    this.context = null;\n\n    this._compositeLifeCycleState = null;\n  },\n\n  /**\n   * Checks whether or not this composite component is mounted.\n   * @return {boolean} True if mounted, false otherwise.\n   * @protected\n   * @final\n   */\n  isMounted: function() {\n    return ReactComponent.Mixin.isMounted.call(this) &&\n      this._compositeLifeCycleState !== CompositeLifeCycle.MOUNTING;\n  },\n\n  /**\n   * Initializes the component, renders markup, and registers event listeners.\n   *\n   * @param {string} rootID DOM ID of the root node.\n   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n   * @param {number} mountDepth number of components in the owner hierarchy\n   * @return {?string} Rendered markup to be inserted into the DOM.\n   * @final\n   * @internal\n   */\n  mountComponent: ReactPerf.measure(\n    'ReactCompositeComponent',\n    'mountComponent',\n    function(rootID, transaction, mountDepth) {\n      ReactComponent.Mixin.mountComponent.call(\n        this,\n        rootID,\n        transaction,\n        mountDepth\n      );\n      this._compositeLifeCycleState = CompositeLifeCycle.MOUNTING;\n\n      if (this.__reactAutoBindMap) {\n        this._bindAutoBindMethods();\n      }\n\n      this.context = this._processContext(this._descriptor._context);\n      this.props = this._processProps(this.props);\n\n      this.state = this.getInitialState ? this.getInitialState() : null;\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        typeof this.state === 'object' && !Array.isArray(this.state),\n        '%s.getInitialState(): must return an object or null',\n        this.constructor.displayName || 'ReactCompositeComponent'\n      ) : invariant(typeof this.state === 'object' && !Array.isArray(this.state)));\n\n      this._pendingState = null;\n      this._pendingForceUpdate = false;\n\n      if (this.componentWillMount) {\n        this.componentWillMount();\n        // When mounting, calls to `setState` by `componentWillMount` will set\n        // `this._pendingState` without triggering a re-render.\n        if (this._pendingState) {\n          this.state = this._pendingState;\n          this._pendingState = null;\n        }\n      }\n\n      this._renderedComponent = instantiateReactComponent(\n        this._renderValidatedComponent()\n      );\n\n      // Done with mounting, `setState` will now trigger UI changes.\n      this._compositeLifeCycleState = null;\n      var markup = this._renderedComponent.mountComponent(\n        rootID,\n        transaction,\n        mountDepth + 1\n      );\n      if (this.componentDidMount) {\n        transaction.getReactMountReady().enqueue(this.componentDidMount, this);\n      }\n      return markup;\n    }\n  ),\n\n  /**\n   * Releases any resources allocated by `mountComponent`.\n   *\n   * @final\n   * @internal\n   */\n  unmountComponent: function() {\n    this._compositeLifeCycleState = CompositeLifeCycle.UNMOUNTING;\n    if (this.componentWillUnmount) {\n      this.componentWillUnmount();\n    }\n    this._compositeLifeCycleState = null;\n\n    this._renderedComponent.unmountComponent();\n    this._renderedComponent = null;\n\n    ReactComponent.Mixin.unmountComponent.call(this);\n\n    // Some existing components rely on this.props even after they've been\n    // destroyed (in event handlers).\n    // TODO: this.props = null;\n    // TODO: this.state = null;\n  },\n\n  /**\n   * Sets a subset of the state. Always use this or `replaceState` to mutate\n   * state. You should treat `this.state` as immutable.\n   *\n   * There is no guarantee that `this.state` will be immediately updated, so\n   * accessing `this.state` after calling this method may return the old value.\n   *\n   * There is no guarantee that calls to `setState` will run synchronously,\n   * as they may eventually be batched together.  You can provide an optional\n   * callback that will be executed when the call to setState is actually\n   * completed.\n   *\n   * @param {object} partialState Next partial state to be merged with state.\n   * @param {?function} callback Called after state is updated.\n   * @final\n   * @protected\n   */\n  setState: function(partialState, callback) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      typeof partialState === 'object' || partialState == null,\n      'setState(...): takes an object of state variables to update.'\n    ) : invariant(typeof partialState === 'object' || partialState == null));\n    if (\"production\" !== process.env.NODE_ENV){\n      (\"production\" !== process.env.NODE_ENV ? warning(\n        partialState != null,\n        'setState(...): You passed an undefined or null state object; ' +\n        'instead, use forceUpdate().'\n      ) : null);\n    }\n    // Merge with `_pendingState` if it exists, otherwise with existing state.\n    this.replaceState(\n      merge(this._pendingState || this.state, partialState),\n      callback\n    );\n  },\n\n  /**\n   * Replaces all of the state. Always use this or `setState` to mutate state.\n   * You should treat `this.state` as immutable.\n   *\n   * There is no guarantee that `this.state` will be immediately updated, so\n   * accessing `this.state` after calling this method may return the old value.\n   *\n   * @param {object} completeState Next state.\n   * @param {?function} callback Called after state is updated.\n   * @final\n   * @protected\n   */\n  replaceState: function(completeState, callback) {\n    validateLifeCycleOnReplaceState(this);\n    this._pendingState = completeState;\n    if (this._compositeLifeCycleState !== CompositeLifeCycle.MOUNTING) {\n      // If we're in a componentWillMount handler, don't enqueue a rerender\n      // because ReactUpdates assumes we're in a browser context (which is wrong\n      // for server rendering) and we're about to do a render anyway.\n      // TODO: The callback here is ignored when setState is called from\n      // componentWillMount. Either fix it or disallow doing so completely in\n      // favor of getInitialState.\n      ReactUpdates.enqueueUpdate(this, callback);\n    }\n  },\n\n  /**\n   * Filters the context object to only contain keys specified in\n   * `contextTypes`, and asserts that they are valid.\n   *\n   * @param {object} context\n   * @return {?object}\n   * @private\n   */\n  _processContext: function(context) {\n    var maskedContext = null;\n    var contextTypes = this.constructor.contextTypes;\n    if (contextTypes) {\n      maskedContext = {};\n      for (var contextName in contextTypes) {\n        maskedContext[contextName] = context[contextName];\n      }\n      if (\"production\" !== process.env.NODE_ENV) {\n        this._checkPropTypes(\n          contextTypes,\n          maskedContext,\n          ReactPropTypeLocations.context\n        );\n      }\n    }\n    return maskedContext;\n  },\n\n  /**\n   * @param {object} currentContext\n   * @return {object}\n   * @private\n   */\n  _processChildContext: function(currentContext) {\n    var childContext = this.getChildContext && this.getChildContext();\n    var displayName = this.constructor.displayName || 'ReactCompositeComponent';\n    if (childContext) {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        typeof this.constructor.childContextTypes === 'object',\n        '%s.getChildContext(): childContextTypes must be defined in order to ' +\n        'use getChildContext().',\n        displayName\n      ) : invariant(typeof this.constructor.childContextTypes === 'object'));\n      if (\"production\" !== process.env.NODE_ENV) {\n        this._checkPropTypes(\n          this.constructor.childContextTypes,\n          childContext,\n          ReactPropTypeLocations.childContext\n        );\n      }\n      for (var name in childContext) {\n        (\"production\" !== process.env.NODE_ENV ? invariant(\n          name in this.constructor.childContextTypes,\n          '%s.getChildContext(): key \"%s\" is not defined in childContextTypes.',\n          displayName,\n          name\n        ) : invariant(name in this.constructor.childContextTypes));\n      }\n      return merge(currentContext, childContext);\n    }\n    return currentContext;\n  },\n\n  /**\n   * Processes props by setting default values for unspecified props and\n   * asserting that the props are valid. Does not mutate its argument; returns\n   * a new props object with defaults merged in.\n   *\n   * @param {object} newProps\n   * @return {object}\n   * @private\n   */\n  _processProps: function(newProps) {\n    var defaultProps = this.constructor.defaultProps;\n    var props;\n    if (defaultProps) {\n      props = merge(newProps);\n      for (var propName in defaultProps) {\n        if (typeof props[propName] === 'undefined') {\n          props[propName] = defaultProps[propName];\n        }\n      }\n    } else {\n      props = newProps;\n    }\n    if (\"production\" !== process.env.NODE_ENV) {\n      var propTypes = this.constructor.propTypes;\n      if (propTypes) {\n        this._checkPropTypes(propTypes, props, ReactPropTypeLocations.prop);\n      }\n    }\n    return props;\n  },\n\n  /**\n   * Assert that the props are valid\n   *\n   * @param {object} propTypes Map of prop name to a ReactPropType\n   * @param {object} props\n   * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n   * @private\n   */\n  _checkPropTypes: function(propTypes, props, location) {\n    // TODO: Stop validating prop types here and only use the descriptor\n    // validation.\n    var componentName = this.constructor.displayName;\n    for (var propName in propTypes) {\n      if (propTypes.hasOwnProperty(propName)) {\n        var error =\n          propTypes[propName](props, propName, componentName, location);\n        if (error instanceof Error) {\n          // We may want to extend this logic for similar errors in\n          // renderComponent calls, so I'm abstracting it away into\n          // a function to minimize refactoring in the future\n          var addendum = getDeclarationErrorAddendum(this);\n          (\"production\" !== process.env.NODE_ENV ? warning(false, error.message + addendum) : null);\n        }\n      }\n    }\n  },\n\n  /**\n   * If any of `_pendingDescriptor`, `_pendingState`, or `_pendingForceUpdate`\n   * is set, update the component.\n   *\n   * @param {ReactReconcileTransaction} transaction\n   * @internal\n   */\n  performUpdateIfNecessary: function(transaction) {\n    var compositeLifeCycleState = this._compositeLifeCycleState;\n    // Do not trigger a state transition if we are in the middle of mounting or\n    // receiving props because both of those will already be doing this.\n    if (compositeLifeCycleState === CompositeLifeCycle.MOUNTING ||\n        compositeLifeCycleState === CompositeLifeCycle.RECEIVING_PROPS) {\n      return;\n    }\n\n    if (this._pendingDescriptor == null &&\n        this._pendingState == null &&\n        !this._pendingForceUpdate) {\n      return;\n    }\n\n    var nextContext = this.context;\n    var nextProps = this.props;\n    var nextDescriptor = this._descriptor;\n    if (this._pendingDescriptor != null) {\n      nextDescriptor = this._pendingDescriptor;\n      nextContext = this._processContext(nextDescriptor._context);\n      nextProps = this._processProps(nextDescriptor.props);\n      this._pendingDescriptor = null;\n\n      this._compositeLifeCycleState = CompositeLifeCycle.RECEIVING_PROPS;\n      if (this.componentWillReceiveProps) {\n        this.componentWillReceiveProps(nextProps, nextContext);\n      }\n    }\n\n    this._compositeLifeCycleState = CompositeLifeCycle.RECEIVING_STATE;\n\n    var nextState = this._pendingState || this.state;\n    this._pendingState = null;\n\n    try {\n      var shouldUpdate =\n        this._pendingForceUpdate ||\n        !this.shouldComponentUpdate ||\n        this.shouldComponentUpdate(nextProps, nextState, nextContext);\n\n      if (\"production\" !== process.env.NODE_ENV) {\n        if (typeof shouldUpdate === \"undefined\") {\n          console.warn(\n            (this.constructor.displayName || 'ReactCompositeComponent') +\n            '.shouldComponentUpdate(): Returned undefined instead of a ' +\n            'boolean value. Make sure to return true or false.'\n          );\n        }\n      }\n\n      if (shouldUpdate) {\n        this._pendingForceUpdate = false;\n        // Will set `this.props`, `this.state` and `this.context`.\n        this._performComponentUpdate(\n          nextDescriptor,\n          nextProps,\n          nextState,\n          nextContext,\n          transaction\n        );\n      } else {\n        // If it's determined that a component should not update, we still want\n        // to set props and state.\n        this._descriptor = nextDescriptor;\n        this.props = nextProps;\n        this.state = nextState;\n        this.context = nextContext;\n\n        // Owner cannot change because shouldUpdateReactComponent doesn't allow\n        // it. TODO: Remove this._owner completely.\n        this._owner = nextDescriptor._owner;\n      }\n    } finally {\n      this._compositeLifeCycleState = null;\n    }\n  },\n\n  /**\n   * Merges new props and state, notifies delegate methods of update and\n   * performs update.\n   *\n   * @param {ReactDescriptor} nextDescriptor Next descriptor\n   * @param {object} nextProps Next public object to set as properties.\n   * @param {?object} nextState Next object to set as state.\n   * @param {?object} nextContext Next public object to set as context.\n   * @param {ReactReconcileTransaction} transaction\n   * @private\n   */\n  _performComponentUpdate: function(\n    nextDescriptor,\n    nextProps,\n    nextState,\n    nextContext,\n    transaction\n  ) {\n    var prevDescriptor = this._descriptor;\n    var prevProps = this.props;\n    var prevState = this.state;\n    var prevContext = this.context;\n\n    if (this.componentWillUpdate) {\n      this.componentWillUpdate(nextProps, nextState, nextContext);\n    }\n\n    this._descriptor = nextDescriptor;\n    this.props = nextProps;\n    this.state = nextState;\n    this.context = nextContext;\n\n    // Owner cannot change because shouldUpdateReactComponent doesn't allow\n    // it. TODO: Remove this._owner completely.\n    this._owner = nextDescriptor._owner;\n\n    this.updateComponent(\n      transaction,\n      prevDescriptor\n    );\n\n    if (this.componentDidUpdate) {\n      transaction.getReactMountReady().enqueue(\n        this.componentDidUpdate.bind(this, prevProps, prevState, prevContext),\n        this\n      );\n    }\n  },\n\n  receiveComponent: function(nextDescriptor, transaction) {\n    if (nextDescriptor === this._descriptor &&\n        nextDescriptor._owner != null) {\n      // Since descriptors are immutable after the owner is rendered,\n      // we can do a cheap identity compare here to determine if this is a\n      // superfluous reconcile. It's possible for state to be mutable but such\n      // change should trigger an update of the owner which would recreate\n      // the descriptor. We explicitly check for the existence of an owner since\n      // it's possible for a descriptor created outside a composite to be\n      // deeply mutated and reused.\n      return;\n    }\n\n    ReactComponent.Mixin.receiveComponent.call(\n      this,\n      nextDescriptor,\n      transaction\n    );\n  },\n\n  /**\n   * Updates the component's currently mounted DOM representation.\n   *\n   * By default, this implements React's rendering and reconciliation algorithm.\n   * Sophisticated clients may wish to override this.\n   *\n   * @param {ReactReconcileTransaction} transaction\n   * @param {ReactDescriptor} prevDescriptor\n   * @internal\n   * @overridable\n   */\n  updateComponent: ReactPerf.measure(\n    'ReactCompositeComponent',\n    'updateComponent',\n    function(transaction, prevParentDescriptor) {\n      ReactComponent.Mixin.updateComponent.call(\n        this,\n        transaction,\n        prevParentDescriptor\n      );\n\n      var prevComponentInstance = this._renderedComponent;\n      var prevDescriptor = prevComponentInstance._descriptor;\n      var nextDescriptor = this._renderValidatedComponent();\n      if (shouldUpdateReactComponent(prevDescriptor, nextDescriptor)) {\n        prevComponentInstance.receiveComponent(nextDescriptor, transaction);\n      } else {\n        // These two IDs are actually the same! But nothing should rely on that.\n        var thisID = this._rootNodeID;\n        var prevComponentID = prevComponentInstance._rootNodeID;\n        prevComponentInstance.unmountComponent();\n        this._renderedComponent = instantiateReactComponent(nextDescriptor);\n        var nextMarkup = this._renderedComponent.mountComponent(\n          thisID,\n          transaction,\n          this._mountDepth + 1\n        );\n        ReactComponent.BackendIDOperations.dangerouslyReplaceNodeWithMarkupByID(\n          prevComponentID,\n          nextMarkup\n        );\n      }\n    }\n  ),\n\n  /**\n   * Forces an update. This should only be invoked when it is known with\n   * certainty that we are **not** in a DOM transaction.\n   *\n   * You may want to call this when you know that some deeper aspect of the\n   * component's state has changed but `setState` was not called.\n   *\n   * This will not invoke `shouldUpdateComponent`, but it will invoke\n   * `componentWillUpdate` and `componentDidUpdate`.\n   *\n   * @param {?function} callback Called after update is complete.\n   * @final\n   * @protected\n   */\n  forceUpdate: function(callback) {\n    var compositeLifeCycleState = this._compositeLifeCycleState;\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      this.isMounted() ||\n        compositeLifeCycleState === CompositeLifeCycle.MOUNTING,\n      'forceUpdate(...): Can only force an update on mounted or mounting ' +\n        'components.'\n    ) : invariant(this.isMounted() ||\n      compositeLifeCycleState === CompositeLifeCycle.MOUNTING));\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      compositeLifeCycleState !== CompositeLifeCycle.RECEIVING_STATE &&\n      compositeLifeCycleState !== CompositeLifeCycle.UNMOUNTING,\n      'forceUpdate(...): Cannot force an update while unmounting component ' +\n      'or during an existing state transition (such as within `render`).'\n    ) : invariant(compositeLifeCycleState !== CompositeLifeCycle.RECEIVING_STATE &&\n    compositeLifeCycleState !== CompositeLifeCycle.UNMOUNTING));\n    this._pendingForceUpdate = true;\n    ReactUpdates.enqueueUpdate(this, callback);\n  },\n\n  /**\n   * @private\n   */\n  _renderValidatedComponent: ReactPerf.measure(\n    'ReactCompositeComponent',\n    '_renderValidatedComponent',\n    function() {\n      var renderedComponent;\n      var previousContext = ReactContext.current;\n      ReactContext.current = this._processChildContext(\n        this._descriptor._context\n      );\n      ReactCurrentOwner.current = this;\n      try {\n        renderedComponent = this.render();\n        if (renderedComponent === null || renderedComponent === false) {\n          renderedComponent = ReactEmptyComponent.getEmptyComponent();\n          ReactEmptyComponent.registerNullComponentID(this._rootNodeID);\n        } else {\n          ReactEmptyComponent.deregisterNullComponentID(this._rootNodeID);\n        }\n      } finally {\n        ReactContext.current = previousContext;\n        ReactCurrentOwner.current = null;\n      }\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        ReactDescriptor.isValidDescriptor(renderedComponent),\n        '%s.render(): A valid ReactComponent must be returned. You may have ' +\n          'returned undefined, an array or some other invalid object.',\n        this.constructor.displayName || 'ReactCompositeComponent'\n      ) : invariant(ReactDescriptor.isValidDescriptor(renderedComponent)));\n      return renderedComponent;\n    }\n  ),\n\n  /**\n   * @private\n   */\n  _bindAutoBindMethods: function() {\n    for (var autoBindKey in this.__reactAutoBindMap) {\n      if (!this.__reactAutoBindMap.hasOwnProperty(autoBindKey)) {\n        continue;\n      }\n      var method = this.__reactAutoBindMap[autoBindKey];\n      this[autoBindKey] = this._bindAutoBindMethod(ReactErrorUtils.guard(\n        method,\n        this.constructor.displayName + '.' + autoBindKey\n      ));\n    }\n  },\n\n  /**\n   * Binds a method to the component.\n   *\n   * @param {function} method Method to be bound.\n   * @private\n   */\n  _bindAutoBindMethod: function(method) {\n    var component = this;\n    var boundMethod = function() {\n      return method.apply(component, arguments);\n    };\n    if (\"production\" !== process.env.NODE_ENV) {\n      boundMethod.__reactBoundContext = component;\n      boundMethod.__reactBoundMethod = method;\n      boundMethod.__reactBoundArguments = null;\n      var componentName = component.constructor.displayName;\n      var _bind = boundMethod.bind;\n      boundMethod.bind = function(newThis ) {var args=Array.prototype.slice.call(arguments,1);\n        // User is trying to bind() an autobound method; we effectively will\n        // ignore the value of \"this\" that the user is trying to use, so\n        // let's warn.\n        if (newThis !== component && newThis !== null) {\n          monitorCodeUse('react_bind_warning', { component: componentName });\n          console.warn(\n            'bind(): React component methods may only be bound to the ' +\n            'component instance. See ' + componentName\n          );\n        } else if (!args.length) {\n          monitorCodeUse('react_bind_warning', { component: componentName });\n          console.warn(\n            'bind(): You are binding a component method to the component. ' +\n            'React does this for you automatically in a high-performance ' +\n            'way, so you can safely remove this call. See ' + componentName\n          );\n          return boundMethod;\n        }\n        var reboundMethod = _bind.apply(boundMethod, arguments);\n        reboundMethod.__reactBoundContext = component;\n        reboundMethod.__reactBoundMethod = method;\n        reboundMethod.__reactBoundArguments = args;\n        return reboundMethod;\n      };\n    }\n    return boundMethod;\n  }\n};\n\nvar ReactCompositeComponentBase = function() {};\nmixInto(ReactCompositeComponentBase, ReactComponent.Mixin);\nmixInto(ReactCompositeComponentBase, ReactOwner.Mixin);\nmixInto(ReactCompositeComponentBase, ReactPropTransferer.Mixin);\nmixInto(ReactCompositeComponentBase, ReactCompositeComponentMixin);\n\n/**\n * Module for creating composite components.\n *\n * @class ReactCompositeComponent\n * @extends ReactComponent\n * @extends ReactOwner\n * @extends ReactPropTransferer\n */\nvar ReactCompositeComponent = {\n\n  LifeCycle: CompositeLifeCycle,\n\n  Base: ReactCompositeComponentBase,\n\n  /**\n   * Creates a composite component class given a class specification.\n   *\n   * @param {object} spec Class specification (which must define `render`).\n   * @return {function} Component constructor function.\n   * @public\n   */\n  createClass: function(spec) {\n    var Constructor = function(props, owner) {\n      this.construct(props, owner);\n    };\n    Constructor.prototype = new ReactCompositeComponentBase();\n    Constructor.prototype.constructor = Constructor;\n\n    injectedMixins.forEach(\n      mixSpecIntoComponent.bind(null, Constructor)\n    );\n\n    mixSpecIntoComponent(Constructor, spec);\n\n    // Initialize the defaultProps property after all mixins have been merged\n    if (Constructor.getDefaultProps) {\n      Constructor.defaultProps = Constructor.getDefaultProps();\n    }\n\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      Constructor.prototype.render,\n      'createClass(...): Class specification must implement a `render` method.'\n    ) : invariant(Constructor.prototype.render));\n\n    if (\"production\" !== process.env.NODE_ENV) {\n      if (Constructor.prototype.componentShouldUpdate) {\n        monitorCodeUse(\n          'react_component_should_update_warning',\n          { component: spec.displayName }\n        );\n        console.warn(\n          (spec.displayName || 'A component') + ' has a method called ' +\n          'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' +\n          'The name is phrased as a question because the function is ' +\n          'expected to return a value.'\n         );\n      }\n    }\n\n    // Reduce time spent doing lookups by setting these on the prototype.\n    for (var methodName in ReactCompositeComponentInterface) {\n      if (!Constructor.prototype[methodName]) {\n        Constructor.prototype[methodName] = null;\n      }\n    }\n\n    var descriptorFactory = ReactDescriptor.createFactory(Constructor);\n\n    if (\"production\" !== process.env.NODE_ENV) {\n      return ReactDescriptorValidator.createFactory(\n        descriptorFactory,\n        Constructor.propTypes,\n        Constructor.contextTypes\n      );\n    }\n\n    return descriptorFactory;\n  },\n\n  injection: {\n    injectMixin: function(mixin) {\n      injectedMixins.push(mixin);\n    }\n  }\n};\n\nmodule.exports = ReactCompositeComponent;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactContext\n */\n\n\"use strict\";\n\nvar merge = require(\"./merge\");\n\n/**\n * Keeps track of the current context.\n *\n * The context is automatically passed down the component ownership hierarchy\n * and is accessible via `this.context` on ReactCompositeComponents.\n */\nvar ReactContext = {\n\n  /**\n   * @internal\n   * @type {object}\n   */\n  current: {},\n\n  /**\n   * Temporarily extends the current context while executing scopedCallback.\n   *\n   * A typical use case might look like\n   *\n   *  render: function() {\n   *    var children = ReactContext.withContext({foo: 'foo'} () => (\n   *\n   *    ));\n   *    return <div>{children}</div>;\n   *  }\n   *\n   * @param {object} newContext New context to merge into the existing context\n   * @param {function} scopedCallback Callback to run with the new context\n   * @return {ReactComponent|array<ReactComponent>}\n   */\n  withContext: function(newContext, scopedCallback) {\n    var result;\n    var previousContext = ReactContext.current;\n    ReactContext.current = merge(previousContext, newContext);\n    try {\n      result = scopedCallback();\n    } finally {\n      ReactContext.current = previousContext;\n    }\n    return result;\n  }\n\n};\n\nmodule.exports = ReactContext;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactCurrentOwner\n */\n\n\"use strict\";\n\n/**\n * Keeps track of the current owner.\n *\n * The current owner is the component who should own any components that are\n * currently being constructed.\n *\n * The depth indicate how many composite components are above this render level.\n */\nvar ReactCurrentOwner = {\n\n  /**\n   * @internal\n   * @type {ReactComponent}\n   */\n  current: null\n\n};\n\nmodule.exports = ReactCurrentOwner;\n","(function (process){\n/**\n * Copyright 2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDescriptor\n */\n\n\"use strict\";\n\nvar ReactContext = require(\"./ReactContext\");\nvar ReactCurrentOwner = require(\"./ReactCurrentOwner\");\n\nvar merge = require(\"./merge\");\nvar warning = require(\"./warning\");\n\n/**\n * Warn for mutations.\n *\n * @internal\n * @param {object} object\n * @param {string} key\n */\nfunction defineWarningProperty(object, key) {\n  Object.defineProperty(object, key, {\n\n    configurable: false,\n    enumerable: true,\n\n    get: function() {\n      if (!this._store) {\n        return null;\n      }\n      return this._store[key];\n    },\n\n    set: function(value) {\n      (\"production\" !== process.env.NODE_ENV ? warning(\n        false,\n        'Don\\'t set the ' + key + ' property of the component. ' +\n        'Mutate the existing props object instead.'\n      ) : null);\n      this._store[key] = value;\n    }\n\n  });\n}\n\n/**\n * This is updated to true if the membrane is successfully created.\n */\nvar useMutationMembrane = false;\n\n/**\n * Warn for mutations.\n *\n * @internal\n * @param {object} descriptor\n */\nfunction defineMutationMembrane(prototype) {\n  try {\n    var pseudoFrozenProperties = {\n      props: true\n    };\n    for (var key in pseudoFrozenProperties) {\n      defineWarningProperty(prototype, key);\n    }\n    useMutationMembrane = true;\n  } catch (x) {\n    // IE will fail on defineProperty\n  }\n}\n\n/**\n * Transfer static properties from the source to the target. Functions are\n * rebound to have this reflect the original source.\n */\nfunction proxyStaticMethods(target, source) {\n  if (typeof source !== 'function') {\n    return;\n  }\n  for (var key in source) {\n    if (source.hasOwnProperty(key)) {\n      var value = source[key];\n      if (typeof value === 'function') {\n        var bound = value.bind(source);\n        // Copy any properties defined on the function, such as `isRequired` on\n        // a PropTypes validator. (mergeInto refuses to work on functions.)\n        for (var k in value) {\n          if (value.hasOwnProperty(k)) {\n            bound[k] = value[k];\n          }\n        }\n        target[key] = bound;\n      } else {\n        target[key] = value;\n      }\n    }\n  }\n}\n\n/**\n * Base constructor for all React descriptors. This is only used to make this\n * work with a dynamic instanceof check. Nothing should live on this prototype.\n *\n * @param {*} type\n * @internal\n */\nvar ReactDescriptor = function() {};\n\nif (\"production\" !== process.env.NODE_ENV) {\n  defineMutationMembrane(ReactDescriptor.prototype);\n}\n\nReactDescriptor.createFactory = function(type) {\n\n  var descriptorPrototype = Object.create(ReactDescriptor.prototype);\n\n  var factory = function(props, children) {\n    // For consistency we currently allocate a new object for every descriptor.\n    // This protects the descriptor from being mutated by the original props\n    // object being mutated. It also protects the original props object from\n    // being mutated by children arguments and default props. This behavior\n    // comes with a performance cost and could be deprecated in the future.\n    // It could also be optimized with a smarter JSX transform.\n    if (props == null) {\n      props = {};\n    } else if (typeof props === 'object') {\n      props = merge(props);\n    }\n\n    // Children can be more than one argument, and those are transferred onto\n    // the newly allocated props object.\n    var childrenLength = arguments.length - 1;\n    if (childrenLength === 1) {\n      props.children = children;\n    } else if (childrenLength > 1) {\n      var childArray = Array(childrenLength);\n      for (var i = 0; i < childrenLength; i++) {\n        childArray[i] = arguments[i + 1];\n      }\n      props.children = childArray;\n    }\n\n    // Initialize the descriptor object\n    var descriptor = Object.create(descriptorPrototype);\n\n    // Record the component responsible for creating this descriptor.\n    descriptor._owner = ReactCurrentOwner.current;\n\n    // TODO: Deprecate withContext, and then the context becomes accessible\n    // through the owner.\n    descriptor._context = ReactContext.current;\n\n    if (\"production\" !== process.env.NODE_ENV) {\n      // The validation flag and props are currently mutative. We put them on\n      // an external backing store so that we can freeze the whole object.\n      // This can be replaced with a WeakMap once they are implemented in\n      // commonly used development environments.\n      descriptor._store = { validated: false, props: props };\n\n      // We're not allowed to set props directly on the object so we early\n      // return and rely on the prototype membrane to forward to the backing\n      // store.\n      if (useMutationMembrane) {\n        Object.freeze(descriptor);\n        return descriptor;\n      }\n    }\n\n    descriptor.props = props;\n    return descriptor;\n  };\n\n  // Currently we expose the prototype of the descriptor so that\n  // <Foo /> instanceof Foo works. This is controversial pattern.\n  factory.prototype = descriptorPrototype;\n\n  // Expose the type on the factory and the prototype so that it can be\n  // easily accessed on descriptors. E.g. <Foo />.type === Foo.type and for\n  // static methods like <Foo />.type.staticMethod();\n  // This should not be named constructor since this may not be the function\n  // that created the descriptor, and it may not even be a constructor.\n  factory.type = type;\n  descriptorPrototype.type = type;\n\n  proxyStaticMethods(factory, type);\n\n  // Expose a unique constructor on the prototype is that this works with type\n  // systems that compare constructor properties: <Foo />.constructor === Foo\n  // This may be controversial since it requires a known factory function.\n  descriptorPrototype.constructor = factory;\n\n  return factory;\n\n};\n\nReactDescriptor.cloneAndReplaceProps = function(oldDescriptor, newProps) {\n  var newDescriptor = Object.create(oldDescriptor.constructor.prototype);\n  // It's important that this property order matches the hidden class of the\n  // original descriptor to maintain perf.\n  newDescriptor._owner = oldDescriptor._owner;\n  newDescriptor._context = oldDescriptor._context;\n\n  if (\"production\" !== process.env.NODE_ENV) {\n    newDescriptor._store = {\n      validated: oldDescriptor._store.validated,\n      props: newProps\n    };\n    if (useMutationMembrane) {\n      Object.freeze(newDescriptor);\n      return newDescriptor;\n    }\n  }\n\n  newDescriptor.props = newProps;\n  return newDescriptor;\n};\n\n/**\n * Checks if a value is a valid descriptor constructor.\n *\n * @param {*}\n * @return {boolean}\n * @public\n */\nReactDescriptor.isValidFactory = function(factory) {\n  return typeof factory === 'function' &&\n         factory.prototype instanceof ReactDescriptor;\n};\n\n/**\n * @param {?object} object\n * @return {boolean} True if `object` is a valid component.\n * @final\n */\nReactDescriptor.isValidDescriptor = function(object) {\n  return object instanceof ReactDescriptor;\n};\n\nmodule.exports = ReactDescriptor;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDOM\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar ReactDescriptor = require(\"./ReactDescriptor\");\nvar ReactDescriptorValidator = require(\"./ReactDescriptorValidator\");\nvar ReactDOMComponent = require(\"./ReactDOMComponent\");\n\nvar mergeInto = require(\"./mergeInto\");\nvar mapObject = require(\"./mapObject\");\n\n/**\n * Creates a new React class that is idempotent and capable of containing other\n * React components. It accepts event listeners and DOM properties that are\n * valid according to `DOMProperty`.\n *\n *  - Event listeners: `onClick`, `onMouseDown`, etc.\n *  - DOM properties: `className`, `name`, `title`, etc.\n *\n * The `style` property functions differently from the DOM API. It accepts an\n * object mapping of style properties to values.\n *\n * @param {boolean} omitClose True if the close tag should be omitted.\n * @param {string} tag Tag name (e.g. `div`).\n * @private\n */\nfunction createDOMComponentClass(omitClose, tag) {\n  var Constructor = function(descriptor) {\n    this.construct(descriptor);\n  };\n  Constructor.prototype = new ReactDOMComponent(tag, omitClose);\n  Constructor.prototype.constructor = Constructor;\n  Constructor.displayName = tag;\n\n  var ConvenienceConstructor = ReactDescriptor.createFactory(Constructor);\n\n  if (\"production\" !== process.env.NODE_ENV) {\n    return ReactDescriptorValidator.createFactory(\n      ConvenienceConstructor\n    );\n  }\n\n  return ConvenienceConstructor;\n}\n\n/**\n * Creates a mapping from supported HTML tags to `ReactDOMComponent` classes.\n * This is also accessible via `React.DOM`.\n *\n * @public\n */\nvar ReactDOM = mapObject({\n  a: false,\n  abbr: false,\n  address: false,\n  area: true,\n  article: false,\n  aside: false,\n  audio: false,\n  b: false,\n  base: true,\n  bdi: false,\n  bdo: false,\n  big: false,\n  blockquote: false,\n  body: false,\n  br: true,\n  button: false,\n  canvas: false,\n  caption: false,\n  cite: false,\n  code: false,\n  col: true,\n  colgroup: false,\n  data: false,\n  datalist: false,\n  dd: false,\n  del: false,\n  details: false,\n  dfn: false,\n  div: false,\n  dl: false,\n  dt: false,\n  em: false,\n  embed: true,\n  fieldset: false,\n  figcaption: false,\n  figure: false,\n  footer: false,\n  form: false, // NOTE: Injected, see `ReactDOMForm`.\n  h1: false,\n  h2: false,\n  h3: false,\n  h4: false,\n  h5: false,\n  h6: false,\n  head: false,\n  header: false,\n  hr: true,\n  html: false,\n  i: false,\n  iframe: false,\n  img: true,\n  input: true,\n  ins: false,\n  kbd: false,\n  keygen: true,\n  label: false,\n  legend: false,\n  li: false,\n  link: true,\n  main: false,\n  map: false,\n  mark: false,\n  menu: false,\n  menuitem: false, // NOTE: Close tag should be omitted, but causes problems.\n  meta: true,\n  meter: false,\n  nav: false,\n  noscript: false,\n  object: false,\n  ol: false,\n  optgroup: false,\n  option: false,\n  output: false,\n  p: false,\n  param: true,\n  pre: false,\n  progress: false,\n  q: false,\n  rp: false,\n  rt: false,\n  ruby: false,\n  s: false,\n  samp: false,\n  script: false,\n  section: false,\n  select: false,\n  small: false,\n  source: true,\n  span: false,\n  strong: false,\n  style: false,\n  sub: false,\n  summary: false,\n  sup: false,\n  table: false,\n  tbody: false,\n  td: false,\n  textarea: false, // NOTE: Injected, see `ReactDOMTextarea`.\n  tfoot: false,\n  th: false,\n  thead: false,\n  time: false,\n  title: false,\n  tr: false,\n  track: true,\n  u: false,\n  ul: false,\n  'var': false,\n  video: false,\n  wbr: true,\n\n  // SVG\n  circle: false,\n  defs: false,\n  ellipse: false,\n  g: false,\n  line: false,\n  linearGradient: false,\n  mask: false,\n  path: false,\n  pattern: false,\n  polygon: false,\n  polyline: false,\n  radialGradient: false,\n  rect: false,\n  stop: false,\n  svg: false,\n  text: false,\n  tspan: false\n}, createDOMComponentClass);\n\nvar injection = {\n  injectComponentClasses: function(componentClasses) {\n    mergeInto(ReactDOM, componentClasses);\n  }\n};\n\nReactDOM.injection = injection;\n\nmodule.exports = ReactDOM;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDOMComponent\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar CSSPropertyOperations = require(\"./CSSPropertyOperations\");\nvar DOMProperty = require(\"./DOMProperty\");\nvar DOMPropertyOperations = require(\"./DOMPropertyOperations\");\nvar ReactBrowserComponentMixin = require(\"./ReactBrowserComponentMixin\");\nvar ReactComponent = require(\"./ReactComponent\");\nvar ReactBrowserEventEmitter = require(\"./ReactBrowserEventEmitter\");\nvar ReactMount = require(\"./ReactMount\");\nvar ReactMultiChild = require(\"./ReactMultiChild\");\nvar ReactPerf = require(\"./ReactPerf\");\n\nvar escapeTextForBrowser = require(\"./escapeTextForBrowser\");\nvar invariant = require(\"./invariant\");\nvar keyOf = require(\"./keyOf\");\nvar merge = require(\"./merge\");\nvar mixInto = require(\"./mixInto\");\n\nvar deleteListener = ReactBrowserEventEmitter.deleteListener;\nvar listenTo = ReactBrowserEventEmitter.listenTo;\nvar registrationNameModules = ReactBrowserEventEmitter.registrationNameModules;\n\n// For quickly matching children type, to test if can be treated as content.\nvar CONTENT_TYPES = {'string': true, 'number': true};\n\nvar STYLE = keyOf({style: null});\n\nvar ELEMENT_NODE_TYPE = 1;\n\n/**\n * @param {?object} props\n */\nfunction assertValidProps(props) {\n  if (!props) {\n    return;\n  }\n  // Note the use of `==` which checks for null or undefined.\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    props.children == null || props.dangerouslySetInnerHTML == null,\n    'Can only set one of `children` or `props.dangerouslySetInnerHTML`.'\n  ) : invariant(props.children == null || props.dangerouslySetInnerHTML == null));\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    props.style == null || typeof props.style === 'object',\n    'The `style` prop expects a mapping from style properties to values, ' +\n    'not a string.'\n  ) : invariant(props.style == null || typeof props.style === 'object'));\n}\n\nfunction putListener(id, registrationName, listener, transaction) {\n  var container = ReactMount.findReactContainerForID(id);\n  if (container) {\n    var doc = container.nodeType === ELEMENT_NODE_TYPE ?\n      container.ownerDocument :\n      container;\n    listenTo(registrationName, doc);\n  }\n  transaction.getPutListenerQueue().enqueuePutListener(\n    id,\n    registrationName,\n    listener\n  );\n}\n\n\n/**\n * @constructor ReactDOMComponent\n * @extends ReactComponent\n * @extends ReactMultiChild\n */\nfunction ReactDOMComponent(tag, omitClose) {\n  this._tagOpen = '<' + tag;\n  this._tagClose = omitClose ? '' : '</' + tag + '>';\n  this.tagName = tag.toUpperCase();\n}\n\nReactDOMComponent.Mixin = {\n\n  /**\n   * Generates root tag markup then recurses. This method has side effects and\n   * is not idempotent.\n   *\n   * @internal\n   * @param {string} rootID The root DOM ID for this node.\n   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n   * @param {number} mountDepth number of components in the owner hierarchy\n   * @return {string} The computed markup.\n   */\n  mountComponent: ReactPerf.measure(\n    'ReactDOMComponent',\n    'mountComponent',\n    function(rootID, transaction, mountDepth) {\n      ReactComponent.Mixin.mountComponent.call(\n        this,\n        rootID,\n        transaction,\n        mountDepth\n      );\n      assertValidProps(this.props);\n      return (\n        this._createOpenTagMarkupAndPutListeners(transaction) +\n        this._createContentMarkup(transaction) +\n        this._tagClose\n      );\n    }\n  ),\n\n  /**\n   * Creates markup for the open tag and all attributes.\n   *\n   * This method has side effects because events get registered.\n   *\n   * Iterating over object properties is faster than iterating over arrays.\n   * @see http://jsperf.com/obj-vs-arr-iteration\n   *\n   * @private\n   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n   * @return {string} Markup of opening tag.\n   */\n  _createOpenTagMarkupAndPutListeners: function(transaction) {\n    var props = this.props;\n    var ret = this._tagOpen;\n\n    for (var propKey in props) {\n      if (!props.hasOwnProperty(propKey)) {\n        continue;\n      }\n      var propValue = props[propKey];\n      if (propValue == null) {\n        continue;\n      }\n      if (registrationNameModules.hasOwnProperty(propKey)) {\n        putListener(this._rootNodeID, propKey, propValue, transaction);\n      } else {\n        if (propKey === STYLE) {\n          if (propValue) {\n            propValue = props.style = merge(props.style);\n          }\n          propValue = CSSPropertyOperations.createMarkupForStyles(propValue);\n        }\n        var markup =\n          DOMPropertyOperations.createMarkupForProperty(propKey, propValue);\n        if (markup) {\n          ret += ' ' + markup;\n        }\n      }\n    }\n\n    // For static pages, no need to put React ID and checksum. Saves lots of\n    // bytes.\n    if (transaction.renderToStaticMarkup) {\n      return ret + '>';\n    }\n\n    var markupForID = DOMPropertyOperations.createMarkupForID(this._rootNodeID);\n    return ret + ' ' + markupForID + '>';\n  },\n\n  /**\n   * Creates markup for the content between the tags.\n   *\n   * @private\n   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n   * @return {string} Content markup.\n   */\n  _createContentMarkup: function(transaction) {\n    // Intentional use of != to avoid catching zero/false.\n    var innerHTML = this.props.dangerouslySetInnerHTML;\n    if (innerHTML != null) {\n      if (innerHTML.__html != null) {\n        return innerHTML.__html;\n      }\n    } else {\n      var contentToUse =\n        CONTENT_TYPES[typeof this.props.children] ? this.props.children : null;\n      var childrenToUse = contentToUse != null ? null : this.props.children;\n      if (contentToUse != null) {\n        return escapeTextForBrowser(contentToUse);\n      } else if (childrenToUse != null) {\n        var mountImages = this.mountChildren(\n          childrenToUse,\n          transaction\n        );\n        return mountImages.join('');\n      }\n    }\n    return '';\n  },\n\n  receiveComponent: function(nextDescriptor, transaction) {\n    if (nextDescriptor === this._descriptor &&\n        nextDescriptor._owner != null) {\n      // Since descriptors are immutable after the owner is rendered,\n      // we can do a cheap identity compare here to determine if this is a\n      // superfluous reconcile. It's possible for state to be mutable but such\n      // change should trigger an update of the owner which would recreate\n      // the descriptor. We explicitly check for the existence of an owner since\n      // it's possible for a descriptor created outside a composite to be\n      // deeply mutated and reused.\n      return;\n    }\n\n    ReactComponent.Mixin.receiveComponent.call(\n      this,\n      nextDescriptor,\n      transaction\n    );\n  },\n\n  /**\n   * Updates a native DOM component after it has already been allocated and\n   * attached to the DOM. Reconciles the root DOM node, then recurses.\n   *\n   * @param {ReactReconcileTransaction} transaction\n   * @param {ReactDescriptor} prevDescriptor\n   * @internal\n   * @overridable\n   */\n  updateComponent: ReactPerf.measure(\n    'ReactDOMComponent',\n    'updateComponent',\n    function(transaction, prevDescriptor) {\n      assertValidProps(this._descriptor.props);\n      ReactComponent.Mixin.updateComponent.call(\n        this,\n        transaction,\n        prevDescriptor\n      );\n      this._updateDOMProperties(prevDescriptor.props, transaction);\n      this._updateDOMChildren(prevDescriptor.props, transaction);\n    }\n  ),\n\n  /**\n   * Reconciles the properties by detecting differences in property values and\n   * updating the DOM as necessary. This function is probably the single most\n   * critical path for performance optimization.\n   *\n   * TODO: Benchmark whether checking for changed values in memory actually\n   *       improves performance (especially statically positioned elements).\n   * TODO: Benchmark the effects of putting this at the top since 99% of props\n   *       do not change for a given reconciliation.\n   * TODO: Benchmark areas that can be improved with caching.\n   *\n   * @private\n   * @param {object} lastProps\n   * @param {ReactReconcileTransaction} transaction\n   */\n  _updateDOMProperties: function(lastProps, transaction) {\n    var nextProps = this.props;\n    var propKey;\n    var styleName;\n    var styleUpdates;\n    for (propKey in lastProps) {\n      if (nextProps.hasOwnProperty(propKey) ||\n         !lastProps.hasOwnProperty(propKey)) {\n        continue;\n      }\n      if (propKey === STYLE) {\n        var lastStyle = lastProps[propKey];\n        for (styleName in lastStyle) {\n          if (lastStyle.hasOwnProperty(styleName)) {\n            styleUpdates = styleUpdates || {};\n            styleUpdates[styleName] = '';\n          }\n        }\n      } else if (registrationNameModules.hasOwnProperty(propKey)) {\n        deleteListener(this._rootNodeID, propKey);\n      } else if (\n          DOMProperty.isStandardName[propKey] ||\n          DOMProperty.isCustomAttribute(propKey)) {\n        ReactComponent.BackendIDOperations.deletePropertyByID(\n          this._rootNodeID,\n          propKey\n        );\n      }\n    }\n    for (propKey in nextProps) {\n      var nextProp = nextProps[propKey];\n      var lastProp = lastProps[propKey];\n      if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp) {\n        continue;\n      }\n      if (propKey === STYLE) {\n        if (nextProp) {\n          nextProp = nextProps.style = merge(nextProp);\n        }\n        if (lastProp) {\n          // Unset styles on `lastProp` but not on `nextProp`.\n          for (styleName in lastProp) {\n            if (lastProp.hasOwnProperty(styleName) &&\n                (!nextProp || !nextProp.hasOwnProperty(styleName))) {\n              styleUpdates = styleUpdates || {};\n              styleUpdates[styleName] = '';\n            }\n          }\n          // Update styles that changed since `lastProp`.\n          for (styleName in nextProp) {\n            if (nextProp.hasOwnProperty(styleName) &&\n                lastProp[styleName] !== nextProp[styleName]) {\n              styleUpdates = styleUpdates || {};\n              styleUpdates[styleName] = nextProp[styleName];\n            }\n          }\n        } else {\n          // Relies on `updateStylesByID` not mutating `styleUpdates`.\n          styleUpdates = nextProp;\n        }\n      } else if (registrationNameModules.hasOwnProperty(propKey)) {\n        putListener(this._rootNodeID, propKey, nextProp, transaction);\n      } else if (\n          DOMProperty.isStandardName[propKey] ||\n          DOMProperty.isCustomAttribute(propKey)) {\n        ReactComponent.BackendIDOperations.updatePropertyByID(\n          this._rootNodeID,\n          propKey,\n          nextProp\n        );\n      }\n    }\n    if (styleUpdates) {\n      ReactComponent.BackendIDOperations.updateStylesByID(\n        this._rootNodeID,\n        styleUpdates\n      );\n    }\n  },\n\n  /**\n   * Reconciles the children with the various properties that affect the\n   * children content.\n   *\n   * @param {object} lastProps\n   * @param {ReactReconcileTransaction} transaction\n   */\n  _updateDOMChildren: function(lastProps, transaction) {\n    var nextProps = this.props;\n\n    var lastContent =\n      CONTENT_TYPES[typeof lastProps.children] ? lastProps.children : null;\n    var nextContent =\n      CONTENT_TYPES[typeof nextProps.children] ? nextProps.children : null;\n\n    var lastHtml =\n      lastProps.dangerouslySetInnerHTML &&\n      lastProps.dangerouslySetInnerHTML.__html;\n    var nextHtml =\n      nextProps.dangerouslySetInnerHTML &&\n      nextProps.dangerouslySetInnerHTML.__html;\n\n    // Note the use of `!=` which checks for null or undefined.\n    var lastChildren = lastContent != null ? null : lastProps.children;\n    var nextChildren = nextContent != null ? null : nextProps.children;\n\n    // If we're switching from children to content/html or vice versa, remove\n    // the old content\n    var lastHasContentOrHtml = lastContent != null || lastHtml != null;\n    var nextHasContentOrHtml = nextContent != null || nextHtml != null;\n    if (lastChildren != null && nextChildren == null) {\n      this.updateChildren(null, transaction);\n    } else if (lastHasContentOrHtml && !nextHasContentOrHtml) {\n      this.updateTextContent('');\n    }\n\n    if (nextContent != null) {\n      if (lastContent !== nextContent) {\n        this.updateTextContent('' + nextContent);\n      }\n    } else if (nextHtml != null) {\n      if (lastHtml !== nextHtml) {\n        ReactComponent.BackendIDOperations.updateInnerHTMLByID(\n          this._rootNodeID,\n          nextHtml\n        );\n      }\n    } else if (nextChildren != null) {\n      this.updateChildren(nextChildren, transaction);\n    }\n  },\n\n  /**\n   * Destroys all event registrations for this instance. Does not remove from\n   * the DOM. That must be done by the parent.\n   *\n   * @internal\n   */\n  unmountComponent: function() {\n    this.unmountChildren();\n    ReactBrowserEventEmitter.deleteAllListeners(this._rootNodeID);\n    ReactComponent.Mixin.unmountComponent.call(this);\n  }\n\n};\n\nmixInto(ReactDOMComponent, ReactComponent.Mixin);\nmixInto(ReactDOMComponent, ReactDOMComponent.Mixin);\nmixInto(ReactDOMComponent, ReactMultiChild.Mixin);\nmixInto(ReactDOMComponent, ReactBrowserComponentMixin);\n\nmodule.exports = ReactDOMComponent;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDefaultInjection\n */\n\n\"use strict\";\n\nvar BeforeInputEventPlugin = require(\"./BeforeInputEventPlugin\");\nvar ChangeEventPlugin = require(\"./ChangeEventPlugin\");\nvar ClientReactRootIndex = require(\"./ClientReactRootIndex\");\nvar CompositionEventPlugin = require(\"./CompositionEventPlugin\");\nvar DefaultEventPluginOrder = require(\"./DefaultEventPluginOrder\");\nvar EnterLeaveEventPlugin = require(\"./EnterLeaveEventPlugin\");\nvar ExecutionEnvironment = require(\"./ExecutionEnvironment\");\nvar HTMLDOMPropertyConfig = require(\"./HTMLDOMPropertyConfig\");\nvar MobileSafariClickEventPlugin = require(\"./MobileSafariClickEventPlugin\");\nvar ReactBrowserComponentMixin = require(\"./ReactBrowserComponentMixin\");\nvar ReactComponentBrowserEnvironment =\n  require(\"./ReactComponentBrowserEnvironment\");\nvar ReactDefaultBatchingStrategy = require(\"./ReactDefaultBatchingStrategy\");\nvar ReactDOM = require(\"./ReactDOM\");\nvar ReactDOMButton = require(\"./ReactDOMButton\");\nvar ReactDOMForm = require(\"./ReactDOMForm\");\nvar ReactDOMImg = require(\"./ReactDOMImg\");\nvar ReactDOMInput = require(\"./ReactDOMInput\");\nvar ReactDOMOption = require(\"./ReactDOMOption\");\nvar ReactDOMSelect = require(\"./ReactDOMSelect\");\nvar ReactDOMTextarea = require(\"./ReactDOMTextarea\");\nvar ReactEventListener = require(\"./ReactEventListener\");\nvar ReactInjection = require(\"./ReactInjection\");\nvar ReactInstanceHandles = require(\"./ReactInstanceHandles\");\nvar ReactMount = require(\"./ReactMount\");\nvar SelectEventPlugin = require(\"./SelectEventPlugin\");\nvar ServerReactRootIndex = require(\"./ServerReactRootIndex\");\nvar SimpleEventPlugin = require(\"./SimpleEventPlugin\");\nvar SVGDOMPropertyConfig = require(\"./SVGDOMPropertyConfig\");\n\nvar createFullPageComponent = require(\"./createFullPageComponent\");\n\nfunction inject() {\n  ReactInjection.EventEmitter.injectReactEventListener(\n    ReactEventListener\n  );\n\n  /**\n   * Inject modules for resolving DOM hierarchy and plugin ordering.\n   */\n  ReactInjection.EventPluginHub.injectEventPluginOrder(DefaultEventPluginOrder);\n  ReactInjection.EventPluginHub.injectInstanceHandle(ReactInstanceHandles);\n  ReactInjection.EventPluginHub.injectMount(ReactMount);\n\n  /**\n   * Some important event plugins included by default (without having to require\n   * them).\n   */\n  ReactInjection.EventPluginHub.injectEventPluginsByName({\n    SimpleEventPlugin: SimpleEventPlugin,\n    EnterLeaveEventPlugin: EnterLeaveEventPlugin,\n    ChangeEventPlugin: ChangeEventPlugin,\n    CompositionEventPlugin: CompositionEventPlugin,\n    MobileSafariClickEventPlugin: MobileSafariClickEventPlugin,\n    SelectEventPlugin: SelectEventPlugin,\n    BeforeInputEventPlugin: BeforeInputEventPlugin\n  });\n\n  ReactInjection.DOM.injectComponentClasses({\n    button: ReactDOMButton,\n    form: ReactDOMForm,\n    img: ReactDOMImg,\n    input: ReactDOMInput,\n    option: ReactDOMOption,\n    select: ReactDOMSelect,\n    textarea: ReactDOMTextarea,\n\n    html: createFullPageComponent(ReactDOM.html),\n    head: createFullPageComponent(ReactDOM.head),\n    body: createFullPageComponent(ReactDOM.body)\n  });\n\n  // This needs to happen after createFullPageComponent() otherwise the mixin\n  // gets double injected.\n  ReactInjection.CompositeComponent.injectMixin(ReactBrowserComponentMixin);\n\n  ReactInjection.DOMProperty.injectDOMPropertyConfig(HTMLDOMPropertyConfig);\n  ReactInjection.DOMProperty.injectDOMPropertyConfig(SVGDOMPropertyConfig);\n\n  ReactInjection.EmptyComponent.injectEmptyComponent(ReactDOM.noscript);\n\n  ReactInjection.Updates.injectReconcileTransaction(\n    ReactComponentBrowserEnvironment.ReactReconcileTransaction\n  );\n  ReactInjection.Updates.injectBatchingStrategy(\n    ReactDefaultBatchingStrategy\n  );\n\n  ReactInjection.RootIndex.injectCreateReactRootIndex(\n    ExecutionEnvironment.canUseDOM ?\n      ClientReactRootIndex.createReactRootIndex :\n      ServerReactRootIndex.createReactRootIndex\n  );\n\n  ReactInjection.Component.injectEnvironment(ReactComponentBrowserEnvironment);\n\n  if (\"production\" !== process.env.NODE_ENV) {\n    var url = (ExecutionEnvironment.canUseDOM && window.location.href) || '';\n    if ((/[?&]react_perf\\b/).test(url)) {\n      var ReactDefaultPerf = require(\"./ReactDefaultPerf\");\n      ReactDefaultPerf.start();\n    }\n  }\n}\n\nmodule.exports = {\n  inject: inject\n};\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactInstanceHandles\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar ReactRootIndex = require(\"./ReactRootIndex\");\n\nvar invariant = require(\"./invariant\");\n\nvar SEPARATOR = '.';\nvar SEPARATOR_LENGTH = SEPARATOR.length;\n\n/**\n * Maximum depth of traversals before we consider the possibility of a bad ID.\n */\nvar MAX_TREE_DEPTH = 100;\n\n/**\n * Creates a DOM ID prefix to use when mounting React components.\n *\n * @param {number} index A unique integer\n * @return {string} React root ID.\n * @internal\n */\nfunction getReactRootIDString(index) {\n  return SEPARATOR + index.toString(36);\n}\n\n/**\n * Checks if a character in the supplied ID is a separator or the end.\n *\n * @param {string} id A React DOM ID.\n * @param {number} index Index of the character to check.\n * @return {boolean} True if the character is a separator or end of the ID.\n * @private\n */\nfunction isBoundary(id, index) {\n  return id.charAt(index) === SEPARATOR || index === id.length;\n}\n\n/**\n * Checks if the supplied string is a valid React DOM ID.\n *\n * @param {string} id A React DOM ID, maybe.\n * @return {boolean} True if the string is a valid React DOM ID.\n * @private\n */\nfunction isValidID(id) {\n  return id === '' || (\n    id.charAt(0) === SEPARATOR && id.charAt(id.length - 1) !== SEPARATOR\n  );\n}\n\n/**\n * Checks if the first ID is an ancestor of or equal to the second ID.\n *\n * @param {string} ancestorID\n * @param {string} descendantID\n * @return {boolean} True if `ancestorID` is an ancestor of `descendantID`.\n * @internal\n */\nfunction isAncestorIDOf(ancestorID, descendantID) {\n  return (\n    descendantID.indexOf(ancestorID) === 0 &&\n    isBoundary(descendantID, ancestorID.length)\n  );\n}\n\n/**\n * Gets the parent ID of the supplied React DOM ID, `id`.\n *\n * @param {string} id ID of a component.\n * @return {string} ID of the parent, or an empty string.\n * @private\n */\nfunction getParentID(id) {\n  return id ? id.substr(0, id.lastIndexOf(SEPARATOR)) : '';\n}\n\n/**\n * Gets the next DOM ID on the tree path from the supplied `ancestorID` to the\n * supplied `destinationID`. If they are equal, the ID is returned.\n *\n * @param {string} ancestorID ID of an ancestor node of `destinationID`.\n * @param {string} destinationID ID of the destination node.\n * @return {string} Next ID on the path from `ancestorID` to `destinationID`.\n * @private\n */\nfunction getNextDescendantID(ancestorID, destinationID) {\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    isValidID(ancestorID) && isValidID(destinationID),\n    'getNextDescendantID(%s, %s): Received an invalid React DOM ID.',\n    ancestorID,\n    destinationID\n  ) : invariant(isValidID(ancestorID) && isValidID(destinationID)));\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    isAncestorIDOf(ancestorID, destinationID),\n    'getNextDescendantID(...): React has made an invalid assumption about ' +\n    'the DOM hierarchy. Expected `%s` to be an ancestor of `%s`.',\n    ancestorID,\n    destinationID\n  ) : invariant(isAncestorIDOf(ancestorID, destinationID)));\n  if (ancestorID === destinationID) {\n    return ancestorID;\n  }\n  // Skip over the ancestor and the immediate separator. Traverse until we hit\n  // another separator or we reach the end of `destinationID`.\n  var start = ancestorID.length + SEPARATOR_LENGTH;\n  for (var i = start; i < destinationID.length; i++) {\n    if (isBoundary(destinationID, i)) {\n      break;\n    }\n  }\n  return destinationID.substr(0, i);\n}\n\n/**\n * Gets the nearest common ancestor ID of two IDs.\n *\n * Using this ID scheme, the nearest common ancestor ID is the longest common\n * prefix of the two IDs that immediately preceded a \"marker\" in both strings.\n *\n * @param {string} oneID\n * @param {string} twoID\n * @return {string} Nearest common ancestor ID, or the empty string if none.\n * @private\n */\nfunction getFirstCommonAncestorID(oneID, twoID) {\n  var minLength = Math.min(oneID.length, twoID.length);\n  if (minLength === 0) {\n    return '';\n  }\n  var lastCommonMarkerIndex = 0;\n  // Use `<=` to traverse until the \"EOL\" of the shorter string.\n  for (var i = 0; i <= minLength; i++) {\n    if (isBoundary(oneID, i) && isBoundary(twoID, i)) {\n      lastCommonMarkerIndex = i;\n    } else if (oneID.charAt(i) !== twoID.charAt(i)) {\n      break;\n    }\n  }\n  var longestCommonID = oneID.substr(0, lastCommonMarkerIndex);\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    isValidID(longestCommonID),\n    'getFirstCommonAncestorID(%s, %s): Expected a valid React DOM ID: %s',\n    oneID,\n    twoID,\n    longestCommonID\n  ) : invariant(isValidID(longestCommonID)));\n  return longestCommonID;\n}\n\n/**\n * Traverses the parent path between two IDs (either up or down). The IDs must\n * not be the same, and there must exist a parent path between them. If the\n * callback returns `false`, traversal is stopped.\n *\n * @param {?string} start ID at which to start traversal.\n * @param {?string} stop ID at which to end traversal.\n * @param {function} cb Callback to invoke each ID with.\n * @param {?boolean} skipFirst Whether or not to skip the first node.\n * @param {?boolean} skipLast Whether or not to skip the last node.\n * @private\n */\nfunction traverseParentPath(start, stop, cb, arg, skipFirst, skipLast) {\n  start = start || '';\n  stop = stop || '';\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    start !== stop,\n    'traverseParentPath(...): Cannot traverse from and to the same ID, `%s`.',\n    start\n  ) : invariant(start !== stop));\n  var traverseUp = isAncestorIDOf(stop, start);\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    traverseUp || isAncestorIDOf(start, stop),\n    'traverseParentPath(%s, %s, ...): Cannot traverse from two IDs that do ' +\n    'not have a parent path.',\n    start,\n    stop\n  ) : invariant(traverseUp || isAncestorIDOf(start, stop)));\n  // Traverse from `start` to `stop` one depth at a time.\n  var depth = 0;\n  var traverse = traverseUp ? getParentID : getNextDescendantID;\n  for (var id = start; /* until break */; id = traverse(id, stop)) {\n    var ret;\n    if ((!skipFirst || id !== start) && (!skipLast || id !== stop)) {\n      ret = cb(id, traverseUp, arg);\n    }\n    if (ret === false || id === stop) {\n      // Only break //after// visiting `stop`.\n      break;\n    }\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      depth++ < MAX_TREE_DEPTH,\n      'traverseParentPath(%s, %s, ...): Detected an infinite loop while ' +\n      'traversing the React DOM ID tree. This may be due to malformed IDs: %s',\n      start, stop\n    ) : invariant(depth++ < MAX_TREE_DEPTH));\n  }\n}\n\n/**\n * Manages the IDs assigned to DOM representations of React components. This\n * uses a specific scheme in order to traverse the DOM efficiently (e.g. in\n * order to simulate events).\n *\n * @internal\n */\nvar ReactInstanceHandles = {\n\n  /**\n   * Constructs a React root ID\n   * @return {string} A React root ID.\n   */\n  createReactRootID: function() {\n    return getReactRootIDString(ReactRootIndex.createReactRootIndex());\n  },\n\n  /**\n   * Constructs a React ID by joining a root ID with a name.\n   *\n   * @param {string} rootID Root ID of a parent component.\n   * @param {string} name A component's name (as flattened children).\n   * @return {string} A React ID.\n   * @internal\n   */\n  createReactID: function(rootID, name) {\n    return rootID + name;\n  },\n\n  /**\n   * Gets the DOM ID of the React component that is the root of the tree that\n   * contains the React component with the supplied DOM ID.\n   *\n   * @param {string} id DOM ID of a React component.\n   * @return {?string} DOM ID of the React component that is the root.\n   * @internal\n   */\n  getReactRootIDFromNodeID: function(id) {\n    if (id && id.charAt(0) === SEPARATOR && id.length > 1) {\n      var index = id.indexOf(SEPARATOR, 1);\n      return index > -1 ? id.substr(0, index) : id;\n    }\n    return null;\n  },\n\n  /**\n   * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that\n   * should would receive a `mouseEnter` or `mouseLeave` event.\n   *\n   * NOTE: Does not invoke the callback on the nearest common ancestor because\n   * nothing \"entered\" or \"left\" that element.\n   *\n   * @param {string} leaveID ID being left.\n   * @param {string} enterID ID being entered.\n   * @param {function} cb Callback to invoke on each entered/left ID.\n   * @param {*} upArg Argument to invoke the callback with on left IDs.\n   * @param {*} downArg Argument to invoke the callback with on entered IDs.\n   * @internal\n   */\n  traverseEnterLeave: function(leaveID, enterID, cb, upArg, downArg) {\n    var ancestorID = getFirstCommonAncestorID(leaveID, enterID);\n    if (ancestorID !== leaveID) {\n      traverseParentPath(leaveID, ancestorID, cb, upArg, false, true);\n    }\n    if (ancestorID !== enterID) {\n      traverseParentPath(ancestorID, enterID, cb, downArg, true, false);\n    }\n  },\n\n  /**\n   * Simulates the traversal of a two-phase, capture/bubble event dispatch.\n   *\n   * NOTE: This traversal happens on IDs without touching the DOM.\n   *\n   * @param {string} targetID ID of the target node.\n   * @param {function} cb Callback to invoke.\n   * @param {*} arg Argument to invoke the callback with.\n   * @internal\n   */\n  traverseTwoPhase: function(targetID, cb, arg) {\n    if (targetID) {\n      traverseParentPath('', targetID, cb, arg, true, false);\n      traverseParentPath(targetID, '', cb, arg, false, true);\n    }\n  },\n\n  /**\n   * Traverse a node ID, calling the supplied `cb` for each ancestor ID. For\n   * example, passing `.0.$row-0.1` would result in `cb` getting called\n   * with `.0`, `.0.$row-0`, and `.0.$row-0.1`.\n   *\n   * NOTE: This traversal happens on IDs without touching the DOM.\n   *\n   * @param {string} targetID ID of the target node.\n   * @param {function} cb Callback to invoke.\n   * @param {*} arg Argument to invoke the callback with.\n   * @internal\n   */\n  traverseAncestors: function(targetID, cb, arg) {\n    traverseParentPath('', targetID, cb, arg, true, false);\n  },\n\n  /**\n   * Exposed for unit testing.\n   * @private\n   */\n  _getFirstCommonAncestorID: getFirstCommonAncestorID,\n\n  /**\n   * Exposed for unit testing.\n   * @private\n   */\n  _getNextDescendantID: getNextDescendantID,\n\n  isAncestorIDOf: isAncestorIDOf,\n\n  SEPARATOR: SEPARATOR\n\n};\n\nmodule.exports = ReactInstanceHandles;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactMount\n */\n\n\"use strict\";\n\nvar DOMProperty = require(\"./DOMProperty\");\nvar ReactBrowserEventEmitter = require(\"./ReactBrowserEventEmitter\");\nvar ReactCurrentOwner = require(\"./ReactCurrentOwner\");\nvar ReactDescriptor = require(\"./ReactDescriptor\");\nvar ReactInstanceHandles = require(\"./ReactInstanceHandles\");\nvar ReactPerf = require(\"./ReactPerf\");\n\nvar containsNode = require(\"./containsNode\");\nvar getReactRootElementInContainer = require(\"./getReactRootElementInContainer\");\nvar instantiateReactComponent = require(\"./instantiateReactComponent\");\nvar invariant = require(\"./invariant\");\nvar shouldUpdateReactComponent = require(\"./shouldUpdateReactComponent\");\nvar warning = require(\"./warning\");\n\nvar SEPARATOR = ReactInstanceHandles.SEPARATOR;\n\nvar ATTR_NAME = DOMProperty.ID_ATTRIBUTE_NAME;\nvar nodeCache = {};\n\nvar ELEMENT_NODE_TYPE = 1;\nvar DOC_NODE_TYPE = 9;\n\n/** Mapping from reactRootID to React component instance. */\nvar instancesByReactRootID = {};\n\n/** Mapping from reactRootID to `container` nodes. */\nvar containersByReactRootID = {};\n\nif (\"production\" !== process.env.NODE_ENV) {\n  /** __DEV__-only mapping from reactRootID to root elements. */\n  var rootElementsByReactRootID = {};\n}\n\n// Used to store breadth-first search state in findComponentRoot.\nvar findComponentRootReusableArray = [];\n\n/**\n * @param {DOMElement} container DOM element that may contain a React component.\n * @return {?string} A \"reactRoot\" ID, if a React component is rendered.\n */\nfunction getReactRootID(container) {\n  var rootElement = getReactRootElementInContainer(container);\n  return rootElement && ReactMount.getID(rootElement);\n}\n\n/**\n * Accessing node[ATTR_NAME] or calling getAttribute(ATTR_NAME) on a form\n * element can return its control whose name or ID equals ATTR_NAME. All\n * DOM nodes support `getAttributeNode` but this can also get called on\n * other objects so just return '' if we're given something other than a\n * DOM node (such as window).\n *\n * @param {?DOMElement|DOMWindow|DOMDocument|DOMTextNode} node DOM node.\n * @return {string} ID of the supplied `domNode`.\n */\nfunction getID(node) {\n  var id = internalGetID(node);\n  if (id) {\n    if (nodeCache.hasOwnProperty(id)) {\n      var cached = nodeCache[id];\n      if (cached !== node) {\n        (\"production\" !== process.env.NODE_ENV ? invariant(\n          !isValid(cached, id),\n          'ReactMount: Two valid but unequal nodes with the same `%s`: %s',\n          ATTR_NAME, id\n        ) : invariant(!isValid(cached, id)));\n\n        nodeCache[id] = node;\n      }\n    } else {\n      nodeCache[id] = node;\n    }\n  }\n\n  return id;\n}\n\nfunction internalGetID(node) {\n  // If node is something like a window, document, or text node, none of\n  // which support attributes or a .getAttribute method, gracefully return\n  // the empty string, as if the attribute were missing.\n  return node && node.getAttribute && node.getAttribute(ATTR_NAME) || '';\n}\n\n/**\n * Sets the React-specific ID of the given node.\n *\n * @param {DOMElement} node The DOM node whose ID will be set.\n * @param {string} id The value of the ID attribute.\n */\nfunction setID(node, id) {\n  var oldID = internalGetID(node);\n  if (oldID !== id) {\n    delete nodeCache[oldID];\n  }\n  node.setAttribute(ATTR_NAME, id);\n  nodeCache[id] = node;\n}\n\n/**\n * Finds the node with the supplied React-generated DOM ID.\n *\n * @param {string} id A React-generated DOM ID.\n * @return {DOMElement} DOM node with the suppled `id`.\n * @internal\n */\nfunction getNode(id) {\n  if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) {\n    nodeCache[id] = ReactMount.findReactNodeByID(id);\n  }\n  return nodeCache[id];\n}\n\n/**\n * A node is \"valid\" if it is contained by a currently mounted container.\n *\n * This means that the node does not have to be contained by a document in\n * order to be considered valid.\n *\n * @param {?DOMElement} node The candidate DOM node.\n * @param {string} id The expected ID of the node.\n * @return {boolean} Whether the node is contained by a mounted container.\n */\nfunction isValid(node, id) {\n  if (node) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      internalGetID(node) === id,\n      'ReactMount: Unexpected modification of `%s`',\n      ATTR_NAME\n    ) : invariant(internalGetID(node) === id));\n\n    var container = ReactMount.findReactContainerForID(id);\n    if (container && containsNode(container, node)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/**\n * Causes the cache to forget about one React-specific ID.\n *\n * @param {string} id The ID to forget.\n */\nfunction purgeID(id) {\n  delete nodeCache[id];\n}\n\nvar deepestNodeSoFar = null;\nfunction findDeepestCachedAncestorImpl(ancestorID) {\n  var ancestor = nodeCache[ancestorID];\n  if (ancestor && isValid(ancestor, ancestorID)) {\n    deepestNodeSoFar = ancestor;\n  } else {\n    // This node isn't populated in the cache, so presumably none of its\n    // descendants are. Break out of the loop.\n    return false;\n  }\n}\n\n/**\n * Return the deepest cached node whose ID is a prefix of `targetID`.\n */\nfunction findDeepestCachedAncestor(targetID) {\n  deepestNodeSoFar = null;\n  ReactInstanceHandles.traverseAncestors(\n    targetID,\n    findDeepestCachedAncestorImpl\n  );\n\n  var foundNode = deepestNodeSoFar;\n  deepestNodeSoFar = null;\n  return foundNode;\n}\n\n/**\n * Mounting is the process of initializing a React component by creatings its\n * representative DOM elements and inserting them into a supplied `container`.\n * Any prior content inside `container` is destroyed in the process.\n *\n *   ReactMount.renderComponent(\n *     component,\n *     document.getElementById('container')\n *   );\n *\n *   <div id=\"container\">                   <-- Supplied `container`.\n *     <div data-reactid=\".3\">              <-- Rendered reactRoot of React\n *       // ...                                 component.\n *     </div>\n *   </div>\n *\n * Inside of `container`, the first element rendered is the \"reactRoot\".\n */\nvar ReactMount = {\n  /** Exposed for debugging purposes **/\n  _instancesByReactRootID: instancesByReactRootID,\n\n  /**\n   * This is a hook provided to support rendering React components while\n   * ensuring that the apparent scroll position of its `container` does not\n   * change.\n   *\n   * @param {DOMElement} container The `container` being rendered into.\n   * @param {function} renderCallback This must be called once to do the render.\n   */\n  scrollMonitor: function(container, renderCallback) {\n    renderCallback();\n  },\n\n  /**\n   * Take a component that's already mounted into the DOM and replace its props\n   * @param {ReactComponent} prevComponent component instance already in the DOM\n   * @param {ReactComponent} nextComponent component instance to render\n   * @param {DOMElement} container container to render into\n   * @param {?function} callback function triggered on completion\n   */\n  _updateRootComponent: function(\n      prevComponent,\n      nextComponent,\n      container,\n      callback) {\n    var nextProps = nextComponent.props;\n    ReactMount.scrollMonitor(container, function() {\n      prevComponent.replaceProps(nextProps, callback);\n    });\n\n    if (\"production\" !== process.env.NODE_ENV) {\n      // Record the root element in case it later gets transplanted.\n      rootElementsByReactRootID[getReactRootID(container)] =\n        getReactRootElementInContainer(container);\n    }\n\n    return prevComponent;\n  },\n\n  /**\n   * Register a component into the instance map and starts scroll value\n   * monitoring\n   * @param {ReactComponent} nextComponent component instance to render\n   * @param {DOMElement} container container to render into\n   * @return {string} reactRoot ID prefix\n   */\n  _registerComponent: function(nextComponent, container) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      container && (\n        container.nodeType === ELEMENT_NODE_TYPE ||\n        container.nodeType === DOC_NODE_TYPE\n      ),\n      '_registerComponent(...): Target container is not a DOM element.'\n    ) : invariant(container && (\n      container.nodeType === ELEMENT_NODE_TYPE ||\n      container.nodeType === DOC_NODE_TYPE\n    )));\n\n    ReactBrowserEventEmitter.ensureScrollValueMonitoring();\n\n    var reactRootID = ReactMount.registerContainer(container);\n    instancesByReactRootID[reactRootID] = nextComponent;\n    return reactRootID;\n  },\n\n  /**\n   * Render a new component into the DOM.\n   * @param {ReactComponent} nextComponent component instance to render\n   * @param {DOMElement} container container to render into\n   * @param {boolean} shouldReuseMarkup if we should skip the markup insertion\n   * @return {ReactComponent} nextComponent\n   */\n  _renderNewRootComponent: ReactPerf.measure(\n    'ReactMount',\n    '_renderNewRootComponent',\n    function(\n        nextComponent,\n        container,\n        shouldReuseMarkup) {\n      // Various parts of our code (such as ReactCompositeComponent's\n      // _renderValidatedComponent) assume that calls to render aren't nested;\n      // verify that that's the case.\n      (\"production\" !== process.env.NODE_ENV ? warning(\n        ReactCurrentOwner.current == null,\n        '_renderNewRootComponent(): Render methods should be a pure function ' +\n        'of props and state; triggering nested component updates from ' +\n        'render is not allowed. If necessary, trigger nested updates in ' +\n        'componentDidUpdate.'\n      ) : null);\n\n      var componentInstance = instantiateReactComponent(nextComponent);\n      var reactRootID = ReactMount._registerComponent(\n        componentInstance,\n        container\n      );\n      componentInstance.mountComponentIntoNode(\n        reactRootID,\n        container,\n        shouldReuseMarkup\n      );\n\n      if (\"production\" !== process.env.NODE_ENV) {\n        // Record the root element in case it later gets transplanted.\n        rootElementsByReactRootID[reactRootID] =\n          getReactRootElementInContainer(container);\n      }\n\n      return componentInstance;\n    }\n  ),\n\n  /**\n   * Renders a React component into the DOM in the supplied `container`.\n   *\n   * If the React component was previously rendered into `container`, this will\n   * perform an update on it and only mutate the DOM as necessary to reflect the\n   * latest React component.\n   *\n   * @param {ReactDescriptor} nextDescriptor Component descriptor to render.\n   * @param {DOMElement} container DOM element to render into.\n   * @param {?function} callback function triggered on completion\n   * @return {ReactComponent} Component instance rendered in `container`.\n   */\n  renderComponent: function(nextDescriptor, container, callback) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      ReactDescriptor.isValidDescriptor(nextDescriptor),\n      'renderComponent(): Invalid component descriptor.%s',\n      (\n        ReactDescriptor.isValidFactory(nextDescriptor) ?\n          ' Instead of passing a component class, make sure to instantiate ' +\n          'it first by calling it with props.' :\n        // Check if it quacks like a descriptor\n        typeof nextDescriptor.props !== \"undefined\" ?\n          ' This may be caused by unintentionally loading two independent ' +\n          'copies of React.' :\n          ''\n      )\n    ) : invariant(ReactDescriptor.isValidDescriptor(nextDescriptor)));\n\n    var prevComponent = instancesByReactRootID[getReactRootID(container)];\n\n    if (prevComponent) {\n      var prevDescriptor = prevComponent._descriptor;\n      if (shouldUpdateReactComponent(prevDescriptor, nextDescriptor)) {\n        return ReactMount._updateRootComponent(\n          prevComponent,\n          nextDescriptor,\n          container,\n          callback\n        );\n      } else {\n        ReactMount.unmountComponentAtNode(container);\n      }\n    }\n\n    var reactRootElement = getReactRootElementInContainer(container);\n    var containerHasReactMarkup =\n      reactRootElement && ReactMount.isRenderedByReact(reactRootElement);\n\n    var shouldReuseMarkup = containerHasReactMarkup && !prevComponent;\n\n    var component = ReactMount._renderNewRootComponent(\n      nextDescriptor,\n      container,\n      shouldReuseMarkup\n    );\n    callback && callback.call(component);\n    return component;\n  },\n\n  /**\n   * Constructs a component instance of `constructor` with `initialProps` and\n   * renders it into the supplied `container`.\n   *\n   * @param {function} constructor React component constructor.\n   * @param {?object} props Initial props of the component instance.\n   * @param {DOMElement} container DOM element to render into.\n   * @return {ReactComponent} Component instance rendered in `container`.\n   */\n  constructAndRenderComponent: function(constructor, props, container) {\n    return ReactMount.renderComponent(constructor(props), container);\n  },\n\n  /**\n   * Constructs a component instance of `constructor` with `initialProps` and\n   * renders it into a container node identified by supplied `id`.\n   *\n   * @param {function} componentConstructor React component constructor\n   * @param {?object} props Initial props of the component instance.\n   * @param {string} id ID of the DOM element to render into.\n   * @return {ReactComponent} Component instance rendered in the container node.\n   */\n  constructAndRenderComponentByID: function(constructor, props, id) {\n    var domNode = document.getElementById(id);\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      domNode,\n      'Tried to get element with id of \"%s\" but it is not present on the page.',\n      id\n    ) : invariant(domNode));\n    return ReactMount.constructAndRenderComponent(constructor, props, domNode);\n  },\n\n  /**\n   * Registers a container node into which React components will be rendered.\n   * This also creates the \"reactRoot\" ID that will be assigned to the element\n   * rendered within.\n   *\n   * @param {DOMElement} container DOM element to register as a container.\n   * @return {string} The \"reactRoot\" ID of elements rendered within.\n   */\n  registerContainer: function(container) {\n    var reactRootID = getReactRootID(container);\n    if (reactRootID) {\n      // If one exists, make sure it is a valid \"reactRoot\" ID.\n      reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(reactRootID);\n    }\n    if (!reactRootID) {\n      // No valid \"reactRoot\" ID found, create one.\n      reactRootID = ReactInstanceHandles.createReactRootID();\n    }\n    containersByReactRootID[reactRootID] = container;\n    return reactRootID;\n  },\n\n  /**\n   * Unmounts and destroys the React component rendered in the `container`.\n   *\n   * @param {DOMElement} container DOM element containing a React component.\n   * @return {boolean} True if a component was found in and unmounted from\n   *                   `container`\n   */\n  unmountComponentAtNode: function(container) {\n    // Various parts of our code (such as ReactCompositeComponent's\n    // _renderValidatedComponent) assume that calls to render aren't nested;\n    // verify that that's the case. (Strictly speaking, unmounting won't cause a\n    // render but we still don't expect to be in a render call here.)\n    (\"production\" !== process.env.NODE_ENV ? warning(\n      ReactCurrentOwner.current == null,\n      'unmountComponentAtNode(): Render methods should be a pure function of ' +\n      'props and state; triggering nested component updates from render is ' +\n      'not allowed. If necessary, trigger nested updates in ' +\n      'componentDidUpdate.'\n    ) : null);\n\n    var reactRootID = getReactRootID(container);\n    var component = instancesByReactRootID[reactRootID];\n    if (!component) {\n      return false;\n    }\n    ReactMount.unmountComponentFromNode(component, container);\n    delete instancesByReactRootID[reactRootID];\n    delete containersByReactRootID[reactRootID];\n    if (\"production\" !== process.env.NODE_ENV) {\n      delete rootElementsByReactRootID[reactRootID];\n    }\n    return true;\n  },\n\n  /**\n   * Unmounts a component and removes it from the DOM.\n   *\n   * @param {ReactComponent} instance React component instance.\n   * @param {DOMElement} container DOM element to unmount from.\n   * @final\n   * @internal\n   * @see {ReactMount.unmountComponentAtNode}\n   */\n  unmountComponentFromNode: function(instance, container) {\n    instance.unmountComponent();\n\n    if (container.nodeType === DOC_NODE_TYPE) {\n      container = container.documentElement;\n    }\n\n    // http://jsperf.com/emptying-a-node\n    while (container.lastChild) {\n      container.removeChild(container.lastChild);\n    }\n  },\n\n  /**\n   * Finds the container DOM element that contains React component to which the\n   * supplied DOM `id` belongs.\n   *\n   * @param {string} id The ID of an element rendered by a React component.\n   * @return {?DOMElement} DOM element that contains the `id`.\n   */\n  findReactContainerForID: function(id) {\n    var reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(id);\n    var container = containersByReactRootID[reactRootID];\n\n    if (\"production\" !== process.env.NODE_ENV) {\n      var rootElement = rootElementsByReactRootID[reactRootID];\n      if (rootElement && rootElement.parentNode !== container) {\n        (\"production\" !== process.env.NODE_ENV ? invariant(\n          // Call internalGetID here because getID calls isValid which calls\n          // findReactContainerForID (this function).\n          internalGetID(rootElement) === reactRootID,\n          'ReactMount: Root element ID differed from reactRootID.'\n        ) : invariant(// Call internalGetID here because getID calls isValid which calls\n        // findReactContainerForID (this function).\n        internalGetID(rootElement) === reactRootID));\n\n        var containerChild = container.firstChild;\n        if (containerChild &&\n            reactRootID === internalGetID(containerChild)) {\n          // If the container has a new child with the same ID as the old\n          // root element, then rootElementsByReactRootID[reactRootID] is\n          // just stale and needs to be updated. The case that deserves a\n          // warning is when the container is empty.\n          rootElementsByReactRootID[reactRootID] = containerChild;\n        } else {\n          console.warn(\n            'ReactMount: Root element has been removed from its original ' +\n            'container. New container:', rootElement.parentNode\n          );\n        }\n      }\n    }\n\n    return container;\n  },\n\n  /**\n   * Finds an element rendered by React with the supplied ID.\n   *\n   * @param {string} id ID of a DOM node in the React component.\n   * @return {DOMElement} Root DOM node of the React component.\n   */\n  findReactNodeByID: function(id) {\n    var reactRoot = ReactMount.findReactContainerForID(id);\n    return ReactMount.findComponentRoot(reactRoot, id);\n  },\n\n  /**\n   * True if the supplied `node` is rendered by React.\n   *\n   * @param {*} node DOM Element to check.\n   * @return {boolean} True if the DOM Element appears to be rendered by React.\n   * @internal\n   */\n  isRenderedByReact: function(node) {\n    if (node.nodeType !== 1) {\n      // Not a DOMElement, therefore not a React component\n      return false;\n    }\n    var id = ReactMount.getID(node);\n    return id ? id.charAt(0) === SEPARATOR : false;\n  },\n\n  /**\n   * Traverses up the ancestors of the supplied node to find a node that is a\n   * DOM representation of a React component.\n   *\n   * @param {*} node\n   * @return {?DOMEventTarget}\n   * @internal\n   */\n  getFirstReactDOM: function(node) {\n    var current = node;\n    while (current && current.parentNode !== current) {\n      if (ReactMount.isRenderedByReact(current)) {\n        return current;\n      }\n      current = current.parentNode;\n    }\n    return null;\n  },\n\n  /**\n   * Finds a node with the supplied `targetID` inside of the supplied\n   * `ancestorNode`.  Exploits the ID naming scheme to perform the search\n   * quickly.\n   *\n   * @param {DOMEventTarget} ancestorNode Search from this root.\n   * @pararm {string} targetID ID of the DOM representation of the component.\n   * @return {DOMEventTarget} DOM node with the supplied `targetID`.\n   * @internal\n   */\n  findComponentRoot: function(ancestorNode, targetID) {\n    var firstChildren = findComponentRootReusableArray;\n    var childIndex = 0;\n\n    var deepestAncestor = findDeepestCachedAncestor(targetID) || ancestorNode;\n\n    firstChildren[0] = deepestAncestor.firstChild;\n    firstChildren.length = 1;\n\n    while (childIndex < firstChildren.length) {\n      var child = firstChildren[childIndex++];\n      var targetChild;\n\n      while (child) {\n        var childID = ReactMount.getID(child);\n        if (childID) {\n          // Even if we find the node we're looking for, we finish looping\n          // through its siblings to ensure they're cached so that we don't have\n          // to revisit this node again. Otherwise, we make n^2 calls to getID\n          // when visiting the many children of a single node in order.\n\n          if (targetID === childID) {\n            targetChild = child;\n          } else if (ReactInstanceHandles.isAncestorIDOf(childID, targetID)) {\n            // If we find a child whose ID is an ancestor of the given ID,\n            // then we can be sure that we only want to search the subtree\n            // rooted at this child, so we can throw out the rest of the\n            // search state.\n            firstChildren.length = childIndex = 0;\n            firstChildren.push(child.firstChild);\n          }\n\n        } else {\n          // If this child had no ID, then there's a chance that it was\n          // injected automatically by the browser, as when a `<table>`\n          // element sprouts an extra `<tbody>` child as a side effect of\n          // `.innerHTML` parsing. Optimistically continue down this\n          // branch, but not before examining the other siblings.\n          firstChildren.push(child.firstChild);\n        }\n\n        child = child.nextSibling;\n      }\n\n      if (targetChild) {\n        // Emptying firstChildren/findComponentRootReusableArray is\n        // not necessary for correctness, but it helps the GC reclaim\n        // any nodes that were left at the end of the search.\n        firstChildren.length = 0;\n\n        return targetChild;\n      }\n    }\n\n    firstChildren.length = 0;\n\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      false,\n      'findComponentRoot(..., %s): Unable to find element. This probably ' +\n      'means the DOM was unexpectedly mutated (e.g., by the browser), ' +\n      'usually due to forgetting a <tbody> when using tables, nesting <p> ' +\n      'or <a> tags, or using non-SVG elements in an <svg> parent. Try ' +\n      'inspecting the child nodes of the element with React ID `%s`.',\n      targetID,\n      ReactMount.getID(ancestorNode)\n    ) : invariant(false));\n  },\n\n\n  /**\n   * React ID utilities.\n   */\n\n  getReactRootID: getReactRootID,\n\n  getID: getID,\n\n  setID: setID,\n\n  getNode: getNode,\n\n  purgeID: purgeID\n};\n\nmodule.exports = ReactMount;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactMultiChild\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar ReactComponent = require(\"./ReactComponent\");\nvar ReactMultiChildUpdateTypes = require(\"./ReactMultiChildUpdateTypes\");\n\nvar flattenChildren = require(\"./flattenChildren\");\nvar instantiateReactComponent = require(\"./instantiateReactComponent\");\nvar shouldUpdateReactComponent = require(\"./shouldUpdateReactComponent\");\n\n/**\n * Updating children of a component may trigger recursive updates. The depth is\n * used to batch recursive updates to render markup more efficiently.\n *\n * @type {number}\n * @private\n */\nvar updateDepth = 0;\n\n/**\n * Queue of update configuration objects.\n *\n * Each object has a `type` property that is in `ReactMultiChildUpdateTypes`.\n *\n * @type {array<object>}\n * @private\n */\nvar updateQueue = [];\n\n/**\n * Queue of markup to be rendered.\n *\n * @type {array<string>}\n * @private\n */\nvar markupQueue = [];\n\n/**\n * Enqueues markup to be rendered and inserted at a supplied index.\n *\n * @param {string} parentID ID of the parent component.\n * @param {string} markup Markup that renders into an element.\n * @param {number} toIndex Destination index.\n * @private\n */\nfunction enqueueMarkup(parentID, markup, toIndex) {\n  // NOTE: Null values reduce hidden classes.\n  updateQueue.push({\n    parentID: parentID,\n    parentNode: null,\n    type: ReactMultiChildUpdateTypes.INSERT_MARKUP,\n    markupIndex: markupQueue.push(markup) - 1,\n    textContent: null,\n    fromIndex: null,\n    toIndex: toIndex\n  });\n}\n\n/**\n * Enqueues moving an existing element to another index.\n *\n * @param {string} parentID ID of the parent component.\n * @param {number} fromIndex Source index of the existing element.\n * @param {number} toIndex Destination index of the element.\n * @private\n */\nfunction enqueueMove(parentID, fromIndex, toIndex) {\n  // NOTE: Null values reduce hidden classes.\n  updateQueue.push({\n    parentID: parentID,\n    parentNode: null,\n    type: ReactMultiChildUpdateTypes.MOVE_EXISTING,\n    markupIndex: null,\n    textContent: null,\n    fromIndex: fromIndex,\n    toIndex: toIndex\n  });\n}\n\n/**\n * Enqueues removing an element at an index.\n *\n * @param {string} parentID ID of the parent component.\n * @param {number} fromIndex Index of the element to remove.\n * @private\n */\nfunction enqueueRemove(parentID, fromIndex) {\n  // NOTE: Null values reduce hidden classes.\n  updateQueue.push({\n    parentID: parentID,\n    parentNode: null,\n    type: ReactMultiChildUpdateTypes.REMOVE_NODE,\n    markupIndex: null,\n    textContent: null,\n    fromIndex: fromIndex,\n    toIndex: null\n  });\n}\n\n/**\n * Enqueues setting the text content.\n *\n * @param {string} parentID ID of the parent component.\n * @param {string} textContent Text content to set.\n * @private\n */\nfunction enqueueTextContent(parentID, textContent) {\n  // NOTE: Null values reduce hidden classes.\n  updateQueue.push({\n    parentID: parentID,\n    parentNode: null,\n    type: ReactMultiChildUpdateTypes.TEXT_CONTENT,\n    markupIndex: null,\n    textContent: textContent,\n    fromIndex: null,\n    toIndex: null\n  });\n}\n\n/**\n * Processes any enqueued updates.\n *\n * @private\n */\nfunction processQueue() {\n  if (updateQueue.length) {\n    ReactComponent.BackendIDOperations.dangerouslyProcessChildrenUpdates(\n      updateQueue,\n      markupQueue\n    );\n    clearQueue();\n  }\n}\n\n/**\n * Clears any enqueued updates.\n *\n * @private\n */\nfunction clearQueue() {\n  updateQueue.length = 0;\n  markupQueue.length = 0;\n}\n\n/**\n * ReactMultiChild are capable of reconciling multiple children.\n *\n * @class ReactMultiChild\n * @internal\n */\nvar ReactMultiChild = {\n\n  /**\n   * Provides common functionality for components that must reconcile multiple\n   * children. This is used by `ReactDOMComponent` to mount, update, and\n   * unmount child components.\n   *\n   * @lends {ReactMultiChild.prototype}\n   */\n  Mixin: {\n\n    /**\n     * Generates a \"mount image\" for each of the supplied children. In the case\n     * of `ReactDOMComponent`, a mount image is a string of markup.\n     *\n     * @param {?object} nestedChildren Nested child maps.\n     * @return {array} An array of mounted representations.\n     * @internal\n     */\n    mountChildren: function(nestedChildren, transaction) {\n      var children = flattenChildren(nestedChildren);\n      var mountImages = [];\n      var index = 0;\n      this._renderedChildren = children;\n      for (var name in children) {\n        var child = children[name];\n        if (children.hasOwnProperty(name)) {\n          // The rendered children must be turned into instances as they're\n          // mounted.\n          var childInstance = instantiateReactComponent(child);\n          children[name] = childInstance;\n          // Inlined for performance, see `ReactInstanceHandles.createReactID`.\n          var rootID = this._rootNodeID + name;\n          var mountImage = childInstance.mountComponent(\n            rootID,\n            transaction,\n            this._mountDepth + 1\n          );\n          childInstance._mountIndex = index;\n          mountImages.push(mountImage);\n          index++;\n        }\n      }\n      return mountImages;\n    },\n\n    /**\n     * Replaces any rendered children with a text content string.\n     *\n     * @param {string} nextContent String of content.\n     * @internal\n     */\n    updateTextContent: function(nextContent) {\n      updateDepth++;\n      var errorThrown = true;\n      try {\n        var prevChildren = this._renderedChildren;\n        // Remove any rendered children.\n        for (var name in prevChildren) {\n          if (prevChildren.hasOwnProperty(name)) {\n            this._unmountChildByName(prevChildren[name], name);\n          }\n        }\n        // Set new text content.\n        this.setTextContent(nextContent);\n        errorThrown = false;\n      } finally {\n        updateDepth--;\n        if (!updateDepth) {\n          errorThrown ? clearQueue() : processQueue();\n        }\n      }\n    },\n\n    /**\n     * Updates the rendered children with new children.\n     *\n     * @param {?object} nextNestedChildren Nested child maps.\n     * @param {ReactReconcileTransaction} transaction\n     * @internal\n     */\n    updateChildren: function(nextNestedChildren, transaction) {\n      updateDepth++;\n      var errorThrown = true;\n      try {\n        this._updateChildren(nextNestedChildren, transaction);\n        errorThrown = false;\n      } finally {\n        updateDepth--;\n        if (!updateDepth) {\n          errorThrown ? clearQueue() : processQueue();\n        }\n      }\n    },\n\n    /**\n     * Improve performance by isolating this hot code path from the try/catch\n     * block in `updateChildren`.\n     *\n     * @param {?object} nextNestedChildren Nested child maps.\n     * @param {ReactReconcileTransaction} transaction\n     * @final\n     * @protected\n     */\n    _updateChildren: function(nextNestedChildren, transaction) {\n      var nextChildren = flattenChildren(nextNestedChildren);\n      var prevChildren = this._renderedChildren;\n      if (!nextChildren && !prevChildren) {\n        return;\n      }\n      var name;\n      // `nextIndex` will increment for each child in `nextChildren`, but\n      // `lastIndex` will be the last index visited in `prevChildren`.\n      var lastIndex = 0;\n      var nextIndex = 0;\n      for (name in nextChildren) {\n        if (!nextChildren.hasOwnProperty(name)) {\n          continue;\n        }\n        var prevChild = prevChildren && prevChildren[name];\n        var prevDescriptor = prevChild && prevChild._descriptor;\n        var nextDescriptor = nextChildren[name];\n        if (shouldUpdateReactComponent(prevDescriptor, nextDescriptor)) {\n          this.moveChild(prevChild, nextIndex, lastIndex);\n          lastIndex = Math.max(prevChild._mountIndex, lastIndex);\n          prevChild.receiveComponent(nextDescriptor, transaction);\n          prevChild._mountIndex = nextIndex;\n        } else {\n          if (prevChild) {\n            // Update `lastIndex` before `_mountIndex` gets unset by unmounting.\n            lastIndex = Math.max(prevChild._mountIndex, lastIndex);\n            this._unmountChildByName(prevChild, name);\n          }\n          // The child must be instantiated before it's mounted.\n          var nextChildInstance = instantiateReactComponent(nextDescriptor);\n          this._mountChildByNameAtIndex(\n            nextChildInstance, name, nextIndex, transaction\n          );\n        }\n        nextIndex++;\n      }\n      // Remove children that are no longer present.\n      for (name in prevChildren) {\n        if (prevChildren.hasOwnProperty(name) &&\n            !(nextChildren && nextChildren[name])) {\n          this._unmountChildByName(prevChildren[name], name);\n        }\n      }\n    },\n\n    /**\n     * Unmounts all rendered children. This should be used to clean up children\n     * when this component is unmounted.\n     *\n     * @internal\n     */\n    unmountChildren: function() {\n      var renderedChildren = this._renderedChildren;\n      for (var name in renderedChildren) {\n        var renderedChild = renderedChildren[name];\n        // TODO: When is this not true?\n        if (renderedChild.unmountComponent) {\n          renderedChild.unmountComponent();\n        }\n      }\n      this._renderedChildren = null;\n    },\n\n    /**\n     * Moves a child component to the supplied index.\n     *\n     * @param {ReactComponent} child Component to move.\n     * @param {number} toIndex Destination index of the element.\n     * @param {number} lastIndex Last index visited of the siblings of `child`.\n     * @protected\n     */\n    moveChild: function(child, toIndex, lastIndex) {\n      // If the index of `child` is less than `lastIndex`, then it needs to\n      // be moved. Otherwise, we do not need to move it because a child will be\n      // inserted or moved before `child`.\n      if (child._mountIndex < lastIndex) {\n        enqueueMove(this._rootNodeID, child._mountIndex, toIndex);\n      }\n    },\n\n    /**\n     * Creates a child component.\n     *\n     * @param {ReactComponent} child Component to create.\n     * @param {string} mountImage Markup to insert.\n     * @protected\n     */\n    createChild: function(child, mountImage) {\n      enqueueMarkup(this._rootNodeID, mountImage, child._mountIndex);\n    },\n\n    /**\n     * Removes a child component.\n     *\n     * @param {ReactComponent} child Child to remove.\n     * @protected\n     */\n    removeChild: function(child) {\n      enqueueRemove(this._rootNodeID, child._mountIndex);\n    },\n\n    /**\n     * Sets this text content string.\n     *\n     * @param {string} textContent Text content to set.\n     * @protected\n     */\n    setTextContent: function(textContent) {\n      enqueueTextContent(this._rootNodeID, textContent);\n    },\n\n    /**\n     * Mounts a child with the supplied name.\n     *\n     * NOTE: This is part of `updateChildren` and is here for readability.\n     *\n     * @param {ReactComponent} child Component to mount.\n     * @param {string} name Name of the child.\n     * @param {number} index Index at which to insert the child.\n     * @param {ReactReconcileTransaction} transaction\n     * @private\n     */\n    _mountChildByNameAtIndex: function(child, name, index, transaction) {\n      // Inlined for performance, see `ReactInstanceHandles.createReactID`.\n      var rootID = this._rootNodeID + name;\n      var mountImage = child.mountComponent(\n        rootID,\n        transaction,\n        this._mountDepth + 1\n      );\n      child._mountIndex = index;\n      this.createChild(child, mountImage);\n      this._renderedChildren = this._renderedChildren || {};\n      this._renderedChildren[name] = child;\n    },\n\n    /**\n     * Unmounts a rendered child by name.\n     *\n     * NOTE: This is part of `updateChildren` and is here for readability.\n     *\n     * @param {ReactComponent} child Component to unmount.\n     * @param {string} name Name of the child in `this._renderedChildren`.\n     * @private\n     */\n    _unmountChildByName: function(child, name) {\n      this.removeChild(child);\n      child._mountIndex = null;\n      child.unmountComponent();\n      delete this._renderedChildren[name];\n    }\n\n  }\n\n};\n\nmodule.exports = ReactMultiChild;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactPerf\n * @typechecks static-only\n */\n\n\"use strict\";\n\n/**\n * ReactPerf is a general AOP system designed to measure performance. This\n * module only has the hooks: see ReactDefaultPerf for the analysis tool.\n */\nvar ReactPerf = {\n  /**\n   * Boolean to enable/disable measurement. Set to false by default to prevent\n   * accidental logging and perf loss.\n   */\n  enableMeasure: false,\n\n  /**\n   * Holds onto the measure function in use. By default, don't measure\n   * anything, but we'll override this if we inject a measure function.\n   */\n  storedMeasure: _noMeasure,\n\n  /**\n   * Use this to wrap methods you want to measure. Zero overhead in production.\n   *\n   * @param {string} objName\n   * @param {string} fnName\n   * @param {function} func\n   * @return {function}\n   */\n  measure: function(objName, fnName, func) {\n    if (\"production\" !== process.env.NODE_ENV) {\n      var measuredFunc = null;\n      return function() {\n        if (ReactPerf.enableMeasure) {\n          if (!measuredFunc) {\n            measuredFunc = ReactPerf.storedMeasure(objName, fnName, func);\n          }\n          return measuredFunc.apply(this, arguments);\n        }\n        return func.apply(this, arguments);\n      };\n    }\n    return func;\n  },\n\n  injection: {\n    /**\n     * @param {function} measure\n     */\n    injectMeasure: function(measure) {\n      ReactPerf.storedMeasure = measure;\n    }\n  }\n};\n\n/**\n * Simply passes through the measured function, without measuring it.\n *\n * @param {string} objName\n * @param {string} fnName\n * @param {function} func\n * @return {function}\n */\nfunction _noMeasure(objName, fnName, func) {\n  return func;\n}\n\nmodule.exports = ReactPerf;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactPropTypes\n */\n\n\"use strict\";\n\nvar ReactDescriptor = require(\"./ReactDescriptor\");\nvar ReactPropTypeLocationNames = require(\"./ReactPropTypeLocationNames\");\n\nvar emptyFunction = require(\"./emptyFunction\");\n\n/**\n * Collection of methods that allow declaration and validation of props that are\n * supplied to React components. Example usage:\n *\n *   var Props = require('ReactPropTypes');\n *   var MyArticle = React.createClass({\n *     propTypes: {\n *       // An optional string prop named \"description\".\n *       description: Props.string,\n *\n *       // A required enum prop named \"category\".\n *       category: Props.oneOf(['News','Photos']).isRequired,\n *\n *       // A prop named \"dialog\" that requires an instance of Dialog.\n *       dialog: Props.instanceOf(Dialog).isRequired\n *     },\n *     render: function() { ... }\n *   });\n *\n * A more formal specification of how these methods are used:\n *\n *   type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n *   decl := ReactPropTypes.{type}(.isRequired)?\n *\n * Each and every declaration produces a function with the same signature. This\n * allows the creation of custom validation functions. For example:\n *\n *  var MyLink = React.createClass({\n *    propTypes: {\n *      // An optional string or URI prop named \"href\".\n *      href: function(props, propName, componentName) {\n *        var propValue = props[propName];\n *        if (propValue != null && typeof propValue !== 'string' &&\n *            !(propValue instanceof URI)) {\n *          return new Error(\n *            'Expected a string or an URI for ' + propName + ' in ' +\n *            componentName\n *          );\n *        }\n *      }\n *    },\n *    render: function() {...}\n *  });\n *\n * @internal\n */\n\nvar ANONYMOUS = '<<anonymous>>';\n\nvar ReactPropTypes = {\n  array: createPrimitiveTypeChecker('array'),\n  bool: createPrimitiveTypeChecker('boolean'),\n  func: createPrimitiveTypeChecker('function'),\n  number: createPrimitiveTypeChecker('number'),\n  object: createPrimitiveTypeChecker('object'),\n  string: createPrimitiveTypeChecker('string'),\n\n  any: createAnyTypeChecker(),\n  arrayOf: createArrayOfTypeChecker,\n  component: createComponentTypeChecker(),\n  instanceOf: createInstanceTypeChecker,\n  objectOf: createObjectOfTypeChecker,\n  oneOf: createEnumTypeChecker,\n  oneOfType: createUnionTypeChecker,\n  renderable: createRenderableTypeChecker(),\n  shape: createShapeTypeChecker\n};\n\nfunction createChainableTypeChecker(validate) {\n  function checkType(isRequired, props, propName, componentName, location) {\n    componentName = componentName || ANONYMOUS;\n    if (props[propName] == null) {\n      var locationName = ReactPropTypeLocationNames[location];\n      if (isRequired) {\n        return new Error(\n          (\"Required \" + locationName + \" `\" + propName + \"` was not specified in \")+\n          (\"`\" + componentName + \"`.\")\n        );\n      }\n    } else {\n      return validate(props, propName, componentName, location);\n    }\n  }\n\n  var chainedCheckType = checkType.bind(null, false);\n  chainedCheckType.isRequired = checkType.bind(null, true);\n\n  return chainedCheckType;\n}\n\nfunction createPrimitiveTypeChecker(expectedType) {\n  function validate(props, propName, componentName, location) {\n    var propValue = props[propName];\n    var propType = getPropType(propValue);\n    if (propType !== expectedType) {\n      var locationName = ReactPropTypeLocationNames[location];\n      // `propValue` being instance of, say, date/regexp, pass the 'object'\n      // check, but we can offer a more precise error message here rather than\n      // 'of type `object`'.\n      var preciseType = getPreciseType(propValue);\n\n      return new Error(\n        (\"Invalid \" + locationName + \" `\" + propName + \"` of type `\" + preciseType + \"` \") +\n        (\"supplied to `\" + componentName + \"`, expected `\" + expectedType + \"`.\")\n      );\n    }\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction createAnyTypeChecker() {\n  return createChainableTypeChecker(emptyFunction.thatReturns());\n}\n\nfunction createArrayOfTypeChecker(typeChecker) {\n  function validate(props, propName, componentName, location) {\n    var propValue = props[propName];\n    if (!Array.isArray(propValue)) {\n      var locationName = ReactPropTypeLocationNames[location];\n      var propType = getPropType(propValue);\n      return new Error(\n        (\"Invalid \" + locationName + \" `\" + propName + \"` of type \") +\n        (\"`\" + propType + \"` supplied to `\" + componentName + \"`, expected an array.\")\n      );\n    }\n    for (var i = 0; i < propValue.length; i++) {\n      var error = typeChecker(propValue, i, componentName, location);\n      if (error instanceof Error) {\n        return error;\n      }\n    }\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction createComponentTypeChecker() {\n  function validate(props, propName, componentName, location) {\n    if (!ReactDescriptor.isValidDescriptor(props[propName])) {\n      var locationName = ReactPropTypeLocationNames[location];\n      return new Error(\n        (\"Invalid \" + locationName + \" `\" + propName + \"` supplied to \") +\n        (\"`\" + componentName + \"`, expected a React component.\")\n      );\n    }\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction createInstanceTypeChecker(expectedClass) {\n  function validate(props, propName, componentName, location) {\n    if (!(props[propName] instanceof expectedClass)) {\n      var locationName = ReactPropTypeLocationNames[location];\n      var expectedClassName = expectedClass.name || ANONYMOUS;\n      return new Error(\n        (\"Invalid \" + locationName + \" `\" + propName + \"` supplied to \") +\n        (\"`\" + componentName + \"`, expected instance of `\" + expectedClassName + \"`.\")\n      );\n    }\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction createEnumTypeChecker(expectedValues) {\n  function validate(props, propName, componentName, location) {\n    var propValue = props[propName];\n    for (var i = 0; i < expectedValues.length; i++) {\n      if (propValue === expectedValues[i]) {\n        return;\n      }\n    }\n\n    var locationName = ReactPropTypeLocationNames[location];\n    var valuesString = JSON.stringify(expectedValues);\n    return new Error(\n      (\"Invalid \" + locationName + \" `\" + propName + \"` of value `\" + propValue + \"` \") +\n      (\"supplied to `\" + componentName + \"`, expected one of \" + valuesString + \".\")\n    );\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction createObjectOfTypeChecker(typeChecker) {\n  function validate(props, propName, componentName, location) {\n    var propValue = props[propName];\n    var propType = getPropType(propValue);\n    if (propType !== 'object') {\n      var locationName = ReactPropTypeLocationNames[location];\n      return new Error(\n        (\"Invalid \" + locationName + \" `\" + propName + \"` of type \") +\n        (\"`\" + propType + \"` supplied to `\" + componentName + \"`, expected an object.\")\n      );\n    }\n    for (var key in propValue) {\n      if (propValue.hasOwnProperty(key)) {\n        var error = typeChecker(propValue, key, componentName, location);\n        if (error instanceof Error) {\n          return error;\n        }\n      }\n    }\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction createUnionTypeChecker(arrayOfTypeCheckers) {\n  function validate(props, propName, componentName, location) {\n    for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n      var checker = arrayOfTypeCheckers[i];\n      if (checker(props, propName, componentName, location) == null) {\n        return;\n      }\n    }\n\n    var locationName = ReactPropTypeLocationNames[location];\n    return new Error(\n      (\"Invalid \" + locationName + \" `\" + propName + \"` supplied to \") +\n      (\"`\" + componentName + \"`.\")\n    );\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction createRenderableTypeChecker() {\n  function validate(props, propName, componentName, location) {\n    if (!isRenderable(props[propName])) {\n      var locationName = ReactPropTypeLocationNames[location];\n      return new Error(\n        (\"Invalid \" + locationName + \" `\" + propName + \"` supplied to \") +\n        (\"`\" + componentName + \"`, expected a renderable prop.\")\n      );\n    }\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction createShapeTypeChecker(shapeTypes) {\n  function validate(props, propName, componentName, location) {\n    var propValue = props[propName];\n    var propType = getPropType(propValue);\n    if (propType !== 'object') {\n      var locationName = ReactPropTypeLocationNames[location];\n      return new Error(\n        (\"Invalid \" + locationName + \" `\" + propName + \"` of type `\" + propType + \"` \") +\n        (\"supplied to `\" + componentName + \"`, expected `object`.\")\n      );\n    }\n    for (var key in shapeTypes) {\n      var checker = shapeTypes[key];\n      if (!checker) {\n        continue;\n      }\n      var error = checker(propValue, key, componentName, location);\n      if (error) {\n        return error;\n      }\n    }\n  }\n  return createChainableTypeChecker(validate, 'expected `object`');\n}\n\nfunction isRenderable(propValue) {\n  switch(typeof propValue) {\n    // TODO: this was probably written with the assumption that we're not\n    // returning `this.props.component` directly from `render`. This is\n    // currently not supported but we should, to make it consistent.\n    case 'number':\n    case 'string':\n      return true;\n    case 'boolean':\n      return !propValue;\n    case 'object':\n      if (Array.isArray(propValue)) {\n        return propValue.every(isRenderable);\n      }\n      if (ReactDescriptor.isValidDescriptor(propValue)) {\n        return true;\n      }\n      for (var k in propValue) {\n        if (!isRenderable(propValue[k])) {\n          return false;\n        }\n      }\n      return true;\n    default:\n      return false;\n  }\n}\n\n// Equivalent of `typeof` but with special handling for array and regexp.\nfunction getPropType(propValue) {\n  var propType = typeof propValue;\n  if (Array.isArray(propValue)) {\n    return 'array';\n  }\n  if (propValue instanceof RegExp) {\n    // Old webkits (at least until Android 4.0) return 'function' rather than\n    // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n    // passes PropTypes.object.\n    return 'object';\n  }\n  return propType;\n}\n\n// This handles more types than `getPropType`. Only used for error messages.\n// See `createPrimitiveTypeChecker`.\nfunction getPreciseType(propValue) {\n  var propType = getPropType(propValue);\n  if (propType === 'object') {\n    if (propValue instanceof Date) {\n      return 'date';\n    } else if (propValue instanceof RegExp) {\n      return 'regexp';\n    }\n  }\n  return propType;\n}\n\nmodule.exports = ReactPropTypes;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @typechecks static-only\n * @providesModule ReactServerRendering\n */\n\"use strict\";\n\nvar ReactDescriptor = require(\"./ReactDescriptor\");\nvar ReactInstanceHandles = require(\"./ReactInstanceHandles\");\nvar ReactMarkupChecksum = require(\"./ReactMarkupChecksum\");\nvar ReactServerRenderingTransaction =\n  require(\"./ReactServerRenderingTransaction\");\n\nvar instantiateReactComponent = require(\"./instantiateReactComponent\");\nvar invariant = require(\"./invariant\");\n\n/**\n * @param {ReactComponent} component\n * @return {string} the HTML markup\n */\nfunction renderComponentToString(component) {\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    ReactDescriptor.isValidDescriptor(component),\n    'renderComponentToString(): You must pass a valid ReactComponent.'\n  ) : invariant(ReactDescriptor.isValidDescriptor(component)));\n\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    !(arguments.length === 2 && typeof arguments[1] === 'function'),\n    'renderComponentToString(): This function became synchronous and now ' +\n    'returns the generated markup. Please remove the second parameter.'\n  ) : invariant(!(arguments.length === 2 && typeof arguments[1] === 'function')));\n\n  var transaction;\n  try {\n    var id = ReactInstanceHandles.createReactRootID();\n    transaction = ReactServerRenderingTransaction.getPooled(false);\n\n    return transaction.perform(function() {\n      var componentInstance = instantiateReactComponent(component);\n      var markup = componentInstance.mountComponent(id, transaction, 0);\n      return ReactMarkupChecksum.addChecksumToMarkup(markup);\n    }, null);\n  } finally {\n    ReactServerRenderingTransaction.release(transaction);\n  }\n}\n\n/**\n * @param {ReactComponent} component\n * @return {string} the HTML markup, without the extra React ID and checksum\n* (for generating static pages)\n */\nfunction renderComponentToStaticMarkup(component) {\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    ReactDescriptor.isValidDescriptor(component),\n    'renderComponentToStaticMarkup(): You must pass a valid ReactComponent.'\n  ) : invariant(ReactDescriptor.isValidDescriptor(component)));\n\n  var transaction;\n  try {\n    var id = ReactInstanceHandles.createReactRootID();\n    transaction = ReactServerRenderingTransaction.getPooled(true);\n\n    return transaction.perform(function() {\n      var componentInstance = instantiateReactComponent(component);\n      return componentInstance.mountComponent(id, transaction, 0);\n    }, null);\n  } finally {\n    ReactServerRenderingTransaction.release(transaction);\n  }\n}\n\nmodule.exports = {\n  renderComponentToString: renderComponentToString,\n  renderComponentToStaticMarkup: renderComponentToStaticMarkup\n};\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactTextComponent\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar DOMPropertyOperations = require(\"./DOMPropertyOperations\");\nvar ReactBrowserComponentMixin = require(\"./ReactBrowserComponentMixin\");\nvar ReactComponent = require(\"./ReactComponent\");\nvar ReactDescriptor = require(\"./ReactDescriptor\");\n\nvar escapeTextForBrowser = require(\"./escapeTextForBrowser\");\nvar mixInto = require(\"./mixInto\");\n\n/**\n * Text nodes violate a couple assumptions that React makes about components:\n *\n *  - When mounting text into the DOM, adjacent text nodes are merged.\n *  - Text nodes cannot be assigned a React root ID.\n *\n * This component is used to wrap strings in elements so that they can undergo\n * the same reconciliation that is applied to elements.\n *\n * TODO: Investigate representing React components in the DOM with text nodes.\n *\n * @class ReactTextComponent\n * @extends ReactComponent\n * @internal\n */\nvar ReactTextComponent = function(descriptor) {\n  this.construct(descriptor);\n};\n\nmixInto(ReactTextComponent, ReactComponent.Mixin);\nmixInto(ReactTextComponent, ReactBrowserComponentMixin);\nmixInto(ReactTextComponent, {\n\n  /**\n   * Creates the markup for this text node. This node is not intended to have\n   * any features besides containing text content.\n   *\n   * @param {string} rootID DOM ID of the root node.\n   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n   * @param {number} mountDepth number of components in the owner hierarchy\n   * @return {string} Markup for this text node.\n   * @internal\n   */\n  mountComponent: function(rootID, transaction, mountDepth) {\n    ReactComponent.Mixin.mountComponent.call(\n      this,\n      rootID,\n      transaction,\n      mountDepth\n    );\n\n    var escapedText = escapeTextForBrowser(this.props);\n\n    if (transaction.renderToStaticMarkup) {\n      // Normally we'd wrap this in a `span` for the reasons stated above, but\n      // since this is a situation where React won't take over (static pages),\n      // we can simply return the text as it is.\n      return escapedText;\n    }\n\n    return (\n      '<span ' + DOMPropertyOperations.createMarkupForID(rootID) + '>' +\n        escapedText +\n      '</span>'\n    );\n  },\n\n  /**\n   * Updates this component by updating the text content.\n   *\n   * @param {object} nextComponent Contains the next text content.\n   * @param {ReactReconcileTransaction} transaction\n   * @internal\n   */\n  receiveComponent: function(nextComponent, transaction) {\n    var nextProps = nextComponent.props;\n    if (nextProps !== this.props) {\n      this.props = nextProps;\n      ReactComponent.BackendIDOperations.updateTextContentByID(\n        this._rootNodeID,\n        nextProps\n      );\n    }\n  }\n\n});\n\nmodule.exports = ReactDescriptor.createFactory(ReactTextComponent);\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule onlyChild\n */\n\"use strict\";\n\nvar ReactDescriptor = require(\"./ReactDescriptor\");\n\nvar invariant = require(\"./invariant\");\n\n/**\n * Returns the first child in a collection of children and verifies that there\n * is only one child in the collection. The current implementation of this\n * function assumes that a single child gets passed without a wrapper, but the\n * purpose of this helper function is to abstract away the particular structure\n * of children.\n *\n * @param {?object} children Child collection structure.\n * @return {ReactComponent} The first and only `ReactComponent` contained in the\n * structure.\n */\nfunction onlyChild(children) {\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    ReactDescriptor.isValidDescriptor(children),\n    'onlyChild must be passed a children with exactly one child.'\n  ) : invariant(ReactDescriptor.isValidDescriptor(children)));\n  return children;\n}\n\nmodule.exports = onlyChild;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ExecutionEnvironment\n */\n\n/*jslint evil: true */\n\n\"use strict\";\n\nvar canUseDOM = !!(\n  typeof window !== 'undefined' &&\n  window.document &&\n  window.document.createElement\n);\n\n/**\n * Simple, lightweight module assisting with the detection and context of\n * Worker. Helps avoid circular dependencies and allows code to reason about\n * whether or not they are in a Worker, even if they never include the main\n * `ReactWorker` dependency.\n */\nvar ExecutionEnvironment = {\n\n  canUseDOM: canUseDOM,\n\n  canUseWorkers: typeof Worker !== 'undefined',\n\n  canUseEventListeners:\n    canUseDOM && !!(window.addEventListener || window.attachEvent),\n\n  canUseViewport: canUseDOM && !!window.screen,\n\n  isInWorker: !canUseDOM // For now, this is true - might change in the future.\n\n};\n\nmodule.exports = ExecutionEnvironment;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactLink\n * @typechecks static-only\n */\n\n\"use strict\";\n\n/**\n * ReactLink encapsulates a common pattern in which a component wants to modify\n * a prop received from its parent. ReactLink allows the parent to pass down a\n * value coupled with a callback that, when invoked, expresses an intent to\n * modify that value. For example:\n *\n * React.createClass({\n *   getInitialState: function() {\n *     return {value: ''};\n *   },\n *   render: function() {\n *     var valueLink = new ReactLink(this.state.value, this._handleValueChange);\n *     return <input valueLink={valueLink} />;\n *   },\n *   this._handleValueChange: function(newValue) {\n *     this.setState({value: newValue});\n *   }\n * });\n *\n * We have provided some sugary mixins to make the creation and\n * consumption of ReactLink easier; see LinkedValueUtils and LinkedStateMixin.\n */\n\nvar React = require(\"./React\");\n\n/**\n * @param {*} value current value of the link\n * @param {function} requestChange callback to request a change\n */\nfunction ReactLink(value, requestChange) {\n  this.value = value;\n  this.requestChange = requestChange;\n}\n\n/**\n * Creates a PropType that enforces the ReactLink API and optionally checks the\n * type of the value being passed inside the link. Example:\n *\n * MyComponent.propTypes = {\n *   tabIndexLink: ReactLink.PropTypes.link(React.PropTypes.number)\n * }\n */\nfunction createLinkTypeChecker(linkType) {\n  var shapes = {\n    value: typeof linkType === 'undefined' ?\n      React.PropTypes.any.isRequired :\n      linkType.isRequired,\n    requestChange: React.PropTypes.func.isRequired\n  };\n  return React.PropTypes.shape(shapes);\n}\n\nReactLink.PropTypes = {\n  link: createLinkTypeChecker\n};\n\nmodule.exports = ReactLink;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule shallowEqual\n */\n\n\"use strict\";\n\n/**\n * Performs equality by iterating through keys on an object and returning\n * false when any key has values which are not strictly equal between\n * objA and objB. Returns true when the values of all keys are strictly equal.\n *\n * @return {boolean}\n */\nfunction shallowEqual(objA, objB) {\n  if (objA === objB) {\n    return true;\n  }\n  var key;\n  // Test for A's keys different from B.\n  for (key in objA) {\n    if (objA.hasOwnProperty(key) &&\n        (!objB.hasOwnProperty(key) || objA[key] !== objB[key])) {\n      return false;\n    }\n  }\n  // Test for B'a keys missing from A.\n  for (key in objB) {\n    if (objB.hasOwnProperty(key) && !objA.hasOwnProperty(key)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nmodule.exports = shallowEqual;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @typechecks\n * @providesModule ReactCSSTransitionGroupChild\n */\n\n\"use strict\";\n\nvar React = require(\"./React\");\n\nvar CSSCore = require(\"./CSSCore\");\nvar ReactTransitionEvents = require(\"./ReactTransitionEvents\");\n\nvar onlyChild = require(\"./onlyChild\");\n\n// We don't remove the element from the DOM until we receive an animationend or\n// transitionend event. If the user screws up and forgets to add an animation\n// their node will be stuck in the DOM forever, so we detect if an animation\n// does not start and if it doesn't, we just call the end listener immediately.\nvar TICK = 17;\nvar NO_EVENT_TIMEOUT = 5000;\n\nvar noEventListener = null;\n\n\nif (\"production\" !== process.env.NODE_ENV) {\n  noEventListener = function() {\n    console.warn(\n      'transition(): tried to perform an animation without ' +\n      'an animationend or transitionend event after timeout (' +\n      NO_EVENT_TIMEOUT + 'ms). You should either disable this ' +\n      'transition in JS or add a CSS animation/transition.'\n    );\n  };\n}\n\nvar ReactCSSTransitionGroupChild = React.createClass({\n  displayName: 'ReactCSSTransitionGroupChild',\n\n  transition: function(animationType, finishCallback) {\n    var node = this.getDOMNode();\n    var className = this.props.name + '-' + animationType;\n    var activeClassName = className + '-active';\n    var noEventTimeout = null;\n\n    var endListener = function() {\n      if (\"production\" !== process.env.NODE_ENV) {\n        clearTimeout(noEventTimeout);\n      }\n\n      CSSCore.removeClass(node, className);\n      CSSCore.removeClass(node, activeClassName);\n\n      ReactTransitionEvents.removeEndEventListener(node, endListener);\n\n      // Usually this optional callback is used for informing an owner of\n      // a leave animation and telling it to remove the child.\n      finishCallback && finishCallback();\n    };\n\n    ReactTransitionEvents.addEndEventListener(node, endListener);\n\n    CSSCore.addClass(node, className);\n\n    // Need to do this to actually trigger a transition.\n    this.queueClass(activeClassName);\n\n    if (\"production\" !== process.env.NODE_ENV) {\n      noEventTimeout = setTimeout(noEventListener, NO_EVENT_TIMEOUT);\n    }\n  },\n\n  queueClass: function(className) {\n    this.classNameQueue.push(className);\n\n    if (!this.timeout) {\n      this.timeout = setTimeout(this.flushClassNameQueue, TICK);\n    }\n  },\n\n  flushClassNameQueue: function() {\n    if (this.isMounted()) {\n      this.classNameQueue.forEach(\n        CSSCore.addClass.bind(CSSCore, this.getDOMNode())\n      );\n    }\n    this.classNameQueue.length = 0;\n    this.timeout = null;\n  },\n\n  componentWillMount: function() {\n    this.classNameQueue = [];\n  },\n\n  componentWillUnmount: function() {\n    if (this.timeout) {\n      clearTimeout(this.timeout);\n    }\n  },\n\n  componentWillEnter: function(done) {\n    if (this.props.enter) {\n      this.transition('enter', done);\n    } else {\n      done();\n    }\n  },\n\n  componentWillLeave: function(done) {\n    if (this.props.leave) {\n      this.transition('leave', done);\n    } else {\n      done();\n    }\n  },\n\n  render: function() {\n    return onlyChild(this.props.children);\n  }\n});\n\nmodule.exports = ReactCSSTransitionGroupChild;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @typechecks static-only\n * @providesModule ReactTransitionChildMapping\n */\n\n\"use strict\";\n\nvar ReactChildren = require(\"./ReactChildren\");\n\nvar ReactTransitionChildMapping = {\n  /**\n   * Given `this.props.children`, return an object mapping key to child. Just\n   * simple syntactic sugar around ReactChildren.map().\n   *\n   * @param {*} children `this.props.children`\n   * @return {object} Mapping of key to child\n   */\n  getChildMapping: function(children) {\n    return ReactChildren.map(children, function(child) {\n      return child;\n    });\n  },\n\n  /**\n   * When you're adding or removing children some may be added or removed in the\n   * same render pass. We want ot show *both* since we want to simultaneously\n   * animate elements in and out. This function takes a previous set of keys\n   * and a new set of keys and merges them with its best guess of the correct\n   * ordering. In the future we may expose some of the utilities in\n   * ReactMultiChild to make this easy, but for now React itself does not\n   * directly have this concept of the union of prevChildren and nextChildren\n   * so we implement it here.\n   *\n   * @param {object} prev prev children as returned from\n   * `ReactTransitionChildMapping.getChildMapping()`.\n   * @param {object} next next children as returned from\n   * `ReactTransitionChildMapping.getChildMapping()`.\n   * @return {object} a key set that contains all keys in `prev` and all keys\n   * in `next` in a reasonable order.\n   */\n  mergeChildMappings: function(prev, next) {\n    prev = prev || {};\n    next = next || {};\n\n    function getValueForKey(key) {\n      if (next.hasOwnProperty(key)) {\n        return next[key];\n      } else {\n        return prev[key];\n      }\n    }\n\n    // For each key of `next`, the list of keys to insert before that key in\n    // the combined list\n    var nextKeysPending = {};\n\n    var pendingKeys = [];\n    for (var prevKey in prev) {\n      if (next.hasOwnProperty(prevKey)) {\n        if (pendingKeys.length) {\n          nextKeysPending[prevKey] = pendingKeys;\n          pendingKeys = [];\n        }\n      } else {\n        pendingKeys.push(prevKey);\n      }\n    }\n\n    var i;\n    var childMapping = {};\n    for (var nextKey in next) {\n      if (nextKeysPending.hasOwnProperty(nextKey)) {\n        for (i = 0; i < nextKeysPending[nextKey].length; i++) {\n          var pendingNextKey = nextKeysPending[nextKey][i];\n          childMapping[nextKeysPending[nextKey][i]] = getValueForKey(\n            pendingNextKey\n          );\n        }\n      }\n      childMapping[nextKey] = getValueForKey(nextKey);\n    }\n\n    // Finally, add the keys which didn't appear before any key in `next`\n    for (i = 0; i < pendingKeys.length; i++) {\n      childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);\n    }\n\n    return childMapping;\n  }\n};\n\nmodule.exports = ReactTransitionChildMapping;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule emptyFunction\n */\n\nvar copyProperties = require(\"./copyProperties\");\n\nfunction makeEmptyFunction(arg) {\n  return function() {\n    return arg;\n  };\n}\n\n/**\n * This function accepts and discards inputs; it has no side effects. This is\n * primarily useful idiomatically for overridable function endpoints which\n * always need to be callable, since JS lacks a null-call idiom ala Cocoa.\n */\nfunction emptyFunction() {}\n\ncopyProperties(emptyFunction, {\n  thatReturns: makeEmptyFunction,\n  thatReturnsFalse: makeEmptyFunction(false),\n  thatReturnsTrue: makeEmptyFunction(true),\n  thatReturnsNull: makeEmptyFunction(null),\n  thatReturnsThis: function() { return this; },\n  thatReturnsArgument: function(arg) { return arg; }\n});\n\nmodule.exports = emptyFunction;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule merge\n */\n\n\"use strict\";\n\nvar mergeInto = require(\"./mergeInto\");\n\n/**\n * Shallow merges two structures into a return value, without mutating either.\n *\n * @param {?object} one Optional object with properties to merge from.\n * @param {?object} two Optional object with properties to merge from.\n * @return {object} The shallow extension of one by two.\n */\nvar merge = function(one, two) {\n  var result = {};\n  mergeInto(result, one);\n  mergeInto(result, two);\n  return result;\n};\n\nmodule.exports = merge;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactPropTransferer\n */\n\n\"use strict\";\n\nvar emptyFunction = require(\"./emptyFunction\");\nvar invariant = require(\"./invariant\");\nvar joinClasses = require(\"./joinClasses\");\nvar merge = require(\"./merge\");\n\n/**\n * Creates a transfer strategy that will merge prop values using the supplied\n * `mergeStrategy`. If a prop was previously unset, this just sets it.\n *\n * @param {function} mergeStrategy\n * @return {function}\n */\nfunction createTransferStrategy(mergeStrategy) {\n  return function(props, key, value) {\n    if (!props.hasOwnProperty(key)) {\n      props[key] = value;\n    } else {\n      props[key] = mergeStrategy(props[key], value);\n    }\n  };\n}\n\nvar transferStrategyMerge = createTransferStrategy(function(a, b) {\n  // `merge` overrides the first object's (`props[key]` above) keys using the\n  // second object's (`value`) keys. An object's style's existing `propA` would\n  // get overridden. Flip the order here.\n  return merge(b, a);\n});\n\n/**\n * Transfer strategies dictate how props are transferred by `transferPropsTo`.\n * NOTE: if you add any more exceptions to this list you should be sure to\n * update `cloneWithProps()` accordingly.\n */\nvar TransferStrategies = {\n  /**\n   * Never transfer `children`.\n   */\n  children: emptyFunction,\n  /**\n   * Transfer the `className` prop by merging them.\n   */\n  className: createTransferStrategy(joinClasses),\n  /**\n   * Never transfer the `key` prop.\n   */\n  key: emptyFunction,\n  /**\n   * Never transfer the `ref` prop.\n   */\n  ref: emptyFunction,\n  /**\n   * Transfer the `style` prop (which is an object) by merging them.\n   */\n  style: transferStrategyMerge\n};\n\n/**\n * Mutates the first argument by transferring the properties from the second\n * argument.\n *\n * @param {object} props\n * @param {object} newProps\n * @return {object}\n */\nfunction transferInto(props, newProps) {\n  for (var thisKey in newProps) {\n    if (!newProps.hasOwnProperty(thisKey)) {\n      continue;\n    }\n\n    var transferStrategy = TransferStrategies[thisKey];\n\n    if (transferStrategy && TransferStrategies.hasOwnProperty(thisKey)) {\n      transferStrategy(props, thisKey, newProps[thisKey]);\n    } else if (!props.hasOwnProperty(thisKey)) {\n      props[thisKey] = newProps[thisKey];\n    }\n  }\n  return props;\n}\n\n/**\n * ReactPropTransferer are capable of transferring props to another component\n * using a `transferPropsTo` method.\n *\n * @class ReactPropTransferer\n */\nvar ReactPropTransferer = {\n\n  TransferStrategies: TransferStrategies,\n\n  /**\n   * Merge two props objects using TransferStrategies.\n   *\n   * @param {object} oldProps original props (they take precedence)\n   * @param {object} newProps new props to merge in\n   * @return {object} a new object containing both sets of props merged.\n   */\n  mergeProps: function(oldProps, newProps) {\n    return transferInto(merge(oldProps), newProps);\n  },\n\n  /**\n   * @lends {ReactPropTransferer.prototype}\n   */\n  Mixin: {\n\n    /**\n     * Transfer props from this component to a target component.\n     *\n     * Props that do not have an explicit transfer strategy will be transferred\n     * only if the target component does not already have the prop set.\n     *\n     * This is usually used to pass down props to a returned root component.\n     *\n     * @param {ReactDescriptor} descriptor Component receiving the properties.\n     * @return {ReactDescriptor} The supplied `component`.\n     * @final\n     * @protected\n     */\n    transferPropsTo: function(descriptor) {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        descriptor._owner === this,\n        '%s: You can\\'t call transferPropsTo() on a component that you ' +\n        'don\\'t own, %s. This usually means you are calling ' +\n        'transferPropsTo() on a component passed in as props or children.',\n        this.constructor.displayName,\n        descriptor.type.displayName\n      ) : invariant(descriptor._owner === this));\n\n      // Because descriptors are immutable we have to merge into the existing\n      // props object rather than clone it.\n      transferInto(descriptor.props, this.props);\n\n      return descriptor;\n    }\n\n  }\n};\n\nmodule.exports = ReactPropTransferer;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule keyOf\n */\n\n/**\n * Allows extraction of a minified key. Let's the build system minify keys\n * without loosing the ability to dynamically use key strings as values\n * themselves. Pass in an object with a single key/val pair and it will return\n * you the string key of that single record. Suppose you want to grab the\n * value for a key 'className' inside of an object. Key/val minification may\n * have aliased that key to be 'xa12'. keyOf({className: null}) will return\n * 'xa12' in that case. Resolve keys you want to use once at startup time, then\n * reuse those resolutions.\n */\nvar keyOf = function(oneKeyObj) {\n  var key;\n  for (key in oneKeyObj) {\n    if (!oneKeyObj.hasOwnProperty(key)) {\n      continue;\n    }\n    return key;\n  }\n  return null;\n};\n\n\nmodule.exports = keyOf;\n","(function (process){\n/**\n * Copyright 2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule warning\n */\n\n\"use strict\";\n\nvar emptyFunction = require(\"./emptyFunction\");\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = emptyFunction;\n\nif (\"production\" !== process.env.NODE_ENV) {\n  warning = function(condition, format ) {var args=Array.prototype.slice.call(arguments,2);\n    if (format === undefined) {\n      throw new Error(\n        '`warning(condition, format, ...args)` requires a warning ' +\n        'message argument'\n      );\n    }\n\n    if (!condition) {\n      var argIndex = 0;\n      console.warn('Warning: ' + format.replace(/%s/g, function()  {return args[argIndex++];}));\n    }\n  };\n}\n\nmodule.exports = warning;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule copyProperties\n */\n\n/**\n * Copy properties from one or more objects (up to 5) into the first object.\n * This is a shallow copy. It mutates the first object and also returns it.\n *\n * NOTE: `arguments` has a very significant performance penalty, which is why\n * we don't support unlimited arguments.\n */\nfunction copyProperties(obj, a, b, c, d, e, f) {\n  obj = obj || {};\n\n  if (\"production\" !== process.env.NODE_ENV) {\n    if (f) {\n      throw new Error('Too many arguments passed to copyProperties');\n    }\n  }\n\n  var args = [a, b, c, d, e];\n  var ii = 0, v;\n  while (args[ii]) {\n    v = args[ii++];\n    for (var k in v) {\n      obj[k] = v[k];\n    }\n\n    // IE ignores toString in object iteration.. See:\n    // webreflection.blogspot.com/2007/07/quick-fix-internet-explorer-and.html\n    if (v.hasOwnProperty && v.hasOwnProperty('toString') &&\n        (typeof v.toString != 'undefined') && (obj.toString !== v.toString)) {\n      obj.toString = v.toString;\n    }\n  }\n\n  return obj;\n}\n\nmodule.exports = copyProperties;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule invariant\n */\n\n\"use strict\";\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n  if (\"production\" !== process.env.NODE_ENV) {\n    if (format === undefined) {\n      throw new Error('invariant requires an error message argument');\n    }\n  }\n\n  if (!condition) {\n    var error;\n    if (format === undefined) {\n      error = new Error(\n        'Minified exception occurred; use the non-minified dev environment ' +\n        'for the full error message and additional helpful warnings.'\n      );\n    } else {\n      var args = [a, b, c, d, e, f];\n      var argIndex = 0;\n      error = new Error(\n        'Invariant Violation: ' +\n        format.replace(/%s/g, function() { return args[argIndex++]; })\n      );\n    }\n\n    error.framesToPop = 1; // we don't care about invariant's own frame\n    throw error;\n  }\n};\n\nmodule.exports = invariant;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactStateSetters\n */\n\n\"use strict\";\n\nvar ReactStateSetters = {\n  /**\n   * Returns a function that calls the provided function, and uses the result\n   * of that to set the component's state.\n   *\n   * @param {ReactCompositeComponent} component\n   * @param {function} funcReturningState Returned callback uses this to\n   *                                      determine how to update state.\n   * @return {function} callback that when invoked uses funcReturningState to\n   *                    determined the object literal to setState.\n   */\n  createStateSetter: function(component, funcReturningState) {\n    return function(a, b, c, d, e, f) {\n      var partialState = funcReturningState.call(component, a, b, c, d, e, f);\n      if (partialState) {\n        component.setState(partialState);\n      }\n    };\n  },\n\n  /**\n   * Returns a single-argument callback that can be used to update a single\n   * key in the component's state.\n   *\n   * Note: this is memoized function, which makes it inexpensive to call.\n   *\n   * @param {ReactCompositeComponent} component\n   * @param {string} key The key in the state that you should update.\n   * @return {function} callback of 1 argument which calls setState() with\n   *                    the provided keyName and callback argument.\n   */\n  createStateKeySetter: function(component, key) {\n    // Memoize the setters.\n    var cache = component.__keySetters || (component.__keySetters = {});\n    return cache[key] || (cache[key] = createStateKeySetter(component, key));\n  }\n};\n\nfunction createStateKeySetter(component, key) {\n  // Partial state is allocated outside of the function closure so it can be\n  // reused with every call, avoiding memory allocation when this function\n  // is called.\n  var partialState = {};\n  return function stateKeySetter(value) {\n    partialState[key] = value;\n    component.setState(partialState);\n  };\n}\n\nReactStateSetters.Mixin = {\n  /**\n   * Returns a function that calls the provided function, and uses the result\n   * of that to set the component's state.\n   *\n   * For example, these statements are equivalent:\n   *\n   *   this.setState({x: 1});\n   *   this.createStateSetter(function(xValue) {\n   *     return {x: xValue};\n   *   })(1);\n   *\n   * @param {function} funcReturningState Returned callback uses this to\n   *                                      determine how to update state.\n   * @return {function} callback that when invoked uses funcReturningState to\n   *                    determined the object literal to setState.\n   */\n  createStateSetter: function(funcReturningState) {\n    return ReactStateSetters.createStateSetter(this, funcReturningState);\n  },\n\n  /**\n   * Returns a single-argument callback that can be used to update a single\n   * key in the component's state.\n   *\n   * For example, these statements are equivalent:\n   *\n   *   this.setState({x: 1});\n   *   this.createStateKeySetter('x')(1);\n   *\n   * Note: this is memoized function, which makes it inexpensive to call.\n   *\n   * @param {string} key The key in the state that you should update.\n   * @return {function} callback of 1 argument which calls setState() with\n   *                    the provided keyName and callback argument.\n   */\n  createStateKeySetter: function(key) {\n    return ReactStateSetters.createStateKeySetter(this, key);\n  }\n};\n\nmodule.exports = ReactStateSetters;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule DOMProperty\n * @typechecks static-only\n */\n\n/*jslint bitwise: true */\n\n\"use strict\";\n\nvar invariant = require(\"./invariant\");\n\nvar DOMPropertyInjection = {\n  /**\n   * Mapping from normalized, camelcased property names to a configuration that\n   * specifies how the associated DOM property should be accessed or rendered.\n   */\n  MUST_USE_ATTRIBUTE: 0x1,\n  MUST_USE_PROPERTY: 0x2,\n  HAS_SIDE_EFFECTS: 0x4,\n  HAS_BOOLEAN_VALUE: 0x8,\n  HAS_NUMERIC_VALUE: 0x10,\n  HAS_POSITIVE_NUMERIC_VALUE: 0x20 | 0x10,\n  HAS_OVERLOADED_BOOLEAN_VALUE: 0x40,\n\n  /**\n   * Inject some specialized knowledge about the DOM. This takes a config object\n   * with the following properties:\n   *\n   * isCustomAttribute: function that given an attribute name will return true\n   * if it can be inserted into the DOM verbatim. Useful for data-* or aria-*\n   * attributes where it's impossible to enumerate all of the possible\n   * attribute names,\n   *\n   * Properties: object mapping DOM property name to one of the\n   * DOMPropertyInjection constants or null. If your attribute isn't in here,\n   * it won't get written to the DOM.\n   *\n   * DOMAttributeNames: object mapping React attribute name to the DOM\n   * attribute name. Attribute names not specified use the **lowercase**\n   * normalized name.\n   *\n   * DOMPropertyNames: similar to DOMAttributeNames but for DOM properties.\n   * Property names not specified use the normalized name.\n   *\n   * DOMMutationMethods: Properties that require special mutation methods. If\n   * `value` is undefined, the mutation method should unset the property.\n   *\n   * @param {object} domPropertyConfig the config as described above.\n   */\n  injectDOMPropertyConfig: function(domPropertyConfig) {\n    var Properties = domPropertyConfig.Properties || {};\n    var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {};\n    var DOMPropertyNames = domPropertyConfig.DOMPropertyNames || {};\n    var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {};\n\n    if (domPropertyConfig.isCustomAttribute) {\n      DOMProperty._isCustomAttributeFunctions.push(\n        domPropertyConfig.isCustomAttribute\n      );\n    }\n\n    for (var propName in Properties) {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        !DOMProperty.isStandardName.hasOwnProperty(propName),\n        'injectDOMPropertyConfig(...): You\\'re trying to inject DOM property ' +\n        '\\'%s\\' which has already been injected. You may be accidentally ' +\n        'injecting the same DOM property config twice, or you may be ' +\n        'injecting two configs that have conflicting property names.',\n        propName\n      ) : invariant(!DOMProperty.isStandardName.hasOwnProperty(propName)));\n\n      DOMProperty.isStandardName[propName] = true;\n\n      var lowerCased = propName.toLowerCase();\n      DOMProperty.getPossibleStandardName[lowerCased] = propName;\n\n      if (DOMAttributeNames.hasOwnProperty(propName)) {\n        var attributeName = DOMAttributeNames[propName];\n        DOMProperty.getPossibleStandardName[attributeName] = propName;\n        DOMProperty.getAttributeName[propName] = attributeName;\n      } else {\n        DOMProperty.getAttributeName[propName] = lowerCased;\n      }\n\n      DOMProperty.getPropertyName[propName] =\n        DOMPropertyNames.hasOwnProperty(propName) ?\n          DOMPropertyNames[propName] :\n          propName;\n\n      if (DOMMutationMethods.hasOwnProperty(propName)) {\n        DOMProperty.getMutationMethod[propName] = DOMMutationMethods[propName];\n      } else {\n        DOMProperty.getMutationMethod[propName] = null;\n      }\n\n      var propConfig = Properties[propName];\n      DOMProperty.mustUseAttribute[propName] =\n        propConfig & DOMPropertyInjection.MUST_USE_ATTRIBUTE;\n      DOMProperty.mustUseProperty[propName] =\n        propConfig & DOMPropertyInjection.MUST_USE_PROPERTY;\n      DOMProperty.hasSideEffects[propName] =\n        propConfig & DOMPropertyInjection.HAS_SIDE_EFFECTS;\n      DOMProperty.hasBooleanValue[propName] =\n        propConfig & DOMPropertyInjection.HAS_BOOLEAN_VALUE;\n      DOMProperty.hasNumericValue[propName] =\n        propConfig & DOMPropertyInjection.HAS_NUMERIC_VALUE;\n      DOMProperty.hasPositiveNumericValue[propName] =\n        propConfig & DOMPropertyInjection.HAS_POSITIVE_NUMERIC_VALUE;\n      DOMProperty.hasOverloadedBooleanValue[propName] =\n        propConfig & DOMPropertyInjection.HAS_OVERLOADED_BOOLEAN_VALUE;\n\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        !DOMProperty.mustUseAttribute[propName] ||\n          !DOMProperty.mustUseProperty[propName],\n        'DOMProperty: Cannot require using both attribute and property: %s',\n        propName\n      ) : invariant(!DOMProperty.mustUseAttribute[propName] ||\n        !DOMProperty.mustUseProperty[propName]));\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        DOMProperty.mustUseProperty[propName] ||\n          !DOMProperty.hasSideEffects[propName],\n        'DOMProperty: Properties that have side effects must use property: %s',\n        propName\n      ) : invariant(DOMProperty.mustUseProperty[propName] ||\n        !DOMProperty.hasSideEffects[propName]));\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        !!DOMProperty.hasBooleanValue[propName] +\n          !!DOMProperty.hasNumericValue[propName] +\n          !!DOMProperty.hasOverloadedBooleanValue[propName] <= 1,\n        'DOMProperty: Value can be one of boolean, overloaded boolean, or ' +\n        'numeric value, but not a combination: %s',\n        propName\n      ) : invariant(!!DOMProperty.hasBooleanValue[propName] +\n        !!DOMProperty.hasNumericValue[propName] +\n        !!DOMProperty.hasOverloadedBooleanValue[propName] <= 1));\n    }\n  }\n};\nvar defaultValueCache = {};\n\n/**\n * DOMProperty exports lookup objects that can be used like functions:\n *\n *   > DOMProperty.isValid['id']\n *   true\n *   > DOMProperty.isValid['foobar']\n *   undefined\n *\n * Although this may be confusing, it performs better in general.\n *\n * @see http://jsperf.com/key-exists\n * @see http://jsperf.com/key-missing\n */\nvar DOMProperty = {\n\n  ID_ATTRIBUTE_NAME: 'data-reactid',\n\n  /**\n   * Checks whether a property name is a standard property.\n   * @type {Object}\n   */\n  isStandardName: {},\n\n  /**\n   * Mapping from lowercase property names to the properly cased version, used\n   * to warn in the case of missing properties.\n   * @type {Object}\n   */\n  getPossibleStandardName: {},\n\n  /**\n   * Mapping from normalized names to attribute names that differ. Attribute\n   * names are used when rendering markup or with `*Attribute()`.\n   * @type {Object}\n   */\n  getAttributeName: {},\n\n  /**\n   * Mapping from normalized names to properties on DOM node instances.\n   * (This includes properties that mutate due to external factors.)\n   * @type {Object}\n   */\n  getPropertyName: {},\n\n  /**\n   * Mapping from normalized names to mutation methods. This will only exist if\n   * mutation cannot be set simply by the property or `setAttribute()`.\n   * @type {Object}\n   */\n  getMutationMethod: {},\n\n  /**\n   * Whether the property must be accessed and mutated as an object property.\n   * @type {Object}\n   */\n  mustUseAttribute: {},\n\n  /**\n   * Whether the property must be accessed and mutated using `*Attribute()`.\n   * (This includes anything that fails `<propName> in <element>`.)\n   * @type {Object}\n   */\n  mustUseProperty: {},\n\n  /**\n   * Whether or not setting a value causes side effects such as triggering\n   * resources to be loaded or text selection changes. We must ensure that\n   * the value is only set if it has changed.\n   * @type {Object}\n   */\n  hasSideEffects: {},\n\n  /**\n   * Whether the property should be removed when set to a falsey value.\n   * @type {Object}\n   */\n  hasBooleanValue: {},\n\n  /**\n   * Whether the property must be numeric or parse as a\n   * numeric and should be removed when set to a falsey value.\n   * @type {Object}\n   */\n  hasNumericValue: {},\n\n  /**\n   * Whether the property must be positive numeric or parse as a positive\n   * numeric and should be removed when set to a falsey value.\n   * @type {Object}\n   */\n  hasPositiveNumericValue: {},\n\n  /**\n   * Whether the property can be used as a flag as well as with a value. Removed\n   * when strictly equal to false; present without a value when strictly equal\n   * to true; present with a value otherwise.\n   * @type {Object}\n   */\n  hasOverloadedBooleanValue: {},\n\n  /**\n   * All of the isCustomAttribute() functions that have been injected.\n   */\n  _isCustomAttributeFunctions: [],\n\n  /**\n   * Checks whether a property name is a custom attribute.\n   * @method\n   */\n  isCustomAttribute: function(attributeName) {\n    for (var i = 0; i < DOMProperty._isCustomAttributeFunctions.length; i++) {\n      var isCustomAttributeFn = DOMProperty._isCustomAttributeFunctions[i];\n      if (isCustomAttributeFn(attributeName)) {\n        return true;\n      }\n    }\n    return false;\n  },\n\n  /**\n   * Returns the default property value for a DOM property (i.e., not an\n   * attribute). Most default values are '' or false, but not all. Worse yet,\n   * some (in particular, `type`) vary depending on the type of element.\n   *\n   * TODO: Is it better to grab all the possible properties when creating an\n   * element to avoid having to create the same element twice?\n   */\n  getDefaultValueForProperty: function(nodeName, prop) {\n    var nodeDefaults = defaultValueCache[nodeName];\n    var testElement;\n    if (!nodeDefaults) {\n      defaultValueCache[nodeName] = nodeDefaults = {};\n    }\n    if (!(prop in nodeDefaults)) {\n      testElement = document.createElement(nodeName);\n      nodeDefaults[prop] = testElement[prop];\n    }\n    return nodeDefaults[prop];\n  },\n\n  injection: DOMPropertyInjection\n};\n\nmodule.exports = DOMProperty;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDefaultPerfAnalysis\n */\n\nvar merge = require(\"./merge\");\n\n// Don't try to save users less than 1.2ms (a number I made up)\nvar DONT_CARE_THRESHOLD = 1.2;\nvar DOM_OPERATION_TYPES = {\n  'mountImageIntoNode': 'set innerHTML',\n  INSERT_MARKUP: 'set innerHTML',\n  MOVE_EXISTING: 'move',\n  REMOVE_NODE: 'remove',\n  TEXT_CONTENT: 'set textContent',\n  'updatePropertyByID': 'update attribute',\n  'deletePropertyByID': 'delete attribute',\n  'updateStylesByID': 'update styles',\n  'updateInnerHTMLByID': 'set innerHTML',\n  'dangerouslyReplaceNodeWithMarkupByID': 'replace'\n};\n\nfunction getTotalTime(measurements) {\n  // TODO: return number of DOM ops? could be misleading.\n  // TODO: measure dropped frames after reconcile?\n  // TODO: log total time of each reconcile and the top-level component\n  // class that triggered it.\n  var totalTime = 0;\n  for (var i = 0; i < measurements.length; i++) {\n    var measurement = measurements[i];\n    totalTime += measurement.totalTime;\n  }\n  return totalTime;\n}\n\nfunction getDOMSummary(measurements) {\n  var items = [];\n  for (var i = 0; i < measurements.length; i++) {\n    var measurement = measurements[i];\n    var id;\n\n    for (id in measurement.writes) {\n      measurement.writes[id].forEach(function(write) {\n        items.push({\n          id: id,\n          type: DOM_OPERATION_TYPES[write.type] || write.type,\n          args: write.args\n        });\n      });\n    }\n  }\n  return items;\n}\n\nfunction getExclusiveSummary(measurements) {\n  var candidates = {};\n  var displayName;\n\n  for (var i = 0; i < measurements.length; i++) {\n    var measurement = measurements[i];\n    var allIDs = merge(measurement.exclusive, measurement.inclusive);\n\n    for (var id in allIDs) {\n      displayName = measurement.displayNames[id].current;\n\n      candidates[displayName] = candidates[displayName] || {\n        componentName: displayName,\n        inclusive: 0,\n        exclusive: 0,\n        render: 0,\n        count: 0\n      };\n      if (measurement.render[id]) {\n        candidates[displayName].render += measurement.render[id];\n      }\n      if (measurement.exclusive[id]) {\n        candidates[displayName].exclusive += measurement.exclusive[id];\n      }\n      if (measurement.inclusive[id]) {\n        candidates[displayName].inclusive += measurement.inclusive[id];\n      }\n      if (measurement.counts[id]) {\n        candidates[displayName].count += measurement.counts[id];\n      }\n    }\n  }\n\n  // Now make a sorted array with the results.\n  var arr = [];\n  for (displayName in candidates) {\n    if (candidates[displayName].exclusive >= DONT_CARE_THRESHOLD) {\n      arr.push(candidates[displayName]);\n    }\n  }\n\n  arr.sort(function(a, b) {\n    return b.exclusive - a.exclusive;\n  });\n\n  return arr;\n}\n\nfunction getInclusiveSummary(measurements, onlyClean) {\n  var candidates = {};\n  var inclusiveKey;\n\n  for (var i = 0; i < measurements.length; i++) {\n    var measurement = measurements[i];\n    var allIDs = merge(measurement.exclusive, measurement.inclusive);\n    var cleanComponents;\n\n    if (onlyClean) {\n      cleanComponents = getUnchangedComponents(measurement);\n    }\n\n    for (var id in allIDs) {\n      if (onlyClean && !cleanComponents[id]) {\n        continue;\n      }\n\n      var displayName = measurement.displayNames[id];\n\n      // Inclusive time is not useful for many components without knowing where\n      // they are instantiated. So we aggregate inclusive time with both the\n      // owner and current displayName as the key.\n      inclusiveKey = displayName.owner + ' > ' + displayName.current;\n\n      candidates[inclusiveKey] = candidates[inclusiveKey] || {\n        componentName: inclusiveKey,\n        time: 0,\n        count: 0\n      };\n\n      if (measurement.inclusive[id]) {\n        candidates[inclusiveKey].time += measurement.inclusive[id];\n      }\n      if (measurement.counts[id]) {\n        candidates[inclusiveKey].count += measurement.counts[id];\n      }\n    }\n  }\n\n  // Now make a sorted array with the results.\n  var arr = [];\n  for (inclusiveKey in candidates) {\n    if (candidates[inclusiveKey].time >= DONT_CARE_THRESHOLD) {\n      arr.push(candidates[inclusiveKey]);\n    }\n  }\n\n  arr.sort(function(a, b) {\n    return b.time - a.time;\n  });\n\n  return arr;\n}\n\nfunction getUnchangedComponents(measurement) {\n  // For a given reconcile, look at which components did not actually\n  // render anything to the DOM and return a mapping of their ID to\n  // the amount of time it took to render the entire subtree.\n  var cleanComponents = {};\n  var dirtyLeafIDs = Object.keys(measurement.writes);\n  var allIDs = merge(measurement.exclusive, measurement.inclusive);\n\n  for (var id in allIDs) {\n    var isDirty = false;\n    // For each component that rendered, see if a component that triggerd\n    // a DOM op is in its subtree.\n    for (var i = 0; i < dirtyLeafIDs.length; i++) {\n      if (dirtyLeafIDs[i].indexOf(id) === 0) {\n        isDirty = true;\n        break;\n      }\n    }\n    if (!isDirty && measurement.counts[id] > 0) {\n      cleanComponents[id] = true;\n    }\n  }\n  return cleanComponents;\n}\n\nvar ReactDefaultPerfAnalysis = {\n  getExclusiveSummary: getExclusiveSummary,\n  getInclusiveSummary: getInclusiveSummary,\n  getDOMSummary: getDOMSummary,\n  getTotalTime: getTotalTime\n};\n\nmodule.exports = ReactDefaultPerfAnalysis;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule performanceNow\n * @typechecks\n */\n\nvar performance = require(\"./performance\");\n\n/**\n * Detect if we can use `window.performance.now()` and gracefully fallback to\n * `Date.now()` if it doesn't exist. We need to support Firefox < 15 for now\n * because of Facebook's testing infrastructure.\n */\nif (!performance || !performance.now) {\n  performance = Date;\n}\n\nvar performanceNow = performance.now.bind(performance);\n\nmodule.exports = performanceNow;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule EventConstants\n */\n\n\"use strict\";\n\nvar keyMirror = require(\"./keyMirror\");\n\nvar PropagationPhases = keyMirror({bubbled: null, captured: null});\n\n/**\n * Types of raw signals from the browser caught at the top level.\n */\nvar topLevelTypes = keyMirror({\n  topBlur: null,\n  topChange: null,\n  topClick: null,\n  topCompositionEnd: null,\n  topCompositionStart: null,\n  topCompositionUpdate: null,\n  topContextMenu: null,\n  topCopy: null,\n  topCut: null,\n  topDoubleClick: null,\n  topDrag: null,\n  topDragEnd: null,\n  topDragEnter: null,\n  topDragExit: null,\n  topDragLeave: null,\n  topDragOver: null,\n  topDragStart: null,\n  topDrop: null,\n  topError: null,\n  topFocus: null,\n  topInput: null,\n  topKeyDown: null,\n  topKeyPress: null,\n  topKeyUp: null,\n  topLoad: null,\n  topMouseDown: null,\n  topMouseMove: null,\n  topMouseOut: null,\n  topMouseOver: null,\n  topMouseUp: null,\n  topPaste: null,\n  topReset: null,\n  topScroll: null,\n  topSelectionChange: null,\n  topSubmit: null,\n  topTextInput: null,\n  topTouchCancel: null,\n  topTouchEnd: null,\n  topTouchMove: null,\n  topTouchStart: null,\n  topWheel: null\n});\n\nvar EventConstants = {\n  topLevelTypes: topLevelTypes,\n  PropagationPhases: PropagationPhases\n};\n\nmodule.exports = EventConstants;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule EventPluginHub\n */\n\n\"use strict\";\n\nvar EventPluginRegistry = require(\"./EventPluginRegistry\");\nvar EventPluginUtils = require(\"./EventPluginUtils\");\n\nvar accumulate = require(\"./accumulate\");\nvar forEachAccumulated = require(\"./forEachAccumulated\");\nvar invariant = require(\"./invariant\");\nvar isEventSupported = require(\"./isEventSupported\");\nvar monitorCodeUse = require(\"./monitorCodeUse\");\n\n/**\n * Internal store for event listeners\n */\nvar listenerBank = {};\n\n/**\n * Internal queue of events that have accumulated their dispatches and are\n * waiting to have their dispatches executed.\n */\nvar eventQueue = null;\n\n/**\n * Dispatches an event and releases it back into the pool, unless persistent.\n *\n * @param {?object} event Synthetic event to be dispatched.\n * @private\n */\nvar executeDispatchesAndRelease = function(event) {\n  if (event) {\n    var executeDispatch = EventPluginUtils.executeDispatch;\n    // Plugins can provide custom behavior when dispatching events.\n    var PluginModule = EventPluginRegistry.getPluginModuleForEvent(event);\n    if (PluginModule && PluginModule.executeDispatch) {\n      executeDispatch = PluginModule.executeDispatch;\n    }\n    EventPluginUtils.executeDispatchesInOrder(event, executeDispatch);\n\n    if (!event.isPersistent()) {\n      event.constructor.release(event);\n    }\n  }\n};\n\n/**\n * - `InstanceHandle`: [required] Module that performs logical traversals of DOM\n *   hierarchy given ids of the logical DOM elements involved.\n */\nvar InstanceHandle = null;\n\nfunction validateInstanceHandle() {\n  var invalid = !InstanceHandle||\n    !InstanceHandle.traverseTwoPhase ||\n    !InstanceHandle.traverseEnterLeave;\n  if (invalid) {\n    throw new Error('InstanceHandle not injected before use!');\n  }\n}\n\n/**\n * This is a unified interface for event plugins to be installed and configured.\n *\n * Event plugins can implement the following properties:\n *\n *   `extractEvents` {function(string, DOMEventTarget, string, object): *}\n *     Required. When a top-level event is fired, this method is expected to\n *     extract synthetic events that will in turn be queued and dispatched.\n *\n *   `eventTypes` {object}\n *     Optional, plugins that fire events must publish a mapping of registration\n *     names that are used to register listeners. Values of this mapping must\n *     be objects that contain `registrationName` or `phasedRegistrationNames`.\n *\n *   `executeDispatch` {function(object, function, string)}\n *     Optional, allows plugins to override how an event gets dispatched. By\n *     default, the listener is simply invoked.\n *\n * Each plugin that is injected into `EventsPluginHub` is immediately operable.\n *\n * @public\n */\nvar EventPluginHub = {\n\n  /**\n   * Methods for injecting dependencies.\n   */\n  injection: {\n\n    /**\n     * @param {object} InjectedMount\n     * @public\n     */\n    injectMount: EventPluginUtils.injection.injectMount,\n\n    /**\n     * @param {object} InjectedInstanceHandle\n     * @public\n     */\n    injectInstanceHandle: function(InjectedInstanceHandle) {\n      InstanceHandle = InjectedInstanceHandle;\n      if (\"production\" !== process.env.NODE_ENV) {\n        validateInstanceHandle();\n      }\n    },\n\n    getInstanceHandle: function() {\n      if (\"production\" !== process.env.NODE_ENV) {\n        validateInstanceHandle();\n      }\n      return InstanceHandle;\n    },\n\n    /**\n     * @param {array} InjectedEventPluginOrder\n     * @public\n     */\n    injectEventPluginOrder: EventPluginRegistry.injectEventPluginOrder,\n\n    /**\n     * @param {object} injectedNamesToPlugins Map from names to plugin modules.\n     */\n    injectEventPluginsByName: EventPluginRegistry.injectEventPluginsByName\n\n  },\n\n  eventNameDispatchConfigs: EventPluginRegistry.eventNameDispatchConfigs,\n\n  registrationNameModules: EventPluginRegistry.registrationNameModules,\n\n  /**\n   * Stores `listener` at `listenerBank[registrationName][id]`. Is idempotent.\n   *\n   * @param {string} id ID of the DOM element.\n   * @param {string} registrationName Name of listener (e.g. `onClick`).\n   * @param {?function} listener The callback to store.\n   */\n  putListener: function(id, registrationName, listener) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      !listener || typeof listener === 'function',\n      'Expected %s listener to be a function, instead got type %s',\n      registrationName, typeof listener\n    ) : invariant(!listener || typeof listener === 'function'));\n\n    if (\"production\" !== process.env.NODE_ENV) {\n      // IE8 has no API for event capturing and the `onScroll` event doesn't\n      // bubble.\n      if (registrationName === 'onScroll' &&\n          !isEventSupported('scroll', true)) {\n        monitorCodeUse('react_no_scroll_event');\n        console.warn('This browser doesn\\'t support the `onScroll` event');\n      }\n    }\n    var bankForRegistrationName =\n      listenerBank[registrationName] || (listenerBank[registrationName] = {});\n    bankForRegistrationName[id] = listener;\n  },\n\n  /**\n   * @param {string} id ID of the DOM element.\n   * @param {string} registrationName Name of listener (e.g. `onClick`).\n   * @return {?function} The stored callback.\n   */\n  getListener: function(id, registrationName) {\n    var bankForRegistrationName = listenerBank[registrationName];\n    return bankForRegistrationName && bankForRegistrationName[id];\n  },\n\n  /**\n   * Deletes a listener from the registration bank.\n   *\n   * @param {string} id ID of the DOM element.\n   * @param {string} registrationName Name of listener (e.g. `onClick`).\n   */\n  deleteListener: function(id, registrationName) {\n    var bankForRegistrationName = listenerBank[registrationName];\n    if (bankForRegistrationName) {\n      delete bankForRegistrationName[id];\n    }\n  },\n\n  /**\n   * Deletes all listeners for the DOM element with the supplied ID.\n   *\n   * @param {string} id ID of the DOM element.\n   */\n  deleteAllListeners: function(id) {\n    for (var registrationName in listenerBank) {\n      delete listenerBank[registrationName][id];\n    }\n  },\n\n  /**\n   * Allows registered plugins an opportunity to extract events from top-level\n   * native browser events.\n   *\n   * @param {string} topLevelType Record from `EventConstants`.\n   * @param {DOMEventTarget} topLevelTarget The listening component root node.\n   * @param {string} topLevelTargetID ID of `topLevelTarget`.\n   * @param {object} nativeEvent Native browser event.\n   * @return {*} An accumulation of synthetic events.\n   * @internal\n   */\n  extractEvents: function(\n      topLevelType,\n      topLevelTarget,\n      topLevelTargetID,\n      nativeEvent) {\n    var events;\n    var plugins = EventPluginRegistry.plugins;\n    for (var i = 0, l = plugins.length; i < l; i++) {\n      // Not every plugin in the ordering may be loaded at runtime.\n      var possiblePlugin = plugins[i];\n      if (possiblePlugin) {\n        var extractedEvents = possiblePlugin.extractEvents(\n          topLevelType,\n          topLevelTarget,\n          topLevelTargetID,\n          nativeEvent\n        );\n        if (extractedEvents) {\n          events = accumulate(events, extractedEvents);\n        }\n      }\n    }\n    return events;\n  },\n\n  /**\n   * Enqueues a synthetic event that should be dispatched when\n   * `processEventQueue` is invoked.\n   *\n   * @param {*} events An accumulation of synthetic events.\n   * @internal\n   */\n  enqueueEvents: function(events) {\n    if (events) {\n      eventQueue = accumulate(eventQueue, events);\n    }\n  },\n\n  /**\n   * Dispatches all synthetic events on the event queue.\n   *\n   * @internal\n   */\n  processEventQueue: function() {\n    // Set `eventQueue` to null before processing it so that we can tell if more\n    // events get enqueued while processing.\n    var processingEventQueue = eventQueue;\n    eventQueue = null;\n    forEachAccumulated(processingEventQueue, executeDispatchesAndRelease);\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      !eventQueue,\n      'processEventQueue(): Additional events were enqueued while processing ' +\n      'an event queue. Support for this has not yet been implemented.'\n    ) : invariant(!eventQueue));\n  },\n\n  /**\n   * These are needed for tests only. Do not use!\n   */\n  __purge: function() {\n    listenerBank = {};\n  },\n\n  __getListenerBank: function() {\n    return listenerBank;\n  }\n\n};\n\nmodule.exports = EventPluginHub;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule EventPropagators\n */\n\n\"use strict\";\n\nvar EventConstants = require(\"./EventConstants\");\nvar EventPluginHub = require(\"./EventPluginHub\");\n\nvar accumulate = require(\"./accumulate\");\nvar forEachAccumulated = require(\"./forEachAccumulated\");\n\nvar PropagationPhases = EventConstants.PropagationPhases;\nvar getListener = EventPluginHub.getListener;\n\n/**\n * Some event types have a notion of different registration names for different\n * \"phases\" of propagation. This finds listeners by a given phase.\n */\nfunction listenerAtPhase(id, event, propagationPhase) {\n  var registrationName =\n    event.dispatchConfig.phasedRegistrationNames[propagationPhase];\n  return getListener(id, registrationName);\n}\n\n/**\n * Tags a `SyntheticEvent` with dispatched listeners. Creating this function\n * here, allows us to not have to bind or create functions for each event.\n * Mutating the event's members allows us to not have to create a wrapping\n * \"dispatch\" object that pairs the event with the listener.\n */\nfunction accumulateDirectionalDispatches(domID, upwards, event) {\n  if (\"production\" !== process.env.NODE_ENV) {\n    if (!domID) {\n      throw new Error('Dispatching id must not be null');\n    }\n  }\n  var phase = upwards ? PropagationPhases.bubbled : PropagationPhases.captured;\n  var listener = listenerAtPhase(domID, event, phase);\n  if (listener) {\n    event._dispatchListeners = accumulate(event._dispatchListeners, listener);\n    event._dispatchIDs = accumulate(event._dispatchIDs, domID);\n  }\n}\n\n/**\n * Collect dispatches (must be entirely collected before dispatching - see unit\n * tests). Lazily allocate the array to conserve memory.  We must loop through\n * each event and perform the traversal for each one. We can not perform a\n * single traversal for the entire collection of events because each event may\n * have a different target.\n */\nfunction accumulateTwoPhaseDispatchesSingle(event) {\n  if (event && event.dispatchConfig.phasedRegistrationNames) {\n    EventPluginHub.injection.getInstanceHandle().traverseTwoPhase(\n      event.dispatchMarker,\n      accumulateDirectionalDispatches,\n      event\n    );\n  }\n}\n\n\n/**\n * Accumulates without regard to direction, does not look for phased\n * registration names. Same as `accumulateDirectDispatchesSingle` but without\n * requiring that the `dispatchMarker` be the same as the dispatched ID.\n */\nfunction accumulateDispatches(id, ignoredDirection, event) {\n  if (event && event.dispatchConfig.registrationName) {\n    var registrationName = event.dispatchConfig.registrationName;\n    var listener = getListener(id, registrationName);\n    if (listener) {\n      event._dispatchListeners = accumulate(event._dispatchListeners, listener);\n      event._dispatchIDs = accumulate(event._dispatchIDs, id);\n    }\n  }\n}\n\n/**\n * Accumulates dispatches on an `SyntheticEvent`, but only for the\n * `dispatchMarker`.\n * @param {SyntheticEvent} event\n */\nfunction accumulateDirectDispatchesSingle(event) {\n  if (event && event.dispatchConfig.registrationName) {\n    accumulateDispatches(event.dispatchMarker, null, event);\n  }\n}\n\nfunction accumulateTwoPhaseDispatches(events) {\n  forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);\n}\n\nfunction accumulateEnterLeaveDispatches(leave, enter, fromID, toID) {\n  EventPluginHub.injection.getInstanceHandle().traverseEnterLeave(\n    fromID,\n    toID,\n    accumulateDispatches,\n    leave,\n    enter\n  );\n}\n\n\nfunction accumulateDirectDispatches(events) {\n  forEachAccumulated(events, accumulateDirectDispatchesSingle);\n}\n\n\n\n/**\n * A small set of propagation patterns, each of which will accept a small amount\n * of information, and generate a set of \"dispatch ready event objects\" - which\n * are sets of events that have already been annotated with a set of dispatched\n * listener functions/ids. The API is designed this way to discourage these\n * propagation strategies from actually executing the dispatches, since we\n * always want to collect the entire set of dispatches before executing event a\n * single one.\n *\n * @constructor EventPropagators\n */\nvar EventPropagators = {\n  accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches,\n  accumulateDirectDispatches: accumulateDirectDispatches,\n  accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches\n};\n\nmodule.exports = EventPropagators;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactBrowserEventEmitter\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar EventConstants = require(\"./EventConstants\");\nvar EventPluginHub = require(\"./EventPluginHub\");\nvar EventPluginRegistry = require(\"./EventPluginRegistry\");\nvar ReactEventEmitterMixin = require(\"./ReactEventEmitterMixin\");\nvar ViewportMetrics = require(\"./ViewportMetrics\");\n\nvar isEventSupported = require(\"./isEventSupported\");\nvar merge = require(\"./merge\");\n\n/**\n * Summary of `ReactBrowserEventEmitter` event handling:\n *\n *  - Top-level delegation is used to trap most native browser events. This\n *    may only occur in the main thread and is the responsibility of\n *    ReactEventListener, which is injected and can therefore support pluggable\n *    event sources. This is the only work that occurs in the main thread.\n *\n *  - We normalize and de-duplicate events to account for browser quirks. This\n *    may be done in the worker thread.\n *\n *  - Forward these native events (with the associated top-level type used to\n *    trap it) to `EventPluginHub`, which in turn will ask plugins if they want\n *    to extract any synthetic events.\n *\n *  - The `EventPluginHub` will then process each event by annotating them with\n *    \"dispatches\", a sequence of listeners and IDs that care about that event.\n *\n *  - The `EventPluginHub` then dispatches the events.\n *\n * Overview of React and the event system:\n *\n * +------------+    .\n * |    DOM     |    .\n * +------------+    .\n *       |           .\n *       v           .\n * +------------+    .\n * | ReactEvent |    .\n * |  Listener  |    .\n * +------------+    .                         +-----------+\n *       |           .               +--------+|SimpleEvent|\n *       |           .               |         |Plugin     |\n * +-----|------+    .               v         +-----------+\n * |     |      |    .    +--------------+                    +------------+\n * |     +-----------.--->|EventPluginHub|                    |    Event   |\n * |            |    .    |              |     +-----------+  | Propagators|\n * | ReactEvent |    .    |              |     |TapEvent   |  |------------|\n * |  Emitter   |    .    |              |<---+|Plugin     |  |other plugin|\n * |            |    .    |              |     +-----------+  |  utilities |\n * |     +-----------.--->|              |                    +------------+\n * |     |      |    .    +--------------+\n * +-----|------+    .                ^        +-----------+\n *       |           .                |        |Enter/Leave|\n *       +           .                +-------+|Plugin     |\n * +-------------+   .                         +-----------+\n * | application |   .\n * |-------------|   .\n * |             |   .\n * |             |   .\n * +-------------+   .\n *                   .\n *    React Core     .  General Purpose Event Plugin System\n */\n\nvar alreadyListeningTo = {};\nvar isMonitoringScrollValue = false;\nvar reactTopListenersCounter = 0;\n\n// For events like 'submit' which don't consistently bubble (which we trap at a\n// lower node than `document`), binding at `document` would cause duplicate\n// events so we don't include them here\nvar topEventMapping = {\n  topBlur: 'blur',\n  topChange: 'change',\n  topClick: 'click',\n  topCompositionEnd: 'compositionend',\n  topCompositionStart: 'compositionstart',\n  topCompositionUpdate: 'compositionupdate',\n  topContextMenu: 'contextmenu',\n  topCopy: 'copy',\n  topCut: 'cut',\n  topDoubleClick: 'dblclick',\n  topDrag: 'drag',\n  topDragEnd: 'dragend',\n  topDragEnter: 'dragenter',\n  topDragExit: 'dragexit',\n  topDragLeave: 'dragleave',\n  topDragOver: 'dragover',\n  topDragStart: 'dragstart',\n  topDrop: 'drop',\n  topFocus: 'focus',\n  topInput: 'input',\n  topKeyDown: 'keydown',\n  topKeyPress: 'keypress',\n  topKeyUp: 'keyup',\n  topMouseDown: 'mousedown',\n  topMouseMove: 'mousemove',\n  topMouseOut: 'mouseout',\n  topMouseOver: 'mouseover',\n  topMouseUp: 'mouseup',\n  topPaste: 'paste',\n  topScroll: 'scroll',\n  topSelectionChange: 'selectionchange',\n  topTextInput: 'textInput',\n  topTouchCancel: 'touchcancel',\n  topTouchEnd: 'touchend',\n  topTouchMove: 'touchmove',\n  topTouchStart: 'touchstart',\n  topWheel: 'wheel'\n};\n\n/**\n * To ensure no conflicts with other potential React instances on the page\n */\nvar topListenersIDKey = \"_reactListenersID\" + String(Math.random()).slice(2);\n\nfunction getListeningForDocument(mountAt) {\n  // In IE8, `mountAt` is a host object and doesn't have `hasOwnProperty`\n  // directly.\n  if (!Object.prototype.hasOwnProperty.call(mountAt, topListenersIDKey)) {\n    mountAt[topListenersIDKey] = reactTopListenersCounter++;\n    alreadyListeningTo[mountAt[topListenersIDKey]] = {};\n  }\n  return alreadyListeningTo[mountAt[topListenersIDKey]];\n}\n\n/**\n * `ReactBrowserEventEmitter` is used to attach top-level event listeners. For\n * example:\n *\n *   ReactBrowserEventEmitter.putListener('myID', 'onClick', myFunction);\n *\n * This would allocate a \"registration\" of `('onClick', myFunction)` on 'myID'.\n *\n * @internal\n */\nvar ReactBrowserEventEmitter = merge(ReactEventEmitterMixin, {\n\n  /**\n   * Injectable event backend\n   */\n  ReactEventListener: null,\n\n  injection: {\n    /**\n     * @param {object} ReactEventListener\n     */\n    injectReactEventListener: function(ReactEventListener) {\n      ReactEventListener.setHandleTopLevel(\n        ReactBrowserEventEmitter.handleTopLevel\n      );\n      ReactBrowserEventEmitter.ReactEventListener = ReactEventListener;\n    }\n  },\n\n  /**\n   * Sets whether or not any created callbacks should be enabled.\n   *\n   * @param {boolean} enabled True if callbacks should be enabled.\n   */\n  setEnabled: function(enabled) {\n    if (ReactBrowserEventEmitter.ReactEventListener) {\n      ReactBrowserEventEmitter.ReactEventListener.setEnabled(enabled);\n    }\n  },\n\n  /**\n   * @return {boolean} True if callbacks are enabled.\n   */\n  isEnabled: function() {\n    return !!(\n      ReactBrowserEventEmitter.ReactEventListener &&\n      ReactBrowserEventEmitter.ReactEventListener.isEnabled()\n    );\n  },\n\n  /**\n   * We listen for bubbled touch events on the document object.\n   *\n   * Firefox v8.01 (and possibly others) exhibited strange behavior when\n   * mounting `onmousemove` events at some node that was not the document\n   * element. The symptoms were that if your mouse is not moving over something\n   * contained within that mount point (for example on the background) the\n   * top-level listeners for `onmousemove` won't be called. However, if you\n   * register the `mousemove` on the document object, then it will of course\n   * catch all `mousemove`s. This along with iOS quirks, justifies restricting\n   * top-level listeners to the document object only, at least for these\n   * movement types of events and possibly all events.\n   *\n   * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html\n   *\n   * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but\n   * they bubble to document.\n   *\n   * @param {string} registrationName Name of listener (e.g. `onClick`).\n   * @param {object} contentDocumentHandle Document which owns the container\n   */\n  listenTo: function(registrationName, contentDocumentHandle) {\n    var mountAt = contentDocumentHandle;\n    var isListening = getListeningForDocument(mountAt);\n    var dependencies = EventPluginRegistry.\n      registrationNameDependencies[registrationName];\n\n    var topLevelTypes = EventConstants.topLevelTypes;\n    for (var i = 0, l = dependencies.length; i < l; i++) {\n      var dependency = dependencies[i];\n      if (!(\n            isListening.hasOwnProperty(dependency) &&\n            isListening[dependency]\n          )) {\n        if (dependency === topLevelTypes.topWheel) {\n          if (isEventSupported('wheel')) {\n            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(\n              topLevelTypes.topWheel,\n              'wheel',\n              mountAt\n            );\n          } else if (isEventSupported('mousewheel')) {\n            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(\n              topLevelTypes.topWheel,\n              'mousewheel',\n              mountAt\n            );\n          } else {\n            // Firefox needs to capture a different mouse scroll event.\n            // @see http://www.quirksmode.org/dom/events/tests/scroll.html\n            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(\n              topLevelTypes.topWheel,\n              'DOMMouseScroll',\n              mountAt\n            );\n          }\n        } else if (dependency === topLevelTypes.topScroll) {\n\n          if (isEventSupported('scroll', true)) {\n            ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(\n              topLevelTypes.topScroll,\n              'scroll',\n              mountAt\n            );\n          } else {\n            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(\n              topLevelTypes.topScroll,\n              'scroll',\n              ReactBrowserEventEmitter.ReactEventListener.WINDOW_HANDLE\n            );\n          }\n        } else if (dependency === topLevelTypes.topFocus ||\n            dependency === topLevelTypes.topBlur) {\n\n          if (isEventSupported('focus', true)) {\n            ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(\n              topLevelTypes.topFocus,\n              'focus',\n              mountAt\n            );\n            ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(\n              topLevelTypes.topBlur,\n              'blur',\n              mountAt\n            );\n          } else if (isEventSupported('focusin')) {\n            // IE has `focusin` and `focusout` events which bubble.\n            // @see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html\n            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(\n              topLevelTypes.topFocus,\n              'focusin',\n              mountAt\n            );\n            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(\n              topLevelTypes.topBlur,\n              'focusout',\n              mountAt\n            );\n          }\n\n          // to make sure blur and focus event listeners are only attached once\n          isListening[topLevelTypes.topBlur] = true;\n          isListening[topLevelTypes.topFocus] = true;\n        } else if (topEventMapping.hasOwnProperty(dependency)) {\n          ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(\n            dependency,\n            topEventMapping[dependency],\n            mountAt\n          );\n        }\n\n        isListening[dependency] = true;\n      }\n    }\n  },\n\n  trapBubbledEvent: function(topLevelType, handlerBaseName, handle) {\n    return ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(\n      topLevelType,\n      handlerBaseName,\n      handle\n    );\n  },\n\n  trapCapturedEvent: function(topLevelType, handlerBaseName, handle) {\n    return ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(\n      topLevelType,\n      handlerBaseName,\n      handle\n    );\n  },\n\n  /**\n   * Listens to window scroll and resize events. We cache scroll values so that\n   * application code can access them without triggering reflows.\n   *\n   * NOTE: Scroll events do not bubble.\n   *\n   * @see http://www.quirksmode.org/dom/events/scroll.html\n   */\n  ensureScrollValueMonitoring: function(){\n    if (!isMonitoringScrollValue) {\n      var refresh = ViewportMetrics.refreshScrollValues;\n      ReactBrowserEventEmitter.ReactEventListener.monitorScrollValue(refresh);\n      isMonitoringScrollValue = true;\n    }\n  },\n\n  eventNameDispatchConfigs: EventPluginHub.eventNameDispatchConfigs,\n\n  registrationNameModules: EventPluginHub.registrationNameModules,\n\n  putListener: EventPluginHub.putListener,\n\n  getListener: EventPluginHub.getListener,\n\n  deleteListener: EventPluginHub.deleteListener,\n\n  deleteAllListeners: EventPluginHub.deleteAllListeners\n\n});\n\nmodule.exports = ReactBrowserEventEmitter;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactUpdates\n */\n\n\"use strict\";\n\nvar CallbackQueue = require(\"./CallbackQueue\");\nvar PooledClass = require(\"./PooledClass\");\nvar ReactCurrentOwner = require(\"./ReactCurrentOwner\");\nvar ReactPerf = require(\"./ReactPerf\");\nvar Transaction = require(\"./Transaction\");\n\nvar invariant = require(\"./invariant\");\nvar mixInto = require(\"./mixInto\");\nvar warning = require(\"./warning\");\n\nvar dirtyComponents = [];\n\nvar batchingStrategy = null;\n\nfunction ensureInjected() {\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    ReactUpdates.ReactReconcileTransaction && batchingStrategy,\n    'ReactUpdates: must inject a reconcile transaction class and batching ' +\n    'strategy'\n  ) : invariant(ReactUpdates.ReactReconcileTransaction && batchingStrategy));\n}\n\nvar NESTED_UPDATES = {\n  initialize: function() {\n    this.dirtyComponentsLength = dirtyComponents.length;\n  },\n  close: function() {\n    if (this.dirtyComponentsLength !== dirtyComponents.length) {\n      // Additional updates were enqueued by componentDidUpdate handlers or\n      // similar; before our own UPDATE_QUEUEING wrapper closes, we want to run\n      // these new updates so that if A's componentDidUpdate calls setState on\n      // B, B will update before the callback A's updater provided when calling\n      // setState.\n      dirtyComponents.splice(0, this.dirtyComponentsLength);\n      flushBatchedUpdates();\n    } else {\n      dirtyComponents.length = 0;\n    }\n  }\n};\n\nvar UPDATE_QUEUEING = {\n  initialize: function() {\n    this.callbackQueue.reset();\n  },\n  close: function() {\n    this.callbackQueue.notifyAll();\n  }\n};\n\nvar TRANSACTION_WRAPPERS = [NESTED_UPDATES, UPDATE_QUEUEING];\n\nfunction ReactUpdatesFlushTransaction() {\n  this.reinitializeTransaction();\n  this.dirtyComponentsLength = null;\n  this.callbackQueue = CallbackQueue.getPooled(null);\n  this.reconcileTransaction =\n    ReactUpdates.ReactReconcileTransaction.getPooled();\n}\n\nmixInto(ReactUpdatesFlushTransaction, Transaction.Mixin);\nmixInto(ReactUpdatesFlushTransaction, {\n  getTransactionWrappers: function() {\n    return TRANSACTION_WRAPPERS;\n  },\n\n  destructor: function() {\n    this.dirtyComponentsLength = null;\n    CallbackQueue.release(this.callbackQueue);\n    this.callbackQueue = null;\n    ReactUpdates.ReactReconcileTransaction.release(this.reconcileTransaction);\n    this.reconcileTransaction = null;\n  },\n\n  perform: function(method, scope, a) {\n    // Essentially calls `this.reconcileTransaction.perform(method, scope, a)`\n    // with this transaction's wrappers around it.\n    return Transaction.Mixin.perform.call(\n      this,\n      this.reconcileTransaction.perform,\n      this.reconcileTransaction,\n      method,\n      scope,\n      a\n    );\n  }\n});\n\nPooledClass.addPoolingTo(ReactUpdatesFlushTransaction);\n\nfunction batchedUpdates(callback, a, b) {\n  ensureInjected();\n  batchingStrategy.batchedUpdates(callback, a, b);\n}\n\n/**\n * Array comparator for ReactComponents by owner depth\n *\n * @param {ReactComponent} c1 first component you're comparing\n * @param {ReactComponent} c2 second component you're comparing\n * @return {number} Return value usable by Array.prototype.sort().\n */\nfunction mountDepthComparator(c1, c2) {\n  return c1._mountDepth - c2._mountDepth;\n}\n\nfunction runBatchedUpdates(transaction) {\n  var len = transaction.dirtyComponentsLength;\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    len === dirtyComponents.length,\n    'Expected flush transaction\\'s stored dirty-components length (%s) to ' +\n    'match dirty-components array length (%s).',\n    len,\n    dirtyComponents.length\n  ) : invariant(len === dirtyComponents.length));\n\n  // Since reconciling a component higher in the owner hierarchy usually (not\n  // always -- see shouldComponentUpdate()) will reconcile children, reconcile\n  // them before their children by sorting the array.\n  dirtyComponents.sort(mountDepthComparator);\n\n  for (var i = 0; i < len; i++) {\n    // If a component is unmounted before pending changes apply, ignore them\n    // TODO: Queue unmounts in the same list to avoid this happening at all\n    var component = dirtyComponents[i];\n    if (component.isMounted()) {\n      // If performUpdateIfNecessary happens to enqueue any new updates, we\n      // shouldn't execute the callbacks until the next render happens, so\n      // stash the callbacks first\n      var callbacks = component._pendingCallbacks;\n      component._pendingCallbacks = null;\n      component.performUpdateIfNecessary(transaction.reconcileTransaction);\n\n      if (callbacks) {\n        for (var j = 0; j < callbacks.length; j++) {\n          transaction.callbackQueue.enqueue(\n            callbacks[j],\n            component\n          );\n        }\n      }\n    }\n  }\n}\n\nvar flushBatchedUpdates = ReactPerf.measure(\n  'ReactUpdates',\n  'flushBatchedUpdates',\n  function() {\n    // ReactUpdatesFlushTransaction's wrappers will clear the dirtyComponents\n    // array and perform any updates enqueued by mount-ready handlers (i.e.,\n    // componentDidUpdate) but we need to check here too in order to catch\n    // updates enqueued by setState callbacks.\n    while (dirtyComponents.length) {\n      var transaction = ReactUpdatesFlushTransaction.getPooled();\n      transaction.perform(runBatchedUpdates, null, transaction);\n      ReactUpdatesFlushTransaction.release(transaction);\n    }\n  }\n);\n\n/**\n * Mark a component as needing a rerender, adding an optional callback to a\n * list of functions which will be executed once the rerender occurs.\n */\nfunction enqueueUpdate(component, callback) {\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    !callback || typeof callback === \"function\",\n    'enqueueUpdate(...): You called `setProps`, `replaceProps`, ' +\n    '`setState`, `replaceState`, or `forceUpdate` with a callback that ' +\n    'isn\\'t callable.'\n  ) : invariant(!callback || typeof callback === \"function\"));\n  ensureInjected();\n\n  // Various parts of our code (such as ReactCompositeComponent's\n  // _renderValidatedComponent) assume that calls to render aren't nested;\n  // verify that that's the case. (This is called by each top-level update\n  // function, like setProps, setState, forceUpdate, etc.; creation and\n  // destruction of top-level components is guarded in ReactMount.)\n  (\"production\" !== process.env.NODE_ENV ? warning(\n    ReactCurrentOwner.current == null,\n    'enqueueUpdate(): Render methods should be a pure function of props ' +\n    'and state; triggering nested component updates from render is not ' +\n    'allowed. If necessary, trigger nested updates in ' +\n    'componentDidUpdate.'\n  ) : null);\n\n  if (!batchingStrategy.isBatchingUpdates) {\n    batchingStrategy.batchedUpdates(enqueueUpdate, component, callback);\n    return;\n  }\n\n  dirtyComponents.push(component);\n\n  if (callback) {\n    if (component._pendingCallbacks) {\n      component._pendingCallbacks.push(callback);\n    } else {\n      component._pendingCallbacks = [callback];\n    }\n  }\n}\n\nvar ReactUpdatesInjection = {\n  injectReconcileTransaction: function(ReconcileTransaction) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      ReconcileTransaction,\n      'ReactUpdates: must provide a reconcile transaction class'\n    ) : invariant(ReconcileTransaction));\n    ReactUpdates.ReactReconcileTransaction = ReconcileTransaction;\n  },\n\n  injectBatchingStrategy: function(_batchingStrategy) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      _batchingStrategy,\n      'ReactUpdates: must provide a batching strategy'\n    ) : invariant(_batchingStrategy));\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      typeof _batchingStrategy.batchedUpdates === 'function',\n      'ReactUpdates: must provide a batchedUpdates() function'\n    ) : invariant(typeof _batchingStrategy.batchedUpdates === 'function'));\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      typeof _batchingStrategy.isBatchingUpdates === 'boolean',\n      'ReactUpdates: must provide an isBatchingUpdates boolean attribute'\n    ) : invariant(typeof _batchingStrategy.isBatchingUpdates === 'boolean'));\n    batchingStrategy = _batchingStrategy;\n  }\n};\n\nvar ReactUpdates = {\n  /**\n   * React references `ReactReconcileTransaction` using this property in order\n   * to allow dependency injection.\n   *\n   * @internal\n   */\n  ReactReconcileTransaction: null,\n\n  batchedUpdates: batchedUpdates,\n  enqueueUpdate: enqueueUpdate,\n  flushBatchedUpdates: flushBatchedUpdates,\n  injection: ReactUpdatesInjection\n};\n\nmodule.exports = ReactUpdates;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule SyntheticEvent\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar PooledClass = require(\"./PooledClass\");\n\nvar emptyFunction = require(\"./emptyFunction\");\nvar getEventTarget = require(\"./getEventTarget\");\nvar merge = require(\"./merge\");\nvar mergeInto = require(\"./mergeInto\");\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar EventInterface = {\n  type: null,\n  target: getEventTarget,\n  // currentTarget is set when dispatching; no use in copying it here\n  currentTarget: emptyFunction.thatReturnsNull,\n  eventPhase: null,\n  bubbles: null,\n  cancelable: null,\n  timeStamp: function(event) {\n    return event.timeStamp || Date.now();\n  },\n  defaultPrevented: null,\n  isTrusted: null\n};\n\n/**\n * Synthetic events are dispatched by event plugins, typically in response to a\n * top-level event delegation handler.\n *\n * These systems should generally use pooling to reduce the frequency of garbage\n * collection. The system should check `isPersistent` to determine whether the\n * event should be released into the pool after being dispatched. Users that\n * need a persisted event should invoke `persist`.\n *\n * Synthetic events (and subclasses) implement the DOM Level 3 Events API by\n * normalizing browser quirks. Subclasses do not necessarily have to implement a\n * DOM interface; custom application-specific events can also subclass this.\n *\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n */\nfunction SyntheticEvent(dispatchConfig, dispatchMarker, nativeEvent) {\n  this.dispatchConfig = dispatchConfig;\n  this.dispatchMarker = dispatchMarker;\n  this.nativeEvent = nativeEvent;\n\n  var Interface = this.constructor.Interface;\n  for (var propName in Interface) {\n    if (!Interface.hasOwnProperty(propName)) {\n      continue;\n    }\n    var normalize = Interface[propName];\n    if (normalize) {\n      this[propName] = normalize(nativeEvent);\n    } else {\n      this[propName] = nativeEvent[propName];\n    }\n  }\n\n  var defaultPrevented = nativeEvent.defaultPrevented != null ?\n    nativeEvent.defaultPrevented :\n    nativeEvent.returnValue === false;\n  if (defaultPrevented) {\n    this.isDefaultPrevented = emptyFunction.thatReturnsTrue;\n  } else {\n    this.isDefaultPrevented = emptyFunction.thatReturnsFalse;\n  }\n  this.isPropagationStopped = emptyFunction.thatReturnsFalse;\n}\n\nmergeInto(SyntheticEvent.prototype, {\n\n  preventDefault: function() {\n    this.defaultPrevented = true;\n    var event = this.nativeEvent;\n    event.preventDefault ? event.preventDefault() : event.returnValue = false;\n    this.isDefaultPrevented = emptyFunction.thatReturnsTrue;\n  },\n\n  stopPropagation: function() {\n    var event = this.nativeEvent;\n    event.stopPropagation ? event.stopPropagation() : event.cancelBubble = true;\n    this.isPropagationStopped = emptyFunction.thatReturnsTrue;\n  },\n\n  /**\n   * We release all dispatched `SyntheticEvent`s after each event loop, adding\n   * them back into the pool. This allows a way to hold onto a reference that\n   * won't be added back into the pool.\n   */\n  persist: function() {\n    this.isPersistent = emptyFunction.thatReturnsTrue;\n  },\n\n  /**\n   * Checks if this event should be released back into the pool.\n   *\n   * @return {boolean} True if this should not be released, false otherwise.\n   */\n  isPersistent: emptyFunction.thatReturnsFalse,\n\n  /**\n   * `PooledClass` looks for `destructor` on each instance it releases.\n   */\n  destructor: function() {\n    var Interface = this.constructor.Interface;\n    for (var propName in Interface) {\n      this[propName] = null;\n    }\n    this.dispatchConfig = null;\n    this.dispatchMarker = null;\n    this.nativeEvent = null;\n  }\n\n});\n\nSyntheticEvent.Interface = EventInterface;\n\n/**\n * Helper to reduce boilerplate when creating subclasses.\n *\n * @param {function} Class\n * @param {?object} Interface\n */\nSyntheticEvent.augmentClass = function(Class, Interface) {\n  var Super = this;\n\n  var prototype = Object.create(Super.prototype);\n  mergeInto(prototype, Class.prototype);\n  Class.prototype = prototype;\n  Class.prototype.constructor = Class;\n\n  Class.Interface = merge(Super.Interface, Interface);\n  Class.augmentClass = Super.augmentClass;\n\n  PooledClass.addPoolingTo(Class, PooledClass.threeArgumentPooler);\n};\n\nPooledClass.addPoolingTo(SyntheticEvent, PooledClass.threeArgumentPooler);\n\nmodule.exports = SyntheticEvent;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule mergeInto\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar mergeHelpers = require(\"./mergeHelpers\");\n\nvar checkMergeObjectArg = mergeHelpers.checkMergeObjectArg;\nvar checkMergeIntoObjectArg = mergeHelpers.checkMergeIntoObjectArg;\n\n/**\n * Shallow merges two structures by mutating the first parameter.\n *\n * @param {object|function} one Object to be merged into.\n * @param {?object} two Optional object with properties to merge from.\n */\nfunction mergeInto(one, two) {\n  checkMergeIntoObjectArg(one);\n  if (two != null) {\n    checkMergeObjectArg(two);\n    for (var key in two) {\n      if (!two.hasOwnProperty(key)) {\n        continue;\n      }\n      one[key] = two[key];\n    }\n  }\n}\n\nmodule.exports = mergeInto;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule escapeTextForBrowser\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar ESCAPE_LOOKUP = {\n  \"&\": \"&amp;\",\n  \">\": \"&gt;\",\n  \"<\": \"&lt;\",\n  \"\\\"\": \"&quot;\",\n  \"'\": \"&#x27;\"\n};\n\nvar ESCAPE_REGEX = /[&><\"']/g;\n\nfunction escaper(match) {\n  return ESCAPE_LOOKUP[match];\n}\n\n/**\n * Escapes text to prevent scripting attacks.\n *\n * @param {*} text Text value to escape.\n * @return {string} An escaped string.\n */\nfunction escapeTextForBrowser(text) {\n  return ('' + text).replace(ESCAPE_REGEX, escaper);\n}\n\nmodule.exports = escapeTextForBrowser;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule memoizeStringOnly\n * @typechecks static-only\n */\n\n\"use strict\";\n\n/**\n * Memoizes the return value of a function that accepts one string argument.\n *\n * @param {function} callback\n * @return {function}\n */\nfunction memoizeStringOnly(callback) {\n  var cache = {};\n  return function(string) {\n    if (cache.hasOwnProperty(string)) {\n      return cache[string];\n    } else {\n      return cache[string] = callback.call(this, string);\n    }\n  };\n}\n\nmodule.exports = memoizeStringOnly;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule PooledClass\n */\n\n\"use strict\";\n\nvar invariant = require(\"./invariant\");\n\n/**\n * Static poolers. Several custom versions for each potential number of\n * arguments. A completely generic pooler is easy to implement, but would\n * require accessing the `arguments` object. In each of these, `this` refers to\n * the Class itself, not an instance. If any others are needed, simply add them\n * here, or in their own files.\n */\nvar oneArgumentPooler = function(copyFieldsFrom) {\n  var Klass = this;\n  if (Klass.instancePool.length) {\n    var instance = Klass.instancePool.pop();\n    Klass.call(instance, copyFieldsFrom);\n    return instance;\n  } else {\n    return new Klass(copyFieldsFrom);\n  }\n};\n\nvar twoArgumentPooler = function(a1, a2) {\n  var Klass = this;\n  if (Klass.instancePool.length) {\n    var instance = Klass.instancePool.pop();\n    Klass.call(instance, a1, a2);\n    return instance;\n  } else {\n    return new Klass(a1, a2);\n  }\n};\n\nvar threeArgumentPooler = function(a1, a2, a3) {\n  var Klass = this;\n  if (Klass.instancePool.length) {\n    var instance = Klass.instancePool.pop();\n    Klass.call(instance, a1, a2, a3);\n    return instance;\n  } else {\n    return new Klass(a1, a2, a3);\n  }\n};\n\nvar fiveArgumentPooler = function(a1, a2, a3, a4, a5) {\n  var Klass = this;\n  if (Klass.instancePool.length) {\n    var instance = Klass.instancePool.pop();\n    Klass.call(instance, a1, a2, a3, a4, a5);\n    return instance;\n  } else {\n    return new Klass(a1, a2, a3, a4, a5);\n  }\n};\n\nvar standardReleaser = function(instance) {\n  var Klass = this;\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    instance instanceof Klass,\n    'Trying to release an instance into a pool of a different type.'\n  ) : invariant(instance instanceof Klass));\n  if (instance.destructor) {\n    instance.destructor();\n  }\n  if (Klass.instancePool.length < Klass.poolSize) {\n    Klass.instancePool.push(instance);\n  }\n};\n\nvar DEFAULT_POOL_SIZE = 10;\nvar DEFAULT_POOLER = oneArgumentPooler;\n\n/**\n * Augments `CopyConstructor` to be a poolable class, augmenting only the class\n * itself (statically) not adding any prototypical fields. Any CopyConstructor\n * you give this may have a `poolSize` property, and will look for a\n * prototypical `destructor` on instances (optional).\n *\n * @param {Function} CopyConstructor Constructor that can be used to reset.\n * @param {Function} pooler Customizable pooler.\n */\nvar addPoolingTo = function(CopyConstructor, pooler) {\n  var NewKlass = CopyConstructor;\n  NewKlass.instancePool = [];\n  NewKlass.getPooled = pooler || DEFAULT_POOLER;\n  if (!NewKlass.poolSize) {\n    NewKlass.poolSize = DEFAULT_POOL_SIZE;\n  }\n  NewKlass.release = standardReleaser;\n  return NewKlass;\n};\n\nvar PooledClass = {\n  addPoolingTo: addPoolingTo,\n  oneArgumentPooler: oneArgumentPooler,\n  twoArgumentPooler: twoArgumentPooler,\n  threeArgumentPooler: threeArgumentPooler,\n  fiveArgumentPooler: fiveArgumentPooler\n};\n\nmodule.exports = PooledClass;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule traverseAllChildren\n */\n\n\"use strict\";\n\nvar ReactInstanceHandles = require(\"./ReactInstanceHandles\");\nvar ReactTextComponent = require(\"./ReactTextComponent\");\n\nvar invariant = require(\"./invariant\");\n\nvar SEPARATOR = ReactInstanceHandles.SEPARATOR;\nvar SUBSEPARATOR = ':';\n\n/**\n * TODO: Test that:\n * 1. `mapChildren` transforms strings and numbers into `ReactTextComponent`.\n * 2. it('should fail when supplied duplicate key', function() {\n * 3. That a single child and an array with one item have the same key pattern.\n * });\n */\n\nvar userProvidedKeyEscaperLookup = {\n  '=': '=0',\n  '.': '=1',\n  ':': '=2'\n};\n\nvar userProvidedKeyEscapeRegex = /[=.:]/g;\n\nfunction userProvidedKeyEscaper(match) {\n  return userProvidedKeyEscaperLookup[match];\n}\n\n/**\n * Generate a key string that identifies a component within a set.\n *\n * @param {*} component A component that could contain a manual key.\n * @param {number} index Index that is used if a manual key is not provided.\n * @return {string}\n */\nfunction getComponentKey(component, index) {\n  if (component && component.props && component.props.key != null) {\n    // Explicit key\n    return wrapUserProvidedKey(component.props.key);\n  }\n  // Implicit key determined by the index in the set\n  return index.toString(36);\n}\n\n/**\n * Escape a component key so that it is safe to use in a reactid.\n *\n * @param {*} key Component key to be escaped.\n * @return {string} An escaped string.\n */\nfunction escapeUserProvidedKey(text) {\n  return ('' + text).replace(\n    userProvidedKeyEscapeRegex,\n    userProvidedKeyEscaper\n  );\n}\n\n/**\n * Wrap a `key` value explicitly provided by the user to distinguish it from\n * implicitly-generated keys generated by a component's index in its parent.\n *\n * @param {string} key Value of a user-provided `key` attribute\n * @return {string}\n */\nfunction wrapUserProvidedKey(key) {\n  return '$' + escapeUserProvidedKey(key);\n}\n\n/**\n * @param {?*} children Children tree container.\n * @param {!string} nameSoFar Name of the key path so far.\n * @param {!number} indexSoFar Number of children encountered until this point.\n * @param {!function} callback Callback to invoke with each child found.\n * @param {?*} traverseContext Used to pass information throughout the traversal\n * process.\n * @return {!number} The number of children in this subtree.\n */\nvar traverseAllChildrenImpl =\n  function(children, nameSoFar, indexSoFar, callback, traverseContext) {\n    var subtreeCount = 0;  // Count of children found in the current subtree.\n    if (Array.isArray(children)) {\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var nextName = (\n          nameSoFar +\n          (nameSoFar ? SUBSEPARATOR : SEPARATOR) +\n          getComponentKey(child, i)\n        );\n        var nextIndex = indexSoFar + subtreeCount;\n        subtreeCount += traverseAllChildrenImpl(\n          child,\n          nextName,\n          nextIndex,\n          callback,\n          traverseContext\n        );\n      }\n    } else {\n      var type = typeof children;\n      var isOnlyChild = nameSoFar === '';\n      // If it's the only child, treat the name as if it was wrapped in an array\n      // so that it's consistent if the number of children grows\n      var storageName =\n        isOnlyChild ? SEPARATOR + getComponentKey(children, 0) : nameSoFar;\n      if (children == null || type === 'boolean') {\n        // All of the above are perceived as null.\n        callback(traverseContext, null, storageName, indexSoFar);\n        subtreeCount = 1;\n      } else if (children.type && children.type.prototype &&\n                 children.type.prototype.mountComponentIntoNode) {\n        callback(traverseContext, children, storageName, indexSoFar);\n        subtreeCount = 1;\n      } else {\n        if (type === 'object') {\n          (\"production\" !== process.env.NODE_ENV ? invariant(\n            !children || children.nodeType !== 1,\n            'traverseAllChildren(...): Encountered an invalid child; DOM ' +\n            'elements are not valid children of React components.'\n          ) : invariant(!children || children.nodeType !== 1));\n          for (var key in children) {\n            if (children.hasOwnProperty(key)) {\n              subtreeCount += traverseAllChildrenImpl(\n                children[key],\n                (\n                  nameSoFar + (nameSoFar ? SUBSEPARATOR : SEPARATOR) +\n                  wrapUserProvidedKey(key) + SUBSEPARATOR +\n                  getComponentKey(children[key], 0)\n                ),\n                indexSoFar + subtreeCount,\n                callback,\n                traverseContext\n              );\n            }\n          }\n        } else if (type === 'string') {\n          var normalizedText = ReactTextComponent(children);\n          callback(traverseContext, normalizedText, storageName, indexSoFar);\n          subtreeCount += 1;\n        } else if (type === 'number') {\n          var normalizedNumber = ReactTextComponent('' + children);\n          callback(traverseContext, normalizedNumber, storageName, indexSoFar);\n          subtreeCount += 1;\n        }\n      }\n    }\n    return subtreeCount;\n  };\n\n/**\n * Traverses children that are typically specified as `props.children`, but\n * might also be specified through attributes:\n *\n * - `traverseAllChildren(this.props.children, ...)`\n * - `traverseAllChildren(this.props.leftPanelChildren, ...)`\n *\n * The `traverseContext` is an optional argument that is passed through the\n * entire traversal. It can be used to store accumulations or anything else that\n * the callback might find relevant.\n *\n * @param {?*} children Children tree object.\n * @param {!function} callback To invoke upon traversing each child.\n * @param {?*} traverseContext Context for traversal.\n * @return {!number} The number of children in this subtree.\n */\nfunction traverseAllChildren(children, callback, traverseContext) {\n  if (children == null) {\n    return 0;\n  }\n\n  return traverseAllChildrenImpl(children, '', 0, callback, traverseContext);\n}\n\nmodule.exports = traverseAllChildren;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactOwner\n */\n\n\"use strict\";\n\nvar emptyObject = require(\"./emptyObject\");\nvar invariant = require(\"./invariant\");\n\n/**\n * ReactOwners are capable of storing references to owned components.\n *\n * All components are capable of //being// referenced by owner components, but\n * only ReactOwner components are capable of //referencing// owned components.\n * The named reference is known as a \"ref\".\n *\n * Refs are available when mounted and updated during reconciliation.\n *\n *   var MyComponent = React.createClass({\n *     render: function() {\n *       return (\n *         <div onClick={this.handleClick}>\n *           <CustomComponent ref=\"custom\" />\n *         </div>\n *       );\n *     },\n *     handleClick: function() {\n *       this.refs.custom.handleClick();\n *     },\n *     componentDidMount: function() {\n *       this.refs.custom.initialize();\n *     }\n *   });\n *\n * Refs should rarely be used. When refs are used, they should only be done to\n * control data that is not handled by React's data flow.\n *\n * @class ReactOwner\n */\nvar ReactOwner = {\n\n  /**\n   * @param {?object} object\n   * @return {boolean} True if `object` is a valid owner.\n   * @final\n   */\n  isValidOwner: function(object) {\n    return !!(\n      object &&\n      typeof object.attachRef === 'function' &&\n      typeof object.detachRef === 'function'\n    );\n  },\n\n  /**\n   * Adds a component by ref to an owner component.\n   *\n   * @param {ReactComponent} component Component to reference.\n   * @param {string} ref Name by which to refer to the component.\n   * @param {ReactOwner} owner Component on which to record the ref.\n   * @final\n   * @internal\n   */\n  addComponentAsRefTo: function(component, ref, owner) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      ReactOwner.isValidOwner(owner),\n      'addComponentAsRefTo(...): Only a ReactOwner can have refs. This ' +\n      'usually means that you\\'re trying to add a ref to a component that ' +\n      'doesn\\'t have an owner (that is, was not created inside of another ' +\n      'component\\'s `render` method). Try rendering this component inside of ' +\n      'a new top-level component which will hold the ref.'\n    ) : invariant(ReactOwner.isValidOwner(owner)));\n    owner.attachRef(ref, component);\n  },\n\n  /**\n   * Removes a component by ref from an owner component.\n   *\n   * @param {ReactComponent} component Component to dereference.\n   * @param {string} ref Name of the ref to remove.\n   * @param {ReactOwner} owner Component on which the ref is recorded.\n   * @final\n   * @internal\n   */\n  removeComponentAsRefFrom: function(component, ref, owner) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      ReactOwner.isValidOwner(owner),\n      'removeComponentAsRefFrom(...): Only a ReactOwner can have refs. This ' +\n      'usually means that you\\'re trying to remove a ref to a component that ' +\n      'doesn\\'t have an owner (that is, was not created inside of another ' +\n      'component\\'s `render` method). Try rendering this component inside of ' +\n      'a new top-level component which will hold the ref.'\n    ) : invariant(ReactOwner.isValidOwner(owner)));\n    // Check that `component` is still the current ref because we do not want to\n    // detach the ref if another component stole it.\n    if (owner.refs[ref] === component) {\n      owner.detachRef(ref);\n    }\n  },\n\n  /**\n   * A ReactComponent must mix this in to have refs.\n   *\n   * @lends {ReactOwner.prototype}\n   */\n  Mixin: {\n\n    construct: function() {\n      this.refs = emptyObject;\n    },\n\n    /**\n     * Lazily allocates the refs object and stores `component` as `ref`.\n     *\n     * @param {string} ref Reference name.\n     * @param {component} component Component to store as `ref`.\n     * @final\n     * @private\n     */\n    attachRef: function(ref, component) {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        component.isOwnedBy(this),\n        'attachRef(%s, ...): Only a component\\'s owner can store a ref to it.',\n        ref\n      ) : invariant(component.isOwnedBy(this)));\n      var refs = this.refs === emptyObject ? (this.refs = {}) : this.refs;\n      refs[ref] = component;\n    },\n\n    /**\n     * Detaches a reference name.\n     *\n     * @param {string} ref Name to dereference.\n     * @final\n     * @private\n     */\n    detachRef: function(ref) {\n      delete this.refs[ref];\n    }\n\n  }\n\n};\n\nmodule.exports = ReactOwner;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule keyMirror\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar invariant = require(\"./invariant\");\n\n/**\n * Constructs an enumeration with keys equal to their value.\n *\n * For example:\n *\n *   var COLORS = keyMirror({blue: null, red: null});\n *   var myColor = COLORS.blue;\n *   var isColorValid = !!COLORS[myColor];\n *\n * The last line could not be performed if the values of the generated enum were\n * not equal to their keys.\n *\n *   Input:  {key1: val1, key2: val2}\n *   Output: {key1: key1, key2: key2}\n *\n * @param {object} obj\n * @return {object}\n */\nvar keyMirror = function(obj) {\n  var ret = {};\n  var key;\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    obj instanceof Object && !Array.isArray(obj),\n    'keyMirror(...): Argument must be an object.'\n  ) : invariant(obj instanceof Object && !Array.isArray(obj)));\n  for (key in obj) {\n    if (!obj.hasOwnProperty(key)) {\n      continue;\n    }\n    ret[key] = key;\n  }\n  return ret;\n};\n\nmodule.exports = keyMirror;\n\n}).call(this,require('_process'))","/**\n * Copyright 2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDescriptorValidator\n */\n\n/**\n * ReactDescriptorValidator provides a wrapper around a descriptor factory\n * which validates the props passed to the descriptor. This is intended to be\n * used only in DEV and could be replaced by a static type checker for languages\n * that support it.\n */\n\n\"use strict\";\n\nvar ReactDescriptor = require(\"./ReactDescriptor\");\nvar ReactPropTypeLocations = require(\"./ReactPropTypeLocations\");\nvar ReactCurrentOwner = require(\"./ReactCurrentOwner\");\n\nvar monitorCodeUse = require(\"./monitorCodeUse\");\n\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\nvar ownerHasKeyUseWarning = {\n  'react_key_warning': {},\n  'react_numeric_key_warning': {}\n};\nvar ownerHasMonitoredObjectMap = {};\n\nvar loggedTypeFailures = {};\n\nvar NUMERIC_PROPERTY_REGEX = /^\\d+$/;\n\n/**\n * Gets the current owner's displayName for use in warnings.\n *\n * @internal\n * @return {?string} Display name or undefined\n */\nfunction getCurrentOwnerDisplayName() {\n  var current = ReactCurrentOwner.current;\n  return current && current.constructor.displayName || undefined;\n}\n\n/**\n * Warn if the component doesn't have an explicit key assigned to it.\n * This component is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it.\n *\n * @internal\n * @param {ReactComponent} component Component that requires a key.\n * @param {*} parentType component's parent's type.\n */\nfunction validateExplicitKey(component, parentType) {\n  if (component._store.validated || component.props.key != null) {\n    return;\n  }\n  component._store.validated = true;\n\n  warnAndMonitorForKeyUse(\n    'react_key_warning',\n    'Each child in an array should have a unique \"key\" prop.',\n    component,\n    parentType\n  );\n}\n\n/**\n * Warn if the key is being defined as an object property but has an incorrect\n * value.\n *\n * @internal\n * @param {string} name Property name of the key.\n * @param {ReactComponent} component Component that requires a key.\n * @param {*} parentType component's parent's type.\n */\nfunction validatePropertyKey(name, component, parentType) {\n  if (!NUMERIC_PROPERTY_REGEX.test(name)) {\n    return;\n  }\n  warnAndMonitorForKeyUse(\n    'react_numeric_key_warning',\n    'Child objects should have non-numeric keys so ordering is preserved.',\n    component,\n    parentType\n  );\n}\n\n/**\n * Shared warning and monitoring code for the key warnings.\n *\n * @internal\n * @param {string} warningID The id used when logging.\n * @param {string} message The base warning that gets output.\n * @param {ReactComponent} component Component that requires a key.\n * @param {*} parentType component's parent's type.\n */\nfunction warnAndMonitorForKeyUse(warningID, message, component, parentType) {\n  var ownerName = getCurrentOwnerDisplayName();\n  var parentName = parentType.displayName;\n\n  var useName = ownerName || parentName;\n  var memoizer = ownerHasKeyUseWarning[warningID];\n  if (memoizer.hasOwnProperty(useName)) {\n    return;\n  }\n  memoizer[useName] = true;\n\n  message += ownerName ?\n    (\" Check the render method of \" + ownerName + \".\") :\n    (\" Check the renderComponent call using <\" + parentName + \">.\");\n\n  // Usually the current owner is the offender, but if it accepts children as a\n  // property, it may be the creator of the child that's responsible for\n  // assigning it a key.\n  var childOwnerName = null;\n  if (component._owner && component._owner !== ReactCurrentOwner.current) {\n    // Name of the component that originally created this child.\n    childOwnerName = component._owner.constructor.displayName;\n\n    message += (\" It was passed a child from \" + childOwnerName + \".\");\n  }\n\n  message += ' See http://fb.me/react-warning-keys for more information.';\n  monitorCodeUse(warningID, {\n    component: useName,\n    componentOwner: childOwnerName\n  });\n  console.warn(message);\n}\n\n/**\n * Log that we're using an object map. We're considering deprecating this\n * feature and replace it with proper Map and ImmutableMap data structures.\n *\n * @internal\n */\nfunction monitorUseOfObjectMap() {\n  var currentName = getCurrentOwnerDisplayName() || '';\n  if (ownerHasMonitoredObjectMap.hasOwnProperty(currentName)) {\n    return;\n  }\n  ownerHasMonitoredObjectMap[currentName] = true;\n  monitorCodeUse('react_object_map_children');\n}\n\n/**\n * Ensure that every component either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {*} component Statically passed child of any type.\n * @param {*} parentType component's parent's type.\n * @return {boolean}\n */\nfunction validateChildKeys(component, parentType) {\n  if (Array.isArray(component)) {\n    for (var i = 0; i < component.length; i++) {\n      var child = component[i];\n      if (ReactDescriptor.isValidDescriptor(child)) {\n        validateExplicitKey(child, parentType);\n      }\n    }\n  } else if (ReactDescriptor.isValidDescriptor(component)) {\n    // This component was passed in a valid location.\n    component._store.validated = true;\n  } else if (component && typeof component === 'object') {\n    monitorUseOfObjectMap();\n    for (var name in component) {\n      validatePropertyKey(name, component[name], parentType);\n    }\n  }\n}\n\n/**\n * Assert that the props are valid\n *\n * @param {string} componentName Name of the component for error messages.\n * @param {object} propTypes Map of prop name to a ReactPropType\n * @param {object} props\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @private\n */\nfunction checkPropTypes(componentName, propTypes, props, location) {\n  for (var propName in propTypes) {\n    if (propTypes.hasOwnProperty(propName)) {\n      var error;\n      // Prop type validation may throw. In case they do, we don't want to\n      // fail the render phase where it didn't fail before. So we log it.\n      // After these have been cleaned up, we'll let them throw.\n      try {\n        error = propTypes[propName](props, propName, componentName, location);\n      } catch (ex) {\n        error = ex;\n      }\n      if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n        // Only monitor this failure once because there tends to be a lot of the\n        // same error.\n        loggedTypeFailures[error.message] = true;\n        // This will soon use the warning module\n        monitorCodeUse(\n          'react_failed_descriptor_type_check',\n          { message: error.message }\n        );\n      }\n    }\n  }\n}\n\nvar ReactDescriptorValidator = {\n\n  /**\n   * Wraps a descriptor factory function in another function which validates\n   * the props and context of the descriptor and warns about any failed type\n   * checks.\n   *\n   * @param {function} factory The original descriptor factory\n   * @param {object?} propTypes A prop type definition set\n   * @param {object?} contextTypes A context type definition set\n   * @return {object} The component descriptor, which may be invalid.\n   * @private\n   */\n  createFactory: function(factory, propTypes, contextTypes) {\n    var validatedFactory = function(props, children) {\n      var descriptor = factory.apply(this, arguments);\n\n      for (var i = 1; i < arguments.length; i++) {\n        validateChildKeys(arguments[i], descriptor.type);\n      }\n\n      var name = descriptor.type.displayName;\n      if (propTypes) {\n        checkPropTypes(\n          name,\n          propTypes,\n          descriptor.props,\n          ReactPropTypeLocations.prop\n        );\n      }\n      if (contextTypes) {\n        checkPropTypes(\n          name,\n          contextTypes,\n          descriptor._context,\n          ReactPropTypeLocations.context\n        );\n      }\n      return descriptor;\n    };\n\n    validatedFactory.prototype = factory.prototype;\n    validatedFactory.type = factory.type;\n\n    // Copy static properties\n    for (var key in factory) {\n      if (factory.hasOwnProperty(key)) {\n        validatedFactory[key] = factory[key];\n      }\n    }\n\n    return validatedFactory;\n  }\n\n};\n\nmodule.exports = ReactDescriptorValidator;\n","(function (process){\n/**\n * Copyright 2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactEmptyComponent\n */\n\n\"use strict\";\n\nvar invariant = require(\"./invariant\");\n\nvar component;\n// This registry keeps track of the React IDs of the components that rendered to\n// `null` (in reality a placeholder such as `noscript`)\nvar nullComponentIdsRegistry = {};\n\nvar ReactEmptyComponentInjection = {\n  injectEmptyComponent: function(emptyComponent) {\n    component = emptyComponent;\n  }\n};\n\n/**\n * @return {ReactComponent} component The injected empty component.\n */\nfunction getEmptyComponent() {\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    component,\n    'Trying to return null from a render, but no null placeholder component ' +\n    'was injected.'\n  ) : invariant(component));\n  return component();\n}\n\n/**\n * Mark the component as having rendered to null.\n * @param {string} id Component's `_rootNodeID`.\n */\nfunction registerNullComponentID(id) {\n  nullComponentIdsRegistry[id] = true;\n}\n\n/**\n * Unmark the component as having rendered to null: it renders to something now.\n * @param {string} id Component's `_rootNodeID`.\n */\nfunction deregisterNullComponentID(id) {\n  delete nullComponentIdsRegistry[id];\n}\n\n/**\n * @param {string} id Component's `_rootNodeID`.\n * @return {boolean} True if the component is rendered to null.\n */\nfunction isNullComponentID(id) {\n  return nullComponentIdsRegistry[id];\n}\n\nvar ReactEmptyComponent = {\n  deregisterNullComponentID: deregisterNullComponentID,\n  getEmptyComponent: getEmptyComponent,\n  injection: ReactEmptyComponentInjection,\n  isNullComponentID: isNullComponentID,\n  registerNullComponentID: registerNullComponentID\n};\n\nmodule.exports = ReactEmptyComponent;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactErrorUtils\n * @typechecks\n */\n\n\"use strict\";\n\nvar ReactErrorUtils = {\n  /**\n   * Creates a guarded version of a function. This is supposed to make debugging\n   * of event handlers easier. To aid debugging with the browser's debugger,\n   * this currently simply returns the original function.\n   *\n   * @param {function} func Function to be executed\n   * @param {string} name The name of the guard\n   * @return {function}\n   */\n  guard: function(func, name) {\n    return func;\n  }\n};\n\nmodule.exports = ReactErrorUtils;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactPropTypeLocations\n */\n\n\"use strict\";\n\nvar keyMirror = require(\"./keyMirror\");\n\nvar ReactPropTypeLocations = keyMirror({\n  prop: null,\n  context: null,\n  childContext: null\n});\n\nmodule.exports = ReactPropTypeLocations;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactPropTypeLocationNames\n */\n\n\"use strict\";\n\nvar ReactPropTypeLocationNames = {};\n\nif (\"production\" !== process.env.NODE_ENV) {\n  ReactPropTypeLocationNames = {\n    prop: 'prop',\n    context: 'context',\n    childContext: 'child context'\n  };\n}\n\nmodule.exports = ReactPropTypeLocationNames;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule instantiateReactComponent\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar invariant = require(\"./invariant\");\n\n/**\n * Validate a `componentDescriptor`. This should be exposed publicly in a follow\n * up diff.\n *\n * @param {object} descriptor\n * @return {boolean} Returns true if this is a valid descriptor of a Component.\n */\nfunction isValidComponentDescriptor(descriptor) {\n  return (\n    descriptor &&\n    typeof descriptor.type === 'function' &&\n    typeof descriptor.type.prototype.mountComponent === 'function' &&\n    typeof descriptor.type.prototype.receiveComponent === 'function'\n  );\n}\n\n/**\n * Given a `componentDescriptor` create an instance that will actually be\n * mounted. Currently it just extracts an existing clone from composite\n * components but this is an implementation detail which will change.\n *\n * @param {object} descriptor\n * @return {object} A new instance of componentDescriptor's constructor.\n * @protected\n */\nfunction instantiateReactComponent(descriptor) {\n\n  // TODO: Make warning\n  // if (__DEV__) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      isValidComponentDescriptor(descriptor),\n      'Only React Components are valid for mounting.'\n    ) : invariant(isValidComponentDescriptor(descriptor)));\n  // }\n\n  return new descriptor.type(descriptor);\n}\n\nmodule.exports = instantiateReactComponent;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule mixInto\n */\n\n\"use strict\";\n\n/**\n * Simply copies properties to the prototype.\n */\nvar mixInto = function(constructor, methodBag) {\n  var methodName;\n  for (methodName in methodBag) {\n    if (!methodBag.hasOwnProperty(methodName)) {\n      continue;\n    }\n    constructor.prototype[methodName] = methodBag[methodName];\n  }\n};\n\nmodule.exports = mixInto;\n","(function (process){\n/**\n * Copyright 2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule monitorCodeUse\n */\n\n\"use strict\";\n\nvar invariant = require(\"./invariant\");\n\n/**\n * Provides open-source compatible instrumentation for monitoring certain API\n * uses before we're ready to issue a warning or refactor. It accepts an event\n * name which may only contain the characters [a-z0-9_] and an optional data\n * object with further information.\n */\n\nfunction monitorCodeUse(eventName, data) {\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    eventName && !/[^a-z0-9_]/.test(eventName),\n    'You must provide an eventName using only the characters [a-z0-9_]'\n  ) : invariant(eventName && !/[^a-z0-9_]/.test(eventName)));\n}\n\nmodule.exports = monitorCodeUse;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule mapObject\n */\n\n\"use strict\";\n\n/**\n * For each key/value pair, invokes callback func and constructs a resulting\n * object which contains, for every key in obj, values that are the result of\n * of invoking the function:\n *\n *   func(value, key, iteration)\n *\n * Grepable names:\n *\n *   function objectMap()\n *   function objMap()\n *\n * @param {?object} obj Object to map keys over\n * @param {function} func Invoked for each key/val pair.\n * @param {?*} context\n * @return {?object} Result of mapping or null if obj is falsey\n */\nfunction mapObject(obj, func, context) {\n  if (!obj) {\n    return null;\n  }\n  var i = 0;\n  var ret = {};\n  for (var key in obj) {\n    if (obj.hasOwnProperty(key)) {\n      ret[key] = func.call(context, obj[key], key, i++);\n    }\n  }\n  return ret;\n}\n\nmodule.exports = mapObject;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule shouldUpdateReactComponent\n * @typechecks static-only\n */\n\n\"use strict\";\n\n/**\n * Given a `prevDescriptor` and `nextDescriptor`, determines if the existing\n * instance should be updated as opposed to being destroyed or replaced by a new\n * instance. Both arguments are descriptors. This ensures that this logic can\n * operate on stateless trees without any backing instance.\n *\n * @param {?object} prevDescriptor\n * @param {?object} nextDescriptor\n * @return {boolean} True if the existing instance should be updated.\n * @protected\n */\nfunction shouldUpdateReactComponent(prevDescriptor, nextDescriptor) {\n  if (prevDescriptor && nextDescriptor &&\n      prevDescriptor.type === nextDescriptor.type && (\n        (prevDescriptor.props && prevDescriptor.props.key) ===\n        (nextDescriptor.props && nextDescriptor.props.key)\n      ) && prevDescriptor._owner === nextDescriptor._owner) {\n    return true;\n  }\n  return false;\n}\n\nmodule.exports = shouldUpdateReactComponent;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule CSSPropertyOperations\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar CSSProperty = require(\"./CSSProperty\");\n\nvar dangerousStyleValue = require(\"./dangerousStyleValue\");\nvar hyphenateStyleName = require(\"./hyphenateStyleName\");\nvar memoizeStringOnly = require(\"./memoizeStringOnly\");\n\nvar processStyleName = memoizeStringOnly(function(styleName) {\n  return hyphenateStyleName(styleName);\n});\n\n/**\n * Operations for dealing with CSS properties.\n */\nvar CSSPropertyOperations = {\n\n  /**\n   * Serializes a mapping of style properties for use as inline styles:\n   *\n   *   > createMarkupForStyles({width: '200px', height: 0})\n   *   \"width:200px;height:0;\"\n   *\n   * Undefined values are ignored so that declarative programming is easier.\n   * The result should be HTML-escaped before insertion into the DOM.\n   *\n   * @param {object} styles\n   * @return {?string}\n   */\n  createMarkupForStyles: function(styles) {\n    var serialized = '';\n    for (var styleName in styles) {\n      if (!styles.hasOwnProperty(styleName)) {\n        continue;\n      }\n      var styleValue = styles[styleName];\n      if (styleValue != null) {\n        serialized += processStyleName(styleName) + ':';\n        serialized += dangerousStyleValue(styleName, styleValue) + ';';\n      }\n    }\n    return serialized || null;\n  },\n\n  /**\n   * Sets the value for multiple styles on a node.  If a value is specified as\n   * '' (empty string), the corresponding style property will be unset.\n   *\n   * @param {DOMElement} node\n   * @param {object} styles\n   */\n  setValueForStyles: function(node, styles) {\n    var style = node.style;\n    for (var styleName in styles) {\n      if (!styles.hasOwnProperty(styleName)) {\n        continue;\n      }\n      var styleValue = dangerousStyleValue(styleName, styles[styleName]);\n      if (styleValue) {\n        style[styleName] = styleValue;\n      } else {\n        var expansion = CSSProperty.shorthandPropertyExpansions[styleName];\n        if (expansion) {\n          // Shorthand property that IE8 won't like unsetting, so unset each\n          // component to placate it\n          for (var individualStyleName in expansion) {\n            style[individualStyleName] = '';\n          }\n        } else {\n          style[styleName] = '';\n        }\n      }\n    }\n  }\n\n};\n\nmodule.exports = CSSPropertyOperations;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactBrowserComponentMixin\n */\n\n\"use strict\";\n\nvar ReactEmptyComponent = require(\"./ReactEmptyComponent\");\nvar ReactMount = require(\"./ReactMount\");\n\nvar invariant = require(\"./invariant\");\n\nvar ReactBrowserComponentMixin = {\n  /**\n   * Returns the DOM node rendered by this component.\n   *\n   * @return {DOMElement} The root node of this component.\n   * @final\n   * @protected\n   */\n  getDOMNode: function() {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      this.isMounted(),\n      'getDOMNode(): A component must be mounted to have a DOM node.'\n    ) : invariant(this.isMounted()));\n    if (ReactEmptyComponent.isNullComponentID(this._rootNodeID)) {\n      return null;\n    }\n    return ReactMount.getNode(this._rootNodeID);\n  }\n};\n\nmodule.exports = ReactBrowserComponentMixin;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule BeforeInputEventPlugin\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar EventConstants = require(\"./EventConstants\");\nvar EventPropagators = require(\"./EventPropagators\");\nvar ExecutionEnvironment = require(\"./ExecutionEnvironment\");\nvar SyntheticInputEvent = require(\"./SyntheticInputEvent\");\n\nvar keyOf = require(\"./keyOf\");\n\nvar canUseTextInputEvent = (\n  ExecutionEnvironment.canUseDOM &&\n  'TextEvent' in window &&\n  !('documentMode' in document || isPresto())\n);\n\n/**\n * Opera <= 12 includes TextEvent in window, but does not fire\n * text input events. Rely on keypress instead.\n */\nfunction isPresto() {\n  var opera = window.opera;\n  return (\n    typeof opera === 'object' &&\n    typeof opera.version === 'function' &&\n    parseInt(opera.version(), 10) <= 12\n  );\n}\n\nvar SPACEBAR_CODE = 32;\nvar SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\n// Events and their corresponding property names.\nvar eventTypes = {\n  beforeInput: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onBeforeInput: null}),\n      captured: keyOf({onBeforeInputCapture: null})\n    },\n    dependencies: [\n      topLevelTypes.topCompositionEnd,\n      topLevelTypes.topKeyPress,\n      topLevelTypes.topTextInput,\n      topLevelTypes.topPaste\n    ]\n  }\n};\n\n// Track characters inserted via keypress and composition events.\nvar fallbackChars = null;\n\n/**\n * Return whether a native keypress event is assumed to be a command.\n * This is required because Firefox fires `keypress` events for key commands\n * (cut, copy, select-all, etc.) even though no character is inserted.\n */\nfunction isKeypressCommand(nativeEvent) {\n  return (\n    (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) &&\n    // ctrlKey && altKey is equivalent to AltGr, and is not a command.\n    !(nativeEvent.ctrlKey && nativeEvent.altKey)\n  );\n}\n\n/**\n * Create an `onBeforeInput` event to match\n * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.\n *\n * This event plugin is based on the native `textInput` event\n * available in Chrome, Safari, Opera, and IE. This event fires after\n * `onKeyPress` and `onCompositionEnd`, but before `onInput`.\n *\n * `beforeInput` is spec'd but not implemented in any browsers, and\n * the `input` event does not provide any useful information about what has\n * actually been added, contrary to the spec. Thus, `textInput` is the best\n * available event to identify the characters that have actually been inserted\n * into the target node.\n */\nvar BeforeInputEventPlugin = {\n\n  eventTypes: eventTypes,\n\n  /**\n   * @param {string} topLevelType Record from `EventConstants`.\n   * @param {DOMEventTarget} topLevelTarget The listening component root node.\n   * @param {string} topLevelTargetID ID of `topLevelTarget`.\n   * @param {object} nativeEvent Native browser event.\n   * @return {*} An accumulation of synthetic events.\n   * @see {EventPluginHub.extractEvents}\n   */\n  extractEvents: function(\n      topLevelType,\n      topLevelTarget,\n      topLevelTargetID,\n      nativeEvent) {\n\n    var chars;\n\n    if (canUseTextInputEvent) {\n      switch (topLevelType) {\n        case topLevelTypes.topKeyPress:\n          /**\n           * If native `textInput` events are available, our goal is to make\n           * use of them. However, there is a special case: the spacebar key.\n           * In Webkit, preventing default on a spacebar `textInput` event\n           * cancels character insertion, but it *also* causes the browser\n           * to fall back to its default spacebar behavior of scrolling the\n           * page.\n           *\n           * Tracking at:\n           * https://code.google.com/p/chromium/issues/detail?id=355103\n           *\n           * To avoid this issue, use the keypress event as if no `textInput`\n           * event is available.\n           */\n          var which = nativeEvent.which;\n          if (which !== SPACEBAR_CODE) {\n            return;\n          }\n\n          chars = String.fromCharCode(which);\n          break;\n\n        case topLevelTypes.topTextInput:\n          // Record the characters to be added to the DOM.\n          chars = nativeEvent.data;\n\n          // If it's a spacebar character, assume that we have already handled\n          // it at the keypress level and bail immediately.\n          if (chars === SPACEBAR_CHAR) {\n            return;\n          }\n\n          // Otherwise, carry on.\n          break;\n\n        default:\n          // For other native event types, do nothing.\n          return;\n      }\n    } else {\n      switch (topLevelType) {\n        case topLevelTypes.topPaste:\n          // If a paste event occurs after a keypress, throw out the input\n          // chars. Paste events should not lead to BeforeInput events.\n          fallbackChars = null;\n          break;\n        case topLevelTypes.topKeyPress:\n          /**\n           * As of v27, Firefox may fire keypress events even when no character\n           * will be inserted. A few possibilities:\n           *\n           * - `which` is `0`. Arrow keys, Esc key, etc.\n           *\n           * - `which` is the pressed key code, but no char is available.\n           *   Ex: 'AltGr + d` in Polish. There is no modified character for\n           *   this key combination and no character is inserted into the\n           *   document, but FF fires the keypress for char code `100` anyway.\n           *   No `input` event will occur.\n           *\n           * - `which` is the pressed key code, but a command combination is\n           *   being used. Ex: `Cmd+C`. No character is inserted, and no\n           *   `input` event will occur.\n           */\n          if (nativeEvent.which && !isKeypressCommand(nativeEvent)) {\n            fallbackChars = String.fromCharCode(nativeEvent.which);\n          }\n          break;\n        case topLevelTypes.topCompositionEnd:\n          fallbackChars = nativeEvent.data;\n          break;\n      }\n\n      // If no changes have occurred to the fallback string, no relevant\n      // event has fired and we're done.\n      if (fallbackChars === null) {\n        return;\n      }\n\n      chars = fallbackChars;\n    }\n\n    // If no characters are being inserted, no BeforeInput event should\n    // be fired.\n    if (!chars) {\n      return;\n    }\n\n    var event = SyntheticInputEvent.getPooled(\n      eventTypes.beforeInput,\n      topLevelTargetID,\n      nativeEvent\n    );\n\n    event.data = chars;\n    fallbackChars = null;\n    EventPropagators.accumulateTwoPhaseDispatches(event);\n    return event;\n  }\n};\n\nmodule.exports = BeforeInputEventPlugin;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ChangeEventPlugin\n */\n\n\"use strict\";\n\nvar EventConstants = require(\"./EventConstants\");\nvar EventPluginHub = require(\"./EventPluginHub\");\nvar EventPropagators = require(\"./EventPropagators\");\nvar ExecutionEnvironment = require(\"./ExecutionEnvironment\");\nvar ReactUpdates = require(\"./ReactUpdates\");\nvar SyntheticEvent = require(\"./SyntheticEvent\");\n\nvar isEventSupported = require(\"./isEventSupported\");\nvar isTextInputElement = require(\"./isTextInputElement\");\nvar keyOf = require(\"./keyOf\");\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\nvar eventTypes = {\n  change: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onChange: null}),\n      captured: keyOf({onChangeCapture: null})\n    },\n    dependencies: [\n      topLevelTypes.topBlur,\n      topLevelTypes.topChange,\n      topLevelTypes.topClick,\n      topLevelTypes.topFocus,\n      topLevelTypes.topInput,\n      topLevelTypes.topKeyDown,\n      topLevelTypes.topKeyUp,\n      topLevelTypes.topSelectionChange\n    ]\n  }\n};\n\n/**\n * For IE shims\n */\nvar activeElement = null;\nvar activeElementID = null;\nvar activeElementValue = null;\nvar activeElementValueProp = null;\n\n/**\n * SECTION: handle `change` event\n */\nfunction shouldUseChangeEvent(elem) {\n  return (\n    elem.nodeName === 'SELECT' ||\n    (elem.nodeName === 'INPUT' && elem.type === 'file')\n  );\n}\n\nvar doesChangeEventBubble = false;\nif (ExecutionEnvironment.canUseDOM) {\n  // See `handleChange` comment below\n  doesChangeEventBubble = isEventSupported('change') && (\n    !('documentMode' in document) || document.documentMode > 8\n  );\n}\n\nfunction manualDispatchChangeEvent(nativeEvent) {\n  var event = SyntheticEvent.getPooled(\n    eventTypes.change,\n    activeElementID,\n    nativeEvent\n  );\n  EventPropagators.accumulateTwoPhaseDispatches(event);\n\n  // If change and propertychange bubbled, we'd just bind to it like all the\n  // other events and have it go through ReactBrowserEventEmitter. Since it\n  // doesn't, we manually listen for the events and so we have to enqueue and\n  // process the abstract event manually.\n  //\n  // Batching is necessary here in order to ensure that all event handlers run\n  // before the next rerender (including event handlers attached to ancestor\n  // elements instead of directly on the input). Without this, controlled\n  // components don't work properly in conjunction with event bubbling because\n  // the component is rerendered and the value reverted before all the event\n  // handlers can run. See https://github.com/facebook/react/issues/708.\n  ReactUpdates.batchedUpdates(runEventInBatch, event);\n}\n\nfunction runEventInBatch(event) {\n  EventPluginHub.enqueueEvents(event);\n  EventPluginHub.processEventQueue();\n}\n\nfunction startWatchingForChangeEventIE8(target, targetID) {\n  activeElement = target;\n  activeElementID = targetID;\n  activeElement.attachEvent('onchange', manualDispatchChangeEvent);\n}\n\nfunction stopWatchingForChangeEventIE8() {\n  if (!activeElement) {\n    return;\n  }\n  activeElement.detachEvent('onchange', manualDispatchChangeEvent);\n  activeElement = null;\n  activeElementID = null;\n}\n\nfunction getTargetIDForChangeEvent(\n    topLevelType,\n    topLevelTarget,\n    topLevelTargetID) {\n  if (topLevelType === topLevelTypes.topChange) {\n    return topLevelTargetID;\n  }\n}\nfunction handleEventsForChangeEventIE8(\n    topLevelType,\n    topLevelTarget,\n    topLevelTargetID) {\n  if (topLevelType === topLevelTypes.topFocus) {\n    // stopWatching() should be a noop here but we call it just in case we\n    // missed a blur event somehow.\n    stopWatchingForChangeEventIE8();\n    startWatchingForChangeEventIE8(topLevelTarget, topLevelTargetID);\n  } else if (topLevelType === topLevelTypes.topBlur) {\n    stopWatchingForChangeEventIE8();\n  }\n}\n\n\n/**\n * SECTION: handle `input` event\n */\nvar isInputEventSupported = false;\nif (ExecutionEnvironment.canUseDOM) {\n  // IE9 claims to support the input event but fails to trigger it when\n  // deleting text, so we ignore its input events\n  isInputEventSupported = isEventSupported('input') && (\n    !('documentMode' in document) || document.documentMode > 9\n  );\n}\n\n/**\n * (For old IE.) Replacement getter/setter for the `value` property that gets\n * set on the active element.\n */\nvar newValueProp =  {\n  get: function() {\n    return activeElementValueProp.get.call(this);\n  },\n  set: function(val) {\n    // Cast to a string so we can do equality checks.\n    activeElementValue = '' + val;\n    activeElementValueProp.set.call(this, val);\n  }\n};\n\n/**\n * (For old IE.) Starts tracking propertychange events on the passed-in element\n * and override the value property so that we can distinguish user events from\n * value changes in JS.\n */\nfunction startWatchingForValueChange(target, targetID) {\n  activeElement = target;\n  activeElementID = targetID;\n  activeElementValue = target.value;\n  activeElementValueProp = Object.getOwnPropertyDescriptor(\n    target.constructor.prototype,\n    'value'\n  );\n\n  Object.defineProperty(activeElement, 'value', newValueProp);\n  activeElement.attachEvent('onpropertychange', handlePropertyChange);\n}\n\n/**\n * (For old IE.) Removes the event listeners from the currently-tracked element,\n * if any exists.\n */\nfunction stopWatchingForValueChange() {\n  if (!activeElement) {\n    return;\n  }\n\n  // delete restores the original property definition\n  delete activeElement.value;\n  activeElement.detachEvent('onpropertychange', handlePropertyChange);\n\n  activeElement = null;\n  activeElementID = null;\n  activeElementValue = null;\n  activeElementValueProp = null;\n}\n\n/**\n * (For old IE.) Handles a propertychange event, sending a `change` event if\n * the value of the active element has changed.\n */\nfunction handlePropertyChange(nativeEvent) {\n  if (nativeEvent.propertyName !== 'value') {\n    return;\n  }\n  var value = nativeEvent.srcElement.value;\n  if (value === activeElementValue) {\n    return;\n  }\n  activeElementValue = value;\n\n  manualDispatchChangeEvent(nativeEvent);\n}\n\n/**\n * If a `change` event should be fired, returns the target's ID.\n */\nfunction getTargetIDForInputEvent(\n    topLevelType,\n    topLevelTarget,\n    topLevelTargetID) {\n  if (topLevelType === topLevelTypes.topInput) {\n    // In modern browsers (i.e., not IE8 or IE9), the input event is exactly\n    // what we want so fall through here and trigger an abstract event\n    return topLevelTargetID;\n  }\n}\n\n// For IE8 and IE9.\nfunction handleEventsForInputEventIE(\n    topLevelType,\n    topLevelTarget,\n    topLevelTargetID) {\n  if (topLevelType === topLevelTypes.topFocus) {\n    // In IE8, we can capture almost all .value changes by adding a\n    // propertychange handler and looking for events with propertyName\n    // equal to 'value'\n    // In IE9, propertychange fires for most input events but is buggy and\n    // doesn't fire when text is deleted, but conveniently, selectionchange\n    // appears to fire in all of the remaining cases so we catch those and\n    // forward the event if the value has changed\n    // In either case, we don't want to call the event handler if the value\n    // is changed from JS so we redefine a setter for `.value` that updates\n    // our activeElementValue variable, allowing us to ignore those changes\n    //\n    // stopWatching() should be a noop here but we call it just in case we\n    // missed a blur event somehow.\n    stopWatchingForValueChange();\n    startWatchingForValueChange(topLevelTarget, topLevelTargetID);\n  } else if (topLevelType === topLevelTypes.topBlur) {\n    stopWatchingForValueChange();\n  }\n}\n\n// For IE8 and IE9.\nfunction getTargetIDForInputEventIE(\n    topLevelType,\n    topLevelTarget,\n    topLevelTargetID) {\n  if (topLevelType === topLevelTypes.topSelectionChange ||\n      topLevelType === topLevelTypes.topKeyUp ||\n      topLevelType === topLevelTypes.topKeyDown) {\n    // On the selectionchange event, the target is just document which isn't\n    // helpful for us so just check activeElement instead.\n    //\n    // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire\n    // propertychange on the first input event after setting `value` from a\n    // script and fires only keydown, keypress, keyup. Catching keyup usually\n    // gets it and catching keydown lets us fire an event for the first\n    // keystroke if user does a key repeat (it'll be a little delayed: right\n    // before the second keystroke). Other input methods (e.g., paste) seem to\n    // fire selectionchange normally.\n    if (activeElement && activeElement.value !== activeElementValue) {\n      activeElementValue = activeElement.value;\n      return activeElementID;\n    }\n  }\n}\n\n\n/**\n * SECTION: handle `click` event\n */\nfunction shouldUseClickEvent(elem) {\n  // Use the `click` event to detect changes to checkbox and radio inputs.\n  // This approach works across all browsers, whereas `change` does not fire\n  // until `blur` in IE8.\n  return (\n    elem.nodeName === 'INPUT' &&\n    (elem.type === 'checkbox' || elem.type === 'radio')\n  );\n}\n\nfunction getTargetIDForClickEvent(\n    topLevelType,\n    topLevelTarget,\n    topLevelTargetID) {\n  if (topLevelType === topLevelTypes.topClick) {\n    return topLevelTargetID;\n  }\n}\n\n/**\n * This plugin creates an `onChange` event that normalizes change events\n * across form elements. This event fires at a time when it's possible to\n * change the element's value without seeing a flicker.\n *\n * Supported elements are:\n * - input (see `isTextInputElement`)\n * - textarea\n * - select\n */\nvar ChangeEventPlugin = {\n\n  eventTypes: eventTypes,\n\n  /**\n   * @param {string} topLevelType Record from `EventConstants`.\n   * @param {DOMEventTarget} topLevelTarget The listening component root node.\n   * @param {string} topLevelTargetID ID of `topLevelTarget`.\n   * @param {object} nativeEvent Native browser event.\n   * @return {*} An accumulation of synthetic events.\n   * @see {EventPluginHub.extractEvents}\n   */\n  extractEvents: function(\n      topLevelType,\n      topLevelTarget,\n      topLevelTargetID,\n      nativeEvent) {\n\n    var getTargetIDFunc, handleEventFunc;\n    if (shouldUseChangeEvent(topLevelTarget)) {\n      if (doesChangeEventBubble) {\n        getTargetIDFunc = getTargetIDForChangeEvent;\n      } else {\n        handleEventFunc = handleEventsForChangeEventIE8;\n      }\n    } else if (isTextInputElement(topLevelTarget)) {\n      if (isInputEventSupported) {\n        getTargetIDFunc = getTargetIDForInputEvent;\n      } else {\n        getTargetIDFunc = getTargetIDForInputEventIE;\n        handleEventFunc = handleEventsForInputEventIE;\n      }\n    } else if (shouldUseClickEvent(topLevelTarget)) {\n      getTargetIDFunc = getTargetIDForClickEvent;\n    }\n\n    if (getTargetIDFunc) {\n      var targetID = getTargetIDFunc(\n        topLevelType,\n        topLevelTarget,\n        topLevelTargetID\n      );\n      if (targetID) {\n        var event = SyntheticEvent.getPooled(\n          eventTypes.change,\n          targetID,\n          nativeEvent\n        );\n        EventPropagators.accumulateTwoPhaseDispatches(event);\n        return event;\n      }\n    }\n\n    if (handleEventFunc) {\n      handleEventFunc(\n        topLevelType,\n        topLevelTarget,\n        topLevelTargetID\n      );\n    }\n  }\n\n};\n\nmodule.exports = ChangeEventPlugin;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ClientReactRootIndex\n * @typechecks\n */\n\n\"use strict\";\n\nvar nextReactRootIndex = 0;\n\nvar ClientReactRootIndex = {\n  createReactRootIndex: function() {\n    return nextReactRootIndex++;\n  }\n};\n\nmodule.exports = ClientReactRootIndex;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule CompositionEventPlugin\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar EventConstants = require(\"./EventConstants\");\nvar EventPropagators = require(\"./EventPropagators\");\nvar ExecutionEnvironment = require(\"./ExecutionEnvironment\");\nvar ReactInputSelection = require(\"./ReactInputSelection\");\nvar SyntheticCompositionEvent = require(\"./SyntheticCompositionEvent\");\n\nvar getTextContentAccessor = require(\"./getTextContentAccessor\");\nvar keyOf = require(\"./keyOf\");\n\nvar END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space\nvar START_KEYCODE = 229;\n\nvar useCompositionEvent = (\n  ExecutionEnvironment.canUseDOM &&\n  'CompositionEvent' in window\n);\n\n// In IE9+, we have access to composition events, but the data supplied\n// by the native compositionend event may be incorrect. In Korean, for example,\n// the compositionend event contains only one character regardless of\n// how many characters have been composed since compositionstart.\n// We therefore use the fallback data while still using the native\n// events as triggers.\nvar useFallbackData = (\n  !useCompositionEvent ||\n  (\n    'documentMode' in document &&\n    document.documentMode > 8 &&\n    document.documentMode <= 11\n  )\n);\n\nvar topLevelTypes = EventConstants.topLevelTypes;\nvar currentComposition = null;\n\n// Events and their corresponding property names.\nvar eventTypes = {\n  compositionEnd: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onCompositionEnd: null}),\n      captured: keyOf({onCompositionEndCapture: null})\n    },\n    dependencies: [\n      topLevelTypes.topBlur,\n      topLevelTypes.topCompositionEnd,\n      topLevelTypes.topKeyDown,\n      topLevelTypes.topKeyPress,\n      topLevelTypes.topKeyUp,\n      topLevelTypes.topMouseDown\n    ]\n  },\n  compositionStart: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onCompositionStart: null}),\n      captured: keyOf({onCompositionStartCapture: null})\n    },\n    dependencies: [\n      topLevelTypes.topBlur,\n      topLevelTypes.topCompositionStart,\n      topLevelTypes.topKeyDown,\n      topLevelTypes.topKeyPress,\n      topLevelTypes.topKeyUp,\n      topLevelTypes.topMouseDown\n    ]\n  },\n  compositionUpdate: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onCompositionUpdate: null}),\n      captured: keyOf({onCompositionUpdateCapture: null})\n    },\n    dependencies: [\n      topLevelTypes.topBlur,\n      topLevelTypes.topCompositionUpdate,\n      topLevelTypes.topKeyDown,\n      topLevelTypes.topKeyPress,\n      topLevelTypes.topKeyUp,\n      topLevelTypes.topMouseDown\n    ]\n  }\n};\n\n/**\n * Translate native top level events into event types.\n *\n * @param {string} topLevelType\n * @return {object}\n */\nfunction getCompositionEventType(topLevelType) {\n  switch (topLevelType) {\n    case topLevelTypes.topCompositionStart:\n      return eventTypes.compositionStart;\n    case topLevelTypes.topCompositionEnd:\n      return eventTypes.compositionEnd;\n    case topLevelTypes.topCompositionUpdate:\n      return eventTypes.compositionUpdate;\n  }\n}\n\n/**\n * Does our fallback best-guess model think this event signifies that\n * composition has begun?\n *\n * @param {string} topLevelType\n * @param {object} nativeEvent\n * @return {boolean}\n */\nfunction isFallbackStart(topLevelType, nativeEvent) {\n  return (\n    topLevelType === topLevelTypes.topKeyDown &&\n    nativeEvent.keyCode === START_KEYCODE\n  );\n}\n\n/**\n * Does our fallback mode think that this event is the end of composition?\n *\n * @param {string} topLevelType\n * @param {object} nativeEvent\n * @return {boolean}\n */\nfunction isFallbackEnd(topLevelType, nativeEvent) {\n  switch (topLevelType) {\n    case topLevelTypes.topKeyUp:\n      // Command keys insert or clear IME input.\n      return (END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1);\n    case topLevelTypes.topKeyDown:\n      // Expect IME keyCode on each keydown. If we get any other\n      // code we must have exited earlier.\n      return (nativeEvent.keyCode !== START_KEYCODE);\n    case topLevelTypes.topKeyPress:\n    case topLevelTypes.topMouseDown:\n    case topLevelTypes.topBlur:\n      // Events are not possible without cancelling IME.\n      return true;\n    default:\n      return false;\n  }\n}\n\n/**\n * Helper class stores information about selection and document state\n * so we can figure out what changed at a later date.\n *\n * @param {DOMEventTarget} root\n */\nfunction FallbackCompositionState(root) {\n  this.root = root;\n  this.startSelection = ReactInputSelection.getSelection(root);\n  this.startValue = this.getText();\n}\n\n/**\n * Get current text of input.\n *\n * @return {string}\n */\nFallbackCompositionState.prototype.getText = function() {\n  return this.root.value || this.root[getTextContentAccessor()];\n};\n\n/**\n * Text that has changed since the start of composition.\n *\n * @return {string}\n */\nFallbackCompositionState.prototype.getData = function() {\n  var endValue = this.getText();\n  var prefixLength = this.startSelection.start;\n  var suffixLength = this.startValue.length - this.startSelection.end;\n\n  return endValue.substr(\n    prefixLength,\n    endValue.length - suffixLength - prefixLength\n  );\n};\n\n/**\n * This plugin creates `onCompositionStart`, `onCompositionUpdate` and\n * `onCompositionEnd` events on inputs, textareas and contentEditable\n * nodes.\n */\nvar CompositionEventPlugin = {\n\n  eventTypes: eventTypes,\n\n  /**\n   * @param {string} topLevelType Record from `EventConstants`.\n   * @param {DOMEventTarget} topLevelTarget The listening component root node.\n   * @param {string} topLevelTargetID ID of `topLevelTarget`.\n   * @param {object} nativeEvent Native browser event.\n   * @return {*} An accumulation of synthetic events.\n   * @see {EventPluginHub.extractEvents}\n   */\n  extractEvents: function(\n      topLevelType,\n      topLevelTarget,\n      topLevelTargetID,\n      nativeEvent) {\n\n    var eventType;\n    var data;\n\n    if (useCompositionEvent) {\n      eventType = getCompositionEventType(topLevelType);\n    } else if (!currentComposition) {\n      if (isFallbackStart(topLevelType, nativeEvent)) {\n        eventType = eventTypes.compositionStart;\n      }\n    } else if (isFallbackEnd(topLevelType, nativeEvent)) {\n      eventType = eventTypes.compositionEnd;\n    }\n\n    if (useFallbackData) {\n      // The current composition is stored statically and must not be\n      // overwritten while composition continues.\n      if (!currentComposition && eventType === eventTypes.compositionStart) {\n        currentComposition = new FallbackCompositionState(topLevelTarget);\n      } else if (eventType === eventTypes.compositionEnd) {\n        if (currentComposition) {\n          data = currentComposition.getData();\n          currentComposition = null;\n        }\n      }\n    }\n\n    if (eventType) {\n      var event = SyntheticCompositionEvent.getPooled(\n        eventType,\n        topLevelTargetID,\n        nativeEvent\n      );\n      if (data) {\n        // Inject data generated from fallback path into the synthetic event.\n        // This matches the property of native CompositionEventInterface.\n        event.data = data;\n      }\n      EventPropagators.accumulateTwoPhaseDispatches(event);\n      return event;\n    }\n  }\n};\n\nmodule.exports = CompositionEventPlugin;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule DefaultEventPluginOrder\n */\n\n\"use strict\";\n\n var keyOf = require(\"./keyOf\");\n\n/**\n * Module that is injectable into `EventPluginHub`, that specifies a\n * deterministic ordering of `EventPlugin`s. A convenient way to reason about\n * plugins, without having to package every one of them. This is better than\n * having plugins be ordered in the same order that they are injected because\n * that ordering would be influenced by the packaging order.\n * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that\n * preventing default on events is convenient in `SimpleEventPlugin` handlers.\n */\nvar DefaultEventPluginOrder = [\n  keyOf({ResponderEventPlugin: null}),\n  keyOf({SimpleEventPlugin: null}),\n  keyOf({TapEventPlugin: null}),\n  keyOf({EnterLeaveEventPlugin: null}),\n  keyOf({ChangeEventPlugin: null}),\n  keyOf({SelectEventPlugin: null}),\n  keyOf({CompositionEventPlugin: null}),\n  keyOf({BeforeInputEventPlugin: null}),\n  keyOf({AnalyticsEventPlugin: null}),\n  keyOf({MobileSafariClickEventPlugin: null})\n];\n\nmodule.exports = DefaultEventPluginOrder;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule EnterLeaveEventPlugin\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar EventConstants = require(\"./EventConstants\");\nvar EventPropagators = require(\"./EventPropagators\");\nvar SyntheticMouseEvent = require(\"./SyntheticMouseEvent\");\n\nvar ReactMount = require(\"./ReactMount\");\nvar keyOf = require(\"./keyOf\");\n\nvar topLevelTypes = EventConstants.topLevelTypes;\nvar getFirstReactDOM = ReactMount.getFirstReactDOM;\n\nvar eventTypes = {\n  mouseEnter: {\n    registrationName: keyOf({onMouseEnter: null}),\n    dependencies: [\n      topLevelTypes.topMouseOut,\n      topLevelTypes.topMouseOver\n    ]\n  },\n  mouseLeave: {\n    registrationName: keyOf({onMouseLeave: null}),\n    dependencies: [\n      topLevelTypes.topMouseOut,\n      topLevelTypes.topMouseOver\n    ]\n  }\n};\n\nvar extractedEvents = [null, null];\n\nvar EnterLeaveEventPlugin = {\n\n  eventTypes: eventTypes,\n\n  /**\n   * For almost every interaction we care about, there will be both a top-level\n   * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that\n   * we do not extract duplicate events. However, moving the mouse into the\n   * browser from outside will not fire a `mouseout` event. In this case, we use\n   * the `mouseover` top-level event.\n   *\n   * @param {string} topLevelType Record from `EventConstants`.\n   * @param {DOMEventTarget} topLevelTarget The listening component root node.\n   * @param {string} topLevelTargetID ID of `topLevelTarget`.\n   * @param {object} nativeEvent Native browser event.\n   * @return {*} An accumulation of synthetic events.\n   * @see {EventPluginHub.extractEvents}\n   */\n  extractEvents: function(\n      topLevelType,\n      topLevelTarget,\n      topLevelTargetID,\n      nativeEvent) {\n    if (topLevelType === topLevelTypes.topMouseOver &&\n        (nativeEvent.relatedTarget || nativeEvent.fromElement)) {\n      return null;\n    }\n    if (topLevelType !== topLevelTypes.topMouseOut &&\n        topLevelType !== topLevelTypes.topMouseOver) {\n      // Must not be a mouse in or mouse out - ignoring.\n      return null;\n    }\n\n    var win;\n    if (topLevelTarget.window === topLevelTarget) {\n      // `topLevelTarget` is probably a window object.\n      win = topLevelTarget;\n    } else {\n      // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.\n      var doc = topLevelTarget.ownerDocument;\n      if (doc) {\n        win = doc.defaultView || doc.parentWindow;\n      } else {\n        win = window;\n      }\n    }\n\n    var from, to;\n    if (topLevelType === topLevelTypes.topMouseOut) {\n      from = topLevelTarget;\n      to =\n        getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement) ||\n        win;\n    } else {\n      from = win;\n      to = topLevelTarget;\n    }\n\n    if (from === to) {\n      // Nothing pertains to our managed components.\n      return null;\n    }\n\n    var fromID = from ? ReactMount.getID(from) : '';\n    var toID = to ? ReactMount.getID(to) : '';\n\n    var leave = SyntheticMouseEvent.getPooled(\n      eventTypes.mouseLeave,\n      fromID,\n      nativeEvent\n    );\n    leave.type = 'mouseleave';\n    leave.target = from;\n    leave.relatedTarget = to;\n\n    var enter = SyntheticMouseEvent.getPooled(\n      eventTypes.mouseEnter,\n      toID,\n      nativeEvent\n    );\n    enter.type = 'mouseenter';\n    enter.target = to;\n    enter.relatedTarget = from;\n\n    EventPropagators.accumulateEnterLeaveDispatches(leave, enter, fromID, toID);\n\n    extractedEvents[0] = leave;\n    extractedEvents[1] = enter;\n\n    return extractedEvents;\n  }\n\n};\n\nmodule.exports = EnterLeaveEventPlugin;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule HTMLDOMPropertyConfig\n */\n\n/*jslint bitwise: true*/\n\n\"use strict\";\n\nvar DOMProperty = require(\"./DOMProperty\");\nvar ExecutionEnvironment = require(\"./ExecutionEnvironment\");\n\nvar MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE;\nvar MUST_USE_PROPERTY = DOMProperty.injection.MUST_USE_PROPERTY;\nvar HAS_BOOLEAN_VALUE = DOMProperty.injection.HAS_BOOLEAN_VALUE;\nvar HAS_SIDE_EFFECTS = DOMProperty.injection.HAS_SIDE_EFFECTS;\nvar HAS_NUMERIC_VALUE = DOMProperty.injection.HAS_NUMERIC_VALUE;\nvar HAS_POSITIVE_NUMERIC_VALUE =\n  DOMProperty.injection.HAS_POSITIVE_NUMERIC_VALUE;\nvar HAS_OVERLOADED_BOOLEAN_VALUE =\n  DOMProperty.injection.HAS_OVERLOADED_BOOLEAN_VALUE;\n\nvar hasSVG;\nif (ExecutionEnvironment.canUseDOM) {\n  var implementation = document.implementation;\n  hasSVG = (\n    implementation &&\n    implementation.hasFeature &&\n    implementation.hasFeature(\n      'http://www.w3.org/TR/SVG11/feature#BasicStructure',\n      '1.1'\n    )\n  );\n}\n\n\nvar HTMLDOMPropertyConfig = {\n  isCustomAttribute: RegExp.prototype.test.bind(\n    /^(data|aria)-[a-z_][a-z\\d_.\\-]*$/\n  ),\n  Properties: {\n    /**\n     * Standard Properties\n     */\n    accept: null,\n    accessKey: null,\n    action: null,\n    allowFullScreen: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,\n    allowTransparency: MUST_USE_ATTRIBUTE,\n    alt: null,\n    async: HAS_BOOLEAN_VALUE,\n    autoComplete: null,\n    // autoFocus is polyfilled/normalized by AutoFocusMixin\n    // autoFocus: HAS_BOOLEAN_VALUE,\n    autoPlay: HAS_BOOLEAN_VALUE,\n    cellPadding: null,\n    cellSpacing: null,\n    charSet: MUST_USE_ATTRIBUTE,\n    checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n    // To set className on SVG elements, it's necessary to use .setAttribute;\n    // this works on HTML elements too in all browsers except IE8. Conveniently,\n    // IE8 doesn't support SVG and so we can simply use the attribute in\n    // browsers that support SVG and the property in browsers that don't,\n    // regardless of whether the element is HTML or SVG.\n    className: hasSVG ? MUST_USE_ATTRIBUTE : MUST_USE_PROPERTY,\n    cols: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,\n    colSpan: null,\n    content: null,\n    contentEditable: null,\n    contextMenu: MUST_USE_ATTRIBUTE,\n    controls: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n    coords: null,\n    crossOrigin: null,\n    data: null, // For `<object />` acts as `src`.\n    dateTime: MUST_USE_ATTRIBUTE,\n    defer: HAS_BOOLEAN_VALUE,\n    dir: null,\n    disabled: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,\n    download: HAS_OVERLOADED_BOOLEAN_VALUE,\n    draggable: null,\n    encType: null,\n    form: MUST_USE_ATTRIBUTE,\n    formNoValidate: HAS_BOOLEAN_VALUE,\n    frameBorder: MUST_USE_ATTRIBUTE,\n    height: MUST_USE_ATTRIBUTE,\n    hidden: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,\n    href: null,\n    hrefLang: null,\n    htmlFor: null,\n    httpEquiv: null,\n    icon: null,\n    id: MUST_USE_PROPERTY,\n    label: null,\n    lang: null,\n    list: null,\n    loop: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n    max: null,\n    maxLength: MUST_USE_ATTRIBUTE,\n    mediaGroup: null,\n    method: null,\n    min: null,\n    multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n    muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n    name: null,\n    noValidate: HAS_BOOLEAN_VALUE,\n    pattern: null,\n    placeholder: null,\n    poster: null,\n    preload: null,\n    radioGroup: null,\n    readOnly: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n    rel: null,\n    required: HAS_BOOLEAN_VALUE,\n    role: MUST_USE_ATTRIBUTE,\n    rows: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,\n    rowSpan: null,\n    sandbox: null,\n    scope: null,\n    scrollLeft: MUST_USE_PROPERTY,\n    scrolling: null,\n    scrollTop: MUST_USE_PROPERTY,\n    seamless: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,\n    selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n    shape: null,\n    size: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,\n    span: HAS_POSITIVE_NUMERIC_VALUE,\n    spellCheck: null,\n    src: null,\n    srcDoc: MUST_USE_PROPERTY,\n    srcSet: null,\n    start: HAS_NUMERIC_VALUE,\n    step: null,\n    style: null,\n    tabIndex: null,\n    target: null,\n    title: null,\n    type: null,\n    useMap: null,\n    value: MUST_USE_PROPERTY | HAS_SIDE_EFFECTS,\n    width: MUST_USE_ATTRIBUTE,\n    wmode: MUST_USE_ATTRIBUTE,\n\n    /**\n     * Non-standard Properties\n     */\n    autoCapitalize: null, // Supported in Mobile Safari for keyboard hints\n    autoCorrect: null, // Supported in Mobile Safari for keyboard hints\n    itemProp: MUST_USE_ATTRIBUTE, // Microdata: http://schema.org/docs/gs.html\n    itemScope: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, // Microdata: http://schema.org/docs/gs.html\n    itemType: MUST_USE_ATTRIBUTE, // Microdata: http://schema.org/docs/gs.html\n    property: null // Supports OG in meta tags\n  },\n  DOMAttributeNames: {\n    className: 'class',\n    htmlFor: 'for',\n    httpEquiv: 'http-equiv'\n  },\n  DOMPropertyNames: {\n    autoCapitalize: 'autocapitalize',\n    autoComplete: 'autocomplete',\n    autoCorrect: 'autocorrect',\n    autoFocus: 'autofocus',\n    autoPlay: 'autoplay',\n    encType: 'enctype',\n    hrefLang: 'hreflang',\n    radioGroup: 'radiogroup',\n    spellCheck: 'spellcheck',\n    srcDoc: 'srcdoc',\n    srcSet: 'srcset'\n  }\n};\n\nmodule.exports = HTMLDOMPropertyConfig;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule MobileSafariClickEventPlugin\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar EventConstants = require(\"./EventConstants\");\n\nvar emptyFunction = require(\"./emptyFunction\");\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\n/**\n * Mobile Safari does not fire properly bubble click events on non-interactive\n * elements, which means delegated click listeners do not fire. The workaround\n * for this bug involves attaching an empty click listener on the target node.\n *\n * This particular plugin works around the bug by attaching an empty click\n * listener on `touchstart` (which does fire on every element).\n */\nvar MobileSafariClickEventPlugin = {\n\n  eventTypes: null,\n\n  /**\n   * @param {string} topLevelType Record from `EventConstants`.\n   * @param {DOMEventTarget} topLevelTarget The listening component root node.\n   * @param {string} topLevelTargetID ID of `topLevelTarget`.\n   * @param {object} nativeEvent Native browser event.\n   * @return {*} An accumulation of synthetic events.\n   * @see {EventPluginHub.extractEvents}\n   */\n  extractEvents: function(\n      topLevelType,\n      topLevelTarget,\n      topLevelTargetID,\n      nativeEvent) {\n    if (topLevelType === topLevelTypes.topTouchStart) {\n      var target = nativeEvent.target;\n      if (target && !target.onclick) {\n        target.onclick = emptyFunction;\n      }\n    }\n  }\n\n};\n\nmodule.exports = MobileSafariClickEventPlugin;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactComponentBrowserEnvironment\n */\n\n/*jslint evil: true */\n\n\"use strict\";\n\nvar ReactDOMIDOperations = require(\"./ReactDOMIDOperations\");\nvar ReactMarkupChecksum = require(\"./ReactMarkupChecksum\");\nvar ReactMount = require(\"./ReactMount\");\nvar ReactPerf = require(\"./ReactPerf\");\nvar ReactReconcileTransaction = require(\"./ReactReconcileTransaction\");\n\nvar getReactRootElementInContainer = require(\"./getReactRootElementInContainer\");\nvar invariant = require(\"./invariant\");\nvar setInnerHTML = require(\"./setInnerHTML\");\n\n\nvar ELEMENT_NODE_TYPE = 1;\nvar DOC_NODE_TYPE = 9;\n\n\n/**\n * Abstracts away all functionality of `ReactComponent` requires knowledge of\n * the browser context.\n */\nvar ReactComponentBrowserEnvironment = {\n  ReactReconcileTransaction: ReactReconcileTransaction,\n\n  BackendIDOperations: ReactDOMIDOperations,\n\n  /**\n   * If a particular environment requires that some resources be cleaned up,\n   * specify this in the injected Mixin. In the DOM, we would likely want to\n   * purge any cached node ID lookups.\n   *\n   * @private\n   */\n  unmountIDFromEnvironment: function(rootNodeID) {\n    ReactMount.purgeID(rootNodeID);\n  },\n\n  /**\n   * @param {string} markup Markup string to place into the DOM Element.\n   * @param {DOMElement} container DOM Element to insert markup into.\n   * @param {boolean} shouldReuseMarkup Should reuse the existing markup in the\n   * container if possible.\n   */\n  mountImageIntoNode: ReactPerf.measure(\n    'ReactComponentBrowserEnvironment',\n    'mountImageIntoNode',\n    function(markup, container, shouldReuseMarkup) {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        container && (\n          container.nodeType === ELEMENT_NODE_TYPE ||\n            container.nodeType === DOC_NODE_TYPE\n        ),\n        'mountComponentIntoNode(...): Target container is not valid.'\n      ) : invariant(container && (\n        container.nodeType === ELEMENT_NODE_TYPE ||\n          container.nodeType === DOC_NODE_TYPE\n      )));\n\n      if (shouldReuseMarkup) {\n        if (ReactMarkupChecksum.canReuseMarkup(\n          markup,\n          getReactRootElementInContainer(container))) {\n          return;\n        } else {\n          (\"production\" !== process.env.NODE_ENV ? invariant(\n            container.nodeType !== DOC_NODE_TYPE,\n            'You\\'re trying to render a component to the document using ' +\n            'server rendering but the checksum was invalid. This usually ' +\n            'means you rendered a different component type or props on ' +\n            'the client from the one on the server, or your render() ' +\n            'methods are impure. React cannot handle this case due to ' +\n            'cross-browser quirks by rendering at the document root. You ' +\n            'should look for environment dependent code in your components ' +\n            'and ensure the props are the same client and server side.'\n          ) : invariant(container.nodeType !== DOC_NODE_TYPE));\n\n          if (\"production\" !== process.env.NODE_ENV) {\n            console.warn(\n              'React attempted to use reuse markup in a container but the ' +\n              'checksum was invalid. This generally means that you are ' +\n              'using server rendering and the markup generated on the ' +\n              'server was not what the client was expecting. React injected ' +\n              'new markup to compensate which works but you have lost many ' +\n              'of the benefits of server rendering. Instead, figure out ' +\n              'why the markup being generated is different on the client ' +\n              'or server.'\n            );\n          }\n        }\n      }\n\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        container.nodeType !== DOC_NODE_TYPE,\n        'You\\'re trying to render a component to the document but ' +\n          'you didn\\'t use server rendering. We can\\'t do this ' +\n          'without using server rendering due to cross-browser quirks. ' +\n          'See renderComponentToString() for server rendering.'\n      ) : invariant(container.nodeType !== DOC_NODE_TYPE));\n\n      setInnerHTML(container, markup);\n    }\n  )\n};\n\nmodule.exports = ReactComponentBrowserEnvironment;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDefaultBatchingStrategy\n */\n\n\"use strict\";\n\nvar ReactUpdates = require(\"./ReactUpdates\");\nvar Transaction = require(\"./Transaction\");\n\nvar emptyFunction = require(\"./emptyFunction\");\nvar mixInto = require(\"./mixInto\");\n\nvar RESET_BATCHED_UPDATES = {\n  initialize: emptyFunction,\n  close: function() {\n    ReactDefaultBatchingStrategy.isBatchingUpdates = false;\n  }\n};\n\nvar FLUSH_BATCHED_UPDATES = {\n  initialize: emptyFunction,\n  close: ReactUpdates.flushBatchedUpdates.bind(ReactUpdates)\n};\n\nvar TRANSACTION_WRAPPERS = [FLUSH_BATCHED_UPDATES, RESET_BATCHED_UPDATES];\n\nfunction ReactDefaultBatchingStrategyTransaction() {\n  this.reinitializeTransaction();\n}\n\nmixInto(ReactDefaultBatchingStrategyTransaction, Transaction.Mixin);\nmixInto(ReactDefaultBatchingStrategyTransaction, {\n  getTransactionWrappers: function() {\n    return TRANSACTION_WRAPPERS;\n  }\n});\n\nvar transaction = new ReactDefaultBatchingStrategyTransaction();\n\nvar ReactDefaultBatchingStrategy = {\n  isBatchingUpdates: false,\n\n  /**\n   * Call the provided function in a context within which calls to `setState`\n   * and friends are batched such that components aren't updated unnecessarily.\n   */\n  batchedUpdates: function(callback, a, b) {\n    var alreadyBatchingUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates;\n\n    ReactDefaultBatchingStrategy.isBatchingUpdates = true;\n\n    // The code is written this way to avoid extra allocations\n    if (alreadyBatchingUpdates) {\n      callback(a, b);\n    } else {\n      transaction.perform(callback, null, a, b);\n    }\n  }\n};\n\nmodule.exports = ReactDefaultBatchingStrategy;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDOMButton\n */\n\n\"use strict\";\n\nvar AutoFocusMixin = require(\"./AutoFocusMixin\");\nvar ReactBrowserComponentMixin = require(\"./ReactBrowserComponentMixin\");\nvar ReactCompositeComponent = require(\"./ReactCompositeComponent\");\nvar ReactDOM = require(\"./ReactDOM\");\n\nvar keyMirror = require(\"./keyMirror\");\n\n// Store a reference to the <button> `ReactDOMComponent`.\nvar button = ReactDOM.button;\n\nvar mouseListenerNames = keyMirror({\n  onClick: true,\n  onDoubleClick: true,\n  onMouseDown: true,\n  onMouseMove: true,\n  onMouseUp: true,\n  onClickCapture: true,\n  onDoubleClickCapture: true,\n  onMouseDownCapture: true,\n  onMouseMoveCapture: true,\n  onMouseUpCapture: true\n});\n\n/**\n * Implements a <button> native component that does not receive mouse events\n * when `disabled` is set.\n */\nvar ReactDOMButton = ReactCompositeComponent.createClass({\n  displayName: 'ReactDOMButton',\n\n  mixins: [AutoFocusMixin, ReactBrowserComponentMixin],\n\n  render: function() {\n    var props = {};\n\n    // Copy the props; except the mouse listeners if we're disabled\n    for (var key in this.props) {\n      if (this.props.hasOwnProperty(key) &&\n          (!this.props.disabled || !mouseListenerNames[key])) {\n        props[key] = this.props[key];\n      }\n    }\n\n    return button(props, this.props.children);\n  }\n\n});\n\nmodule.exports = ReactDOMButton;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDOMForm\n */\n\n\"use strict\";\n\nvar EventConstants = require(\"./EventConstants\");\nvar LocalEventTrapMixin = require(\"./LocalEventTrapMixin\");\nvar ReactBrowserComponentMixin = require(\"./ReactBrowserComponentMixin\");\nvar ReactCompositeComponent = require(\"./ReactCompositeComponent\");\nvar ReactDOM = require(\"./ReactDOM\");\n\n// Store a reference to the <form> `ReactDOMComponent`.\nvar form = ReactDOM.form;\n\n/**\n * Since onSubmit doesn't bubble OR capture on the top level in IE8, we need\n * to capture it on the <form> element itself. There are lots of hacks we could\n * do to accomplish this, but the most reliable is to make <form> a\n * composite component and use `componentDidMount` to attach the event handlers.\n */\nvar ReactDOMForm = ReactCompositeComponent.createClass({\n  displayName: 'ReactDOMForm',\n\n  mixins: [ReactBrowserComponentMixin, LocalEventTrapMixin],\n\n  render: function() {\n    // TODO: Instead of using `ReactDOM` directly, we should use JSX. However,\n    // `jshint` fails to parse JSX so in order for linting to work in the open\n    // source repo, we need to just use `ReactDOM.form`.\n    return this.transferPropsTo(form(null, this.props.children));\n  },\n\n  componentDidMount: function() {\n    this.trapBubbledEvent(EventConstants.topLevelTypes.topReset, 'reset');\n    this.trapBubbledEvent(EventConstants.topLevelTypes.topSubmit, 'submit');\n  }\n});\n\nmodule.exports = ReactDOMForm;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDOMImg\n */\n\n\"use strict\";\n\nvar EventConstants = require(\"./EventConstants\");\nvar LocalEventTrapMixin = require(\"./LocalEventTrapMixin\");\nvar ReactBrowserComponentMixin = require(\"./ReactBrowserComponentMixin\");\nvar ReactCompositeComponent = require(\"./ReactCompositeComponent\");\nvar ReactDOM = require(\"./ReactDOM\");\n\n// Store a reference to the <img> `ReactDOMComponent`.\nvar img = ReactDOM.img;\n\n/**\n * Since onLoad doesn't bubble OR capture on the top level in IE8, we need to\n * capture it on the <img> element itself. There are lots of hacks we could do\n * to accomplish this, but the most reliable is to make <img> a composite\n * component and use `componentDidMount` to attach the event handlers.\n */\nvar ReactDOMImg = ReactCompositeComponent.createClass({\n  displayName: 'ReactDOMImg',\n  tagName: 'IMG',\n\n  mixins: [ReactBrowserComponentMixin, LocalEventTrapMixin],\n\n  render: function() {\n    return img(this.props);\n  },\n\n  componentDidMount: function() {\n    this.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load');\n    this.trapBubbledEvent(EventConstants.topLevelTypes.topError, 'error');\n  }\n});\n\nmodule.exports = ReactDOMImg;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDOMInput\n */\n\n\"use strict\";\n\nvar AutoFocusMixin = require(\"./AutoFocusMixin\");\nvar DOMPropertyOperations = require(\"./DOMPropertyOperations\");\nvar LinkedValueUtils = require(\"./LinkedValueUtils\");\nvar ReactBrowserComponentMixin = require(\"./ReactBrowserComponentMixin\");\nvar ReactCompositeComponent = require(\"./ReactCompositeComponent\");\nvar ReactDOM = require(\"./ReactDOM\");\nvar ReactMount = require(\"./ReactMount\");\n\nvar invariant = require(\"./invariant\");\nvar merge = require(\"./merge\");\n\n// Store a reference to the <input> `ReactDOMComponent`.\nvar input = ReactDOM.input;\n\nvar instancesByReactID = {};\n\n/**\n * Implements an <input> native component that allows setting these optional\n * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.\n *\n * If `checked` or `value` are not supplied (or null/undefined), user actions\n * that affect the checked state or value will trigger updates to the element.\n *\n * If they are supplied (and not null/undefined), the rendered element will not\n * trigger updates to the element. Instead, the props must change in order for\n * the rendered element to be updated.\n *\n * The rendered element will be initialized as unchecked (or `defaultChecked`)\n * with an empty value (or `defaultValue`).\n *\n * @see http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html\n */\nvar ReactDOMInput = ReactCompositeComponent.createClass({\n  displayName: 'ReactDOMInput',\n\n  mixins: [AutoFocusMixin, LinkedValueUtils.Mixin, ReactBrowserComponentMixin],\n\n  getInitialState: function() {\n    var defaultValue = this.props.defaultValue;\n    return {\n      checked: this.props.defaultChecked || false,\n      value: defaultValue != null ? defaultValue : null\n    };\n  },\n\n  shouldComponentUpdate: function() {\n    // Defer any updates to this component during the `onChange` handler.\n    return !this._isChanging;\n  },\n\n  render: function() {\n    // Clone `this.props` so we don't mutate the input.\n    var props = merge(this.props);\n\n    props.defaultChecked = null;\n    props.defaultValue = null;\n\n    var value = LinkedValueUtils.getValue(this);\n    props.value = value != null ? value : this.state.value;\n\n    var checked = LinkedValueUtils.getChecked(this);\n    props.checked = checked != null ? checked : this.state.checked;\n\n    props.onChange = this._handleChange;\n\n    return input(props, this.props.children);\n  },\n\n  componentDidMount: function() {\n    var id = ReactMount.getID(this.getDOMNode());\n    instancesByReactID[id] = this;\n  },\n\n  componentWillUnmount: function() {\n    var rootNode = this.getDOMNode();\n    var id = ReactMount.getID(rootNode);\n    delete instancesByReactID[id];\n  },\n\n  componentDidUpdate: function(prevProps, prevState, prevContext) {\n    var rootNode = this.getDOMNode();\n    if (this.props.checked != null) {\n      DOMPropertyOperations.setValueForProperty(\n        rootNode,\n        'checked',\n        this.props.checked || false\n      );\n    }\n\n    var value = LinkedValueUtils.getValue(this);\n    if (value != null) {\n      // Cast `value` to a string to ensure the value is set correctly. While\n      // browsers typically do this as necessary, jsdom doesn't.\n      DOMPropertyOperations.setValueForProperty(rootNode, 'value', '' + value);\n    }\n  },\n\n  _handleChange: function(event) {\n    var returnValue;\n    var onChange = LinkedValueUtils.getOnChange(this);\n    if (onChange) {\n      this._isChanging = true;\n      returnValue = onChange.call(this, event);\n      this._isChanging = false;\n    }\n    this.setState({\n      checked: event.target.checked,\n      value: event.target.value\n    });\n\n    var name = this.props.name;\n    if (this.props.type === 'radio' && name != null) {\n      var rootNode = this.getDOMNode();\n      var queryRoot = rootNode;\n\n      while (queryRoot.parentNode) {\n        queryRoot = queryRoot.parentNode;\n      }\n\n      // If `rootNode.form` was non-null, then we could try `form.elements`,\n      // but that sometimes behaves strangely in IE8. We could also try using\n      // `form.getElementsByName`, but that will only return direct children\n      // and won't include inputs that use the HTML5 `form=` attribute. Since\n      // the input might not even be in a form, let's just use the global\n      // `querySelectorAll` to ensure we don't miss anything.\n      var group = queryRoot.querySelectorAll(\n        'input[name=' + JSON.stringify('' + name) + '][type=\"radio\"]');\n\n      for (var i = 0, groupLen = group.length; i < groupLen; i++) {\n        var otherNode = group[i];\n        if (otherNode === rootNode ||\n            otherNode.form !== rootNode.form) {\n          continue;\n        }\n        var otherID = ReactMount.getID(otherNode);\n        (\"production\" !== process.env.NODE_ENV ? invariant(\n          otherID,\n          'ReactDOMInput: Mixing React and non-React radio inputs with the ' +\n          'same `name` is not supported.'\n        ) : invariant(otherID));\n        var otherInstance = instancesByReactID[otherID];\n        (\"production\" !== process.env.NODE_ENV ? invariant(\n          otherInstance,\n          'ReactDOMInput: Unknown radio button ID %s.',\n          otherID\n        ) : invariant(otherInstance));\n        // In some cases, this will actually change the `checked` state value.\n        // In other cases, there's no change but this forces a reconcile upon\n        // which componentDidUpdate will reset the DOM property to whatever it\n        // should be.\n        otherInstance.setState({\n          checked: false\n        });\n      }\n    }\n\n    return returnValue;\n  }\n\n});\n\nmodule.exports = ReactDOMInput;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDOMOption\n */\n\n\"use strict\";\n\nvar ReactBrowserComponentMixin = require(\"./ReactBrowserComponentMixin\");\nvar ReactCompositeComponent = require(\"./ReactCompositeComponent\");\nvar ReactDOM = require(\"./ReactDOM\");\n\nvar warning = require(\"./warning\");\n\n// Store a reference to the <option> `ReactDOMComponent`.\nvar option = ReactDOM.option;\n\n/**\n * Implements an <option> native component that warns when `selected` is set.\n */\nvar ReactDOMOption = ReactCompositeComponent.createClass({\n  displayName: 'ReactDOMOption',\n\n  mixins: [ReactBrowserComponentMixin],\n\n  componentWillMount: function() {\n    // TODO (yungsters): Remove support for `selected` in <option>.\n    if (\"production\" !== process.env.NODE_ENV) {\n      (\"production\" !== process.env.NODE_ENV ? warning(\n        this.props.selected == null,\n        'Use the `defaultValue` or `value` props on <select> instead of ' +\n        'setting `selected` on <option>.'\n      ) : null);\n    }\n  },\n\n  render: function() {\n    return option(this.props, this.props.children);\n  }\n\n});\n\nmodule.exports = ReactDOMOption;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDOMSelect\n */\n\n\"use strict\";\n\nvar AutoFocusMixin = require(\"./AutoFocusMixin\");\nvar LinkedValueUtils = require(\"./LinkedValueUtils\");\nvar ReactBrowserComponentMixin = require(\"./ReactBrowserComponentMixin\");\nvar ReactCompositeComponent = require(\"./ReactCompositeComponent\");\nvar ReactDOM = require(\"./ReactDOM\");\n\nvar merge = require(\"./merge\");\n\n// Store a reference to the <select> `ReactDOMComponent`.\nvar select = ReactDOM.select;\n\n/**\n * Validation function for `value` and `defaultValue`.\n * @private\n */\nfunction selectValueType(props, propName, componentName) {\n  if (props[propName] == null) {\n    return;\n  }\n  if (props.multiple) {\n    if (!Array.isArray(props[propName])) {\n      return new Error(\n        (\"The `\" + propName + \"` prop supplied to <select> must be an array if \") +\n        (\"`multiple` is true.\")\n      );\n    }\n  } else {\n    if (Array.isArray(props[propName])) {\n      return new Error(\n        (\"The `\" + propName + \"` prop supplied to <select> must be a scalar \") +\n        (\"value if `multiple` is false.\")\n      );\n    }\n  }\n}\n\n/**\n * If `value` is supplied, updates <option> elements on mount and update.\n * @param {ReactComponent} component Instance of ReactDOMSelect\n * @param {?*} propValue For uncontrolled components, null/undefined. For\n * controlled components, a string (or with `multiple`, a list of strings).\n * @private\n */\nfunction updateOptions(component, propValue) {\n  var multiple = component.props.multiple;\n  var value = propValue != null ? propValue : component.state.value;\n  var options = component.getDOMNode().options;\n  var selectedValue, i, l;\n  if (multiple) {\n    selectedValue = {};\n    for (i = 0, l = value.length; i < l; ++i) {\n      selectedValue['' + value[i]] = true;\n    }\n  } else {\n    selectedValue = '' + value;\n  }\n  for (i = 0, l = options.length; i < l; i++) {\n    var selected = multiple ?\n      selectedValue.hasOwnProperty(options[i].value) :\n      options[i].value === selectedValue;\n\n    if (selected !== options[i].selected) {\n      options[i].selected = selected;\n    }\n  }\n}\n\n/**\n * Implements a <select> native component that allows optionally setting the\n * props `value` and `defaultValue`. If `multiple` is false, the prop must be a\n * string. If `multiple` is true, the prop must be an array of strings.\n *\n * If `value` is not supplied (or null/undefined), user actions that change the\n * selected option will trigger updates to the rendered options.\n *\n * If it is supplied (and not null/undefined), the rendered options will not\n * update in response to user actions. Instead, the `value` prop must change in\n * order for the rendered options to update.\n *\n * If `defaultValue` is provided, any options with the supplied values will be\n * selected.\n */\nvar ReactDOMSelect = ReactCompositeComponent.createClass({\n  displayName: 'ReactDOMSelect',\n\n  mixins: [AutoFocusMixin, LinkedValueUtils.Mixin, ReactBrowserComponentMixin],\n\n  propTypes: {\n    defaultValue: selectValueType,\n    value: selectValueType\n  },\n\n  getInitialState: function() {\n    return {value: this.props.defaultValue || (this.props.multiple ? [] : '')};\n  },\n\n  componentWillReceiveProps: function(nextProps) {\n    if (!this.props.multiple && nextProps.multiple) {\n      this.setState({value: [this.state.value]});\n    } else if (this.props.multiple && !nextProps.multiple) {\n      this.setState({value: this.state.value[0]});\n    }\n  },\n\n  shouldComponentUpdate: function() {\n    // Defer any updates to this component during the `onChange` handler.\n    return !this._isChanging;\n  },\n\n  render: function() {\n    // Clone `this.props` so we don't mutate the input.\n    var props = merge(this.props);\n\n    props.onChange = this._handleChange;\n    props.value = null;\n\n    return select(props, this.props.children);\n  },\n\n  componentDidMount: function() {\n    updateOptions(this, LinkedValueUtils.getValue(this));\n  },\n\n  componentDidUpdate: function(prevProps) {\n    var value = LinkedValueUtils.getValue(this);\n    var prevMultiple = !!prevProps.multiple;\n    var multiple = !!this.props.multiple;\n    if (value != null || prevMultiple !== multiple) {\n      updateOptions(this, value);\n    }\n  },\n\n  _handleChange: function(event) {\n    var returnValue;\n    var onChange = LinkedValueUtils.getOnChange(this);\n    if (onChange) {\n      this._isChanging = true;\n      returnValue = onChange.call(this, event);\n      this._isChanging = false;\n    }\n\n    var selectedValue;\n    if (this.props.multiple) {\n      selectedValue = [];\n      var options = event.target.options;\n      for (var i = 0, l = options.length; i < l; i++) {\n        if (options[i].selected) {\n          selectedValue.push(options[i].value);\n        }\n      }\n    } else {\n      selectedValue = event.target.value;\n    }\n\n    this.setState({value: selectedValue});\n    return returnValue;\n  }\n\n});\n\nmodule.exports = ReactDOMSelect;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDOMTextarea\n */\n\n\"use strict\";\n\nvar AutoFocusMixin = require(\"./AutoFocusMixin\");\nvar DOMPropertyOperations = require(\"./DOMPropertyOperations\");\nvar LinkedValueUtils = require(\"./LinkedValueUtils\");\nvar ReactBrowserComponentMixin = require(\"./ReactBrowserComponentMixin\");\nvar ReactCompositeComponent = require(\"./ReactCompositeComponent\");\nvar ReactDOM = require(\"./ReactDOM\");\n\nvar invariant = require(\"./invariant\");\nvar merge = require(\"./merge\");\n\nvar warning = require(\"./warning\");\n\n// Store a reference to the <textarea> `ReactDOMComponent`.\nvar textarea = ReactDOM.textarea;\n\n/**\n * Implements a <textarea> native component that allows setting `value`, and\n * `defaultValue`. This differs from the traditional DOM API because value is\n * usually set as PCDATA children.\n *\n * If `value` is not supplied (or null/undefined), user actions that affect the\n * value will trigger updates to the element.\n *\n * If `value` is supplied (and not null/undefined), the rendered element will\n * not trigger updates to the element. Instead, the `value` prop must change in\n * order for the rendered element to be updated.\n *\n * The rendered element will be initialized with an empty value, the prop\n * `defaultValue` if specified, or the children content (deprecated).\n */\nvar ReactDOMTextarea = ReactCompositeComponent.createClass({\n  displayName: 'ReactDOMTextarea',\n\n  mixins: [AutoFocusMixin, LinkedValueUtils.Mixin, ReactBrowserComponentMixin],\n\n  getInitialState: function() {\n    var defaultValue = this.props.defaultValue;\n    // TODO (yungsters): Remove support for children content in <textarea>.\n    var children = this.props.children;\n    if (children != null) {\n      if (\"production\" !== process.env.NODE_ENV) {\n        (\"production\" !== process.env.NODE_ENV ? warning(\n          false,\n          'Use the `defaultValue` or `value` props instead of setting ' +\n          'children on <textarea>.'\n        ) : null);\n      }\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        defaultValue == null,\n        'If you supply `defaultValue` on a <textarea>, do not pass children.'\n      ) : invariant(defaultValue == null));\n      if (Array.isArray(children)) {\n        (\"production\" !== process.env.NODE_ENV ? invariant(\n          children.length <= 1,\n          '<textarea> can only have at most one child.'\n        ) : invariant(children.length <= 1));\n        children = children[0];\n      }\n\n      defaultValue = '' + children;\n    }\n    if (defaultValue == null) {\n      defaultValue = '';\n    }\n    var value = LinkedValueUtils.getValue(this);\n    return {\n      // We save the initial value so that `ReactDOMComponent` doesn't update\n      // `textContent` (unnecessary since we update value).\n      // The initial value can be a boolean or object so that's why it's\n      // forced to be a string.\n      initialValue: '' + (value != null ? value : defaultValue)\n    };\n  },\n\n  shouldComponentUpdate: function() {\n    // Defer any updates to this component during the `onChange` handler.\n    return !this._isChanging;\n  },\n\n  render: function() {\n    // Clone `this.props` so we don't mutate the input.\n    var props = merge(this.props);\n\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      props.dangerouslySetInnerHTML == null,\n      '`dangerouslySetInnerHTML` does not make sense on <textarea>.'\n    ) : invariant(props.dangerouslySetInnerHTML == null));\n\n    props.defaultValue = null;\n    props.value = null;\n    props.onChange = this._handleChange;\n\n    // Always set children to the same thing. In IE9, the selection range will\n    // get reset if `textContent` is mutated.\n    return textarea(props, this.state.initialValue);\n  },\n\n  componentDidUpdate: function(prevProps, prevState, prevContext) {\n    var value = LinkedValueUtils.getValue(this);\n    if (value != null) {\n      var rootNode = this.getDOMNode();\n      // Cast `value` to a string to ensure the value is set correctly. While\n      // browsers typically do this as necessary, jsdom doesn't.\n      DOMPropertyOperations.setValueForProperty(rootNode, 'value', '' + value);\n    }\n  },\n\n  _handleChange: function(event) {\n    var returnValue;\n    var onChange = LinkedValueUtils.getOnChange(this);\n    if (onChange) {\n      this._isChanging = true;\n      returnValue = onChange.call(this, event);\n      this._isChanging = false;\n    }\n    this.setState({value: event.target.value});\n    return returnValue;\n  }\n\n});\n\nmodule.exports = ReactDOMTextarea;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactEventListener\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar EventListener = require(\"./EventListener\");\nvar ExecutionEnvironment = require(\"./ExecutionEnvironment\");\nvar PooledClass = require(\"./PooledClass\");\nvar ReactInstanceHandles = require(\"./ReactInstanceHandles\");\nvar ReactMount = require(\"./ReactMount\");\nvar ReactUpdates = require(\"./ReactUpdates\");\n\nvar getEventTarget = require(\"./getEventTarget\");\nvar getUnboundedScrollPosition = require(\"./getUnboundedScrollPosition\");\nvar mixInto = require(\"./mixInto\");\n\n/**\n * Finds the parent React component of `node`.\n *\n * @param {*} node\n * @return {?DOMEventTarget} Parent container, or `null` if the specified node\n *                           is not nested.\n */\nfunction findParent(node) {\n  // TODO: It may be a good idea to cache this to prevent unnecessary DOM\n  // traversal, but caching is difficult to do correctly without using a\n  // mutation observer to listen for all DOM changes.\n  var nodeID = ReactMount.getID(node);\n  var rootID = ReactInstanceHandles.getReactRootIDFromNodeID(nodeID);\n  var container = ReactMount.findReactContainerForID(rootID);\n  var parent = ReactMount.getFirstReactDOM(container);\n  return parent;\n}\n\n// Used to store ancestor hierarchy in top level callback\nfunction TopLevelCallbackBookKeeping(topLevelType, nativeEvent) {\n  this.topLevelType = topLevelType;\n  this.nativeEvent = nativeEvent;\n  this.ancestors = [];\n}\nmixInto(TopLevelCallbackBookKeeping, {\n  destructor: function() {\n    this.topLevelType = null;\n    this.nativeEvent = null;\n    this.ancestors.length = 0;\n  }\n});\nPooledClass.addPoolingTo(\n  TopLevelCallbackBookKeeping,\n  PooledClass.twoArgumentPooler\n);\n\nfunction handleTopLevelImpl(bookKeeping) {\n  var topLevelTarget = ReactMount.getFirstReactDOM(\n    getEventTarget(bookKeeping.nativeEvent)\n  ) || window;\n\n  // Loop through the hierarchy, in case there's any nested components.\n  // It's important that we build the array of ancestors before calling any\n  // event handlers, because event handlers can modify the DOM, leading to\n  // inconsistencies with ReactMount's node cache. See #1105.\n  var ancestor = topLevelTarget;\n  while (ancestor) {\n    bookKeeping.ancestors.push(ancestor);\n    ancestor = findParent(ancestor);\n  }\n\n  for (var i = 0, l = bookKeeping.ancestors.length; i < l; i++) {\n    topLevelTarget = bookKeeping.ancestors[i];\n    var topLevelTargetID = ReactMount.getID(topLevelTarget) || '';\n    ReactEventListener._handleTopLevel(\n      bookKeeping.topLevelType,\n      topLevelTarget,\n      topLevelTargetID,\n      bookKeeping.nativeEvent\n    );\n  }\n}\n\nfunction scrollValueMonitor(cb) {\n  var scrollPosition = getUnboundedScrollPosition(window);\n  cb(scrollPosition);\n}\n\nvar ReactEventListener = {\n  _enabled: true,\n  _handleTopLevel: null,\n\n  WINDOW_HANDLE: ExecutionEnvironment.canUseDOM ? window : null,\n\n  setHandleTopLevel: function(handleTopLevel) {\n    ReactEventListener._handleTopLevel = handleTopLevel;\n  },\n\n  setEnabled: function(enabled) {\n    ReactEventListener._enabled = !!enabled;\n  },\n\n  isEnabled: function() {\n    return ReactEventListener._enabled;\n  },\n\n\n  /**\n   * Traps top-level events by using event bubbling.\n   *\n   * @param {string} topLevelType Record from `EventConstants`.\n   * @param {string} handlerBaseName Event name (e.g. \"click\").\n   * @param {object} handle Element on which to attach listener.\n   * @return {object} An object with a remove function which will forcefully\n   *                  remove the listener.\n   * @internal\n   */\n  trapBubbledEvent: function(topLevelType, handlerBaseName, handle) {\n    var element = handle;\n    if (!element) {\n      return;\n    }\n    return EventListener.listen(\n      element,\n      handlerBaseName,\n      ReactEventListener.dispatchEvent.bind(null, topLevelType)\n    );\n  },\n\n  /**\n   * Traps a top-level event by using event capturing.\n   *\n   * @param {string} topLevelType Record from `EventConstants`.\n   * @param {string} handlerBaseName Event name (e.g. \"click\").\n   * @param {object} handle Element on which to attach listener.\n   * @return {object} An object with a remove function which will forcefully\n   *                  remove the listener.\n   * @internal\n   */\n  trapCapturedEvent: function(topLevelType, handlerBaseName, handle) {\n    var element = handle;\n    if (!element) {\n      return;\n    }\n    return EventListener.capture(\n      element,\n      handlerBaseName,\n      ReactEventListener.dispatchEvent.bind(null, topLevelType)\n    );\n  },\n\n  monitorScrollValue: function(refresh) {\n    var callback = scrollValueMonitor.bind(null, refresh);\n    EventListener.listen(window, 'scroll', callback);\n    EventListener.listen(window, 'resize', callback);\n  },\n\n  dispatchEvent: function(topLevelType, nativeEvent) {\n    if (!ReactEventListener._enabled) {\n      return;\n    }\n\n    var bookKeeping = TopLevelCallbackBookKeeping.getPooled(\n      topLevelType,\n      nativeEvent\n    );\n    try {\n      // Event queue being processed in the same cycle allows\n      // `preventDefault`.\n      ReactUpdates.batchedUpdates(handleTopLevelImpl, bookKeeping);\n    } finally {\n      TopLevelCallbackBookKeeping.release(bookKeeping);\n    }\n  }\n};\n\nmodule.exports = ReactEventListener;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactInjection\n */\n\n\"use strict\";\n\nvar DOMProperty = require(\"./DOMProperty\");\nvar EventPluginHub = require(\"./EventPluginHub\");\nvar ReactComponent = require(\"./ReactComponent\");\nvar ReactCompositeComponent = require(\"./ReactCompositeComponent\");\nvar ReactDOM = require(\"./ReactDOM\");\nvar ReactEmptyComponent = require(\"./ReactEmptyComponent\");\nvar ReactBrowserEventEmitter = require(\"./ReactBrowserEventEmitter\");\nvar ReactPerf = require(\"./ReactPerf\");\nvar ReactRootIndex = require(\"./ReactRootIndex\");\nvar ReactUpdates = require(\"./ReactUpdates\");\n\nvar ReactInjection = {\n  Component: ReactComponent.injection,\n  CompositeComponent: ReactCompositeComponent.injection,\n  DOMProperty: DOMProperty.injection,\n  EmptyComponent: ReactEmptyComponent.injection,\n  EventPluginHub: EventPluginHub.injection,\n  DOM: ReactDOM.injection,\n  EventEmitter: ReactBrowserEventEmitter.injection,\n  Perf: ReactPerf.injection,\n  RootIndex: ReactRootIndex.injection,\n  Updates: ReactUpdates.injection\n};\n\nmodule.exports = ReactInjection;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule SelectEventPlugin\n */\n\n\"use strict\";\n\nvar EventConstants = require(\"./EventConstants\");\nvar EventPropagators = require(\"./EventPropagators\");\nvar ReactInputSelection = require(\"./ReactInputSelection\");\nvar SyntheticEvent = require(\"./SyntheticEvent\");\n\nvar getActiveElement = require(\"./getActiveElement\");\nvar isTextInputElement = require(\"./isTextInputElement\");\nvar keyOf = require(\"./keyOf\");\nvar shallowEqual = require(\"./shallowEqual\");\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\nvar eventTypes = {\n  select: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onSelect: null}),\n      captured: keyOf({onSelectCapture: null})\n    },\n    dependencies: [\n      topLevelTypes.topBlur,\n      topLevelTypes.topContextMenu,\n      topLevelTypes.topFocus,\n      topLevelTypes.topKeyDown,\n      topLevelTypes.topMouseDown,\n      topLevelTypes.topMouseUp,\n      topLevelTypes.topSelectionChange\n    ]\n  }\n};\n\nvar activeElement = null;\nvar activeElementID = null;\nvar lastSelection = null;\nvar mouseDown = false;\n\n/**\n * Get an object which is a unique representation of the current selection.\n *\n * The return value will not be consistent across nodes or browsers, but\n * two identical selections on the same node will return identical objects.\n *\n * @param {DOMElement} node\n * @param {object}\n */\nfunction getSelection(node) {\n  if ('selectionStart' in node &&\n      ReactInputSelection.hasSelectionCapabilities(node)) {\n    return {\n      start: node.selectionStart,\n      end: node.selectionEnd\n    };\n  } else if (document.selection) {\n    var range = document.selection.createRange();\n    return {\n      parentElement: range.parentElement(),\n      text: range.text,\n      top: range.boundingTop,\n      left: range.boundingLeft\n    };\n  } else {\n    var selection = window.getSelection();\n    return {\n      anchorNode: selection.anchorNode,\n      anchorOffset: selection.anchorOffset,\n      focusNode: selection.focusNode,\n      focusOffset: selection.focusOffset\n    };\n  }\n}\n\n/**\n * Poll selection to see whether it's changed.\n *\n * @param {object} nativeEvent\n * @return {?SyntheticEvent}\n */\nfunction constructSelectEvent(nativeEvent) {\n  // Ensure we have the right element, and that the user is not dragging a\n  // selection (this matches native `select` event behavior). In HTML5, select\n  // fires only on input and textarea thus if there's no focused element we\n  // won't dispatch.\n  if (mouseDown ||\n      activeElement == null ||\n      activeElement != getActiveElement()) {\n    return;\n  }\n\n  // Only fire when selection has actually changed.\n  var currentSelection = getSelection(activeElement);\n  if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {\n    lastSelection = currentSelection;\n\n    var syntheticEvent = SyntheticEvent.getPooled(\n      eventTypes.select,\n      activeElementID,\n      nativeEvent\n    );\n\n    syntheticEvent.type = 'select';\n    syntheticEvent.target = activeElement;\n\n    EventPropagators.accumulateTwoPhaseDispatches(syntheticEvent);\n\n    return syntheticEvent;\n  }\n}\n\n/**\n * This plugin creates an `onSelect` event that normalizes select events\n * across form elements.\n *\n * Supported elements are:\n * - input (see `isTextInputElement`)\n * - textarea\n * - contentEditable\n *\n * This differs from native browser implementations in the following ways:\n * - Fires on contentEditable fields as well as inputs.\n * - Fires for collapsed selection.\n * - Fires after user input.\n */\nvar SelectEventPlugin = {\n\n  eventTypes: eventTypes,\n\n  /**\n   * @param {string} topLevelType Record from `EventConstants`.\n   * @param {DOMEventTarget} topLevelTarget The listening component root node.\n   * @param {string} topLevelTargetID ID of `topLevelTarget`.\n   * @param {object} nativeEvent Native browser event.\n   * @return {*} An accumulation of synthetic events.\n   * @see {EventPluginHub.extractEvents}\n   */\n  extractEvents: function(\n      topLevelType,\n      topLevelTarget,\n      topLevelTargetID,\n      nativeEvent) {\n\n    switch (topLevelType) {\n      // Track the input node that has focus.\n      case topLevelTypes.topFocus:\n        if (isTextInputElement(topLevelTarget) ||\n            topLevelTarget.contentEditable === 'true') {\n          activeElement = topLevelTarget;\n          activeElementID = topLevelTargetID;\n          lastSelection = null;\n        }\n        break;\n      case topLevelTypes.topBlur:\n        activeElement = null;\n        activeElementID = null;\n        lastSelection = null;\n        break;\n\n      // Don't fire the event while the user is dragging. This matches the\n      // semantics of the native select event.\n      case topLevelTypes.topMouseDown:\n        mouseDown = true;\n        break;\n      case topLevelTypes.topContextMenu:\n      case topLevelTypes.topMouseUp:\n        mouseDown = false;\n        return constructSelectEvent(nativeEvent);\n\n      // Chrome and IE fire non-standard event when selection is changed (and\n      // sometimes when it hasn't).\n      // Firefox doesn't support selectionchange, so check selection status\n      // after each key entry. The selection changes after keydown and before\n      // keyup, but we check on keydown as well in the case of holding down a\n      // key, when multiple keydown events are fired but only one keyup is.\n      case topLevelTypes.topSelectionChange:\n      case topLevelTypes.topKeyDown:\n      case topLevelTypes.topKeyUp:\n        return constructSelectEvent(nativeEvent);\n    }\n  }\n};\n\nmodule.exports = SelectEventPlugin;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ServerReactRootIndex\n * @typechecks\n */\n\n\"use strict\";\n\n/**\n * Size of the reactRoot ID space. We generate random numbers for React root\n * IDs and if there's a collision the events and DOM update system will\n * get confused. In the future we need a way to generate GUIDs but for\n * now this will work on a smaller scale.\n */\nvar GLOBAL_MOUNT_POINT_MAX = Math.pow(2, 53);\n\nvar ServerReactRootIndex = {\n  createReactRootIndex: function() {\n    return Math.ceil(Math.random() * GLOBAL_MOUNT_POINT_MAX);\n  }\n};\n\nmodule.exports = ServerReactRootIndex;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule SimpleEventPlugin\n */\n\n\"use strict\";\n\nvar EventConstants = require(\"./EventConstants\");\nvar EventPluginUtils = require(\"./EventPluginUtils\");\nvar EventPropagators = require(\"./EventPropagators\");\nvar SyntheticClipboardEvent = require(\"./SyntheticClipboardEvent\");\nvar SyntheticEvent = require(\"./SyntheticEvent\");\nvar SyntheticFocusEvent = require(\"./SyntheticFocusEvent\");\nvar SyntheticKeyboardEvent = require(\"./SyntheticKeyboardEvent\");\nvar SyntheticMouseEvent = require(\"./SyntheticMouseEvent\");\nvar SyntheticDragEvent = require(\"./SyntheticDragEvent\");\nvar SyntheticTouchEvent = require(\"./SyntheticTouchEvent\");\nvar SyntheticUIEvent = require(\"./SyntheticUIEvent\");\nvar SyntheticWheelEvent = require(\"./SyntheticWheelEvent\");\n\nvar invariant = require(\"./invariant\");\nvar keyOf = require(\"./keyOf\");\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\nvar eventTypes = {\n  blur: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onBlur: true}),\n      captured: keyOf({onBlurCapture: true})\n    }\n  },\n  click: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onClick: true}),\n      captured: keyOf({onClickCapture: true})\n    }\n  },\n  contextMenu: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onContextMenu: true}),\n      captured: keyOf({onContextMenuCapture: true})\n    }\n  },\n  copy: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onCopy: true}),\n      captured: keyOf({onCopyCapture: true})\n    }\n  },\n  cut: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onCut: true}),\n      captured: keyOf({onCutCapture: true})\n    }\n  },\n  doubleClick: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onDoubleClick: true}),\n      captured: keyOf({onDoubleClickCapture: true})\n    }\n  },\n  drag: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onDrag: true}),\n      captured: keyOf({onDragCapture: true})\n    }\n  },\n  dragEnd: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onDragEnd: true}),\n      captured: keyOf({onDragEndCapture: true})\n    }\n  },\n  dragEnter: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onDragEnter: true}),\n      captured: keyOf({onDragEnterCapture: true})\n    }\n  },\n  dragExit: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onDragExit: true}),\n      captured: keyOf({onDragExitCapture: true})\n    }\n  },\n  dragLeave: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onDragLeave: true}),\n      captured: keyOf({onDragLeaveCapture: true})\n    }\n  },\n  dragOver: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onDragOver: true}),\n      captured: keyOf({onDragOverCapture: true})\n    }\n  },\n  dragStart: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onDragStart: true}),\n      captured: keyOf({onDragStartCapture: true})\n    }\n  },\n  drop: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onDrop: true}),\n      captured: keyOf({onDropCapture: true})\n    }\n  },\n  focus: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onFocus: true}),\n      captured: keyOf({onFocusCapture: true})\n    }\n  },\n  input: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onInput: true}),\n      captured: keyOf({onInputCapture: true})\n    }\n  },\n  keyDown: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onKeyDown: true}),\n      captured: keyOf({onKeyDownCapture: true})\n    }\n  },\n  keyPress: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onKeyPress: true}),\n      captured: keyOf({onKeyPressCapture: true})\n    }\n  },\n  keyUp: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onKeyUp: true}),\n      captured: keyOf({onKeyUpCapture: true})\n    }\n  },\n  load: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onLoad: true}),\n      captured: keyOf({onLoadCapture: true})\n    }\n  },\n  error: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onError: true}),\n      captured: keyOf({onErrorCapture: true})\n    }\n  },\n  // Note: We do not allow listening to mouseOver events. Instead, use the\n  // onMouseEnter/onMouseLeave created by `EnterLeaveEventPlugin`.\n  mouseDown: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onMouseDown: true}),\n      captured: keyOf({onMouseDownCapture: true})\n    }\n  },\n  mouseMove: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onMouseMove: true}),\n      captured: keyOf({onMouseMoveCapture: true})\n    }\n  },\n  mouseOut: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onMouseOut: true}),\n      captured: keyOf({onMouseOutCapture: true})\n    }\n  },\n  mouseOver: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onMouseOver: true}),\n      captured: keyOf({onMouseOverCapture: true})\n    }\n  },\n  mouseUp: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onMouseUp: true}),\n      captured: keyOf({onMouseUpCapture: true})\n    }\n  },\n  paste: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onPaste: true}),\n      captured: keyOf({onPasteCapture: true})\n    }\n  },\n  reset: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onReset: true}),\n      captured: keyOf({onResetCapture: true})\n    }\n  },\n  scroll: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onScroll: true}),\n      captured: keyOf({onScrollCapture: true})\n    }\n  },\n  submit: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onSubmit: true}),\n      captured: keyOf({onSubmitCapture: true})\n    }\n  },\n  touchCancel: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onTouchCancel: true}),\n      captured: keyOf({onTouchCancelCapture: true})\n    }\n  },\n  touchEnd: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onTouchEnd: true}),\n      captured: keyOf({onTouchEndCapture: true})\n    }\n  },\n  touchMove: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onTouchMove: true}),\n      captured: keyOf({onTouchMoveCapture: true})\n    }\n  },\n  touchStart: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onTouchStart: true}),\n      captured: keyOf({onTouchStartCapture: true})\n    }\n  },\n  wheel: {\n    phasedRegistrationNames: {\n      bubbled: keyOf({onWheel: true}),\n      captured: keyOf({onWheelCapture: true})\n    }\n  }\n};\n\nvar topLevelEventsToDispatchConfig = {\n  topBlur:        eventTypes.blur,\n  topClick:       eventTypes.click,\n  topContextMenu: eventTypes.contextMenu,\n  topCopy:        eventTypes.copy,\n  topCut:         eventTypes.cut,\n  topDoubleClick: eventTypes.doubleClick,\n  topDrag:        eventTypes.drag,\n  topDragEnd:     eventTypes.dragEnd,\n  topDragEnter:   eventTypes.dragEnter,\n  topDragExit:    eventTypes.dragExit,\n  topDragLeave:   eventTypes.dragLeave,\n  topDragOver:    eventTypes.dragOver,\n  topDragStart:   eventTypes.dragStart,\n  topDrop:        eventTypes.drop,\n  topError:       eventTypes.error,\n  topFocus:       eventTypes.focus,\n  topInput:       eventTypes.input,\n  topKeyDown:     eventTypes.keyDown,\n  topKeyPress:    eventTypes.keyPress,\n  topKeyUp:       eventTypes.keyUp,\n  topLoad:        eventTypes.load,\n  topMouseDown:   eventTypes.mouseDown,\n  topMouseMove:   eventTypes.mouseMove,\n  topMouseOut:    eventTypes.mouseOut,\n  topMouseOver:   eventTypes.mouseOver,\n  topMouseUp:     eventTypes.mouseUp,\n  topPaste:       eventTypes.paste,\n  topReset:       eventTypes.reset,\n  topScroll:      eventTypes.scroll,\n  topSubmit:      eventTypes.submit,\n  topTouchCancel: eventTypes.touchCancel,\n  topTouchEnd:    eventTypes.touchEnd,\n  topTouchMove:   eventTypes.touchMove,\n  topTouchStart:  eventTypes.touchStart,\n  topWheel:       eventTypes.wheel\n};\n\nfor (var topLevelType in topLevelEventsToDispatchConfig) {\n  topLevelEventsToDispatchConfig[topLevelType].dependencies = [topLevelType];\n}\n\nvar SimpleEventPlugin = {\n\n  eventTypes: eventTypes,\n\n  /**\n   * Same as the default implementation, except cancels the event when return\n   * value is false.\n   *\n   * @param {object} Event to be dispatched.\n   * @param {function} Application-level callback.\n   * @param {string} domID DOM ID to pass to the callback.\n   */\n  executeDispatch: function(event, listener, domID) {\n    var returnValue = EventPluginUtils.executeDispatch(event, listener, domID);\n    if (returnValue === false) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  },\n\n  /**\n   * @param {string} topLevelType Record from `EventConstants`.\n   * @param {DOMEventTarget} topLevelTarget The listening component root node.\n   * @param {string} topLevelTargetID ID of `topLevelTarget`.\n   * @param {object} nativeEvent Native browser event.\n   * @return {*} An accumulation of synthetic events.\n   * @see {EventPluginHub.extractEvents}\n   */\n  extractEvents: function(\n      topLevelType,\n      topLevelTarget,\n      topLevelTargetID,\n      nativeEvent) {\n    var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType];\n    if (!dispatchConfig) {\n      return null;\n    }\n    var EventConstructor;\n    switch (topLevelType) {\n      case topLevelTypes.topInput:\n      case topLevelTypes.topLoad:\n      case topLevelTypes.topError:\n      case topLevelTypes.topReset:\n      case topLevelTypes.topSubmit:\n        // HTML Events\n        // @see http://www.w3.org/TR/html5/index.html#events-0\n        EventConstructor = SyntheticEvent;\n        break;\n      case topLevelTypes.topKeyPress:\n        // FireFox creates a keypress event for function keys too. This removes\n        // the unwanted keypress events.\n        if (nativeEvent.charCode === 0) {\n          return null;\n        }\n        /* falls through */\n      case topLevelTypes.topKeyDown:\n      case topLevelTypes.topKeyUp:\n        EventConstructor = SyntheticKeyboardEvent;\n        break;\n      case topLevelTypes.topBlur:\n      case topLevelTypes.topFocus:\n        EventConstructor = SyntheticFocusEvent;\n        break;\n      case topLevelTypes.topClick:\n        // Firefox creates a click event on right mouse clicks. This removes the\n        // unwanted click events.\n        if (nativeEvent.button === 2) {\n          return null;\n        }\n        /* falls through */\n      case topLevelTypes.topContextMenu:\n      case topLevelTypes.topDoubleClick:\n      case topLevelTypes.topMouseDown:\n      case topLevelTypes.topMouseMove:\n      case topLevelTypes.topMouseOut:\n      case topLevelTypes.topMouseOver:\n      case topLevelTypes.topMouseUp:\n        EventConstructor = SyntheticMouseEvent;\n        break;\n      case topLevelTypes.topDrag:\n      case topLevelTypes.topDragEnd:\n      case topLevelTypes.topDragEnter:\n      case topLevelTypes.topDragExit:\n      case topLevelTypes.topDragLeave:\n      case topLevelTypes.topDragOver:\n      case topLevelTypes.topDragStart:\n      case topLevelTypes.topDrop:\n        EventConstructor = SyntheticDragEvent;\n        break;\n      case topLevelTypes.topTouchCancel:\n      case topLevelTypes.topTouchEnd:\n      case topLevelTypes.topTouchMove:\n      case topLevelTypes.topTouchStart:\n        EventConstructor = SyntheticTouchEvent;\n        break;\n      case topLevelTypes.topScroll:\n        EventConstructor = SyntheticUIEvent;\n        break;\n      case topLevelTypes.topWheel:\n        EventConstructor = SyntheticWheelEvent;\n        break;\n      case topLevelTypes.topCopy:\n      case topLevelTypes.topCut:\n      case topLevelTypes.topPaste:\n        EventConstructor = SyntheticClipboardEvent;\n        break;\n    }\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      EventConstructor,\n      'SimpleEventPlugin: Unhandled event type, `%s`.',\n      topLevelType\n    ) : invariant(EventConstructor));\n    var event = EventConstructor.getPooled(\n      dispatchConfig,\n      topLevelTargetID,\n      nativeEvent\n    );\n    EventPropagators.accumulateTwoPhaseDispatches(event);\n    return event;\n  }\n\n};\n\nmodule.exports = SimpleEventPlugin;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule SVGDOMPropertyConfig\n */\n\n/*jslint bitwise: true*/\n\n\"use strict\";\n\nvar DOMProperty = require(\"./DOMProperty\");\n\nvar MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE;\n\nvar SVGDOMPropertyConfig = {\n  Properties: {\n    cx: MUST_USE_ATTRIBUTE,\n    cy: MUST_USE_ATTRIBUTE,\n    d: MUST_USE_ATTRIBUTE,\n    dx: MUST_USE_ATTRIBUTE,\n    dy: MUST_USE_ATTRIBUTE,\n    fill: MUST_USE_ATTRIBUTE,\n    fillOpacity: MUST_USE_ATTRIBUTE,\n    fontFamily: MUST_USE_ATTRIBUTE,\n    fontSize: MUST_USE_ATTRIBUTE,\n    fx: MUST_USE_ATTRIBUTE,\n    fy: MUST_USE_ATTRIBUTE,\n    gradientTransform: MUST_USE_ATTRIBUTE,\n    gradientUnits: MUST_USE_ATTRIBUTE,\n    markerEnd: MUST_USE_ATTRIBUTE,\n    markerMid: MUST_USE_ATTRIBUTE,\n    markerStart: MUST_USE_ATTRIBUTE,\n    offset: MUST_USE_ATTRIBUTE,\n    opacity: MUST_USE_ATTRIBUTE,\n    patternContentUnits: MUST_USE_ATTRIBUTE,\n    patternUnits: MUST_USE_ATTRIBUTE,\n    points: MUST_USE_ATTRIBUTE,\n    preserveAspectRatio: MUST_USE_ATTRIBUTE,\n    r: MUST_USE_ATTRIBUTE,\n    rx: MUST_USE_ATTRIBUTE,\n    ry: MUST_USE_ATTRIBUTE,\n    spreadMethod: MUST_USE_ATTRIBUTE,\n    stopColor: MUST_USE_ATTRIBUTE,\n    stopOpacity: MUST_USE_ATTRIBUTE,\n    stroke: MUST_USE_ATTRIBUTE,\n    strokeDasharray: MUST_USE_ATTRIBUTE,\n    strokeLinecap: MUST_USE_ATTRIBUTE,\n    strokeOpacity: MUST_USE_ATTRIBUTE,\n    strokeWidth: MUST_USE_ATTRIBUTE,\n    textAnchor: MUST_USE_ATTRIBUTE,\n    transform: MUST_USE_ATTRIBUTE,\n    version: MUST_USE_ATTRIBUTE,\n    viewBox: MUST_USE_ATTRIBUTE,\n    x1: MUST_USE_ATTRIBUTE,\n    x2: MUST_USE_ATTRIBUTE,\n    x: MUST_USE_ATTRIBUTE,\n    y1: MUST_USE_ATTRIBUTE,\n    y2: MUST_USE_ATTRIBUTE,\n    y: MUST_USE_ATTRIBUTE\n  },\n  DOMAttributeNames: {\n    fillOpacity: 'fill-opacity',\n    fontFamily: 'font-family',\n    fontSize: 'font-size',\n    gradientTransform: 'gradientTransform',\n    gradientUnits: 'gradientUnits',\n    markerEnd: 'marker-end',\n    markerMid: 'marker-mid',\n    markerStart: 'marker-start',\n    patternContentUnits: 'patternContentUnits',\n    patternUnits: 'patternUnits',\n    preserveAspectRatio: 'preserveAspectRatio',\n    spreadMethod: 'spreadMethod',\n    stopColor: 'stop-color',\n    stopOpacity: 'stop-opacity',\n    strokeDasharray: 'stroke-dasharray',\n    strokeLinecap: 'stroke-linecap',\n    strokeOpacity: 'stroke-opacity',\n    strokeWidth: 'stroke-width',\n    textAnchor: 'text-anchor',\n    viewBox: 'viewBox'\n  }\n};\n\nmodule.exports = SVGDOMPropertyConfig;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule createFullPageComponent\n * @typechecks\n */\n\n\"use strict\";\n\n// Defeat circular references by requiring this directly.\nvar ReactCompositeComponent = require(\"./ReactCompositeComponent\");\n\nvar invariant = require(\"./invariant\");\n\n/**\n * Create a component that will throw an exception when unmounted.\n *\n * Components like <html> <head> and <body> can't be removed or added\n * easily in a cross-browser way, however it's valuable to be able to\n * take advantage of React's reconciliation for styling and <title>\n * management. So we just document it and throw in dangerous cases.\n *\n * @param {function} componentClass convenience constructor to wrap\n * @return {function} convenience constructor of new component\n */\nfunction createFullPageComponent(componentClass) {\n  var FullPageComponent = ReactCompositeComponent.createClass({\n    displayName: 'ReactFullPageComponent' + (\n      componentClass.type.displayName || ''\n    ),\n\n    componentWillUnmount: function() {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        false,\n        '%s tried to unmount. Because of cross-browser quirks it is ' +\n        'impossible to unmount some top-level components (eg <html>, <head>, ' +\n        'and <body>) reliably and efficiently. To fix this, have a single ' +\n        'top-level component that never unmounts render these elements.',\n        this.constructor.displayName\n      ) : invariant(false));\n    },\n\n    render: function() {\n      return this.transferPropsTo(componentClass(null, this.props.children));\n    }\n  });\n\n  return FullPageComponent;\n}\n\nmodule.exports = createFullPageComponent;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactRootIndex\n * @typechecks\n */\n\n\"use strict\";\n\nvar ReactRootIndexInjection = {\n  /**\n   * @param {function} _createReactRootIndex\n   */\n  injectCreateReactRootIndex: function(_createReactRootIndex) {\n    ReactRootIndex.createReactRootIndex = _createReactRootIndex;\n  }\n};\n\nvar ReactRootIndex = {\n  createReactRootIndex: null,\n  injection: ReactRootIndexInjection\n};\n\nmodule.exports = ReactRootIndex;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule containsNode\n * @typechecks\n */\n\nvar isTextNode = require(\"./isTextNode\");\n\n/*jslint bitwise:true */\n\n/**\n * Checks if a given DOM node contains or is another DOM node.\n *\n * @param {?DOMNode} outerNode Outer DOM node.\n * @param {?DOMNode} innerNode Inner DOM node.\n * @return {boolean} True if `outerNode` contains or is `innerNode`.\n */\nfunction containsNode(outerNode, innerNode) {\n  if (!outerNode || !innerNode) {\n    return false;\n  } else if (outerNode === innerNode) {\n    return true;\n  } else if (isTextNode(outerNode)) {\n    return false;\n  } else if (isTextNode(innerNode)) {\n    return containsNode(outerNode, innerNode.parentNode);\n  } else if (outerNode.contains) {\n    return outerNode.contains(innerNode);\n  } else if (outerNode.compareDocumentPosition) {\n    return !!(outerNode.compareDocumentPosition(innerNode) & 16);\n  } else {\n    return false;\n  }\n}\n\nmodule.exports = containsNode;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule getReactRootElementInContainer\n */\n\n\"use strict\";\n\nvar DOC_NODE_TYPE = 9;\n\n/**\n * @param {DOMElement|DOMDocument} container DOM element that may contain\n *                                           a React component\n * @return {?*} DOM element that may have the reactRoot ID, or null.\n */\nfunction getReactRootElementInContainer(container) {\n  if (!container) {\n    return null;\n  }\n\n  if (container.nodeType === DOC_NODE_TYPE) {\n    return container.documentElement;\n  } else {\n    return container.firstChild;\n  }\n}\n\nmodule.exports = getReactRootElementInContainer;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactMultiChildUpdateTypes\n */\n\n\"use strict\";\n\nvar keyMirror = require(\"./keyMirror\");\n\n/**\n * When a component's children are updated, a series of update configuration\n * objects are created in order to batch and serialize the required changes.\n *\n * Enumerates all the possible types of update configurations.\n *\n * @internal\n */\nvar ReactMultiChildUpdateTypes = keyMirror({\n  INSERT_MARKUP: null,\n  MOVE_EXISTING: null,\n  REMOVE_NODE: null,\n  TEXT_CONTENT: null\n});\n\nmodule.exports = ReactMultiChildUpdateTypes;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule flattenChildren\n */\n\n\"use strict\";\n\nvar traverseAllChildren = require(\"./traverseAllChildren\");\nvar warning = require(\"./warning\");\n\n/**\n * @param {function} traverseContext Context passed through traversal.\n * @param {?ReactComponent} child React child component.\n * @param {!string} name String name of key path to child.\n */\nfunction flattenSingleChildIntoContext(traverseContext, child, name) {\n  // We found a component instance.\n  var result = traverseContext;\n  var keyUnique = !result.hasOwnProperty(name);\n  (\"production\" !== process.env.NODE_ENV ? warning(\n    keyUnique,\n    'flattenChildren(...): Encountered two children with the same key, ' +\n    '`%s`. Child keys must be unique; when two children share a key, only ' +\n    'the first child will be used.',\n    name\n  ) : null);\n  if (keyUnique && child != null) {\n    result[name] = child;\n  }\n}\n\n/**\n * Flattens children that are typically specified as `props.children`. Any null\n * children will not be included in the resulting object.\n * @return {!object} flattened children keyed by name.\n */\nfunction flattenChildren(children) {\n  if (children == null) {\n    return children;\n  }\n  var result = {};\n  traverseAllChildren(children, flattenSingleChildIntoContext, result);\n  return result;\n}\n\nmodule.exports = flattenChildren;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactMarkupChecksum\n */\n\n\"use strict\";\n\nvar adler32 = require(\"./adler32\");\n\nvar ReactMarkupChecksum = {\n  CHECKSUM_ATTR_NAME: 'data-react-checksum',\n\n  /**\n   * @param {string} markup Markup string\n   * @return {string} Markup string with checksum attribute attached\n   */\n  addChecksumToMarkup: function(markup) {\n    var checksum = adler32(markup);\n    return markup.replace(\n      '>',\n      ' ' + ReactMarkupChecksum.CHECKSUM_ATTR_NAME + '=\"' + checksum + '\">'\n    );\n  },\n\n  /**\n   * @param {string} markup to use\n   * @param {DOMElement} element root React element\n   * @returns {boolean} whether or not the markup is the same\n   */\n  canReuseMarkup: function(markup, element) {\n    var existingChecksum = element.getAttribute(\n      ReactMarkupChecksum.CHECKSUM_ATTR_NAME\n    );\n    existingChecksum = existingChecksum && parseInt(existingChecksum, 10);\n    var markupChecksum = adler32(markup);\n    return markupChecksum === existingChecksum;\n  }\n};\n\nmodule.exports = ReactMarkupChecksum;\n","/**\n * Copyright 2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactServerRenderingTransaction\n * @typechecks\n */\n\n\"use strict\";\n\nvar PooledClass = require(\"./PooledClass\");\nvar CallbackQueue = require(\"./CallbackQueue\");\nvar ReactPutListenerQueue = require(\"./ReactPutListenerQueue\");\nvar Transaction = require(\"./Transaction\");\n\nvar emptyFunction = require(\"./emptyFunction\");\nvar mixInto = require(\"./mixInto\");\n\n/**\n * Provides a `CallbackQueue` queue for collecting `onDOMReady` callbacks\n * during the performing of the transaction.\n */\nvar ON_DOM_READY_QUEUEING = {\n  /**\n   * Initializes the internal `onDOMReady` queue.\n   */\n  initialize: function() {\n    this.reactMountReady.reset();\n  },\n\n  close: emptyFunction\n};\n\nvar PUT_LISTENER_QUEUEING = {\n  initialize: function() {\n    this.putListenerQueue.reset();\n  },\n\n  close: emptyFunction\n};\n\n/**\n * Executed within the scope of the `Transaction` instance. Consider these as\n * being member methods, but with an implied ordering while being isolated from\n * each other.\n */\nvar TRANSACTION_WRAPPERS = [\n  PUT_LISTENER_QUEUEING,\n  ON_DOM_READY_QUEUEING\n];\n\n/**\n * @class ReactServerRenderingTransaction\n * @param {boolean} renderToStaticMarkup\n */\nfunction ReactServerRenderingTransaction(renderToStaticMarkup) {\n  this.reinitializeTransaction();\n  this.renderToStaticMarkup = renderToStaticMarkup;\n  this.reactMountReady = CallbackQueue.getPooled(null);\n  this.putListenerQueue = ReactPutListenerQueue.getPooled();\n}\n\nvar Mixin = {\n  /**\n   * @see Transaction\n   * @abstract\n   * @final\n   * @return {array} Empty list of operation wrap proceedures.\n   */\n  getTransactionWrappers: function() {\n    return TRANSACTION_WRAPPERS;\n  },\n\n  /**\n   * @return {object} The queue to collect `onDOMReady` callbacks with.\n   */\n  getReactMountReady: function() {\n    return this.reactMountReady;\n  },\n\n  getPutListenerQueue: function() {\n    return this.putListenerQueue;\n  },\n\n  /**\n   * `PooledClass` looks for this, and will invoke this before allowing this\n   * instance to be resused.\n   */\n  destructor: function() {\n    CallbackQueue.release(this.reactMountReady);\n    this.reactMountReady = null;\n\n    ReactPutListenerQueue.release(this.putListenerQueue);\n    this.putListenerQueue = null;\n  }\n};\n\n\nmixInto(ReactServerRenderingTransaction, Transaction.Mixin);\nmixInto(ReactServerRenderingTransaction, Mixin);\n\nPooledClass.addPoolingTo(ReactServerRenderingTransaction);\n\nmodule.exports = ReactServerRenderingTransaction;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule CSSCore\n * @typechecks\n */\n\nvar invariant = require(\"./invariant\");\n\n/**\n * The CSSCore module specifies the API (and implements most of the methods)\n * that should be used when dealing with the display of elements (via their\n * CSS classes and visibility on screen. It is an API focused on mutating the\n * display and not reading it as no logical state should be encoded in the\n * display of elements.\n */\n\nvar CSSCore = {\n\n  /**\n   * Adds the class passed in to the element if it doesn't already have it.\n   *\n   * @param {DOMElement} element the element to set the class on\n   * @param {string} className the CSS className\n   * @return {DOMElement} the element passed in\n   */\n  addClass: function(element, className) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      !/\\s/.test(className),\n      'CSSCore.addClass takes only a single class name. \"%s\" contains ' +\n      'multiple classes.', className\n    ) : invariant(!/\\s/.test(className)));\n\n    if (className) {\n      if (element.classList) {\n        element.classList.add(className);\n      } else if (!CSSCore.hasClass(element, className)) {\n        element.className = element.className + ' ' + className;\n      }\n    }\n    return element;\n  },\n\n  /**\n   * Removes the class passed in from the element\n   *\n   * @param {DOMElement} element the element to set the class on\n   * @param {string} className the CSS className\n   * @return {DOMElement} the element passed in\n   */\n  removeClass: function(element, className) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      !/\\s/.test(className),\n      'CSSCore.removeClass takes only a single class name. \"%s\" contains ' +\n      'multiple classes.', className\n    ) : invariant(!/\\s/.test(className)));\n\n    if (className) {\n      if (element.classList) {\n        element.classList.remove(className);\n      } else if (CSSCore.hasClass(element, className)) {\n        element.className = element.className\n          .replace(new RegExp('(^|\\\\s)' + className + '(?:\\\\s|$)', 'g'), '$1')\n          .replace(/\\s+/g, ' ') // multiple spaces to one\n          .replace(/^\\s*|\\s*$/g, ''); // trim the ends\n      }\n    }\n    return element;\n  },\n\n  /**\n   * Helper to add or remove a class from an element based on a condition.\n   *\n   * @param {DOMElement} element the element to set the class on\n   * @param {string} className the CSS className\n   * @param {*} bool condition to whether to add or remove the class\n   * @return {DOMElement} the element passed in\n   */\n  conditionClass: function(element, className, bool) {\n    return (bool ? CSSCore.addClass : CSSCore.removeClass)(element, className);\n  },\n\n  /**\n   * Tests whether the element has the class specified.\n   *\n   * @param {DOMNode|DOMWindow} element the element to set the class on\n   * @param {string} className the CSS className\n   * @returns {boolean} true if the element has the class, false if not\n   */\n  hasClass: function(element, className) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      !/\\s/.test(className),\n      'CSS.hasClass takes only a single class name.'\n    ) : invariant(!/\\s/.test(className)));\n    if (element.classList) {\n      return !!className && element.classList.contains(className);\n    }\n    return (' ' + element.className + ' ').indexOf(' ' + className + ' ') > -1;\n  }\n\n};\n\nmodule.exports = CSSCore;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule EventPluginRegistry\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar invariant = require(\"./invariant\");\n\n/**\n * Injectable ordering of event plugins.\n */\nvar EventPluginOrder = null;\n\n/**\n * Injectable mapping from names to event plugin modules.\n */\nvar namesToPlugins = {};\n\n/**\n * Recomputes the plugin list using the injected plugins and plugin ordering.\n *\n * @private\n */\nfunction recomputePluginOrdering() {\n  if (!EventPluginOrder) {\n    // Wait until an `EventPluginOrder` is injected.\n    return;\n  }\n  for (var pluginName in namesToPlugins) {\n    var PluginModule = namesToPlugins[pluginName];\n    var pluginIndex = EventPluginOrder.indexOf(pluginName);\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      pluginIndex > -1,\n      'EventPluginRegistry: Cannot inject event plugins that do not exist in ' +\n      'the plugin ordering, `%s`.',\n      pluginName\n    ) : invariant(pluginIndex > -1));\n    if (EventPluginRegistry.plugins[pluginIndex]) {\n      continue;\n    }\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      PluginModule.extractEvents,\n      'EventPluginRegistry: Event plugins must implement an `extractEvents` ' +\n      'method, but `%s` does not.',\n      pluginName\n    ) : invariant(PluginModule.extractEvents));\n    EventPluginRegistry.plugins[pluginIndex] = PluginModule;\n    var publishedEvents = PluginModule.eventTypes;\n    for (var eventName in publishedEvents) {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        publishEventForPlugin(\n          publishedEvents[eventName],\n          PluginModule,\n          eventName\n        ),\n        'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.',\n        eventName,\n        pluginName\n      ) : invariant(publishEventForPlugin(\n        publishedEvents[eventName],\n        PluginModule,\n        eventName\n      )));\n    }\n  }\n}\n\n/**\n * Publishes an event so that it can be dispatched by the supplied plugin.\n *\n * @param {object} dispatchConfig Dispatch configuration for the event.\n * @param {object} PluginModule Plugin publishing the event.\n * @return {boolean} True if the event was successfully published.\n * @private\n */\nfunction publishEventForPlugin(dispatchConfig, PluginModule, eventName) {\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    !EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName),\n    'EventPluginHub: More than one plugin attempted to publish the same ' +\n    'event name, `%s`.',\n    eventName\n  ) : invariant(!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName)));\n  EventPluginRegistry.eventNameDispatchConfigs[eventName] = dispatchConfig;\n\n  var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;\n  if (phasedRegistrationNames) {\n    for (var phaseName in phasedRegistrationNames) {\n      if (phasedRegistrationNames.hasOwnProperty(phaseName)) {\n        var phasedRegistrationName = phasedRegistrationNames[phaseName];\n        publishRegistrationName(\n          phasedRegistrationName,\n          PluginModule,\n          eventName\n        );\n      }\n    }\n    return true;\n  } else if (dispatchConfig.registrationName) {\n    publishRegistrationName(\n      dispatchConfig.registrationName,\n      PluginModule,\n      eventName\n    );\n    return true;\n  }\n  return false;\n}\n\n/**\n * Publishes a registration name that is used to identify dispatched events and\n * can be used with `EventPluginHub.putListener` to register listeners.\n *\n * @param {string} registrationName Registration name to add.\n * @param {object} PluginModule Plugin publishing the event.\n * @private\n */\nfunction publishRegistrationName(registrationName, PluginModule, eventName) {\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    !EventPluginRegistry.registrationNameModules[registrationName],\n    'EventPluginHub: More than one plugin attempted to publish the same ' +\n    'registration name, `%s`.',\n    registrationName\n  ) : invariant(!EventPluginRegistry.registrationNameModules[registrationName]));\n  EventPluginRegistry.registrationNameModules[registrationName] = PluginModule;\n  EventPluginRegistry.registrationNameDependencies[registrationName] =\n    PluginModule.eventTypes[eventName].dependencies;\n}\n\n/**\n * Registers plugins so that they can extract and dispatch events.\n *\n * @see {EventPluginHub}\n */\nvar EventPluginRegistry = {\n\n  /**\n   * Ordered list of injected plugins.\n   */\n  plugins: [],\n\n  /**\n   * Mapping from event name to dispatch config\n   */\n  eventNameDispatchConfigs: {},\n\n  /**\n   * Mapping from registration name to plugin module\n   */\n  registrationNameModules: {},\n\n  /**\n   * Mapping from registration name to event name\n   */\n  registrationNameDependencies: {},\n\n  /**\n   * Injects an ordering of plugins (by plugin name). This allows the ordering\n   * to be decoupled from injection of the actual plugins so that ordering is\n   * always deterministic regardless of packaging, on-the-fly injection, etc.\n   *\n   * @param {array} InjectedEventPluginOrder\n   * @internal\n   * @see {EventPluginHub.injection.injectEventPluginOrder}\n   */\n  injectEventPluginOrder: function(InjectedEventPluginOrder) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      !EventPluginOrder,\n      'EventPluginRegistry: Cannot inject event plugin ordering more than ' +\n      'once. You are likely trying to load more than one copy of React.'\n    ) : invariant(!EventPluginOrder));\n    // Clone the ordering so it cannot be dynamically mutated.\n    EventPluginOrder = Array.prototype.slice.call(InjectedEventPluginOrder);\n    recomputePluginOrdering();\n  },\n\n  /**\n   * Injects plugins to be used by `EventPluginHub`. The plugin names must be\n   * in the ordering injected by `injectEventPluginOrder`.\n   *\n   * Plugins can be injected as part of page initialization or on-the-fly.\n   *\n   * @param {object} injectedNamesToPlugins Map from names to plugin modules.\n   * @internal\n   * @see {EventPluginHub.injection.injectEventPluginsByName}\n   */\n  injectEventPluginsByName: function(injectedNamesToPlugins) {\n    var isOrderingDirty = false;\n    for (var pluginName in injectedNamesToPlugins) {\n      if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {\n        continue;\n      }\n      var PluginModule = injectedNamesToPlugins[pluginName];\n      if (!namesToPlugins.hasOwnProperty(pluginName) ||\n          namesToPlugins[pluginName] !== PluginModule) {\n        (\"production\" !== process.env.NODE_ENV ? invariant(\n          !namesToPlugins[pluginName],\n          'EventPluginRegistry: Cannot inject two different event plugins ' +\n          'using the same name, `%s`.',\n          pluginName\n        ) : invariant(!namesToPlugins[pluginName]));\n        namesToPlugins[pluginName] = PluginModule;\n        isOrderingDirty = true;\n      }\n    }\n    if (isOrderingDirty) {\n      recomputePluginOrdering();\n    }\n  },\n\n  /**\n   * Looks up the plugin for the supplied event.\n   *\n   * @param {object} event A synthetic event.\n   * @return {?object} The plugin that created the supplied event.\n   * @internal\n   */\n  getPluginModuleForEvent: function(event) {\n    var dispatchConfig = event.dispatchConfig;\n    if (dispatchConfig.registrationName) {\n      return EventPluginRegistry.registrationNameModules[\n        dispatchConfig.registrationName\n      ] || null;\n    }\n    for (var phase in dispatchConfig.phasedRegistrationNames) {\n      if (!dispatchConfig.phasedRegistrationNames.hasOwnProperty(phase)) {\n        continue;\n      }\n      var PluginModule = EventPluginRegistry.registrationNameModules[\n        dispatchConfig.phasedRegistrationNames[phase]\n      ];\n      if (PluginModule) {\n        return PluginModule;\n      }\n    }\n    return null;\n  },\n\n  /**\n   * Exposed for unit testing.\n   * @private\n   */\n  _resetEventPlugins: function() {\n    EventPluginOrder = null;\n    for (var pluginName in namesToPlugins) {\n      if (namesToPlugins.hasOwnProperty(pluginName)) {\n        delete namesToPlugins[pluginName];\n      }\n    }\n    EventPluginRegistry.plugins.length = 0;\n\n    var eventNameDispatchConfigs = EventPluginRegistry.eventNameDispatchConfigs;\n    for (var eventName in eventNameDispatchConfigs) {\n      if (eventNameDispatchConfigs.hasOwnProperty(eventName)) {\n        delete eventNameDispatchConfigs[eventName];\n      }\n    }\n\n    var registrationNameModules = EventPluginRegistry.registrationNameModules;\n    for (var registrationName in registrationNameModules) {\n      if (registrationNameModules.hasOwnProperty(registrationName)) {\n        delete registrationNameModules[registrationName];\n      }\n    }\n  }\n\n};\n\nmodule.exports = EventPluginRegistry;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactTransitionEvents\n */\n\n\"use strict\";\n\nvar ExecutionEnvironment = require(\"./ExecutionEnvironment\");\n\n/**\n * EVENT_NAME_MAP is used to determine which event fired when a\n * transition/animation ends, based on the style property used to\n * define that event.\n */\nvar EVENT_NAME_MAP = {\n  transitionend: {\n    'transition': 'transitionend',\n    'WebkitTransition': 'webkitTransitionEnd',\n    'MozTransition': 'mozTransitionEnd',\n    'OTransition': 'oTransitionEnd',\n    'msTransition': 'MSTransitionEnd'\n  },\n\n  animationend: {\n    'animation': 'animationend',\n    'WebkitAnimation': 'webkitAnimationEnd',\n    'MozAnimation': 'mozAnimationEnd',\n    'OAnimation': 'oAnimationEnd',\n    'msAnimation': 'MSAnimationEnd'\n  }\n};\n\nvar endEvents = [];\n\nfunction detectEvents() {\n  var testEl = document.createElement('div');\n  var style = testEl.style;\n\n  // On some platforms, in particular some releases of Android 4.x,\n  // the un-prefixed \"animation\" and \"transition\" properties are defined on the\n  // style object but the events that fire will still be prefixed, so we need\n  // to check if the un-prefixed events are useable, and if not remove them\n  // from the map\n  if (!('AnimationEvent' in window)) {\n    delete EVENT_NAME_MAP.animationend.animation;\n  }\n\n  if (!('TransitionEvent' in window)) {\n    delete EVENT_NAME_MAP.transitionend.transition;\n  }\n\n  for (var baseEventName in EVENT_NAME_MAP) {\n    var baseEvents = EVENT_NAME_MAP[baseEventName];\n    for (var styleName in baseEvents) {\n      if (styleName in style) {\n        endEvents.push(baseEvents[styleName]);\n        break;\n      }\n    }\n  }\n}\n\nif (ExecutionEnvironment.canUseDOM) {\n  detectEvents();\n}\n\n// We use the raw {add|remove}EventListener() call because EventListener\n// does not know how to remove event listeners and we really should\n// clean up. Also, these events are not triggered in older browsers\n// so we should be A-OK here.\n\nfunction addEventListener(node, eventName, eventListener) {\n  node.addEventListener(eventName, eventListener, false);\n}\n\nfunction removeEventListener(node, eventName, eventListener) {\n  node.removeEventListener(eventName, eventListener, false);\n}\n\nvar ReactTransitionEvents = {\n  addEndEventListener: function(node, eventListener) {\n    if (endEvents.length === 0) {\n      // If CSS transitions are not supported, trigger an \"end animation\"\n      // event immediately.\n      window.setTimeout(eventListener, 0);\n      return;\n    }\n    endEvents.forEach(function(endEvent) {\n      addEventListener(node, endEvent, eventListener);\n    });\n  },\n\n  removeEndEventListener: function(node, eventListener) {\n    if (endEvents.length === 0) {\n      return;\n    }\n    endEvents.forEach(function(endEvent) {\n      removeEventListener(node, endEvent, eventListener);\n    });\n  }\n};\n\nmodule.exports = ReactTransitionEvents;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule accumulate\n */\n\n\"use strict\";\n\nvar invariant = require(\"./invariant\");\n\n/**\n * Accumulates items that must not be null or undefined.\n *\n * This is used to conserve memory by avoiding array allocations.\n *\n * @return {*|array<*>} An accumulation of items.\n */\nfunction accumulate(current, next) {\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    next != null,\n    'accumulate(...): Accumulated items must be not be null or undefined.'\n  ) : invariant(next != null));\n  if (current == null) {\n    return next;\n  } else {\n    // Both are not empty. Warning: Never call x.concat(y) when you are not\n    // certain that x is an Array (x could be a string with concat method).\n    var currentIsArray = Array.isArray(current);\n    var nextIsArray = Array.isArray(next);\n    if (currentIsArray) {\n      return current.concat(next);\n    } else {\n      if (nextIsArray) {\n        return [current].concat(next);\n      } else {\n        return [current, next];\n      }\n    }\n  }\n}\n\nmodule.exports = accumulate;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule forEachAccumulated\n */\n\n\"use strict\";\n\n/**\n * @param {array} an \"accumulation\" of items which is either an Array or\n * a single item. Useful when paired with the `accumulate` module. This is a\n * simple utility that allows us to reason about a collection of items, but\n * handling the case when there is exactly one item (and we do not need to\n * allocate an array).\n */\nvar forEachAccumulated = function(arr, cb, scope) {\n  if (Array.isArray(arr)) {\n    arr.forEach(cb, scope);\n  } else if (arr) {\n    cb.call(scope, arr);\n  }\n};\n\nmodule.exports = forEachAccumulated;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule isEventSupported\n */\n\n\"use strict\";\n\nvar ExecutionEnvironment = require(\"./ExecutionEnvironment\");\n\nvar useHasFeature;\nif (ExecutionEnvironment.canUseDOM) {\n  useHasFeature =\n    document.implementation &&\n    document.implementation.hasFeature &&\n    // always returns true in newer browsers as per the standard.\n    // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature\n    document.implementation.hasFeature('', '') !== true;\n}\n\n/**\n * Checks if an event is supported in the current execution environment.\n *\n * NOTE: This will not work correctly for non-generic events such as `change`,\n * `reset`, `load`, `error`, and `select`.\n *\n * Borrows from Modernizr.\n *\n * @param {string} eventNameSuffix Event name, e.g. \"click\".\n * @param {?boolean} capture Check if the capture phase is supported.\n * @return {boolean} True if the event is supported.\n * @internal\n * @license Modernizr 3.0.0pre (Custom Build) | MIT\n */\nfunction isEventSupported(eventNameSuffix, capture) {\n  if (!ExecutionEnvironment.canUseDOM ||\n      capture && !('addEventListener' in document)) {\n    return false;\n  }\n\n  var eventName = 'on' + eventNameSuffix;\n  var isSupported = eventName in document;\n\n  if (!isSupported) {\n    var element = document.createElement('div');\n    element.setAttribute(eventName, 'return;');\n    isSupported = typeof element[eventName] === 'function';\n  }\n\n  if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') {\n    // This is the only way to test support for the `wheel` event in IE9+.\n    isSupported = document.implementation.hasFeature('Events.wheel', '3.0');\n  }\n\n  return isSupported;\n}\n\nmodule.exports = isEventSupported;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactEventEmitterMixin\n */\n\n\"use strict\";\n\nvar EventPluginHub = require(\"./EventPluginHub\");\n\nfunction runEventQueueInBatch(events) {\n  EventPluginHub.enqueueEvents(events);\n  EventPluginHub.processEventQueue();\n}\n\nvar ReactEventEmitterMixin = {\n\n  /**\n   * Streams a fired top-level event to `EventPluginHub` where plugins have the\n   * opportunity to create `ReactEvent`s to be dispatched.\n   *\n   * @param {string} topLevelType Record from `EventConstants`.\n   * @param {object} topLevelTarget The listening component root node.\n   * @param {string} topLevelTargetID ID of `topLevelTarget`.\n   * @param {object} nativeEvent Native environment event.\n   */\n  handleTopLevel: function(\n      topLevelType,\n      topLevelTarget,\n      topLevelTargetID,\n      nativeEvent) {\n    var events = EventPluginHub.extractEvents(\n      topLevelType,\n      topLevelTarget,\n      topLevelTargetID,\n      nativeEvent\n    );\n\n    runEventQueueInBatch(events);\n  }\n};\n\nmodule.exports = ReactEventEmitterMixin;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ViewportMetrics\n */\n\n\"use strict\";\n\nvar getUnboundedScrollPosition = require(\"./getUnboundedScrollPosition\");\n\nvar ViewportMetrics = {\n\n  currentScrollLeft: 0,\n\n  currentScrollTop: 0,\n\n  refreshScrollValues: function() {\n    var scrollPosition = getUnboundedScrollPosition(window);\n    ViewportMetrics.currentScrollLeft = scrollPosition.x;\n    ViewportMetrics.currentScrollTop = scrollPosition.y;\n  }\n\n};\n\nmodule.exports = ViewportMetrics;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule CallbackQueue\n */\n\n\"use strict\";\n\nvar PooledClass = require(\"./PooledClass\");\n\nvar invariant = require(\"./invariant\");\nvar mixInto = require(\"./mixInto\");\n\n/**\n * A specialized pseudo-event module to help keep track of components waiting to\n * be notified when their DOM representations are available for use.\n *\n * This implements `PooledClass`, so you should never need to instantiate this.\n * Instead, use `CallbackQueue.getPooled()`.\n *\n * @class ReactMountReady\n * @implements PooledClass\n * @internal\n */\nfunction CallbackQueue() {\n  this._callbacks = null;\n  this._contexts = null;\n}\n\nmixInto(CallbackQueue, {\n\n  /**\n   * Enqueues a callback to be invoked when `notifyAll` is invoked.\n   *\n   * @param {function} callback Invoked when `notifyAll` is invoked.\n   * @param {?object} context Context to call `callback` with.\n   * @internal\n   */\n  enqueue: function(callback, context) {\n    this._callbacks = this._callbacks || [];\n    this._contexts = this._contexts || [];\n    this._callbacks.push(callback);\n    this._contexts.push(context);\n  },\n\n  /**\n   * Invokes all enqueued callbacks and clears the queue. This is invoked after\n   * the DOM representation of a component has been created or updated.\n   *\n   * @internal\n   */\n  notifyAll: function() {\n    var callbacks = this._callbacks;\n    var contexts = this._contexts;\n    if (callbacks) {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        callbacks.length === contexts.length,\n        \"Mismatched list of contexts in callback queue\"\n      ) : invariant(callbacks.length === contexts.length));\n      this._callbacks = null;\n      this._contexts = null;\n      for (var i = 0, l = callbacks.length; i < l; i++) {\n        callbacks[i].call(contexts[i]);\n      }\n      callbacks.length = 0;\n      contexts.length = 0;\n    }\n  },\n\n  /**\n   * Resets the internal queue.\n   *\n   * @internal\n   */\n  reset: function() {\n    this._callbacks = null;\n    this._contexts = null;\n  },\n\n  /**\n   * `PooledClass` looks for this.\n   */\n  destructor: function() {\n    this.reset();\n  }\n\n});\n\nPooledClass.addPoolingTo(CallbackQueue);\n\nmodule.exports = CallbackQueue;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule Transaction\n */\n\n\"use strict\";\n\nvar invariant = require(\"./invariant\");\n\n/**\n * `Transaction` creates a black box that is able to wrap any method such that\n * certain invariants are maintained before and after the method is invoked\n * (Even if an exception is thrown while invoking the wrapped method). Whoever\n * instantiates a transaction can provide enforcers of the invariants at\n * creation time. The `Transaction` class itself will supply one additional\n * automatic invariant for you - the invariant that any transaction instance\n * should not be run while it is already being run. You would typically create a\n * single instance of a `Transaction` for reuse multiple times, that potentially\n * is used to wrap several different methods. Wrappers are extremely simple -\n * they only require implementing two methods.\n *\n * <pre>\n *                       wrappers (injected at creation time)\n *                                      +        +\n *                                      |        |\n *                    +-----------------|--------|--------------+\n *                    |                 v        |              |\n *                    |      +---------------+   |              |\n *                    |   +--|    wrapper1   |---|----+         |\n *                    |   |  +---------------+   v    |         |\n *                    |   |          +-------------+  |         |\n *                    |   |     +----|   wrapper2  |--------+   |\n *                    |   |     |    +-------------+  |     |   |\n *                    |   |     |                     |     |   |\n *                    |   v     v                     v     v   | wrapper\n *                    | +---+ +---+   +---------+   +---+ +---+ | invariants\n * perform(anyMethod) | |   | |   |   |         |   |   | |   | | maintained\n * +----------------->|-|---|-|---|-->|anyMethod|---|---|-|---|-|-------->\n *                    | |   | |   |   |         |   |   | |   | |\n *                    | |   | |   |   |         |   |   | |   | |\n *                    | |   | |   |   |         |   |   | |   | |\n *                    | +---+ +---+   +---------+   +---+ +---+ |\n *                    |  initialize                    close    |\n *                    +-----------------------------------------+\n * </pre>\n *\n * Use cases:\n * - Preserving the input selection ranges before/after reconciliation.\n *   Restoring selection even in the event of an unexpected error.\n * - Deactivating events while rearranging the DOM, preventing blurs/focuses,\n *   while guaranteeing that afterwards, the event system is reactivated.\n * - Flushing a queue of collected DOM mutations to the main UI thread after a\n *   reconciliation takes place in a worker thread.\n * - Invoking any collected `componentDidUpdate` callbacks after rendering new\n *   content.\n * - (Future use case): Wrapping particular flushes of the `ReactWorker` queue\n *   to preserve the `scrollTop` (an automatic scroll aware DOM).\n * - (Future use case): Layout calculations before and after DOM upates.\n *\n * Transactional plugin API:\n * - A module that has an `initialize` method that returns any precomputation.\n * - and a `close` method that accepts the precomputation. `close` is invoked\n *   when the wrapped process is completed, or has failed.\n *\n * @param {Array<TransactionalWrapper>} transactionWrapper Wrapper modules\n * that implement `initialize` and `close`.\n * @return {Transaction} Single transaction for reuse in thread.\n *\n * @class Transaction\n */\nvar Mixin = {\n  /**\n   * Sets up this instance so that it is prepared for collecting metrics. Does\n   * so such that this setup method may be used on an instance that is already\n   * initialized, in a way that does not consume additional memory upon reuse.\n   * That can be useful if you decide to make your subclass of this mixin a\n   * \"PooledClass\".\n   */\n  reinitializeTransaction: function() {\n    this.transactionWrappers = this.getTransactionWrappers();\n    if (!this.wrapperInitData) {\n      this.wrapperInitData = [];\n    } else {\n      this.wrapperInitData.length = 0;\n    }\n    this._isInTransaction = false;\n  },\n\n  _isInTransaction: false,\n\n  /**\n   * @abstract\n   * @return {Array<TransactionWrapper>} Array of transaction wrappers.\n   */\n  getTransactionWrappers: null,\n\n  isInTransaction: function() {\n    return !!this._isInTransaction;\n  },\n\n  /**\n   * Executes the function within a safety window. Use this for the top level\n   * methods that result in large amounts of computation/mutations that would\n   * need to be safety checked.\n   *\n   * @param {function} method Member of scope to call.\n   * @param {Object} scope Scope to invoke from.\n   * @param {Object?=} args... Arguments to pass to the method (optional).\n   *                           Helps prevent need to bind in many cases.\n   * @return Return value from `method`.\n   */\n  perform: function(method, scope, a, b, c, d, e, f) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      !this.isInTransaction(),\n      'Transaction.perform(...): Cannot initialize a transaction when there ' +\n      'is already an outstanding transaction.'\n    ) : invariant(!this.isInTransaction()));\n    var errorThrown;\n    var ret;\n    try {\n      this._isInTransaction = true;\n      // Catching errors makes debugging more difficult, so we start with\n      // errorThrown set to true before setting it to false after calling\n      // close -- if it's still set to true in the finally block, it means\n      // one of these calls threw.\n      errorThrown = true;\n      this.initializeAll(0);\n      ret = method.call(scope, a, b, c, d, e, f);\n      errorThrown = false;\n    } finally {\n      try {\n        if (errorThrown) {\n          // If `method` throws, prefer to show that stack trace over any thrown\n          // by invoking `closeAll`.\n          try {\n            this.closeAll(0);\n          } catch (err) {\n          }\n        } else {\n          // Since `method` didn't throw, we don't want to silence the exception\n          // here.\n          this.closeAll(0);\n        }\n      } finally {\n        this._isInTransaction = false;\n      }\n    }\n    return ret;\n  },\n\n  initializeAll: function(startIndex) {\n    var transactionWrappers = this.transactionWrappers;\n    for (var i = startIndex; i < transactionWrappers.length; i++) {\n      var wrapper = transactionWrappers[i];\n      try {\n        // Catching errors makes debugging more difficult, so we start with the\n        // OBSERVED_ERROR state before overwriting it with the real return value\n        // of initialize -- if it's still set to OBSERVED_ERROR in the finally\n        // block, it means wrapper.initialize threw.\n        this.wrapperInitData[i] = Transaction.OBSERVED_ERROR;\n        this.wrapperInitData[i] = wrapper.initialize ?\n          wrapper.initialize.call(this) :\n          null;\n      } finally {\n        if (this.wrapperInitData[i] === Transaction.OBSERVED_ERROR) {\n          // The initializer for wrapper i threw an error; initialize the\n          // remaining wrappers but silence any exceptions from them to ensure\n          // that the first error is the one to bubble up.\n          try {\n            this.initializeAll(i + 1);\n          } catch (err) {\n          }\n        }\n      }\n    }\n  },\n\n  /**\n   * Invokes each of `this.transactionWrappers.close[i]` functions, passing into\n   * them the respective return values of `this.transactionWrappers.init[i]`\n   * (`close`rs that correspond to initializers that failed will not be\n   * invoked).\n   */\n  closeAll: function(startIndex) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      this.isInTransaction(),\n      'Transaction.closeAll(): Cannot close transaction when none are open.'\n    ) : invariant(this.isInTransaction()));\n    var transactionWrappers = this.transactionWrappers;\n    for (var i = startIndex; i < transactionWrappers.length; i++) {\n      var wrapper = transactionWrappers[i];\n      var initData = this.wrapperInitData[i];\n      var errorThrown;\n      try {\n        // Catching errors makes debugging more difficult, so we start with\n        // errorThrown set to true before setting it to false after calling\n        // close -- if it's still set to true in the finally block, it means\n        // wrapper.close threw.\n        errorThrown = true;\n        if (initData !== Transaction.OBSERVED_ERROR) {\n          wrapper.close && wrapper.close.call(this, initData);\n        }\n        errorThrown = false;\n      } finally {\n        if (errorThrown) {\n          // The closer for wrapper i threw an error; close the remaining\n          // wrappers but silence any exceptions from them to ensure that the\n          // first error is the one to bubble up.\n          try {\n            this.closeAll(i + 1);\n          } catch (e) {\n          }\n        }\n      }\n    }\n    this.wrapperInitData.length = 0;\n  }\n};\n\nvar Transaction = {\n\n  Mixin: Mixin,\n\n  /**\n   * Token to look for to determine if an error occured.\n   */\n  OBSERVED_ERROR: {}\n\n};\n\nmodule.exports = Transaction;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule getEventTarget\n * @typechecks static-only\n */\n\n\"use strict\";\n\n/**\n * Gets the target node from a native browser event by accounting for\n * inconsistencies in browser DOM APIs.\n *\n * @param {object} nativeEvent Native browser event.\n * @return {DOMEventTarget} Target node.\n */\nfunction getEventTarget(nativeEvent) {\n  var target = nativeEvent.target || nativeEvent.srcElement || window;\n  // Safari may fire events on text nodes (Node.TEXT_NODE is 3).\n  // @see http://www.quirksmode.org/js/events_properties.html\n  return target.nodeType === 3 ? target.parentNode : target;\n}\n\nmodule.exports = getEventTarget;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule mergeHelpers\n *\n * requiresPolyfills: Array.isArray\n */\n\n\"use strict\";\n\nvar invariant = require(\"./invariant\");\nvar keyMirror = require(\"./keyMirror\");\n\n/**\n * Maximum number of levels to traverse. Will catch circular structures.\n * @const\n */\nvar MAX_MERGE_DEPTH = 36;\n\n/**\n * We won't worry about edge cases like new String('x') or new Boolean(true).\n * Functions are considered terminals, and arrays are not.\n * @param {*} o The item/object/value to test.\n * @return {boolean} true iff the argument is a terminal.\n */\nvar isTerminal = function(o) {\n  return typeof o !== 'object' || o === null;\n};\n\nvar mergeHelpers = {\n\n  MAX_MERGE_DEPTH: MAX_MERGE_DEPTH,\n\n  isTerminal: isTerminal,\n\n  /**\n   * Converts null/undefined values into empty object.\n   *\n   * @param {?Object=} arg Argument to be normalized (nullable optional)\n   * @return {!Object}\n   */\n  normalizeMergeArg: function(arg) {\n    return arg === undefined || arg === null ? {} : arg;\n  },\n\n  /**\n   * If merging Arrays, a merge strategy *must* be supplied. If not, it is\n   * likely the caller's fault. If this function is ever called with anything\n   * but `one` and `two` being `Array`s, it is the fault of the merge utilities.\n   *\n   * @param {*} one Array to merge into.\n   * @param {*} two Array to merge from.\n   */\n  checkMergeArrayArgs: function(one, two) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      Array.isArray(one) && Array.isArray(two),\n      'Tried to merge arrays, instead got %s and %s.',\n      one,\n      two\n    ) : invariant(Array.isArray(one) && Array.isArray(two)));\n  },\n\n  /**\n   * @param {*} one Object to merge into.\n   * @param {*} two Object to merge from.\n   */\n  checkMergeObjectArgs: function(one, two) {\n    mergeHelpers.checkMergeObjectArg(one);\n    mergeHelpers.checkMergeObjectArg(two);\n  },\n\n  /**\n   * @param {*} arg\n   */\n  checkMergeObjectArg: function(arg) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      !isTerminal(arg) && !Array.isArray(arg),\n      'Tried to merge an object, instead got %s.',\n      arg\n    ) : invariant(!isTerminal(arg) && !Array.isArray(arg)));\n  },\n\n  /**\n   * @param {*} arg\n   */\n  checkMergeIntoObjectArg: function(arg) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      (!isTerminal(arg) || typeof arg === 'function') && !Array.isArray(arg),\n      'Tried to merge into an object, instead got %s.',\n      arg\n    ) : invariant((!isTerminal(arg) || typeof arg === 'function') && !Array.isArray(arg)));\n  },\n\n  /**\n   * Checks that a merge was not given a circular object or an object that had\n   * too great of depth.\n   *\n   * @param {number} Level of recursion to validate against maximum.\n   */\n  checkMergeLevel: function(level) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      level < MAX_MERGE_DEPTH,\n      'Maximum deep merge depth exceeded. You may be attempting to merge ' +\n      'circular structures in an unsupported way.'\n    ) : invariant(level < MAX_MERGE_DEPTH));\n  },\n\n  /**\n   * Checks that the supplied merge strategy is valid.\n   *\n   * @param {string} Array merge strategy.\n   */\n  checkArrayStrategy: function(strategy) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      strategy === undefined || strategy in mergeHelpers.ArrayStrategies,\n      'You must provide an array strategy to deep merge functions to ' +\n      'instruct the deep merge how to resolve merging two arrays.'\n    ) : invariant(strategy === undefined || strategy in mergeHelpers.ArrayStrategies));\n  },\n\n  /**\n   * Set of possible behaviors of merge algorithms when encountering two Arrays\n   * that must be merged together.\n   * - `clobber`: The left `Array` is ignored.\n   * - `indexByIndex`: The result is achieved by recursively deep merging at\n   *   each index. (not yet supported.)\n   */\n  ArrayStrategies: keyMirror({\n    Clobber: true,\n    IndexByIndex: true\n  })\n\n};\n\nmodule.exports = mergeHelpers;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule joinClasses\n * @typechecks static-only\n */\n\n\"use strict\";\n\n/**\n * Combines multiple className strings into one.\n * http://jsperf.com/joinclasses-args-vs-array\n *\n * @param {...?string} classes\n * @return {string}\n */\nfunction joinClasses(className/*, ... */) {\n  if (!className) {\n    className = '';\n  }\n  var nextClass;\n  var argLength = arguments.length;\n  if (argLength > 1) {\n    for (var ii = 1; ii < argLength; ii++) {\n      nextClass = arguments[ii];\n      nextClass && (className += ' ' + nextClass);\n    }\n  }\n  return className;\n}\n\nmodule.exports = joinClasses;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule performance\n * @typechecks\n */\n\n\"use strict\";\n\nvar ExecutionEnvironment = require(\"./ExecutionEnvironment\");\n\nvar performance;\n\nif (ExecutionEnvironment.canUseDOM) {\n  performance =\n    window.performance ||\n    window.msPerformance ||\n    window.webkitPerformance;\n}\n\nmodule.exports = performance || {};\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule emptyObject\n */\n\n\"use strict\";\n\nvar emptyObject = {};\n\nif (\"production\" !== process.env.NODE_ENV) {\n  Object.freeze(emptyObject);\n}\n\nmodule.exports = emptyObject;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule CSSProperty\n */\n\n\"use strict\";\n\n/**\n * CSS properties which accept numbers but are not in units of \"px\".\n */\nvar isUnitlessNumber = {\n  columnCount: true,\n  fillOpacity: true,\n  flex: true,\n  flexGrow: true,\n  flexShrink: true,\n  fontWeight: true,\n  lineClamp: true,\n  lineHeight: true,\n  opacity: true,\n  order: true,\n  orphans: true,\n  widows: true,\n  zIndex: true,\n  zoom: true\n};\n\n/**\n * @param {string} prefix vendor-specific prefix, eg: Webkit\n * @param {string} key style name, eg: transitionDuration\n * @return {string} style name prefixed with `prefix`, properly camelCased, eg:\n * WebkitTransitionDuration\n */\nfunction prefixKey(prefix, key) {\n  return prefix + key.charAt(0).toUpperCase() + key.substring(1);\n}\n\n/**\n * Support style names that may come passed in prefixed by adding permutations\n * of vendor prefixes.\n */\nvar prefixes = ['Webkit', 'ms', 'Moz', 'O'];\n\n// Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an\n// infinite loop, because it iterates over the newly added props too.\nObject.keys(isUnitlessNumber).forEach(function(prop) {\n  prefixes.forEach(function(prefix) {\n    isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];\n  });\n});\n\n/**\n * Most style properties can be unset by doing .style[prop] = '' but IE8\n * doesn't like doing that with shorthand properties so for the properties that\n * IE8 breaks on, which are listed here, we instead unset each of the\n * individual properties. See http://bugs.jquery.com/ticket/12385.\n * The 4-value 'clock' properties like margin, padding, border-width seem to\n * behave without any problems. Curiously, list-style works too without any\n * special prodding.\n */\nvar shorthandPropertyExpansions = {\n  background: {\n    backgroundImage: true,\n    backgroundPosition: true,\n    backgroundRepeat: true,\n    backgroundColor: true\n  },\n  border: {\n    borderWidth: true,\n    borderStyle: true,\n    borderColor: true\n  },\n  borderBottom: {\n    borderBottomWidth: true,\n    borderBottomStyle: true,\n    borderBottomColor: true\n  },\n  borderLeft: {\n    borderLeftWidth: true,\n    borderLeftStyle: true,\n    borderLeftColor: true\n  },\n  borderRight: {\n    borderRightWidth: true,\n    borderRightStyle: true,\n    borderRightColor: true\n  },\n  borderTop: {\n    borderTopWidth: true,\n    borderTopStyle: true,\n    borderTopColor: true\n  },\n  font: {\n    fontStyle: true,\n    fontVariant: true,\n    fontWeight: true,\n    fontSize: true,\n    lineHeight: true,\n    fontFamily: true\n  }\n};\n\nvar CSSProperty = {\n  isUnitlessNumber: isUnitlessNumber,\n  shorthandPropertyExpansions: shorthandPropertyExpansions\n};\n\nmodule.exports = CSSProperty;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule dangerousStyleValue\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar CSSProperty = require(\"./CSSProperty\");\n\nvar isUnitlessNumber = CSSProperty.isUnitlessNumber;\n\n/**\n * Convert a value into the proper css writable value. The style name `name`\n * should be logical (no hyphens), as specified\n * in `CSSProperty.isUnitlessNumber`.\n *\n * @param {string} name CSS property name such as `topMargin`.\n * @param {*} value CSS property value such as `10px`.\n * @return {string} Normalized style value with dimensions applied.\n */\nfunction dangerousStyleValue(name, value) {\n  // Note that we've removed escapeTextForBrowser() calls here since the\n  // whole string will be escaped when the attribute is injected into\n  // the markup. If you provide unsafe user data here they can inject\n  // arbitrary CSS which may be problematic (I couldn't repro this):\n  // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet\n  // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/\n  // This is not an XSS hole but instead a potential CSS injection issue\n  // which has lead to a greater discussion about how we're going to\n  // trust URLs moving forward. See #2115901\n\n  var isEmpty = value == null || typeof value === 'boolean' || value === '';\n  if (isEmpty) {\n    return '';\n  }\n\n  var isNonNumeric = isNaN(value);\n  if (isNonNumeric || value === 0 ||\n      isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name]) {\n    return '' + value; // cast to string\n  }\n\n  if (typeof value === 'string') {\n    value = value.trim();\n  }\n  return value + 'px';\n}\n\nmodule.exports = dangerousStyleValue;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule hyphenateStyleName\n * @typechecks\n */\n\n\"use strict\";\n\nvar hyphenate = require(\"./hyphenate\");\n\nvar msPattern = /^ms-/;\n\n/**\n * Hyphenates a camelcased CSS property name, for example:\n *\n *   > hyphenate('backgroundColor')\n *   < \"background-color\"\n *   > hyphenate('MozTransition')\n *   < \"-moz-transition\"\n *   > hyphenate('msTransition')\n *   < \"-ms-transition\"\n *\n * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix\n * is converted to `-ms-`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction hyphenateStyleName(string) {\n  return hyphenate(string).replace(msPattern, '-ms-');\n}\n\nmodule.exports = hyphenateStyleName;\n","/**\n * Copyright 2013 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule SyntheticInputEvent\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar SyntheticEvent = require(\"./SyntheticEvent\");\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105\n *      /#events-inputevents\n */\nvar InputEventInterface = {\n  data: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticInputEvent(\n  dispatchConfig,\n  dispatchMarker,\n  nativeEvent) {\n  SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);\n}\n\nSyntheticEvent.augmentClass(\n  SyntheticInputEvent,\n  InputEventInterface\n);\n\nmodule.exports = SyntheticInputEvent;\n\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule isTextInputElement\n */\n\n\"use strict\";\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n */\nvar supportedInputTypes = {\n  'color': true,\n  'date': true,\n  'datetime': true,\n  'datetime-local': true,\n  'email': true,\n  'month': true,\n  'number': true,\n  'password': true,\n  'range': true,\n  'search': true,\n  'tel': true,\n  'text': true,\n  'time': true,\n  'url': true,\n  'week': true\n};\n\nfunction isTextInputElement(elem) {\n  return elem && (\n    (elem.nodeName === 'INPUT' && supportedInputTypes[elem.type]) ||\n    elem.nodeName === 'TEXTAREA'\n  );\n}\n\nmodule.exports = isTextInputElement;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactInputSelection\n */\n\n\"use strict\";\n\nvar ReactDOMSelection = require(\"./ReactDOMSelection\");\n\nvar containsNode = require(\"./containsNode\");\nvar focusNode = require(\"./focusNode\");\nvar getActiveElement = require(\"./getActiveElement\");\n\nfunction isInDocument(node) {\n  return containsNode(document.documentElement, node);\n}\n\n/**\n * @ReactInputSelection: React input selection module. Based on Selection.js,\n * but modified to be suitable for react and has a couple of bug fixes (doesn't\n * assume buttons have range selections allowed).\n * Input selection module for React.\n */\nvar ReactInputSelection = {\n\n  hasSelectionCapabilities: function(elem) {\n    return elem && (\n      (elem.nodeName === 'INPUT' && elem.type === 'text') ||\n      elem.nodeName === 'TEXTAREA' ||\n      elem.contentEditable === 'true'\n    );\n  },\n\n  getSelectionInformation: function() {\n    var focusedElem = getActiveElement();\n    return {\n      focusedElem: focusedElem,\n      selectionRange:\n          ReactInputSelection.hasSelectionCapabilities(focusedElem) ?\n          ReactInputSelection.getSelection(focusedElem) :\n          null\n    };\n  },\n\n  /**\n   * @restoreSelection: If any selection information was potentially lost,\n   * restore it. This is useful when performing operations that could remove dom\n   * nodes and place them back in, resulting in focus being lost.\n   */\n  restoreSelection: function(priorSelectionInformation) {\n    var curFocusedElem = getActiveElement();\n    var priorFocusedElem = priorSelectionInformation.focusedElem;\n    var priorSelectionRange = priorSelectionInformation.selectionRange;\n    if (curFocusedElem !== priorFocusedElem &&\n        isInDocument(priorFocusedElem)) {\n      if (ReactInputSelection.hasSelectionCapabilities(priorFocusedElem)) {\n        ReactInputSelection.setSelection(\n          priorFocusedElem,\n          priorSelectionRange\n        );\n      }\n      focusNode(priorFocusedElem);\n    }\n  },\n\n  /**\n   * @getSelection: Gets the selection bounds of a focused textarea, input or\n   * contentEditable node.\n   * -@input: Look up selection bounds of this input\n   * -@return {start: selectionStart, end: selectionEnd}\n   */\n  getSelection: function(input) {\n    var selection;\n\n    if ('selectionStart' in input) {\n      // Modern browser with input or textarea.\n      selection = {\n        start: input.selectionStart,\n        end: input.selectionEnd\n      };\n    } else if (document.selection && input.nodeName === 'INPUT') {\n      // IE8 input.\n      var range = document.selection.createRange();\n      // There can only be one selection per document in IE, so it must\n      // be in our element.\n      if (range.parentElement() === input) {\n        selection = {\n          start: -range.moveStart('character', -input.value.length),\n          end: -range.moveEnd('character', -input.value.length)\n        };\n      }\n    } else {\n      // Content editable or old IE textarea.\n      selection = ReactDOMSelection.getOffsets(input);\n    }\n\n    return selection || {start: 0, end: 0};\n  },\n\n  /**\n   * @setSelection: Sets the selection bounds of a textarea or input and focuses\n   * the input.\n   * -@input     Set selection bounds of this input or textarea\n   * -@offsets   Object of same form that is returned from get*\n   */\n  setSelection: function(input, offsets) {\n    var start = offsets.start;\n    var end = offsets.end;\n    if (typeof end === 'undefined') {\n      end = start;\n    }\n\n    if ('selectionStart' in input) {\n      input.selectionStart = start;\n      input.selectionEnd = Math.min(end, input.value.length);\n    } else if (document.selection && input.nodeName === 'INPUT') {\n      var range = input.createTextRange();\n      range.collapse(true);\n      range.moveStart('character', start);\n      range.moveEnd('character', end - start);\n      range.select();\n    } else {\n      ReactDOMSelection.setOffsets(input, offsets);\n    }\n  }\n};\n\nmodule.exports = ReactInputSelection;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule SyntheticCompositionEvent\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar SyntheticEvent = require(\"./SyntheticEvent\");\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents\n */\nvar CompositionEventInterface = {\n  data: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticCompositionEvent(\n  dispatchConfig,\n  dispatchMarker,\n  nativeEvent) {\n  SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);\n}\n\nSyntheticEvent.augmentClass(\n  SyntheticCompositionEvent,\n  CompositionEventInterface\n);\n\nmodule.exports = SyntheticCompositionEvent;\n\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule getTextContentAccessor\n */\n\n\"use strict\";\n\nvar ExecutionEnvironment = require(\"./ExecutionEnvironment\");\n\nvar contentKey = null;\n\n/**\n * Gets the key used to access text content on a DOM node.\n *\n * @return {?string} Key used to access text content.\n * @internal\n */\nfunction getTextContentAccessor() {\n  if (!contentKey && ExecutionEnvironment.canUseDOM) {\n    // Prefer textContent to innerText because many browsers support both but\n    // SVG <text> elements don't support innerText even when <div> does.\n    contentKey = 'textContent' in document.documentElement ?\n      'textContent' :\n      'innerText';\n  }\n  return contentKey;\n}\n\nmodule.exports = getTextContentAccessor;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule SyntheticMouseEvent\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar SyntheticUIEvent = require(\"./SyntheticUIEvent\");\nvar ViewportMetrics = require(\"./ViewportMetrics\");\n\nvar getEventModifierState = require(\"./getEventModifierState\");\n\n/**\n * @interface MouseEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar MouseEventInterface = {\n  screenX: null,\n  screenY: null,\n  clientX: null,\n  clientY: null,\n  ctrlKey: null,\n  shiftKey: null,\n  altKey: null,\n  metaKey: null,\n  getModifierState: getEventModifierState,\n  button: function(event) {\n    // Webkit, Firefox, IE9+\n    // which:  1 2 3\n    // button: 0 1 2 (standard)\n    var button = event.button;\n    if ('which' in event) {\n      return button;\n    }\n    // IE<9\n    // which:  undefined\n    // button: 0 0 0\n    // button: 1 4 2 (onmouseup)\n    return button === 2 ? 2 : button === 4 ? 1 : 0;\n  },\n  buttons: null,\n  relatedTarget: function(event) {\n    return event.relatedTarget || (\n      event.fromElement === event.srcElement ?\n        event.toElement :\n        event.fromElement\n    );\n  },\n  // \"Proprietary\" Interface.\n  pageX: function(event) {\n    return 'pageX' in event ?\n      event.pageX :\n      event.clientX + ViewportMetrics.currentScrollLeft;\n  },\n  pageY: function(event) {\n    return 'pageY' in event ?\n      event.pageY :\n      event.clientY + ViewportMetrics.currentScrollTop;\n  }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent) {\n  SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface);\n\nmodule.exports = SyntheticMouseEvent;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDOMIDOperations\n * @typechecks static-only\n */\n\n/*jslint evil: true */\n\n\"use strict\";\n\nvar CSSPropertyOperations = require(\"./CSSPropertyOperations\");\nvar DOMChildrenOperations = require(\"./DOMChildrenOperations\");\nvar DOMPropertyOperations = require(\"./DOMPropertyOperations\");\nvar ReactMount = require(\"./ReactMount\");\nvar ReactPerf = require(\"./ReactPerf\");\n\nvar invariant = require(\"./invariant\");\nvar setInnerHTML = require(\"./setInnerHTML\");\n\n/**\n * Errors for properties that should not be updated with `updatePropertyById()`.\n *\n * @type {object}\n * @private\n */\nvar INVALID_PROPERTY_ERRORS = {\n  dangerouslySetInnerHTML:\n    '`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.',\n  style: '`style` must be set using `updateStylesByID()`.'\n};\n\n/**\n * Operations used to process updates to DOM nodes. This is made injectable via\n * `ReactComponent.BackendIDOperations`.\n */\nvar ReactDOMIDOperations = {\n\n  /**\n   * Updates a DOM node with new property values. This should only be used to\n   * update DOM properties in `DOMProperty`.\n   *\n   * @param {string} id ID of the node to update.\n   * @param {string} name A valid property name, see `DOMProperty`.\n   * @param {*} value New value of the property.\n   * @internal\n   */\n  updatePropertyByID: ReactPerf.measure(\n    'ReactDOMIDOperations',\n    'updatePropertyByID',\n    function(id, name, value) {\n      var node = ReactMount.getNode(id);\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        !INVALID_PROPERTY_ERRORS.hasOwnProperty(name),\n        'updatePropertyByID(...): %s',\n        INVALID_PROPERTY_ERRORS[name]\n      ) : invariant(!INVALID_PROPERTY_ERRORS.hasOwnProperty(name)));\n\n      // If we're updating to null or undefined, we should remove the property\n      // from the DOM node instead of inadvertantly setting to a string. This\n      // brings us in line with the same behavior we have on initial render.\n      if (value != null) {\n        DOMPropertyOperations.setValueForProperty(node, name, value);\n      } else {\n        DOMPropertyOperations.deleteValueForProperty(node, name);\n      }\n    }\n  ),\n\n  /**\n   * Updates a DOM node to remove a property. This should only be used to remove\n   * DOM properties in `DOMProperty`.\n   *\n   * @param {string} id ID of the node to update.\n   * @param {string} name A property name to remove, see `DOMProperty`.\n   * @internal\n   */\n  deletePropertyByID: ReactPerf.measure(\n    'ReactDOMIDOperations',\n    'deletePropertyByID',\n    function(id, name, value) {\n      var node = ReactMount.getNode(id);\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        !INVALID_PROPERTY_ERRORS.hasOwnProperty(name),\n        'updatePropertyByID(...): %s',\n        INVALID_PROPERTY_ERRORS[name]\n      ) : invariant(!INVALID_PROPERTY_ERRORS.hasOwnProperty(name)));\n      DOMPropertyOperations.deleteValueForProperty(node, name, value);\n    }\n  ),\n\n  /**\n   * Updates a DOM node with new style values. If a value is specified as '',\n   * the corresponding style property will be unset.\n   *\n   * @param {string} id ID of the node to update.\n   * @param {object} styles Mapping from styles to values.\n   * @internal\n   */\n  updateStylesByID: ReactPerf.measure(\n    'ReactDOMIDOperations',\n    'updateStylesByID',\n    function(id, styles) {\n      var node = ReactMount.getNode(id);\n      CSSPropertyOperations.setValueForStyles(node, styles);\n    }\n  ),\n\n  /**\n   * Updates a DOM node's innerHTML.\n   *\n   * @param {string} id ID of the node to update.\n   * @param {string} html An HTML string.\n   * @internal\n   */\n  updateInnerHTMLByID: ReactPerf.measure(\n    'ReactDOMIDOperations',\n    'updateInnerHTMLByID',\n    function(id, html) {\n      var node = ReactMount.getNode(id);\n      setInnerHTML(node, html);\n    }\n  ),\n\n  /**\n   * Updates a DOM node's text content set by `props.content`.\n   *\n   * @param {string} id ID of the node to update.\n   * @param {string} content Text content.\n   * @internal\n   */\n  updateTextContentByID: ReactPerf.measure(\n    'ReactDOMIDOperations',\n    'updateTextContentByID',\n    function(id, content) {\n      var node = ReactMount.getNode(id);\n      DOMChildrenOperations.updateTextContent(node, content);\n    }\n  ),\n\n  /**\n   * Replaces a DOM node that exists in the document with markup.\n   *\n   * @param {string} id ID of child to be replaced.\n   * @param {string} markup Dangerous markup to inject in place of child.\n   * @internal\n   * @see {Danger.dangerouslyReplaceNodeWithMarkup}\n   */\n  dangerouslyReplaceNodeWithMarkupByID: ReactPerf.measure(\n    'ReactDOMIDOperations',\n    'dangerouslyReplaceNodeWithMarkupByID',\n    function(id, markup) {\n      var node = ReactMount.getNode(id);\n      DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup(node, markup);\n    }\n  ),\n\n  /**\n   * Updates a component's children by processing a series of updates.\n   *\n   * @param {array<object>} updates List of update configurations.\n   * @param {array<string>} markup List of markup strings.\n   * @internal\n   */\n  dangerouslyProcessChildrenUpdates: ReactPerf.measure(\n    'ReactDOMIDOperations',\n    'dangerouslyProcessChildrenUpdates',\n    function(updates, markup) {\n      for (var i = 0; i < updates.length; i++) {\n        updates[i].parentNode = ReactMount.getNode(updates[i].parentID);\n      }\n      DOMChildrenOperations.processUpdates(updates, markup);\n    }\n  )\n};\n\nmodule.exports = ReactDOMIDOperations;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactReconcileTransaction\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar CallbackQueue = require(\"./CallbackQueue\");\nvar PooledClass = require(\"./PooledClass\");\nvar ReactBrowserEventEmitter = require(\"./ReactBrowserEventEmitter\");\nvar ReactInputSelection = require(\"./ReactInputSelection\");\nvar ReactPutListenerQueue = require(\"./ReactPutListenerQueue\");\nvar Transaction = require(\"./Transaction\");\n\nvar mixInto = require(\"./mixInto\");\n\n/**\n * Ensures that, when possible, the selection range (currently selected text\n * input) is not disturbed by performing the transaction.\n */\nvar SELECTION_RESTORATION = {\n  /**\n   * @return {Selection} Selection information.\n   */\n  initialize: ReactInputSelection.getSelectionInformation,\n  /**\n   * @param {Selection} sel Selection information returned from `initialize`.\n   */\n  close: ReactInputSelection.restoreSelection\n};\n\n/**\n * Suppresses events (blur/focus) that could be inadvertently dispatched due to\n * high level DOM manipulations (like temporarily removing a text input from the\n * DOM).\n */\nvar EVENT_SUPPRESSION = {\n  /**\n   * @return {boolean} The enabled status of `ReactBrowserEventEmitter` before\n   * the reconciliation.\n   */\n  initialize: function() {\n    var currentlyEnabled = ReactBrowserEventEmitter.isEnabled();\n    ReactBrowserEventEmitter.setEnabled(false);\n    return currentlyEnabled;\n  },\n\n  /**\n   * @param {boolean} previouslyEnabled Enabled status of\n   *   `ReactBrowserEventEmitter` before the reconciliation occured. `close`\n   *   restores the previous value.\n   */\n  close: function(previouslyEnabled) {\n    ReactBrowserEventEmitter.setEnabled(previouslyEnabled);\n  }\n};\n\n/**\n * Provides a queue for collecting `componentDidMount` and\n * `componentDidUpdate` callbacks during the the transaction.\n */\nvar ON_DOM_READY_QUEUEING = {\n  /**\n   * Initializes the internal `onDOMReady` queue.\n   */\n  initialize: function() {\n    this.reactMountReady.reset();\n  },\n\n  /**\n   * After DOM is flushed, invoke all registered `onDOMReady` callbacks.\n   */\n  close: function() {\n    this.reactMountReady.notifyAll();\n  }\n};\n\nvar PUT_LISTENER_QUEUEING = {\n  initialize: function() {\n    this.putListenerQueue.reset();\n  },\n\n  close: function() {\n    this.putListenerQueue.putListeners();\n  }\n};\n\n/**\n * Executed within the scope of the `Transaction` instance. Consider these as\n * being member methods, but with an implied ordering while being isolated from\n * each other.\n */\nvar TRANSACTION_WRAPPERS = [\n  PUT_LISTENER_QUEUEING,\n  SELECTION_RESTORATION,\n  EVENT_SUPPRESSION,\n  ON_DOM_READY_QUEUEING\n];\n\n/**\n * Currently:\n * - The order that these are listed in the transaction is critical:\n * - Suppresses events.\n * - Restores selection range.\n *\n * Future:\n * - Restore document/overflow scroll positions that were unintentionally\n *   modified via DOM insertions above the top viewport boundary.\n * - Implement/integrate with customized constraint based layout system and keep\n *   track of which dimensions must be remeasured.\n *\n * @class ReactReconcileTransaction\n */\nfunction ReactReconcileTransaction() {\n  this.reinitializeTransaction();\n  // Only server-side rendering really needs this option (see\n  // `ReactServerRendering`), but server-side uses\n  // `ReactServerRenderingTransaction` instead. This option is here so that it's\n  // accessible and defaults to false when `ReactDOMComponent` and\n  // `ReactTextComponent` checks it in `mountComponent`.`\n  this.renderToStaticMarkup = false;\n  this.reactMountReady = CallbackQueue.getPooled(null);\n  this.putListenerQueue = ReactPutListenerQueue.getPooled();\n}\n\nvar Mixin = {\n  /**\n   * @see Transaction\n   * @abstract\n   * @final\n   * @return {array<object>} List of operation wrap proceedures.\n   *   TODO: convert to array<TransactionWrapper>\n   */\n  getTransactionWrappers: function() {\n    return TRANSACTION_WRAPPERS;\n  },\n\n  /**\n   * @return {object} The queue to collect `onDOMReady` callbacks with.\n   */\n  getReactMountReady: function() {\n    return this.reactMountReady;\n  },\n\n  getPutListenerQueue: function() {\n    return this.putListenerQueue;\n  },\n\n  /**\n   * `PooledClass` looks for this, and will invoke this before allowing this\n   * instance to be resused.\n   */\n  destructor: function() {\n    CallbackQueue.release(this.reactMountReady);\n    this.reactMountReady = null;\n\n    ReactPutListenerQueue.release(this.putListenerQueue);\n    this.putListenerQueue = null;\n  }\n};\n\n\nmixInto(ReactReconcileTransaction, Transaction.Mixin);\nmixInto(ReactReconcileTransaction, Mixin);\n\nPooledClass.addPoolingTo(ReactReconcileTransaction);\n\nmodule.exports = ReactReconcileTransaction;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule setInnerHTML\n */\n\n\"use strict\";\n\nvar ExecutionEnvironment = require(\"./ExecutionEnvironment\");\n\n/**\n * Set the innerHTML property of a node, ensuring that whitespace is preserved\n * even in IE8.\n *\n * @param {DOMElement} node\n * @param {string} html\n * @internal\n */\nvar setInnerHTML = function(node, html) {\n  node.innerHTML = html;\n};\n\nif (ExecutionEnvironment.canUseDOM) {\n  // IE8: When updating a just created node with innerHTML only leading\n  // whitespace is removed. When updating an existing node with innerHTML\n  // whitespace in root TextNodes is also collapsed.\n  // @see quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html\n\n  // Feature detection; only IE8 is known to behave improperly like this.\n  var testElement = document.createElement('div');\n  testElement.innerHTML = ' ';\n  if (testElement.innerHTML === '') {\n    setInnerHTML = function(node, html) {\n      // Magic theory: IE8 supposedly differentiates between added and updated\n      // nodes when processing innerHTML, innerHTML on updated nodes suffers\n      // from worse whitespace behavior. Re-adding a node like this triggers\n      // the initial and more favorable whitespace behavior.\n      // TODO: What to do on a detached node?\n      if (node.parentNode) {\n        node.parentNode.replaceChild(node, node);\n      }\n\n      // We also implement a workaround for non-visible tags disappearing into\n      // thin air on IE8, this only happens if there is no visible text\n      // in-front of the non-visible tags. Piggyback on the whitespace fix\n      // and simply check if any non-visible tags appear in the source.\n      if (html.match(/^[ \\r\\n\\t\\f]/) ||\n          html[0] === '<' && (\n            html.indexOf('<noscript') !== -1 ||\n            html.indexOf('<script') !== -1 ||\n            html.indexOf('<style') !== -1 ||\n            html.indexOf('<meta') !== -1 ||\n            html.indexOf('<link') !== -1)) {\n        // Recover leading whitespace by temporarily prepending any character.\n        // \\uFEFF has the potential advantage of being zero-width/invisible.\n        node.innerHTML = '\\uFEFF' + html;\n\n        // deleteData leaves an empty `TextNode` which offsets the index of all\n        // children. Definitely want to avoid this.\n        var textNode = node.firstChild;\n        if (textNode.data.length === 1) {\n          node.removeChild(textNode);\n        } else {\n          textNode.deleteData(0, 1);\n        }\n      } else {\n        node.innerHTML = html;\n      }\n    };\n  }\n}\n\nmodule.exports = setInnerHTML;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule AutoFocusMixin\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar focusNode = require(\"./focusNode\");\n\nvar AutoFocusMixin = {\n  componentDidMount: function() {\n    if (this.props.autoFocus) {\n      focusNode(this.getDOMNode());\n    }\n  }\n};\n\nmodule.exports = AutoFocusMixin;\n","(function (process){\n/**\n * Copyright 2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule LocalEventTrapMixin\n */\n\n\"use strict\";\n\nvar ReactBrowserEventEmitter = require(\"./ReactBrowserEventEmitter\");\n\nvar accumulate = require(\"./accumulate\");\nvar forEachAccumulated = require(\"./forEachAccumulated\");\nvar invariant = require(\"./invariant\");\n\nfunction remove(event) {\n  event.remove();\n}\n\nvar LocalEventTrapMixin = {\n  trapBubbledEvent:function(topLevelType, handlerBaseName) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(this.isMounted(), 'Must be mounted to trap events') : invariant(this.isMounted()));\n    var listener = ReactBrowserEventEmitter.trapBubbledEvent(\n      topLevelType,\n      handlerBaseName,\n      this.getDOMNode()\n    );\n    this._localEventListeners = accumulate(this._localEventListeners, listener);\n  },\n\n  // trapCapturedEvent would look nearly identical. We don't implement that\n  // method because it isn't currently needed.\n\n  componentWillUnmount:function() {\n    if (this._localEventListeners) {\n      forEachAccumulated(this._localEventListeners, remove);\n    }\n  }\n};\n\nmodule.exports = LocalEventTrapMixin;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule LinkedValueUtils\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar ReactPropTypes = require(\"./ReactPropTypes\");\n\nvar invariant = require(\"./invariant\");\n\nvar hasReadOnlyValue = {\n  'button': true,\n  'checkbox': true,\n  'image': true,\n  'hidden': true,\n  'radio': true,\n  'reset': true,\n  'submit': true\n};\n\nfunction _assertSingleLink(input) {\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    input.props.checkedLink == null || input.props.valueLink == null,\n    'Cannot provide a checkedLink and a valueLink. If you want to use ' +\n    'checkedLink, you probably don\\'t want to use valueLink and vice versa.'\n  ) : invariant(input.props.checkedLink == null || input.props.valueLink == null));\n}\nfunction _assertValueLink(input) {\n  _assertSingleLink(input);\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    input.props.value == null && input.props.onChange == null,\n    'Cannot provide a valueLink and a value or onChange event. If you want ' +\n    'to use value or onChange, you probably don\\'t want to use valueLink.'\n  ) : invariant(input.props.value == null && input.props.onChange == null));\n}\n\nfunction _assertCheckedLink(input) {\n  _assertSingleLink(input);\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    input.props.checked == null && input.props.onChange == null,\n    'Cannot provide a checkedLink and a checked property or onChange event. ' +\n    'If you want to use checked or onChange, you probably don\\'t want to ' +\n    'use checkedLink'\n  ) : invariant(input.props.checked == null && input.props.onChange == null));\n}\n\n/**\n * @param {SyntheticEvent} e change event to handle\n */\nfunction _handleLinkedValueChange(e) {\n  /*jshint validthis:true */\n  this.props.valueLink.requestChange(e.target.value);\n}\n\n/**\n  * @param {SyntheticEvent} e change event to handle\n  */\nfunction _handleLinkedCheckChange(e) {\n  /*jshint validthis:true */\n  this.props.checkedLink.requestChange(e.target.checked);\n}\n\n/**\n * Provide a linked `value` attribute for controlled forms. You should not use\n * this outside of the ReactDOM controlled form components.\n */\nvar LinkedValueUtils = {\n  Mixin: {\n    propTypes: {\n      value: function(props, propName, componentName) {\n        if (!props[propName] ||\n            hasReadOnlyValue[props.type] ||\n            props.onChange ||\n            props.readOnly ||\n            props.disabled) {\n          return;\n        }\n        return new Error(\n          'You provided a `value` prop to a form field without an ' +\n          '`onChange` handler. This will render a read-only field. If ' +\n          'the field should be mutable use `defaultValue`. Otherwise, ' +\n          'set either `onChange` or `readOnly`.'\n        );\n      },\n      checked: function(props, propName, componentName) {\n        if (!props[propName] ||\n            props.onChange ||\n            props.readOnly ||\n            props.disabled) {\n          return;\n        }\n        return new Error(\n          'You provided a `checked` prop to a form field without an ' +\n          '`onChange` handler. This will render a read-only field. If ' +\n          'the field should be mutable use `defaultChecked`. Otherwise, ' +\n          'set either `onChange` or `readOnly`.'\n        );\n      },\n      onChange: ReactPropTypes.func\n    }\n  },\n\n  /**\n   * @param {ReactComponent} input Form component\n   * @return {*} current value of the input either from value prop or link.\n   */\n  getValue: function(input) {\n    if (input.props.valueLink) {\n      _assertValueLink(input);\n      return input.props.valueLink.value;\n    }\n    return input.props.value;\n  },\n\n  /**\n   * @param {ReactComponent} input Form component\n   * @return {*} current checked status of the input either from checked prop\n   *             or link.\n   */\n  getChecked: function(input) {\n    if (input.props.checkedLink) {\n      _assertCheckedLink(input);\n      return input.props.checkedLink.value;\n    }\n    return input.props.checked;\n  },\n\n  /**\n   * @param {ReactComponent} input Form component\n   * @return {function} change callback either from onChange prop or link.\n   */\n  getOnChange: function(input) {\n    if (input.props.valueLink) {\n      _assertValueLink(input);\n      return _handleLinkedValueChange;\n    } else if (input.props.checkedLink) {\n      _assertCheckedLink(input);\n      return _handleLinkedCheckChange;\n    }\n    return input.props.onChange;\n  }\n};\n\nmodule.exports = LinkedValueUtils;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * @providesModule EventListener\n * @typechecks\n */\n\nvar emptyFunction = require(\"./emptyFunction\");\n\n/**\n * Upstream version of event listener. Does not take into account specific\n * nature of platform.\n */\nvar EventListener = {\n  /**\n   * Listen to DOM events during the bubble phase.\n   *\n   * @param {DOMEventTarget} target DOM element to register listener on.\n   * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.\n   * @param {function} callback Callback function.\n   * @return {object} Object with a `remove` method.\n   */\n  listen: function(target, eventType, callback) {\n    if (target.addEventListener) {\n      target.addEventListener(eventType, callback, false);\n      return {\n        remove: function() {\n          target.removeEventListener(eventType, callback, false);\n        }\n      };\n    } else if (target.attachEvent) {\n      target.attachEvent('on' + eventType, callback);\n      return {\n        remove: function() {\n          target.detachEvent('on' + eventType, callback);\n        }\n      };\n    }\n  },\n\n  /**\n   * Listen to DOM events during the capture phase.\n   *\n   * @param {DOMEventTarget} target DOM element to register listener on.\n   * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.\n   * @param {function} callback Callback function.\n   * @return {object} Object with a `remove` method.\n   */\n  capture: function(target, eventType, callback) {\n    if (!target.addEventListener) {\n      if (\"production\" !== process.env.NODE_ENV) {\n        console.error(\n          'Attempted to listen to events during the capture phase on a ' +\n          'browser that does not support the capture phase. Your application ' +\n          'will not receive some events.'\n        );\n      }\n      return {\n        remove: emptyFunction\n      };\n    } else {\n      target.addEventListener(eventType, callback, true);\n      return {\n        remove: function() {\n          target.removeEventListener(eventType, callback, true);\n        }\n      };\n    }\n  },\n\n  registerDefault: function() {}\n};\n\nmodule.exports = EventListener;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule getUnboundedScrollPosition\n * @typechecks\n */\n\n\"use strict\";\n\n/**\n * Gets the scroll position of the supplied element or window.\n *\n * The return values are unbounded, unlike `getScrollPosition`. This means they\n * may be negative or exceed the element boundaries (which is possible using\n * inertial scrolling).\n *\n * @param {DOMWindow|DOMElement} scrollable\n * @return {object} Map with `x` and `y` keys.\n */\nfunction getUnboundedScrollPosition(scrollable) {\n  if (scrollable === window) {\n    return {\n      x: window.pageXOffset || document.documentElement.scrollLeft,\n      y: window.pageYOffset || document.documentElement.scrollTop\n    };\n  }\n  return {\n    x: scrollable.scrollLeft,\n    y: scrollable.scrollTop\n  };\n}\n\nmodule.exports = getUnboundedScrollPosition;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule SyntheticClipboardEvent\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar SyntheticEvent = require(\"./SyntheticEvent\");\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/clipboard-apis/\n */\nvar ClipboardEventInterface = {\n  clipboardData: function(event) {\n    return (\n      'clipboardData' in event ?\n        event.clipboardData :\n        window.clipboardData\n    );\n  }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeEvent) {\n  SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);\n}\n\nSyntheticEvent.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface);\n\nmodule.exports = SyntheticClipboardEvent;\n\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule getActiveElement\n * @typechecks\n */\n\n/**\n * Same as document.activeElement but wraps in a try-catch block. In IE it is\n * not safe to call document.activeElement if there is nothing focused.\n *\n * The activeElement will be null only if the document body is not yet defined.\n */\nfunction getActiveElement() /*?DOMElement*/ {\n  try {\n    return document.activeElement || document.body;\n  } catch (e) {\n    return document.body;\n  }\n}\n\nmodule.exports = getActiveElement;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule SyntheticFocusEvent\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar SyntheticUIEvent = require(\"./SyntheticUIEvent\");\n\n/**\n * @interface FocusEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar FocusEventInterface = {\n  relatedTarget: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent) {\n  SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface);\n\nmodule.exports = SyntheticFocusEvent;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule SyntheticKeyboardEvent\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar SyntheticUIEvent = require(\"./SyntheticUIEvent\");\n\nvar getEventKey = require(\"./getEventKey\");\nvar getEventModifierState = require(\"./getEventModifierState\");\n\n/**\n * @interface KeyboardEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar KeyboardEventInterface = {\n  key: getEventKey,\n  location: null,\n  ctrlKey: null,\n  shiftKey: null,\n  altKey: null,\n  metaKey: null,\n  repeat: null,\n  locale: null,\n  getModifierState: getEventModifierState,\n  // Legacy Interface\n  charCode: function(event) {\n    // `charCode` is the result of a KeyPress event and represents the value of\n    // the actual printable character.\n\n    // KeyPress is deprecated but its replacement is not yet final and not\n    // implemented in any major browser.\n    if (event.type === 'keypress') {\n      // IE8 does not implement \"charCode\", but \"keyCode\" has the correct value.\n      return 'charCode' in event ? event.charCode : event.keyCode;\n    }\n    return 0;\n  },\n  keyCode: function(event) {\n    // `keyCode` is the result of a KeyDown/Up event and represents the value of\n    // physical keyboard key.\n\n    // The actual meaning of the value depends on the users' keyboard layout\n    // which cannot be detected. Assuming that it is a US keyboard layout\n    // provides a surprisingly accurate mapping for US and European users.\n    // Due to this, it is left to the user to implement at this time.\n    if (event.type === 'keydown' || event.type === 'keyup') {\n      return event.keyCode;\n    }\n    return 0;\n  },\n  which: function(event) {\n    // `which` is an alias for either `keyCode` or `charCode` depending on the\n    // type of the event. There is no need to determine the type of the event\n    // as `keyCode` and `charCode` are either aliased or default to zero.\n    return event.keyCode || event.charCode;\n  }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent) {\n  SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface);\n\nmodule.exports = SyntheticKeyboardEvent;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule SyntheticDragEvent\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar SyntheticMouseEvent = require(\"./SyntheticMouseEvent\");\n\n/**\n * @interface DragEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar DragEventInterface = {\n  dataTransfer: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent) {\n  SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);\n}\n\nSyntheticMouseEvent.augmentClass(SyntheticDragEvent, DragEventInterface);\n\nmodule.exports = SyntheticDragEvent;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule SyntheticTouchEvent\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar SyntheticUIEvent = require(\"./SyntheticUIEvent\");\n\nvar getEventModifierState = require(\"./getEventModifierState\");\n\n/**\n * @interface TouchEvent\n * @see http://www.w3.org/TR/touch-events/\n */\nvar TouchEventInterface = {\n  touches: null,\n  targetTouches: null,\n  changedTouches: null,\n  altKey: null,\n  metaKey: null,\n  ctrlKey: null,\n  shiftKey: null,\n  getModifierState: getEventModifierState\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent) {\n  SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface);\n\nmodule.exports = SyntheticTouchEvent;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule SyntheticUIEvent\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar SyntheticEvent = require(\"./SyntheticEvent\");\n\nvar getEventTarget = require(\"./getEventTarget\");\n\n/**\n * @interface UIEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar UIEventInterface = {\n  view: function(event) {\n    if (event.view) {\n      return event.view;\n    }\n\n    var target = getEventTarget(event);\n    if (target != null && target.window === target) {\n      // target is a window object\n      return target;\n    }\n\n    var doc = target.ownerDocument;\n    // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.\n    if (doc) {\n      return doc.defaultView || doc.parentWindow;\n    } else {\n      return window;\n    }\n  },\n  detail: function(event) {\n    return event.detail || 0;\n  }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticEvent}\n */\nfunction SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent) {\n  SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);\n}\n\nSyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface);\n\nmodule.exports = SyntheticUIEvent;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule SyntheticWheelEvent\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar SyntheticMouseEvent = require(\"./SyntheticMouseEvent\");\n\n/**\n * @interface WheelEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar WheelEventInterface = {\n  deltaX: function(event) {\n    return (\n      'deltaX' in event ? event.deltaX :\n      // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).\n      'wheelDeltaX' in event ? -event.wheelDeltaX : 0\n    );\n  },\n  deltaY: function(event) {\n    return (\n      'deltaY' in event ? event.deltaY :\n      // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).\n      'wheelDeltaY' in event ? -event.wheelDeltaY :\n      // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).\n      'wheelDelta' in event ? -event.wheelDelta : 0\n    );\n  },\n  deltaZ: null,\n\n  // Browsers without \"deltaMode\" is reporting in raw wheel delta where one\n  // notch on the scroll is always +/- 120, roughly equivalent to pixels.\n  // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or\n  // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.\n  deltaMode: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticMouseEvent}\n */\nfunction SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent) {\n  SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);\n}\n\nSyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface);\n\nmodule.exports = SyntheticWheelEvent;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule isTextNode\n * @typechecks\n */\n\nvar isNode = require(\"./isNode\");\n\n/**\n * @param {*} object The object to check.\n * @return {boolean} Whether or not the object is a DOM text node.\n */\nfunction isTextNode(object) {\n  return isNode(object) && object.nodeType == 3;\n}\n\nmodule.exports = isTextNode;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule adler32\n */\n\n/* jslint bitwise:true */\n\n\"use strict\";\n\nvar MOD = 65521;\n\n// This is a clean-room implementation of adler32 designed for detecting\n// if markup is not what we expect it to be. It does not need to be\n// cryptographically strong, only reasonable good at detecting if markup\n// generated on the server is different than that on the client.\nfunction adler32(data) {\n  var a = 1;\n  var b = 0;\n  for (var i = 0; i < data.length; i++) {\n    a = (a + data.charCodeAt(i)) % MOD;\n    b = (b + a) % MOD;\n  }\n  return a | (b << 16);\n}\n\nmodule.exports = adler32;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactPutListenerQueue\n */\n\n\"use strict\";\n\nvar PooledClass = require(\"./PooledClass\");\nvar ReactBrowserEventEmitter = require(\"./ReactBrowserEventEmitter\");\n\nvar mixInto = require(\"./mixInto\");\n\nfunction ReactPutListenerQueue() {\n  this.listenersToPut = [];\n}\n\nmixInto(ReactPutListenerQueue, {\n  enqueuePutListener: function(rootNodeID, propKey, propValue) {\n    this.listenersToPut.push({\n      rootNodeID: rootNodeID,\n      propKey: propKey,\n      propValue: propValue\n    });\n  },\n\n  putListeners: function() {\n    for (var i = 0; i < this.listenersToPut.length; i++) {\n      var listenerToPut = this.listenersToPut[i];\n      ReactBrowserEventEmitter.putListener(\n        listenerToPut.rootNodeID,\n        listenerToPut.propKey,\n        listenerToPut.propValue\n      );\n    }\n  },\n\n  reset: function() {\n    this.listenersToPut.length = 0;\n  },\n\n  destructor: function() {\n    this.reset();\n  }\n});\n\nPooledClass.addPoolingTo(ReactPutListenerQueue);\n\nmodule.exports = ReactPutListenerQueue;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule hyphenate\n * @typechecks\n */\n\nvar _uppercasePattern = /([A-Z])/g;\n\n/**\n * Hyphenates a camelcased string, for example:\n *\n *   > hyphenate('backgroundColor')\n *   < \"background-color\"\n *\n * For CSS style names, use `hyphenateStyleName` instead which works properly\n * with all vendor prefixes, including `ms`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction hyphenate(string) {\n  return string.replace(_uppercasePattern, '-$1').toLowerCase();\n}\n\nmodule.exports = hyphenate;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule ReactDOMSelection\n */\n\n\"use strict\";\n\nvar ExecutionEnvironment = require(\"./ExecutionEnvironment\");\n\nvar getNodeForCharacterOffset = require(\"./getNodeForCharacterOffset\");\nvar getTextContentAccessor = require(\"./getTextContentAccessor\");\n\n/**\n * While `isCollapsed` is available on the Selection object and `collapsed`\n * is available on the Range object, IE11 sometimes gets them wrong.\n * If the anchor/focus nodes and offsets are the same, the range is collapsed.\n */\nfunction isCollapsed(anchorNode, anchorOffset, focusNode, focusOffset) {\n  return anchorNode === focusNode && anchorOffset === focusOffset;\n}\n\n/**\n * Get the appropriate anchor and focus node/offset pairs for IE.\n *\n * The catch here is that IE's selection API doesn't provide information\n * about whether the selection is forward or backward, so we have to\n * behave as though it's always forward.\n *\n * IE text differs from modern selection in that it behaves as though\n * block elements end with a new line. This means character offsets will\n * differ between the two APIs.\n *\n * @param {DOMElement} node\n * @return {object}\n */\nfunction getIEOffsets(node) {\n  var selection = document.selection;\n  var selectedRange = selection.createRange();\n  var selectedLength = selectedRange.text.length;\n\n  // Duplicate selection so we can move range without breaking user selection.\n  var fromStart = selectedRange.duplicate();\n  fromStart.moveToElementText(node);\n  fromStart.setEndPoint('EndToStart', selectedRange);\n\n  var startOffset = fromStart.text.length;\n  var endOffset = startOffset + selectedLength;\n\n  return {\n    start: startOffset,\n    end: endOffset\n  };\n}\n\n/**\n * @param {DOMElement} node\n * @return {?object}\n */\nfunction getModernOffsets(node) {\n  var selection = window.getSelection();\n\n  if (selection.rangeCount === 0) {\n    return null;\n  }\n\n  var anchorNode = selection.anchorNode;\n  var anchorOffset = selection.anchorOffset;\n  var focusNode = selection.focusNode;\n  var focusOffset = selection.focusOffset;\n\n  var currentRange = selection.getRangeAt(0);\n\n  // If the node and offset values are the same, the selection is collapsed.\n  // `Selection.isCollapsed` is available natively, but IE sometimes gets\n  // this value wrong.\n  var isSelectionCollapsed = isCollapsed(\n    selection.anchorNode,\n    selection.anchorOffset,\n    selection.focusNode,\n    selection.focusOffset\n  );\n\n  var rangeLength = isSelectionCollapsed ? 0 : currentRange.toString().length;\n\n  var tempRange = currentRange.cloneRange();\n  tempRange.selectNodeContents(node);\n  tempRange.setEnd(currentRange.startContainer, currentRange.startOffset);\n\n  var isTempRangeCollapsed = isCollapsed(\n    tempRange.startContainer,\n    tempRange.startOffset,\n    tempRange.endContainer,\n    tempRange.endOffset\n  );\n\n  var start = isTempRangeCollapsed ? 0 : tempRange.toString().length;\n  var end = start + rangeLength;\n\n  // Detect whether the selection is backward.\n  var detectionRange = document.createRange();\n  detectionRange.setStart(anchorNode, anchorOffset);\n  detectionRange.setEnd(focusNode, focusOffset);\n  var isBackward = detectionRange.collapsed;\n  detectionRange.detach();\n\n  return {\n    start: isBackward ? end : start,\n    end: isBackward ? start : end\n  };\n}\n\n/**\n * @param {DOMElement|DOMTextNode} node\n * @param {object} offsets\n */\nfunction setIEOffsets(node, offsets) {\n  var range = document.selection.createRange().duplicate();\n  var start, end;\n\n  if (typeof offsets.end === 'undefined') {\n    start = offsets.start;\n    end = start;\n  } else if (offsets.start > offsets.end) {\n    start = offsets.end;\n    end = offsets.start;\n  } else {\n    start = offsets.start;\n    end = offsets.end;\n  }\n\n  range.moveToElementText(node);\n  range.moveStart('character', start);\n  range.setEndPoint('EndToStart', range);\n  range.moveEnd('character', end - start);\n  range.select();\n}\n\n/**\n * In modern non-IE browsers, we can support both forward and backward\n * selections.\n *\n * Note: IE10+ supports the Selection object, but it does not support\n * the `extend` method, which means that even in modern IE, it's not possible\n * to programatically create a backward selection. Thus, for all IE\n * versions, we use the old IE API to create our selections.\n *\n * @param {DOMElement|DOMTextNode} node\n * @param {object} offsets\n */\nfunction setModernOffsets(node, offsets) {\n  var selection = window.getSelection();\n\n  var length = node[getTextContentAccessor()].length;\n  var start = Math.min(offsets.start, length);\n  var end = typeof offsets.end === 'undefined' ?\n            start : Math.min(offsets.end, length);\n\n  // IE 11 uses modern selection, but doesn't support the extend method.\n  // Flip backward selections, so we can set with a single range.\n  if (!selection.extend && start > end) {\n    var temp = end;\n    end = start;\n    start = temp;\n  }\n\n  var startMarker = getNodeForCharacterOffset(node, start);\n  var endMarker = getNodeForCharacterOffset(node, end);\n\n  if (startMarker && endMarker) {\n    var range = document.createRange();\n    range.setStart(startMarker.node, startMarker.offset);\n    selection.removeAllRanges();\n\n    if (start > end) {\n      selection.addRange(range);\n      selection.extend(endMarker.node, endMarker.offset);\n    } else {\n      range.setEnd(endMarker.node, endMarker.offset);\n      selection.addRange(range);\n    }\n\n    range.detach();\n  }\n}\n\nvar useIEOffsets = ExecutionEnvironment.canUseDOM && document.selection;\n\nvar ReactDOMSelection = {\n  /**\n   * @param {DOMElement} node\n   */\n  getOffsets: useIEOffsets ? getIEOffsets : getModernOffsets,\n\n  /**\n   * @param {DOMElement|DOMTextNode} node\n   * @param {object} offsets\n   */\n  setOffsets: useIEOffsets ? setIEOffsets : setModernOffsets\n};\n\nmodule.exports = ReactDOMSelection;\n","/**\n * Copyright 2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule focusNode\n */\n\n\"use strict\";\n\n/**\n * IE8 throws if an input/textarea is disabled and we try to focus it.\n * Focus only when necessary.\n *\n * @param {DOMElement} node input/textarea to focus\n */\nfunction focusNode(node) {\n  if (!node.disabled) {\n    node.focus();\n  }\n}\n\nmodule.exports = focusNode;\n","/**\n * Copyright 2013 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule getEventModifierState\n * @typechecks static-only\n */\n\n\"use strict\";\n\n/**\n * Translation from modifier key to the associated property in the event.\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers\n */\n\nvar modifierKeyToProp = {\n  'Alt': 'altKey',\n  'Control': 'ctrlKey',\n  'Meta': 'metaKey',\n  'Shift': 'shiftKey'\n};\n\n// IE8 does not implement getModifierState so we simply map it to the only\n// modifier keys exposed by the event itself, does not support Lock-keys.\n// Currently, all major browsers except Chrome seems to support Lock-keys.\nfunction modifierStateGetter(keyArg) {\n  /*jshint validthis:true */\n  var syntheticEvent = this;\n  var nativeEvent = syntheticEvent.nativeEvent;\n  if (nativeEvent.getModifierState) {\n    return nativeEvent.getModifierState(keyArg);\n  }\n  var keyProp = modifierKeyToProp[keyArg];\n  return keyProp ? !!nativeEvent[keyProp] : false;\n}\n\nfunction getEventModifierState(nativeEvent) {\n  return modifierStateGetter;\n}\n\nmodule.exports = getEventModifierState;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule DOMChildrenOperations\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar Danger = require(\"./Danger\");\nvar ReactMultiChildUpdateTypes = require(\"./ReactMultiChildUpdateTypes\");\n\nvar getTextContentAccessor = require(\"./getTextContentAccessor\");\nvar invariant = require(\"./invariant\");\n\n/**\n * The DOM property to use when setting text content.\n *\n * @type {string}\n * @private\n */\nvar textContentAccessor = getTextContentAccessor();\n\n/**\n * Inserts `childNode` as a child of `parentNode` at the `index`.\n *\n * @param {DOMElement} parentNode Parent node in which to insert.\n * @param {DOMElement} childNode Child node to insert.\n * @param {number} index Index at which to insert the child.\n * @internal\n */\nfunction insertChildAt(parentNode, childNode, index) {\n  // By exploiting arrays returning `undefined` for an undefined index, we can\n  // rely exclusively on `insertBefore(node, null)` instead of also using\n  // `appendChild(node)`. However, using `undefined` is not allowed by all\n  // browsers so we must replace it with `null`.\n  parentNode.insertBefore(\n    childNode,\n    parentNode.childNodes[index] || null\n  );\n}\n\nvar updateTextContent;\nif (textContentAccessor === 'textContent') {\n  /**\n   * Sets the text content of `node` to `text`.\n   *\n   * @param {DOMElement} node Node to change\n   * @param {string} text New text content\n   */\n  updateTextContent = function(node, text) {\n    node.textContent = text;\n  };\n} else {\n  /**\n   * Sets the text content of `node` to `text`.\n   *\n   * @param {DOMElement} node Node to change\n   * @param {string} text New text content\n   */\n  updateTextContent = function(node, text) {\n    // In order to preserve newlines correctly, we can't use .innerText to set\n    // the contents (see #1080), so we empty the element then append a text node\n    while (node.firstChild) {\n      node.removeChild(node.firstChild);\n    }\n    if (text) {\n      var doc = node.ownerDocument || document;\n      node.appendChild(doc.createTextNode(text));\n    }\n  };\n}\n\n/**\n * Operations for updating with DOM children.\n */\nvar DOMChildrenOperations = {\n\n  dangerouslyReplaceNodeWithMarkup: Danger.dangerouslyReplaceNodeWithMarkup,\n\n  updateTextContent: updateTextContent,\n\n  /**\n   * Updates a component's children by processing a series of updates. The\n   * update configurations are each expected to have a `parentNode` property.\n   *\n   * @param {array<object>} updates List of update configurations.\n   * @param {array<string>} markupList List of markup strings.\n   * @internal\n   */\n  processUpdates: function(updates, markupList) {\n    var update;\n    // Mapping from parent IDs to initial child orderings.\n    var initialChildren = null;\n    // List of children that will be moved or removed.\n    var updatedChildren = null;\n\n    for (var i = 0; update = updates[i]; i++) {\n      if (update.type === ReactMultiChildUpdateTypes.MOVE_EXISTING ||\n          update.type === ReactMultiChildUpdateTypes.REMOVE_NODE) {\n        var updatedIndex = update.fromIndex;\n        var updatedChild = update.parentNode.childNodes[updatedIndex];\n        var parentID = update.parentID;\n\n        (\"production\" !== process.env.NODE_ENV ? invariant(\n          updatedChild,\n          'processUpdates(): Unable to find child %s of element. This ' +\n          'probably means the DOM was unexpectedly mutated (e.g., by the ' +\n          'browser), usually due to forgetting a <tbody> when using tables, ' +\n          'nesting <p> or <a> tags, or using non-SVG elements in an <svg> '+\n          'parent. Try inspecting the child nodes of the element with React ' +\n          'ID `%s`.',\n          updatedIndex,\n          parentID\n        ) : invariant(updatedChild));\n\n        initialChildren = initialChildren || {};\n        initialChildren[parentID] = initialChildren[parentID] || [];\n        initialChildren[parentID][updatedIndex] = updatedChild;\n\n        updatedChildren = updatedChildren || [];\n        updatedChildren.push(updatedChild);\n      }\n    }\n\n    var renderedMarkup = Danger.dangerouslyRenderMarkup(markupList);\n\n    // Remove updated children first so that `toIndex` is consistent.\n    if (updatedChildren) {\n      for (var j = 0; j < updatedChildren.length; j++) {\n        updatedChildren[j].parentNode.removeChild(updatedChildren[j]);\n      }\n    }\n\n    for (var k = 0; update = updates[k]; k++) {\n      switch (update.type) {\n        case ReactMultiChildUpdateTypes.INSERT_MARKUP:\n          insertChildAt(\n            update.parentNode,\n            renderedMarkup[update.markupIndex],\n            update.toIndex\n          );\n          break;\n        case ReactMultiChildUpdateTypes.MOVE_EXISTING:\n          insertChildAt(\n            update.parentNode,\n            initialChildren[update.parentID][update.fromIndex],\n            update.toIndex\n          );\n          break;\n        case ReactMultiChildUpdateTypes.TEXT_CONTENT:\n          updateTextContent(\n            update.parentNode,\n            update.textContent\n          );\n          break;\n        case ReactMultiChildUpdateTypes.REMOVE_NODE:\n          // Already removed by the for-loop above.\n          break;\n      }\n    }\n  }\n\n};\n\nmodule.exports = DOMChildrenOperations;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule getEventKey\n * @typechecks static-only\n */\n\n\"use strict\";\n\nvar invariant = require(\"./invariant\");\n\n/**\n * Normalization of deprecated HTML5 `key` values\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n */\nvar normalizeKey = {\n  'Esc': 'Escape',\n  'Spacebar': ' ',\n  'Left': 'ArrowLeft',\n  'Up': 'ArrowUp',\n  'Right': 'ArrowRight',\n  'Down': 'ArrowDown',\n  'Del': 'Delete',\n  'Win': 'OS',\n  'Menu': 'ContextMenu',\n  'Apps': 'ContextMenu',\n  'Scroll': 'ScrollLock',\n  'MozPrintableKey': 'Unidentified'\n};\n\n/**\n * Translation from legacy `which`/`keyCode` to HTML5 `key`\n * Only special keys supported, all others depend on keyboard layout or browser\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n */\nvar translateToKey = {\n  8: 'Backspace',\n  9: 'Tab',\n  12: 'Clear',\n  13: 'Enter',\n  16: 'Shift',\n  17: 'Control',\n  18: 'Alt',\n  19: 'Pause',\n  20: 'CapsLock',\n  27: 'Escape',\n  32: ' ',\n  33: 'PageUp',\n  34: 'PageDown',\n  35: 'End',\n  36: 'Home',\n  37: 'ArrowLeft',\n  38: 'ArrowUp',\n  39: 'ArrowRight',\n  40: 'ArrowDown',\n  45: 'Insert',\n  46: 'Delete',\n  112: 'F1', 113: 'F2', 114: 'F3', 115: 'F4', 116: 'F5', 117: 'F6',\n  118: 'F7', 119: 'F8', 120: 'F9', 121: 'F10', 122: 'F11', 123: 'F12',\n  144: 'NumLock',\n  145: 'ScrollLock',\n  224: 'Meta'\n};\n\n/**\n * @param {object} nativeEvent Native browser event.\n * @return {string} Normalized `key` property.\n */\nfunction getEventKey(nativeEvent) {\n  if (nativeEvent.key) {\n    // Normalize inconsistent values reported by browsers due to\n    // implementations of a working draft specification.\n\n    // FireFox implements `key` but returns `MozPrintableKey` for all\n    // printable characters (normalized to `Unidentified`), ignore it.\n    var key = normalizeKey[nativeEvent.key] || nativeEvent.key;\n    if (key !== 'Unidentified') {\n      return key;\n    }\n  }\n\n  // Browser does not implement `key`, polyfill as much of it as we can.\n  if (nativeEvent.type === 'keypress') {\n    // Create the character from the `charCode` ourselves and use as an almost\n    // perfect replacement.\n    var charCode = 'charCode' in nativeEvent ?\n      nativeEvent.charCode :\n      nativeEvent.keyCode;\n\n    // The enter-key is technically both printable and non-printable and can\n    // thus be captured by `keypress`, no other non-printable key should.\n    return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);\n  }\n  if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {\n    // While user keyboard layout determines the actual meaning of each\n    // `keyCode` value, almost all function keys have a universal value.\n    return translateToKey[nativeEvent.keyCode] || 'Unidentified';\n  }\n\n  (\"production\" !== process.env.NODE_ENV ? invariant(false, \"Unexpected keyboard event type: %s\", nativeEvent.type) : invariant(false));\n}\n\nmodule.exports = getEventKey;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule isNode\n * @typechecks\n */\n\n/**\n * @param {*} object The object to check.\n * @return {boolean} Whether or not the object is a DOM node.\n */\nfunction isNode(object) {\n  return !!(object && (\n    typeof Node === 'function' ? object instanceof Node :\n      typeof object === 'object' &&\n      typeof object.nodeType === 'number' &&\n      typeof object.nodeName === 'string'\n  ));\n}\n\nmodule.exports = isNode;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule getNodeForCharacterOffset\n */\n\n\"use strict\";\n\n/**\n * Given any node return the first leaf node without children.\n *\n * @param {DOMElement|DOMTextNode} node\n * @return {DOMElement|DOMTextNode}\n */\nfunction getLeafNode(node) {\n  while (node && node.firstChild) {\n    node = node.firstChild;\n  }\n  return node;\n}\n\n/**\n * Get the next sibling within a container. This will walk up the\n * DOM if a node's siblings have been exhausted.\n *\n * @param {DOMElement|DOMTextNode} node\n * @return {?DOMElement|DOMTextNode}\n */\nfunction getSiblingNode(node) {\n  while (node) {\n    if (node.nextSibling) {\n      return node.nextSibling;\n    }\n    node = node.parentNode;\n  }\n}\n\n/**\n * Get object describing the nodes which contain characters at offset.\n *\n * @param {DOMElement|DOMTextNode} root\n * @param {number} offset\n * @return {?object}\n */\nfunction getNodeForCharacterOffset(root, offset) {\n  var node = getLeafNode(root);\n  var nodeStart = 0;\n  var nodeEnd = 0;\n\n  while (node) {\n    if (node.nodeType == 3) {\n      nodeEnd = nodeStart + node.textContent.length;\n\n      if (nodeStart <= offset && nodeEnd >= offset) {\n        return {\n          node: node,\n          offset: offset - nodeStart\n        };\n      }\n\n      nodeStart = nodeEnd;\n    }\n\n    node = getLeafNode(getSiblingNode(node));\n  }\n}\n\nmodule.exports = getNodeForCharacterOffset;\n","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule Danger\n * @typechecks static-only\n */\n\n/*jslint evil: true, sub: true */\n\n\"use strict\";\n\nvar ExecutionEnvironment = require(\"./ExecutionEnvironment\");\n\nvar createNodesFromMarkup = require(\"./createNodesFromMarkup\");\nvar emptyFunction = require(\"./emptyFunction\");\nvar getMarkupWrap = require(\"./getMarkupWrap\");\nvar invariant = require(\"./invariant\");\n\nvar OPEN_TAG_NAME_EXP = /^(<[^ \\/>]+)/;\nvar RESULT_INDEX_ATTR = 'data-danger-index';\n\n/**\n * Extracts the `nodeName` from a string of markup.\n *\n * NOTE: Extracting the `nodeName` does not require a regular expression match\n * because we make assumptions about React-generated markup (i.e. there are no\n * spaces surrounding the opening tag and there is at least one attribute).\n *\n * @param {string} markup String of markup.\n * @return {string} Node name of the supplied markup.\n * @see http://jsperf.com/extract-nodename\n */\nfunction getNodeName(markup) {\n  return markup.substring(1, markup.indexOf(' '));\n}\n\nvar Danger = {\n\n  /**\n   * Renders markup into an array of nodes. The markup is expected to render\n   * into a list of root nodes. Also, the length of `resultList` and\n   * `markupList` should be the same.\n   *\n   * @param {array<string>} markupList List of markup strings to render.\n   * @return {array<DOMElement>} List of rendered nodes.\n   * @internal\n   */\n  dangerouslyRenderMarkup: function(markupList) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      ExecutionEnvironment.canUseDOM,\n      'dangerouslyRenderMarkup(...): Cannot render markup in a Worker ' +\n      'thread. This is likely a bug in the framework. Please report ' +\n      'immediately.'\n    ) : invariant(ExecutionEnvironment.canUseDOM));\n    var nodeName;\n    var markupByNodeName = {};\n    // Group markup by `nodeName` if a wrap is necessary, else by '*'.\n    for (var i = 0; i < markupList.length; i++) {\n      (\"production\" !== process.env.NODE_ENV ? invariant(\n        markupList[i],\n        'dangerouslyRenderMarkup(...): Missing markup.'\n      ) : invariant(markupList[i]));\n      nodeName = getNodeName(markupList[i]);\n      nodeName = getMarkupWrap(nodeName) ? nodeName : '*';\n      markupByNodeName[nodeName] = markupByNodeName[nodeName] || [];\n      markupByNodeName[nodeName][i] = markupList[i];\n    }\n    var resultList = [];\n    var resultListAssignmentCount = 0;\n    for (nodeName in markupByNodeName) {\n      if (!markupByNodeName.hasOwnProperty(nodeName)) {\n        continue;\n      }\n      var markupListByNodeName = markupByNodeName[nodeName];\n\n      // This for-in loop skips the holes of the sparse array. The order of\n      // iteration should follow the order of assignment, which happens to match\n      // numerical index order, but we don't rely on that.\n      for (var resultIndex in markupListByNodeName) {\n        if (markupListByNodeName.hasOwnProperty(resultIndex)) {\n          var markup = markupListByNodeName[resultIndex];\n\n          // Push the requested markup with an additional RESULT_INDEX_ATTR\n          // attribute.  If the markup does not start with a < character, it\n          // will be discarded below (with an appropriate console.error).\n          markupListByNodeName[resultIndex] = markup.replace(\n            OPEN_TAG_NAME_EXP,\n            // This index will be parsed back out below.\n            '$1 ' + RESULT_INDEX_ATTR + '=\"' + resultIndex + '\" '\n          );\n        }\n      }\n\n      // Render each group of markup with similar wrapping `nodeName`.\n      var renderNodes = createNodesFromMarkup(\n        markupListByNodeName.join(''),\n        emptyFunction // Do nothing special with <script> tags.\n      );\n\n      for (i = 0; i < renderNodes.length; ++i) {\n        var renderNode = renderNodes[i];\n        if (renderNode.hasAttribute &&\n            renderNode.hasAttribute(RESULT_INDEX_ATTR)) {\n\n          resultIndex = +renderNode.getAttribute(RESULT_INDEX_ATTR);\n          renderNode.removeAttribute(RESULT_INDEX_ATTR);\n\n          (\"production\" !== process.env.NODE_ENV ? invariant(\n            !resultList.hasOwnProperty(resultIndex),\n            'Danger: Assigning to an already-occupied result index.'\n          ) : invariant(!resultList.hasOwnProperty(resultIndex)));\n\n          resultList[resultIndex] = renderNode;\n\n          // This should match resultList.length and markupList.length when\n          // we're done.\n          resultListAssignmentCount += 1;\n\n        } else if (\"production\" !== process.env.NODE_ENV) {\n          console.error(\n            \"Danger: Discarding unexpected node:\",\n            renderNode\n          );\n        }\n      }\n    }\n\n    // Although resultList was populated out of order, it should now be a dense\n    // array.\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      resultListAssignmentCount === resultList.length,\n      'Danger: Did not assign to every index of resultList.'\n    ) : invariant(resultListAssignmentCount === resultList.length));\n\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      resultList.length === markupList.length,\n      'Danger: Expected markup to render %s nodes, but rendered %s.',\n      markupList.length,\n      resultList.length\n    ) : invariant(resultList.length === markupList.length));\n\n    return resultList;\n  },\n\n  /**\n   * Replaces a node with a string of markup at its current position within its\n   * parent. The markup must render into a single root node.\n   *\n   * @param {DOMElement} oldChild Child node to replace.\n   * @param {string} markup Markup to render in place of the child node.\n   * @internal\n   */\n  dangerouslyReplaceNodeWithMarkup: function(oldChild, markup) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      ExecutionEnvironment.canUseDOM,\n      'dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a ' +\n      'worker thread. This is likely a bug in the framework. Please report ' +\n      'immediately.'\n    ) : invariant(ExecutionEnvironment.canUseDOM));\n    (\"production\" !== process.env.NODE_ENV ? invariant(markup, 'dangerouslyReplaceNodeWithMarkup(...): Missing markup.') : invariant(markup));\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      oldChild.tagName.toLowerCase() !== 'html',\n      'dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the ' +\n      '<html> node. This is because browser quirks make this unreliable ' +\n      'and/or slow. If you want to render to the root you must use ' +\n      'server rendering. See renderComponentToString().'\n    ) : invariant(oldChild.tagName.toLowerCase() !== 'html'));\n\n    var newChild = createNodesFromMarkup(markup, emptyFunction)[0];\n    oldChild.parentNode.replaceChild(newChild, oldChild);\n  }\n\n};\n\nmodule.exports = Danger;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule createNodesFromMarkup\n * @typechecks\n */\n\n/*jslint evil: true, sub: true */\n\nvar ExecutionEnvironment = require(\"./ExecutionEnvironment\");\n\nvar createArrayFrom = require(\"./createArrayFrom\");\nvar getMarkupWrap = require(\"./getMarkupWrap\");\nvar invariant = require(\"./invariant\");\n\n/**\n * Dummy container used to render all markup.\n */\nvar dummyNode =\n  ExecutionEnvironment.canUseDOM ? document.createElement('div') : null;\n\n/**\n * Pattern used by `getNodeName`.\n */\nvar nodeNamePattern = /^\\s*<(\\w+)/;\n\n/**\n * Extracts the `nodeName` of the first element in a string of markup.\n *\n * @param {string} markup String of markup.\n * @return {?string} Node name of the supplied markup.\n */\nfunction getNodeName(markup) {\n  var nodeNameMatch = markup.match(nodeNamePattern);\n  return nodeNameMatch && nodeNameMatch[1].toLowerCase();\n}\n\n/**\n * Creates an array containing the nodes rendered from the supplied markup. The\n * optionally supplied `handleScript` function will be invoked once for each\n * <script> element that is rendered. If no `handleScript` function is supplied,\n * an exception is thrown if any <script> elements are rendered.\n *\n * @param {string} markup A string of valid HTML markup.\n * @param {?function} handleScript Invoked once for each rendered <script>.\n * @return {array<DOMElement|DOMTextNode>} An array of rendered nodes.\n */\nfunction createNodesFromMarkup(markup, handleScript) {\n  var node = dummyNode;\n  (\"production\" !== process.env.NODE_ENV ? invariant(!!dummyNode, 'createNodesFromMarkup dummy not initialized') : invariant(!!dummyNode));\n  var nodeName = getNodeName(markup);\n\n  var wrap = nodeName && getMarkupWrap(nodeName);\n  if (wrap) {\n    node.innerHTML = wrap[1] + markup + wrap[2];\n\n    var wrapDepth = wrap[0];\n    while (wrapDepth--) {\n      node = node.lastChild;\n    }\n  } else {\n    node.innerHTML = markup;\n  }\n\n  var scripts = node.getElementsByTagName('script');\n  if (scripts.length) {\n    (\"production\" !== process.env.NODE_ENV ? invariant(\n      handleScript,\n      'createNodesFromMarkup(...): Unexpected <script> element rendered.'\n    ) : invariant(handleScript));\n    createArrayFrom(scripts).forEach(handleScript);\n  }\n\n  var nodes = createArrayFrom(node.childNodes);\n  while (node.lastChild) {\n    node.removeChild(node.lastChild);\n  }\n  return nodes;\n}\n\nmodule.exports = createNodesFromMarkup;\n\n}).call(this,require('_process'))","(function (process){\n/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule getMarkupWrap\n */\n\nvar ExecutionEnvironment = require(\"./ExecutionEnvironment\");\n\nvar invariant = require(\"./invariant\");\n\n/**\n * Dummy container used to detect which wraps are necessary.\n */\nvar dummyNode =\n  ExecutionEnvironment.canUseDOM ? document.createElement('div') : null;\n\n/**\n * Some browsers cannot use `innerHTML` to render certain elements standalone,\n * so we wrap them, render the wrapped nodes, then extract the desired node.\n *\n * In IE8, certain elements cannot render alone, so wrap all elements ('*').\n */\nvar shouldWrap = {\n  // Force wrapping for SVG elements because if they get created inside a <div>,\n  // they will be initialized in the wrong namespace (and will not display).\n  'circle': true,\n  'defs': true,\n  'ellipse': true,\n  'g': true,\n  'line': true,\n  'linearGradient': true,\n  'path': true,\n  'polygon': true,\n  'polyline': true,\n  'radialGradient': true,\n  'rect': true,\n  'stop': true,\n  'text': true\n};\n\nvar selectWrap = [1, '<select multiple=\"true\">', '</select>'];\nvar tableWrap = [1, '<table>', '</table>'];\nvar trWrap = [3, '<table><tbody><tr>', '</tr></tbody></table>'];\n\nvar svgWrap = [1, '<svg>', '</svg>'];\n\nvar markupWrap = {\n  '*': [1, '?<div>', '</div>'],\n\n  'area': [1, '<map>', '</map>'],\n  'col': [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],\n  'legend': [1, '<fieldset>', '</fieldset>'],\n  'param': [1, '<object>', '</object>'],\n  'tr': [2, '<table><tbody>', '</tbody></table>'],\n\n  'optgroup': selectWrap,\n  'option': selectWrap,\n\n  'caption': tableWrap,\n  'colgroup': tableWrap,\n  'tbody': tableWrap,\n  'tfoot': tableWrap,\n  'thead': tableWrap,\n\n  'td': trWrap,\n  'th': trWrap,\n\n  'circle': svgWrap,\n  'defs': svgWrap,\n  'ellipse': svgWrap,\n  'g': svgWrap,\n  'line': svgWrap,\n  'linearGradient': svgWrap,\n  'path': svgWrap,\n  'polygon': svgWrap,\n  'polyline': svgWrap,\n  'radialGradient': svgWrap,\n  'rect': svgWrap,\n  'stop': svgWrap,\n  'text': svgWrap\n};\n\n/**\n * Gets the markup wrap configuration for the supplied `nodeName`.\n *\n * NOTE: This lazily detects which wraps are necessary for the current browser.\n *\n * @param {string} nodeName Lowercase `nodeName`.\n * @return {?array} Markup wrap configuration, if applicable.\n */\nfunction getMarkupWrap(nodeName) {\n  (\"production\" !== process.env.NODE_ENV ? invariant(!!dummyNode, 'Markup wrapping node not initialized') : invariant(!!dummyNode));\n  if (!markupWrap.hasOwnProperty(nodeName)) {\n    nodeName = '*';\n  }\n  if (!shouldWrap.hasOwnProperty(nodeName)) {\n    if (nodeName === '*') {\n      dummyNode.innerHTML = '<link />';\n    } else {\n      dummyNode.innerHTML = '<' + nodeName + '></' + nodeName + '>';\n    }\n    shouldWrap[nodeName] = !dummyNode.firstChild;\n  }\n  return shouldWrap[nodeName] ? markupWrap[nodeName] : null;\n}\n\n\nmodule.exports = getMarkupWrap;\n\n}).call(this,require('_process'))","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule createArrayFrom\n * @typechecks\n */\n\nvar toArray = require(\"./toArray\");\n\n/**\n * Perform a heuristic test to determine if an object is \"array-like\".\n *\n *   A monk asked Joshu, a Zen master, \"Has a dog Buddha nature?\"\n *   Joshu replied: \"Mu.\"\n *\n * This function determines if its argument has \"array nature\": it returns\n * true if the argument is an actual array, an `arguments' object, or an\n * HTMLCollection (e.g. node.childNodes or node.getElementsByTagName()).\n *\n * It will return false for other array-like objects like Filelist.\n *\n * @param {*} obj\n * @return {boolean}\n */\nfunction hasArrayNature(obj) {\n  return (\n    // not null/false\n    !!obj &&\n    // arrays are objects, NodeLists are functions in Safari\n    (typeof obj == 'object' || typeof obj == 'function') &&\n    // quacks like an array\n    ('length' in obj) &&\n    // not window\n    !('setInterval' in obj) &&\n    // no DOM node should be considered an array-like\n    // a 'select' element has 'length' and 'item' properties on IE8\n    (typeof obj.nodeType != 'number') &&\n    (\n      // a real array\n      (// HTMLCollection/NodeList\n      (Array.isArray(obj) ||\n      // arguments\n      ('callee' in obj) || 'item' in obj))\n    )\n  );\n}\n\n/**\n * Ensure that the argument is an array by wrapping it in an array if it is not.\n * Creates a copy of the argument if it is already an array.\n *\n * This is mostly useful idiomatically:\n *\n *   var createArrayFrom = require('createArrayFrom');\n *\n *   function takesOneOrMoreThings(things) {\n *     things = createArrayFrom(things);\n *     ...\n *   }\n *\n * This allows you to treat `things' as an array, but accept scalars in the API.\n *\n * If you need to convert an array-like object, like `arguments`, into an array\n * use toArray instead.\n *\n * @param {*} obj\n * @return {array}\n */\nfunction createArrayFrom(obj) {\n  if (!hasArrayNature(obj)) {\n    return [obj];\n  } else if (Array.isArray(obj)) {\n    return obj.slice();\n  } else {\n    return toArray(obj);\n  }\n}\n\nmodule.exports = createArrayFrom;\n","(function (process){\n/**\n * Copyright 2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule toArray\n * @typechecks\n */\n\nvar invariant = require(\"./invariant\");\n\n/**\n * Convert array-like objects to arrays.\n *\n * This API assumes the caller knows the contents of the data type. For less\n * well defined inputs use createArrayFrom.\n *\n * @param {object|function|filelist} obj\n * @return {array}\n */\nfunction toArray(obj) {\n  var length = obj.length;\n\n  // Some browse builtin objects can report typeof 'function' (e.g. NodeList in\n  // old versions of Safari).\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    !Array.isArray(obj) &&\n    (typeof obj === 'object' || typeof obj === 'function'),\n    'toArray: Array-like object expected'\n  ) : invariant(!Array.isArray(obj) &&\n  (typeof obj === 'object' || typeof obj === 'function')));\n\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    typeof length === 'number',\n    'toArray: Object needs a length property'\n  ) : invariant(typeof length === 'number'));\n\n  (\"production\" !== process.env.NODE_ENV ? invariant(\n    length === 0 ||\n    (length - 1) in obj,\n    'toArray: Object should have keys for indices'\n  ) : invariant(length === 0 ||\n  (length - 1) in obj));\n\n  // Old IE doesn't give collections access to hasOwnProperty. Assume inputs\n  // without method will throw during the slice call and skip straight to the\n  // fallback.\n  if (obj.hasOwnProperty) {\n    try {\n      return Array.prototype.slice.call(obj);\n    } catch (e) {\n      // IE < 9 does not support Array#slice on collections objects\n    }\n  }\n\n  // Fall back to copying key by key. This assumes all keys have a value,\n  // so will not preserve sparsely populated inputs.\n  var ret = Array(length);\n  for (var ii = 0; ii < length; ii++) {\n    ret[ii] = obj[ii];\n  }\n  return ret;\n}\n\nmodule.exports = toArray;\n\n}).call(this,require('_process'))"]}