{"version":3,"sources":["webpack:///./app/scripts/components/PureCanvas.tsx","webpack:///./app/scripts/components/CanvasLayer.tsx","webpack:///./app/scripts/components/Places.tsx","webpack:///./app/scripts/components/SvgLayer.tsx","webpack:///./app/scripts/components/Tooltip.tsx","webpack:///./app/scripts/components/TooltipTable.tsx","webpack:///./app/scripts/colors.ts","webpack:///./app/scripts/utils/get-point.ts","webpack:///./app/scripts/vendor/flatqueue.js","webpack:///./app/scripts/vendor/flatbush.js","webpack:///./app/scripts/utils/prepare-topojson.ts","webpack:///./app/scripts/components/LayeredMap.tsx","webpack:///./app/scripts/utils/clamp.js","webpack:///./node_modules/topojson-client/src/identity.js","webpack:///./node_modules/topojson-client/src/transform.js","webpack:///./node_modules/topojson-client/src/feature.js","webpack:///./node_modules/topojson-client/src/reverse.js","webpack:///./node_modules/topojson-client/src/index.js","webpack:///./app/scripts/components/Contest.tsx","webpack:///./node_modules/d3-interpolate/src/basis.js","webpack:///./node_modules/d3-interpolate/src/color.js","webpack:///./node_modules/d3-interpolate/src/rgb.js","webpack:///./node_modules/d3-interpolate/src/basisClosed.js","webpack:///./node_modules/d3-interpolate/src/number.js","webpack:///./node_modules/d3-interpolate/src/numberArray.js","webpack:///./node_modules/d3-interpolate/src/array.js","webpack:///./node_modules/d3-interpolate/src/date.js","webpack:///./node_modules/d3-interpolate/src/object.js","webpack:///./node_modules/d3-interpolate/src/value.js","webpack:///./app/scripts/components/HeadshotCandidateRow.tsx","webpack:///./node_modules/d3-color/src/define.js","webpack:///./node_modules/d3-color/src/color.js","webpack:///./app/scripts/utils/format-percent.ts","webpack:///./config/modern-polyfills.js","webpack:///./app/scripts/components/Portal.js","webpack:///./app/scripts/kickstart.js","webpack:///./app/scripts/utils/select.js","webpack:///./app/scripts/utils/platform.ts","webpack:///./app/scripts/components/NewContestShowcase.tsx","webpack:///./app/scripts/vendor/idb-keyval.js","webpack:///../../src/util.js","webpack:///../../src/index.js","webpack:///./app/scripts/utils/debounce.js","webpack:///./app/scripts/utils/noop.js","webpack:///./app/scripts/components/Typeahead.js","webpack:///./app/scripts/components/YourRaces.js","webpack:///./app/scripts/utils/legislative-districts.js","webpack:///./app/scripts/ResultsApp.tsx","webpack:///./app/scripts/packs/main.js","webpack:///./node_modules/@turf/meta/main.es.js","webpack:///./node_modules/@turf/bbox/main.es.js","webpack:///./app/scripts/endpoints.ts","webpack:///./app/scripts/utils/load-json-script.js","webpack:///./node_modules/d3-collection/src/map.js","webpack:///./node_modules/d3-collection/src/set.js","webpack:///./node_modules/d3-collection/src/entries.js","webpack:///./node_modules/d3-collection/src/index.js","webpack:///./node_modules/@turf/bbox-polygon/main.es.js","webpack:///./node_modules/@turf/invariant/main.es.js","webpack:///./node_modules/@turf/boolean-point-in-polygon/main.es.js","webpack:///./app/scripts/components/CandidateRow.tsx","webpack:///./app/scripts/utils/select-all.js","webpack:///./node_modules/d3-interpolate/src/string.js","webpack:///./app/scripts/constants.ts","webpack:///./app/scripts/election-utils.ts","webpack:///./app/scripts/utils/get-json.js","webpack:///./node_modules/d3-geo/src/adder.js","webpack:///./node_modules/d3-geo/src/path/area.js","webpack:///./node_modules/d3-geo/src/path/centroid.js","webpack:///./node_modules/d3-geo/src/path/context.js","webpack:///./node_modules/d3-geo/src/path/measure.js","webpack:///./node_modules/d3-geo/src/path/string.js","webpack:///./node_modules/d3-geo/src/path/index.js","webpack:///./app/scripts/components/OtherCandidate.js","webpack:///./app/scripts/components/SeatPartyDivider.tsx","webpack:///./app/scripts/utils/sum-values.js","webpack:///./app/scripts/utils/shallow-equal.ts","webpack:///./app/scripts/components/PureComponent.tsx","webpack:///./node_modules/@babel/runtime/helpers/esm/extends.js","webpack:///./node_modules/d3-interpolate/src/constant.js","webpack:///./app/scripts/utils/find.ts","webpack:///./app/scripts/components/PartyPill.tsx","webpack:///./node_modules/@turf/helpers/main.es.js","webpack:///./node_modules/d3-scale/src/init.js","webpack:///./node_modules/d3-scale/src/array.js","webpack:///./node_modules/d3-interpolate/src/round.js","webpack:///./node_modules/d3-scale/src/number.js","webpack:///./node_modules/d3-scale/src/continuous.js","webpack:///./node_modules/d3-scale/src/constant.js","webpack:///./node_modules/d3-format/src/formatSpecifier.js","webpack:///./node_modules/d3-format/src/formatDecimal.js","webpack:///./node_modules/d3-format/src/formatPrefixAuto.js","webpack:///./node_modules/d3-format/src/defaultLocale.js","webpack:///./node_modules/d3-format/src/exponent.js","webpack:///./node_modules/d3-format/src/formatRounded.js","webpack:///./node_modules/d3-format/src/formatTypes.js","webpack:///./node_modules/d3-format/src/identity.js","webpack:///./node_modules/d3-format/src/locale.js","webpack:///./node_modules/d3-format/src/formatGroup.js","webpack:///./node_modules/d3-format/src/formatNumerals.js","webpack:///./node_modules/d3-format/src/formatTrim.js","webpack:///./node_modules/d3-format/src/precisionRound.js","webpack:///./node_modules/d3-scale/src/tickFormat.js","webpack:///./node_modules/d3-format/src/precisionPrefix.js","webpack:///./node_modules/d3-format/src/precisionFixed.js","webpack:///./node_modules/d3-scale/src/linear.js","webpack:///./node_modules/d3-time/src/interval.js","webpack:///./node_modules/d3-time/src/year.js","webpack:///./node_modules/d3-time/src/month.js","webpack:///./node_modules/d3-time/src/week.js","webpack:///./node_modules/d3-time/src/duration.js","webpack:///./node_modules/d3-time/src/day.js","webpack:///./node_modules/d3-time/src/hour.js","webpack:///./node_modules/d3-time/src/minute.js","webpack:///./node_modules/d3-time/src/second.js","webpack:///./node_modules/d3-time/src/millisecond.js","webpack:///./node_modules/d3-time/src/utcWeek.js","webpack:///./node_modules/d3-time/src/utcDay.js","webpack:///./node_modules/d3-time/src/utcYear.js","webpack:///./node_modules/d3-time-format/src/locale.js","webpack:///./node_modules/d3-time-format/src/defaultLocale.js","webpack:///./node_modules/d3-scale/src/time.js","webpack:///./node_modules/d3-time/src/utcMonth.js","webpack:///./node_modules/d3-time/src/utcHour.js","webpack:///./node_modules/d3-time/src/utcMinute.js","webpack:///./node_modules/d3-scale/src/index.js"],"names":["PureCanvas","Component","shouldComponentUpdate","render","style","this","props","ref","canvas","contextRef","getContext","defaultProps","CanvasLayer","PureComponent","constructor","super","setContextRef","bind","ctx","draw","geoPath","pixelRatio","scaleCanvas","width","height","window","devicePixelRatio","scale","updateCanvas","componentDidMount","d3GeoPath","projection","componentDidUpdate","position","top","left","zIndex","Places","places","class","map","place","idx","key","transform","centroid","dx","properties","dy","text-anchor","anchor","name","SvgLayer","handleMouseMove","handleMouseLeave","event","onMouseMove","onMouseLeave","setState","strokeLinecap","strokeLinejoin","pointerEvents","viewBox","preserveAspectRatio","state","Tooltip","cls","isHidden","tooltipRef","klass","cx","Portal","children","TooltipTable","candidatesMap","county","candidatesRender","firstThreeResults","entries","results","sort","a","b","value","slice","formatPercent","county_pollinglocationsreporting","total_county_pollinglocations","CandidateRow","countyHeader","result","candidate","get","candColor","filter","cand","id","ballotName","candidateId","contestIsCalled","candidateColor","isIncumbent","is_incumbent","isWinner","is_winner","party","totalVotesInContest","total_votes","votes","getPoint","node","x","y","rect","getBoundingClientRect","clientLeft","clientTop","FlatQueue","ids","values","length","clear","push","pos","parent","parentValue","pop","halfLength","right","bestIndex","bestValue","rightValue","peek","peekValue","ARRAY_TYPES","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","Flatbush","data","ArrayBuffer","Error","magic","versionAndType","nodeSize","numItems","ArrayType","undefined","isNaN","Math","min","max","n","numNodes","_levelBounds","ceil","IndexArrayType","arrayTypeIndex","indexOf","nodesByteSize","BYTES_PER_ELEMENT","_boxes","_indices","_pos","minX","minY","maxX","maxY","Infinity","set","_queue","add","index","finish","hilbertValues","i","floor","hilbert","boxes","indices","pivot","j","swap","end","nodeMinX","nodeMinY","nodeMaxX","nodeMaxY","nodeIndex","search","filterFn","level","queue","neighbors","maxResults","maxDistance","q","maxDistSquared","upperBound","axisDist","dist","k","arr","m","temp","c","d","e","A","B","C","D","i0","i1","prepareTopoJSON","topology","object","objects","Object","keys","roadsObject","placesObject","urbanAreasObject","collection","feature","roads","urban_areas","bbox","getBBox","features","forEach","bounds","heightRatio","relocateTooltip","tooltip","innerWidth","innerHeight","LayeredMap","activeGeometry","candidatesOnMap","geos","includesNoResult","includesTie","onDocumentTouch","getTooltipRef","canvasRenderer","xScale","scaleLinear","yScale","el","setUpCountyMap","counties","countyMap","fips","setUpCandidateMap","candidates","candidateMap","clientX","clientY","target","point","coords","invert","found","find","booleanPointInPolygon","activeCounty","base","contains","embedType","clearRect","fillStyle","sortedResults","leader","second","leadingId","beginPath","fill","closePath","lineCap","lineJoin","strokeStyle","lineWidth","stroke","places_mappable","embedTypeUsable","includes","arc","PI","componentWillReceiveProps","nextProps","getContainerDimensions","offsetWidth","rawWidth","clientWidth","domain","range","fitSize","bboxPolygon","document","addEventListener","precinctsReporting","totalVotes","boxSizing","stroke-width","totalPrecincts","invisible","Boolean","identity","x0","y0","kx","ky","translate","input","output","Array","o","type","geometries","geometry","transformPoint","arcs","points","array","t","reverse","p","line","ring","polygon","coordinates","converter","process","PreactHTMLConverter","Contest","directory_slug","contest","flags","columnCount","contestTitle","isShowcaseRace","includeCountyRundown","renderParty","renderCandidate","tableHeader","broadcastHeaderImage","activeContestId","IsFlagged","division_type","get_directory_slug","office","rowClass","seat__races","seat__highlight_races","titleClass","seat__title","isPartner","href","rel","src","alt","title","xlinkHref","convert","visibleCandidatesCount","basis","t1","v0","v1","v2","v3","t2","t3","linear","gamma","nogamma","pow","exponential","constant","rgbGamma","color","rgb","start","r","colorRgb","g","opacity","rgbSpline","spline","colors","isNumberArray","isView","DataView","genericArray","nb","na","Date","setTime","number","string","date","numberArray","isArray","valueOf","toString","HeadshotCandidateRow","getColor","delegate_count","isViewable","delegate_num","candidateColors","divStyle","obj","checkStyle","delegate","IsDroppedOut","checkClass","intcomma","SHOW_DELEGATES","isCalled","Header","colSpan","Header_Prez","factory","prototype","extend","definition","create","Color","reI","reN","reP","reHex","reRgbInteger","RegExp","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","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","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","color_formatHex","formatHex","color_formatRgb","formatRgb","format","l","trim","toLowerCase","exec","parseInt","rgbn","Rgb","rgba","hsla","hasOwnProperty","NaN","rgbConvert","arguments","rgb_formatHex","hex","rgb_formatRgb","round","h","s","Hsl","hslConvert","hsl2rgb","m1","m2","define","copy","channels","assign","displayable","formatHsl","brighter","darker","toFixed","require","renderPortal","componentWillUnmount","defaultNode","body","removeChild","portal","createElement","appendChild","ttData","relatedContentContainer","getElementById","gutenTag","then","default","RelatedContent","ribbonContainer","Ribbon","AdLoader","init","select","context","querySelector","userAgent","navigator","isIE","test","ContestShowcase","geoIdentity","reflectY","container","contestContainer","mapContainer","countiesContainer","delegates","shouldDisplay5Candidates","visibleCandidates","headerUsed","candidacies","presidentCandidateColors","senateCandidateColors","_contestPortal","determineContestTitle","SeatPartyDivider","partyName","partyBallot","viewAllCandidates","is_called","_mapPortal","precincts_reporting","store","Store","dbName","storeName","_dbp","Promise","resolve","reject","openreq","indexedDB","open","onerror","error","onsuccess","onupgradeneeded","createObjectStore","_withIDBStore","callback","db","transaction","oncomplete","onabort","objectStore","getDefaultStore","getScroll","w","ret","method","getScrollLeft","getScrollTop","getOffset","elem","doc","docElem","box","getClientPosition","_RE_NUM_NO_PX","RE_POS","each","fn","isBorderBoxFn","getComputedStyleX","computedStyle_","val","computedStyle","rsLeft","BOX_MODELS","options","old","getPBMWidth","which","prop","cssProp","parseFloat","isWindow","domUtils","getWH","extra","borderBoxValue","isBorderBox","cssBoxValue","Number","borderBoxValueOrIsBorderBox","padding","refWin","win","documentElementProp","cssShow","visibility","display","getWHIgnoreDisplay","args","css","v","first","includeMargin","getWindow","offset","current","setOffset","clone","scrollLeft","scrollTop","viewportWidth","viewportHeight","config","util","allowHorizontalScroll","onlyScrollIfNeeded","alignWithTop","alignWithLeft","offsetTop","offsetLeft","offsetBottom","offsetRight","isWin","elemOffset","eh","ew","wh","ww","winScroll","diffTop","diffBottom","containerScroll","containerOffset","ch","cw","debounce","func","wait","immediate","timeout","timestamp","later","last","now","setTimeout","apply","callNow","Typeahead","highlightedIndex","isOpen","handleOnBlur","handleOnClear","handleOnFocus","handleOnInput","debouncedHandleOnInput","debounceDuration","handleKeyDown","setInputRef","setMenuRef","setItemRef","listRefs","_","prevState","count","getFilteredItems","maybeScrollItemIntoView","element","inputRef","menuRef","itemNode","menuNode","scrollIntoView","items","shouldItemRender","sortItems","item","highlightItemOnMouseEnter","selectItemOnClick","getItemValue","onSelect","blur","renderList","onMouseDown","preventDefault","cloneElement","renderItem","onClick","onMouseEnter","renderAttribution","onClear","onBlur","inputProps","onFocus","onChange","keyEvents","call","renderInput","role","String","autocomplete","onInput","onKeyDown","aria-label","aria-hidden","noop","ArrowDown","itemsCount","newIndex","ArrowUp","Enter","keyCode","setSelectionRange","Escape","sessionToken","google","maps","AutocompleteSessionToken","autocompleteService","AutocompleteService","east","west","south","north","componentRestrictions","country","types","YourRaces","contests","lookupError","lookupPending","lookedFoundStored","handleGeocode","debouncedHandleGeocode","getPlacePredictions","predict","status","getPredictions","catch","placeId","placesService","getDetails","fields","lat","latitude","lng","longitude","location","toJSON","getJSON","includeGeography","LOOKUP_URL","lookup","put","PlacesService","req","addressFeedback","matches","sboe","flagMatches","office_division","us_house","district","tx_senate","tx_house","for","placeholder","description","place_id","isHighlighted","_resultsPortal","office_slug","determineContestTitleYourRaces","App","timer","fetchData","console","info","RESULTS_IN_USE","startTimer","LENGTH_OF_CHECK_INTERVAL","clearTimer","clearTimeout","countdown","seats_mapped","propertyName","unique_seats","findIndex","_yourPortal","NewContestShowcase","_usPortal","_supremePortal","_sboePortal","_crimPortal","_senatePortal","_housePortal","loadJsonScript","appNav","appNavHeight","filterSelection","querySelectorAll","w3RemoveClass","getElementsByClassName","w3AddClass","arr1","arr2","className","split","splice","join","selectAll","getAttribute","scrollTo","pageYOffset","btnContainer","btns","path","composedPath","replace","coordEach","geojson","excludeWrapCoord","stopG","geometryMaybeCollection","isGeometryCollection","wrapShrink","coordIndex","isFeatureCollection","isFeature","stop","featureIndex","geomIndex","multiFeatureIndex","geometryIndex","geomType","BBox","coord","HOMEPAGE_URL","STORY_API_URL","elementId","JSON","parse","textContent","Map","f","has","remove","property","size","empty","Set","proto","validateBBox","lowLeft","topLeft","topRight","lowRight","getCoords","containsNumber","isNumber","inRing","pt","ignoreBoundary","isInside","xi","yi","xj","yj","getCoord","polys","inBBox","insidePoly","inHole","Node","Window","reA","reB","source","am","bm","bs","bi","lastIndex","one","zero","PARTY_SORT_ORDER","TT_directory_slugs","slug","sort_candidates_by_party","minutes","getTime","int","setInterval","countdown_div","remaining","innerHTML","clearInterval","seconds","num","determineDistrictTitle","capfirst","jsonResponse","res","ok","statusText","json","fetch","Adder","reset","adder","bv","av","x00","y00","areaSum","areaRingSum","areaStream","lineStart","lineEnd","polygonStart","areaRingStart","areaRingEnd","polygonEnd","abs","area","areaPointFirst","areaPoint","X0","Y0","Z0","X1","Y1","Z1","X2","Y2","Z2","centroidStream","centroidPoint","centroidLineStart","centroidLineEnd","centroidRingStart","centroidRingEnd","centroidPointFirstLine","centroidPointLine","z","sqrt","centroidPointFirstRing","centroidPointRing","PathContext","_context","_radius","pointRadius","_line","_point","moveTo","lineTo","tau","lengthRing","lengthSum","lengthStream","lengthPointFirst","lengthPoint","PathString","_string","circle","radius","_circle","projectionStream","contextStream","stream","pathArea","measure","pathMeasure","pathBounds","pathCentroid","OtherCandidate","candidateCount","showDelegates","classes","onViewableToggle","isHomepage","shouldDisplayResult","contest_result","reduce","acc","contestCalledClass","contestResults","precinctsClass","countdownClass","pollinglocationsreporting","total_pollinglocations","pollinglocations_reporting_percent","hOP","is","shallowEqual","objA","objB","keysA","keysB","_extends","predicate","TypeError","PartyPill","excludeInitial","partyPrefix","partyInitial","toUpperCase","memoize","isObject","validateId","feat","lineString","initRange","unit","normalize","clamper","bimap","interpolate","d0","d1","r0","r1","polymap","bisect","clamp","unknown","transformer","untransform","piecewise","interpolateValue","rescale","interpolateNumber","rangeRound","interpolateRound","u","continuous","re","formatSpecifier","specifier","match","FormatSpecifier","align","sign","symbol","comma","precision","prefixExponent","locale","formatPrefix","toExponential","coefficient","formatDecimal","exponent","toPrecision","formatRounded","prefixes","grouping","thousands","group","substring","currencyPrefix","currency","currencySuffix","decimal","numerals","formatNumerals","percent","minus","nan","newFormat","formatTypes","prefix","suffix","formatType","maybeSuffix","valuePrefix","valueSuffix","valueNegative","out","formatTrim","charCodeAt","formatLocale","step","tickStep","precisionPrefix","precisionRound","precisionFixed","linearish","ticks","tickFormat","nice","tickIncrement","t0","newInterval","floori","offseti","field","interval","previous","every","isFinite","year","setMonth","setHours","setFullYear","getFullYear","month","setDate","getMonth","weekday","getDate","getDay","getTimezoneOffset","sunday","monday","tuesday","wednesday","thursday","friday","saturday","day","hour","getMilliseconds","getSeconds","getMinutes","getHours","minute","getUTCSeconds","millisecond","utcWeekday","setUTCDate","getUTCDate","getUTCDay","setUTCHours","utcSunday","utcMonday","utcTuesday","utcWednesday","utcThursday","utcFriday","utcSaturday","utcDay","utcYear","setUTCMonth","setUTCFullYear","getUTCFullYear","localDate","H","M","S","L","utcDate","UTC","newDate","pads","numberRe","percentRe","requoteRe","pad","requote","formatRe","names","formatLookup","parseWeekdayNumberSunday","parseWeekdayNumberMonday","parseWeekNumberSunday","U","parseWeekNumberISO","V","parseWeekNumberMonday","W","parseFullYear","parseYear","parseZone","Z","parseQuarter","parseMonthNumber","parseDayOfMonth","parseDayOfYear","parseHour24","parseMinutes","parseSeconds","parseMilliseconds","parseMicroseconds","parseLiteralPercent","parseUnixTimestamp","Q","parseUnixTimestampSeconds","formatDayOfMonth","formatHour24","formatHour12","formatDayOfYear","timeDay","timeYear","formatMilliseconds","formatMicroseconds","formatMonthNumber","formatMinutes","formatSeconds","formatWeekdayNumberMonday","formatWeekNumberSunday","timeSunday","formatWeekNumberISO","timeThursday","formatWeekdayNumberSunday","formatWeekNumberMonday","timeMonday","formatYear","formatFullYear","formatZone","formatUTCDayOfMonth","formatUTCHour24","getUTCHours","formatUTCHour12","formatUTCDayOfYear","formatUTCMilliseconds","getUTCMilliseconds","formatUTCMicroseconds","formatUTCMonthNumber","getUTCMonth","formatUTCMinutes","getUTCMinutes","formatUTCSeconds","formatUTCWeekdayNumberMonday","dow","formatUTCWeekNumberSunday","formatUTCWeekNumberISO","formatUTCWeekdayNumberSunday","formatUTCWeekNumberMonday","formatUTCYear","formatUTCFullYear","formatUTCZone","formatLiteralPercent","formatUnixTimestamp","formatUnixTimestampSeconds","locale_dateTime","dateTime","locale_date","locale_time","time","locale_periods","periods","locale_weekdays","days","locale_shortWeekdays","shortDays","locale_months","months","locale_shortMonths","shortMonths","periodRe","periodLookup","weekdayRe","weekdayLookup","shortWeekdayRe","shortWeekdayLookup","monthRe","monthLookup","shortMonthRe","shortMonthLookup","formats","utcFormats","parses","parseSpecifier","charAt","newParse","week","X","utcFormat","utcParse","defaultLocale","utcMonth","utcHour","setUTCMinutes","utcMinute","setUTCSeconds"],"mappings":"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","file":"main.c276e0c8a3.mjs","sourcesContent":["import { Component, h } from 'preact';\n\ninterface Props {\n  style?: any;\n  contextRef: (\n    context: CanvasRenderingContext2D,\n    canvas: HTMLCanvasElement\n  ) => void;\n}\n\nclass PureCanvas extends Component<Props> {\n  shouldComponentUpdate() {\n    return false;\n  }\n\n  render() {\n    return (\n      <canvas\n        style={this.props.style}\n        ref={canvas =>\n          canvas ? this.props.contextRef(canvas.getContext('2d'), canvas) : null\n        }\n      />\n    );\n  }\n}\n\nPureCanvas.defaultProps = {\n  style: {},\n};\n\nexport default PureCanvas;\n","import {\n  geoPath as d3GeoPath,\n  GeoPath,\n  GeoProjection,\n  GeoIdentityTransform,\n} from 'd3-geo';\nimport { h } from 'preact';\n\nimport PureComponent from './PureComponent';\nimport PureCanvas from './PureCanvas';\n\nexport interface CanvasLayerProps {\n  projection: GeoProjection | GeoIdentityTransform;\n  width: number;\n  height: number;\n  render: (\n    ctx: CanvasRenderingContext2D,\n    geoPath: GeoPath,\n    pixelRatio: number\n  ) => void;\n}\n\nclass CanvasLayer extends PureComponent<CanvasLayerProps> {\n  ctx!: CanvasRenderingContext2D;\n  canvas!: HTMLCanvasElement;\n  geoPath!: GeoPath;\n  pixelRatio!: number;\n\n  constructor() {\n    super();\n\n    this.setContextRef = this.setContextRef.bind(this);\n  }\n\n  setContextRef(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement) {\n    this.ctx = ctx;\n    this.canvas = canvas;\n  }\n\n  draw() {\n    const ctx = this.ctx;\n    const geoPath = this.geoPath;\n    const pixelRatio = this.pixelRatio;\n    const { render } = this.props;\n\n    render(ctx, geoPath, pixelRatio);\n  }\n\n  scaleCanvas(\n    canvas: HTMLCanvasElement,\n    ctx: CanvasRenderingContext2D,\n    width: number,\n    height: number\n  ) {\n    const pixelRatio = window.devicePixelRatio || 1;\n    this.pixelRatio = pixelRatio;\n\n    canvas.width = width * pixelRatio;\n    canvas.height = height * pixelRatio;\n\n    canvas.style.width = `${width}px`;\n    canvas.style.height = `${height}px`;\n\n    ctx.scale(pixelRatio, pixelRatio);\n  }\n\n  updateCanvas() {\n    this.scaleCanvas(\n      this.canvas,\n      this.ctx,\n      this.props.width,\n      this.props.height\n    );\n    this.draw();\n  }\n\n  componentDidMount() {\n    // we cannot set up our geoPath until we have a context\n    this.geoPath = d3GeoPath(this.props.projection, this.ctx);\n\n    this.updateCanvas();\n  }\n\n  componentDidUpdate() {\n    this.updateCanvas();\n  }\n\n  render() {\n    return (\n      <PureCanvas\n        style={{ position: 'absolute', top: 0, left: 0, zIndex: 1 }}\n        contextRef={this.setContextRef}\n      />\n    );\n  }\n}\n\nexport default CanvasLayer;\n","import { h } from 'preact';\nimport { GeoPath } from 'd3';\nimport PureComponent from './PureComponent';\nimport { Feature } from 'geojson';\n\nclass Places extends PureComponent<{ geoPath: GeoPath; places: Feature[] }> {\n  render() {\n    const { geoPath, places } = this.props;\n    \n    return (\n      <g class=\"places\">\n        <g class=\"place-background-labels\">\n          {places.map((place, idx) => (\n            <text\n              key={`bg-${idx}`}\n              class=\"place-background-label\"\n              transform={`translate(${geoPath.centroid(place)})`}\n              dx={place.properties.dx}\n              dy={place.properties.dy}\n              text-anchor={place.properties.anchor}\n            >\n              {place.properties.name}\n            </text>\n          ))}\n        </g>\n        <g class=\"place-labels\">\n          {places.map((place, idx) => (\n            <text\n              key={`fg-${idx}`}\n              class=\"place-label\"\n              transform={`translate(${geoPath.centroid(place)})`}\n              dx={place.properties.dx}\n              dy={place.properties.dy}\n              text-anchor={place.properties.anchor}\n            >\n              {place.properties.name}\n            </text>\n          ))}\n        </g>\n      </g>\n    );\n  }\n}\n\nexport default Places;","import {\n  geoPath as d3GeoPath,\n  GeoPath,\n  GeoIdentityTransform,\n  GeoProjection,\n} from 'd3-geo';\nimport { Component, h, VNode } from 'preact';\n\nimport PureComponent from './PureComponent';\n\nexport interface SvgLayerProps {\n  projection: GeoProjection | GeoIdentityTransform;\n  width: number;\n  height: number;\n  render: (state: SvgLayerState) => VNode | null;\n  onMouseMove?: (event: MouseEvent) => void;\n  onMouseLeave?: (event: MouseEvent) => void;\n}\n\ninterface SvgLayerState {\n  geoPath: GeoPath;\n}\n\nclass SvgLayer extends PureComponent<SvgLayerProps, SvgLayerState> {\n  constructor() {\n    super();\n\n    this.handleMouseMove = this.handleMouseMove.bind(this);\n    this.handleMouseLeave = this.handleMouseLeave.bind(this);\n  }\n\n  handleMouseMove(event: MouseEvent) {\n    const { onMouseMove } = this.props;\n\n    if (onMouseMove) {\n      onMouseMove(event);\n    } else {\n      return;\n    }\n  }\n\n  handleMouseLeave(event: MouseEvent) {\n    const { onMouseLeave } = this.props;\n\n    if (onMouseLeave) {\n      onMouseLeave(event);\n    }\n  }\n\n  componentDidMount() {\n    const geoPath = d3GeoPath(this.props.projection);\n\n    this.setState({ geoPath });\n  }\n\n  render() {\n    const { width, height } = this.props;\n\n    return (\n      <svg\n        width={width}\n        height={height}\n        style={{\n          position: 'relative',\n          top: 0,\n          left: 0,\n          zIndex: 2,\n          strokeLinecap: 'round',\n          strokeLinejoin: 'round',\n          pointerEvents: 'none',\n        }}\n        viewBox={`0 0 ${width} ${height}`}\n        preserveAspectRatio=\"xMidYMid\"\n        onMouseMove={this.handleMouseMove}\n        onMouseLeave={this.handleMouseLeave}\n      >\n        <g>{this.props.render(this.state)}</g>\n      </svg>\n    );\n  }\n}\n\nexport default SvgLayer;\n","import cx from 'classnames';\nimport { h } from 'preact';\n\nimport Portal from './Portal';\n\ninterface Props {\n  class: string;\n  tooltipRef(any): void;\n  style?: { [key: string]: string };\n  isHidden?: boolean;\n}\n\nfunction Tooltip({ class: cls, style, isHidden, tooltipRef }: Props) {\n  const klass = cx(cls, { 'display-none': isHidden });\n\n  return (\n    <Portal>\n      <div class={klass} style={style} ref={tooltipRef}>\n        {this.props.children}\n      </div>\n    </Portal>\n  );\n}\n\nTooltip.defaultProps = {\n  class: 'tooltip',\n  isHidden: false,\n};\n\nexport default Tooltip;\n","// packages\nimport { entries } from 'd3-collection';\nimport { intcomma } from 'journalize';\nimport { h } from 'preact';\n\n// components\nimport CandidateRow from './CandidateRow';\nimport PureComponent from './PureComponent';\n\n// internal\nimport formatPercent from '../utils/format-percent';\n\nclass TooltipTable extends PureComponent<any> {\n  render() {\n    const { candidatesMap, county, candidatesRender } = this.props;\n\n    const sortedResults = entries(county.results).sort(\n      (a, b) => b.value - a.value\n    );\n\n    \n\n    const firstThreeResults = sortedResults.slice(0, 3);\n\n\n    return (\n      <div class=\"contest\">\n        <table class=\"contest__candidates contest__candidates--tooltip\">\n          <caption>\n            <p class=\"contest__title\">{county.county} County</p>\n            <div class=\"contest__metrics\">\n              <p class=\"contest__precincts\">\n                {`${formatPercent(\n                  county.county_pollinglocationsreporting,\n                  county.total_county_pollinglocations\n                )}% reporting`}\n              </p>\n            </div>\n          </caption>\n          {CandidateRow.countyHeader}\n          <tbody>\n            {firstThreeResults.map(result => {\n              const candidate = candidatesMap.get(result.key);\n\n              const candColor = candidatesRender.filter(cand => cand.id  == candidate.id);\n\n              return (\n                <CandidateRow\n                  key={candidate.id}\n                  ballotName={candidate.name}\n                  candidateId={candidate.id}\n                  contestIsCalled={false}\n                  candidateColor={candColor[0]['color']}\n                  isIncumbent={candidate.is_incumbent}\n                  isWinner={candidate.is_winner}\n                  party={candidate.party}\n                  totalVotesInContest={county.total_votes}\n                  votes={result.value}\n                />\n              );\n            })}\n          </tbody>\n        </table>\n      </div>\n    );\n  }\n}\n\nexport default TooltipTable;\n","const DEMOCRAT = [\n  '#1755c5',\n  '#ffc200',\n  '#91dfe5',\n  '#fcbec3',\n  '#5acc7d',\n  '#182b4b',\n];\n\n\nconst OTHER = '#888888'\n\nconst NEUTRAL = '#F2F2F2';\nconst TIE = '#999999';\n\nexport { DEMOCRAT, NEUTRAL, TIE, OTHER };\n","function getPoint(node: HTMLElement, x: number, y: number): [number, number] {\n  const rect = node.getBoundingClientRect();\n  return [x - rect.left - node.clientLeft, y - rect.top - node.clientTop];\n}\n\nexport default getPoint;\n","export default class FlatQueue {\n  constructor() {\n    this.ids = [];\n    this.values = [];\n    this.length = 0;\n  }\n\n  clear() {\n    this.length = this.ids.length = this.values.length = 0;\n  }\n\n  push(id, value) {\n    this.ids.push(id);\n    this.values.push(value);\n\n    let pos = this.length++;\n    while (pos > 0) {\n      const parent = (pos - 1) >> 1;\n      const parentValue = this.values[parent];\n      if (value >= parentValue) break;\n      this.ids[pos] = this.ids[parent];\n      this.values[pos] = parentValue;\n      pos = parent;\n    }\n\n    this.ids[pos] = id;\n    this.values[pos] = value;\n  }\n\n  pop() {\n    if (this.length === 0) return undefined;\n\n    const top = this.ids[0];\n    this.length--;\n\n    if (this.length > 0) {\n      const id = (this.ids[0] = this.ids[this.length]);\n      const value = (this.values[0] = this.values[this.length]);\n      const halfLength = this.length >> 1;\n      let pos = 0;\n\n      while (pos < halfLength) {\n        let left = (pos << 1) + 1;\n        const right = left + 1;\n        let bestIndex = this.ids[left];\n        let bestValue = this.values[left];\n        const rightValue = this.values[right];\n\n        if (right < this.length && rightValue < bestValue) {\n          left = right;\n          bestIndex = this.ids[right];\n          bestValue = rightValue;\n        }\n        if (bestValue >= value) break;\n\n        this.ids[pos] = bestIndex;\n        this.values[pos] = bestValue;\n        pos = left;\n      }\n\n      this.ids[pos] = id;\n      this.values[pos] = value;\n    }\n\n    this.ids.pop();\n    this.values.pop();\n\n    return top;\n  }\n\n  peek() {\n    return this.ids[0];\n  }\n\n  peekValue() {\n    return this.values[0];\n  }\n}\n","import FlatQueue from './flatqueue';\n\nconst ARRAY_TYPES = [\n  Int8Array,\n  Uint8Array,\n  Uint8ClampedArray,\n  Int16Array,\n  Uint16Array,\n  Int32Array,\n  Uint32Array,\n  Float32Array,\n  Float64Array,\n];\n\nconst VERSION = 3; // serialized format version\n\nexport default class Flatbush {\n  static from(data) {\n    if (!(data instanceof ArrayBuffer)) {\n      throw new Error('Data must be an instance of ArrayBuffer.');\n    }\n    const [magic, versionAndType] = new Uint8Array(data, 0, 2);\n    if (magic !== 0xfb) {\n      throw new Error('Data does not appear to be in a Flatbush format.');\n    }\n    if (versionAndType >> 4 !== VERSION) {\n      throw new Error(\n        `Got v${versionAndType >> 4} data when expected v${VERSION}.`\n      );\n    }\n    const [nodeSize] = new Uint16Array(data, 2, 1);\n    const [numItems] = new Uint32Array(data, 4, 1);\n\n    return new Flatbush(\n      numItems,\n      nodeSize,\n      ARRAY_TYPES[versionAndType & 0x0f],\n      data\n    );\n  }\n\n  constructor(numItems, nodeSize = 16, ArrayType = Float64Array, data) {\n    if (numItems === undefined)\n      throw new Error('Missing required argument: numItems.');\n    if (isNaN(numItems) || numItems <= 0)\n      throw new Error(`Unpexpected numItems value: ${numItems}.`);\n\n    this.numItems = +numItems;\n    this.nodeSize = Math.min(Math.max(+nodeSize, 2), 65535);\n\n    // calculate the total number of nodes in the R-tree to allocate space for\n    // and the index of each tree level (used in search later)\n    let n = numItems;\n    let numNodes = n;\n    this._levelBounds = [n * 4];\n    do {\n      n = Math.ceil(n / this.nodeSize);\n      numNodes += n;\n      this._levelBounds.push(numNodes * 4);\n    } while (n !== 1);\n\n    this.ArrayType = ArrayType || Float64Array;\n    this.IndexArrayType = numNodes < 16384 ? Uint16Array : Uint32Array;\n\n    const arrayTypeIndex = ARRAY_TYPES.indexOf(this.ArrayType);\n    const nodesByteSize = numNodes * 4 * this.ArrayType.BYTES_PER_ELEMENT;\n\n    if (arrayTypeIndex < 0) {\n      throw new Error(`Unexpected typed array class: ${ArrayType}.`);\n    }\n\n    if (data && data instanceof ArrayBuffer) {\n      this.data = data;\n      this._boxes = new this.ArrayType(this.data, 8, numNodes * 4);\n      this._indices = new this.IndexArrayType(\n        this.data,\n        8 + nodesByteSize,\n        numNodes\n      );\n\n      this._pos = numNodes * 4;\n      this.minX = this._boxes[this._pos - 4];\n      this.minY = this._boxes[this._pos - 3];\n      this.maxX = this._boxes[this._pos - 2];\n      this.maxY = this._boxes[this._pos - 1];\n    } else {\n      this.data = new ArrayBuffer(\n        8 + nodesByteSize + numNodes * this.IndexArrayType.BYTES_PER_ELEMENT\n      );\n      this._boxes = new this.ArrayType(this.data, 8, numNodes * 4);\n      this._indices = new this.IndexArrayType(\n        this.data,\n        8 + nodesByteSize,\n        numNodes\n      );\n      this._pos = 0;\n      this.minX = Infinity;\n      this.minY = Infinity;\n      this.maxX = -Infinity;\n      this.maxY = -Infinity;\n\n      new Uint8Array(this.data, 0, 2).set([\n        0xfb,\n        (VERSION << 4) + arrayTypeIndex,\n      ]);\n      new Uint16Array(this.data, 2, 1)[0] = nodeSize;\n      new Uint32Array(this.data, 4, 1)[0] = numItems;\n    }\n\n    // a priority queue for k-nearest-neighbors queries\n    this._queue = new FlatQueue();\n  }\n\n  add(minX, minY, maxX, maxY) {\n    const index = this._pos >> 2;\n    this._indices[index] = index;\n    this._boxes[this._pos++] = minX;\n    this._boxes[this._pos++] = minY;\n    this._boxes[this._pos++] = maxX;\n    this._boxes[this._pos++] = maxY;\n\n    if (minX < this.minX) this.minX = minX;\n    if (minY < this.minY) this.minY = minY;\n    if (maxX > this.maxX) this.maxX = maxX;\n    if (maxY > this.maxY) this.maxY = maxY;\n  }\n\n  finish() {\n    if (this._pos >> 2 !== this.numItems) {\n      throw new Error(\n        `Added ${this._pos >> 2} items when expected ${this.numItems}.`\n      );\n    }\n\n    const width = this.maxX - this.minX;\n    const height = this.maxY - this.minY;\n    const hilbertValues = new Uint32Array(this.numItems);\n    const hilbertMax = (1 << 16) - 1;\n\n    // map item centers into Hilbert coordinate space and calculate Hilbert values\n    for (let i = 0; i < this.numItems; i++) {\n      let pos = 4 * i;\n      const minX = this._boxes[pos++];\n      const minY = this._boxes[pos++];\n      const maxX = this._boxes[pos++];\n      const maxY = this._boxes[pos++];\n      const x = Math.floor(\n        (hilbertMax * ((minX + maxX) / 2 - this.minX)) / width\n      );\n      const y = Math.floor(\n        (hilbertMax * ((minY + maxY) / 2 - this.minY)) / height\n      );\n      hilbertValues[i] = hilbert(x, y);\n    }\n\n    // sort items by their Hilbert value (for packing later)\n    sort(hilbertValues, this._boxes, this._indices, 0, this.numItems - 1);\n\n    // generate nodes at each tree level, bottom-up\n    for (let i = 0, pos = 0; i < this._levelBounds.length - 1; i++) {\n      const end = this._levelBounds[i];\n\n      // generate a parent node for each block of consecutive <nodeSize> nodes\n      while (pos < end) {\n        let nodeMinX = Infinity;\n        let nodeMinY = Infinity;\n        let nodeMaxX = -Infinity;\n        let nodeMaxY = -Infinity;\n        const nodeIndex = pos;\n\n        // calculate bbox for the new node\n        for (let i = 0; i < this.nodeSize && pos < end; i++) {\n          const minX = this._boxes[pos++];\n          const minY = this._boxes[pos++];\n          const maxX = this._boxes[pos++];\n          const maxY = this._boxes[pos++];\n          if (minX < nodeMinX) nodeMinX = minX;\n          if (minY < nodeMinY) nodeMinY = minY;\n          if (maxX > nodeMaxX) nodeMaxX = maxX;\n          if (maxY > nodeMaxY) nodeMaxY = maxY;\n        }\n\n        // add the new node to the tree data\n        this._indices[this._pos >> 2] = nodeIndex;\n        this._boxes[this._pos++] = nodeMinX;\n        this._boxes[this._pos++] = nodeMinY;\n        this._boxes[this._pos++] = nodeMaxX;\n        this._boxes[this._pos++] = nodeMaxY;\n      }\n    }\n  }\n\n  search(minX, minY, maxX, maxY, filterFn) {\n    if (this._pos !== this._boxes.length) {\n      throw new Error('Data not yet indexed - call index.finish().');\n    }\n\n    let nodeIndex = this._boxes.length - 4;\n    let level = this._levelBounds.length - 1;\n    const queue = [];\n    const results = [];\n\n    while (nodeIndex !== undefined) {\n      // find the end index of the node\n      const end = Math.min(\n        nodeIndex + this.nodeSize * 4,\n        this._levelBounds[level]\n      );\n\n      // search through child nodes\n      for (let pos = nodeIndex; pos < end; pos += 4) {\n        const index = this._indices[pos >> 2];\n\n        // check if node bbox intersects with query bbox\n        if (maxX < this._boxes[pos]) continue; // maxX < nodeMinX\n        if (maxY < this._boxes[pos + 1]) continue; // maxY < nodeMinY\n        if (minX > this._boxes[pos + 2]) continue; // minX > nodeMaxX\n        if (minY > this._boxes[pos + 3]) continue; // minY > nodeMaxY\n\n        if (nodeIndex < this.numItems * 4) {\n          if (filterFn === undefined || filterFn(index)) {\n            results.push(index); // leaf item\n          }\n        } else {\n          queue.push(index); // node; add it to the search queue\n          queue.push(level - 1);\n        }\n      }\n\n      level = queue.pop();\n      nodeIndex = queue.pop();\n    }\n\n    return results;\n  }\n\n  neighbors(x, y, maxResults = Infinity, maxDistance = Infinity, filterFn) {\n    if (this._pos !== this._boxes.length) {\n      throw new Error('Data not yet indexed - call index.finish().');\n    }\n\n    let nodeIndex = this._boxes.length - 4;\n    const q = this._queue;\n    const results = [];\n    const maxDistSquared = maxDistance * maxDistance;\n\n    while (nodeIndex !== undefined) {\n      // find the end index of the node\n      const end = Math.min(\n        nodeIndex + this.nodeSize * 4,\n        upperBound(nodeIndex, this._levelBounds)\n      );\n\n      // add child nodes to the queue\n      for (let pos = nodeIndex; pos < end; pos += 4) {\n        const index = this._indices[pos >> 2];\n\n        const dx = axisDist(x, this._boxes[pos], this._boxes[pos + 2]);\n        const dy = axisDist(y, this._boxes[pos + 1], this._boxes[pos + 3]);\n        const dist = dx * dx + dy * dy;\n\n        if (nodeIndex < this.numItems * 4) {\n          // leaf node\n          if (filterFn === undefined || filterFn(index)) {\n            // put a negative index if it's an item rather than a node, to recognize later\n            q.push(-index - 1, dist);\n          }\n        } else {\n          q.push(index, dist);\n        }\n      }\n\n      // pop items from the queue\n      while (q.length && q.peek() < 0) {\n        const dist = q.peekValue();\n        if (dist > maxDistSquared) {\n          q.clear();\n          return results;\n        }\n        results.push(-q.pop() - 1);\n\n        if (results.length === maxResults) {\n          q.clear();\n          return results;\n        }\n      }\n\n      nodeIndex = q.pop();\n    }\n\n    q.clear();\n    return results;\n  }\n}\n\nfunction axisDist(k, min, max) {\n  return k < min ? min - k : k <= max ? 0 : k - max;\n}\n\n// binary search for the first value in the array bigger than the given\nfunction upperBound(value, arr) {\n  let i = 0;\n  let j = arr.length - 1;\n  while (i < j) {\n    const m = (i + j) >> 1;\n    if (arr[m] > value) {\n      j = m;\n    } else {\n      i = m + 1;\n    }\n  }\n  return arr[i];\n}\n\n// custom quicksort that sorts bbox data alongside the hilbert values\nfunction sort(values, boxes, indices, left, right) {\n  if (left >= right) return;\n\n  const pivot = values[(left + right) >> 1];\n  let i = left - 1;\n  let j = right + 1;\n\n  while (true) {\n    do i++;\n    while (values[i] < pivot);\n    do j--;\n    while (values[j] > pivot);\n    if (i >= j) break;\n    swap(values, boxes, indices, i, j);\n  }\n\n  sort(values, boxes, indices, left, j);\n  sort(values, boxes, indices, j + 1, right);\n}\n\n// swap two values and two corresponding boxes\nfunction swap(values, boxes, indices, i, j) {\n  const temp = values[i];\n  values[i] = values[j];\n  values[j] = temp;\n\n  const k = 4 * i;\n  const m = 4 * j;\n\n  const a = boxes[k];\n  const b = boxes[k + 1];\n  const c = boxes[k + 2];\n  const d = boxes[k + 3];\n  boxes[k] = boxes[m];\n  boxes[k + 1] = boxes[m + 1];\n  boxes[k + 2] = boxes[m + 2];\n  boxes[k + 3] = boxes[m + 3];\n  boxes[m] = a;\n  boxes[m + 1] = b;\n  boxes[m + 2] = c;\n  boxes[m + 3] = d;\n\n  const e = indices[i];\n  indices[i] = indices[j];\n  indices[j] = e;\n}\n\n// Fast Hilbert curve algorithm by http://threadlocalmutex.com/\n// Ported from C++ https://github.com/rawrunprotected/hilbert_curves (public domain)\nfunction hilbert(x, y) {\n  let a = x ^ y;\n  let b = 0xffff ^ a;\n  let c = 0xffff ^ (x | y);\n  let d = x & (y ^ 0xffff);\n\n  let A = a | (b >> 1);\n  let B = (a >> 1) ^ a;\n  let C = (c >> 1) ^ (b & (d >> 1)) ^ c;\n  let D = (a & (c >> 1)) ^ (d >> 1) ^ d;\n\n  a = A;\n  b = B;\n  c = C;\n  d = D;\n  A = (a & (a >> 2)) ^ (b & (b >> 2));\n  B = (a & (b >> 2)) ^ (b & ((a ^ b) >> 2));\n  C ^= (a & (c >> 2)) ^ (b & (d >> 2));\n  D ^= (b & (c >> 2)) ^ ((a ^ b) & (d >> 2));\n\n  a = A;\n  b = B;\n  c = C;\n  d = D;\n  A = (a & (a >> 4)) ^ (b & (b >> 4));\n  B = (a & (b >> 4)) ^ (b & ((a ^ b) >> 4));\n  C ^= (a & (c >> 4)) ^ (b & (d >> 4));\n  D ^= (b & (c >> 4)) ^ ((a ^ b) & (d >> 4));\n\n  a = A;\n  b = B;\n  c = C;\n  d = D;\n  C ^= (a & (c >> 8)) ^ (b & (d >> 8));\n  D ^= (b & (c >> 8)) ^ ((a ^ b) & (d >> 8));\n\n  a = C ^ (C >> 1);\n  b = D ^ (D >> 1);\n\n  let i0 = x ^ y;\n  let i1 = b | (0xffff ^ (i0 | a));\n\n  i0 = (i0 | (i0 << 8)) & 0x00ff00ff;\n  i0 = (i0 | (i0 << 4)) & 0x0f0f0f0f;\n  i0 = (i0 | (i0 << 2)) & 0x33333333;\n  i0 = (i0 | (i0 << 1)) & 0x55555555;\n\n  i1 = (i1 | (i1 << 8)) & 0x00ff00ff;\n  i1 = (i1 | (i1 << 4)) & 0x0f0f0f0f;\n  i1 = (i1 | (i1 << 2)) & 0x33333333;\n  i1 = (i1 | (i1 << 1)) & 0x55555555;\n\n  return ((i1 << 1) | i0) >>> 0;\n}\n","import { feature, mesh } from 'topojson-client';\nimport getBBox from '@turf/bbox';\n\nimport Flatbush from '../vendor/flatbush';\n\nconst innerCompare = (a: TopoJSON.GeometryObject, b: TopoJSON.GeometryObject) =>\n  a !== b;\nconst outerCompare = (a: TopoJSON.GeometryObject, b: TopoJSON.GeometryObject) =>\n  a === b;\n\nfunction prepareTopoJSON(topology: TopoJSON.Topology, key?: string) {\n  const object = topology.objects[\n    key || Object.keys(topology.objects)[0]\n  ] as TopoJSON.GeometryCollection;\n  const roadsObject = topology.objects['roads'] as TopoJSON.GeometryCollection;\n  const placesObject = topology.objects[\n    'places'\n  ] as TopoJSON.GeometryCollection;\n  const urbanAreasObject = topology.objects[\n    'urban_areas'\n  ] as TopoJSON.GeometryCollection;\n\n  const collection = feature(topology, object);\n  const roads = feature(topology, roadsObject);\n  const places = feature(topology, placesObject);\n  const urban_areas = feature(topology, urbanAreasObject);\n  // const innerlines = mesh(topology, object, innerCompare);\n  // const outerlines = mesh(topology, object, outerCompare);\n  const bbox = topology.bbox || getBBox(collection);\n\n  const index = new Flatbush(collection.features.length);\n  collection.features.forEach(feature => {\n    const bounds = getBBox(feature);\n    index.add(...bounds);\n  });\n  index.finish();\n\n  const heightRatio = (bbox[3] - bbox[1]) / (bbox[2] - bbox[0]);\n\n  return {\n    collection,\n    // features,\n    // innerlines,\n    // outerlines,\n    bbox,\n    heightRatio,\n    index,\n    roads,\n    places,\n    urban_areas\n  };\n}\n\nexport default prepareTopoJSON;\n","// packages\nimport cx from 'classnames';\nimport { entries, map, Map, set, Set } from 'd3-collection';\nimport { GeoPath, GeoIdentityTransform, GeoProjection } from 'd3-geo';\nimport { scaleLinear, ScaleLinear } from 'd3-scale';\nimport { Feature, Point } from 'geojson';\nimport { Component, h } from 'preact';\nimport bboxPolygon from '@turf/bbox-polygon';\nimport booleanPointInPolygon from '@turf/boolean-point-in-polygon';\n\n// components\nimport CanvasLayer from './CanvasLayer';\nimport MapLegend from './MapLegend';\nimport Places from './Places';\nimport Portal from './Portal';\nimport SvgLayer from './SvgLayer';\nimport Tooltip from './Tooltip';\nimport TooltipTable from './TooltipTable';\n\n// internal\nimport clamp from '../utils/clamp';\nimport * as colors from '../colors';\nimport find from '../utils/find';\nimport getPoint from '../utils/get-point';\nimport prepareTopoJSON from '../utils/prepare-topojson';\nimport { Topology } from 'topojson-specification';\n\ninterface LayeredMapProps {\n  projection: GeoProjection | GeoIdentityTransform;\n  topology: Topology;\n  precinctsReporting: number;\n  totalVotes: number;\n  candidatesRender: { [key: string]: any }\n}\n\ninterface LayeredMapState {\n  activeGeometry: Feature | null;\n  candidatesOnMap: Set;\n  geos: any;\n  width: number;\n  height: number;\n  x: number;\n  y: number;\n  includesNoResult: boolean;\n  includesTie: boolean;\n}\n\nconst tooltipPush = 20;\n\nconst relocateTooltip = (tooltip, x, y) => {\n  const { height, width } = tooltip.getBoundingClientRect();\n\n  const innerWidth = window.innerWidth;\n  const innerHeight = window.innerHeight;\n\n  const left = clamp(\n    x - width / 2,\n    tooltipPush,\n    innerWidth - width - tooltipPush\n  );\n  const top =\n    innerHeight > y + tooltipPush + height\n      ? y + tooltipPush\n      : y - height - tooltipPush;\n\n  tooltip.style.left = `${left}px`;\n  tooltip.style.top = `${top}px`;\n};\n\nclass LayeredMap extends Component<LayeredMapProps, LayeredMapState> {\n  xScale: ScaleLinear<number, number>;\n  yScale: ScaleLinear<number, number>;\n  tooltip!: HTMLElement;\n  candidateMap!: Map<any>;\n  countyMap!: Map<any>;\n  embedType: string;\n  candidatesRender: { [key: string]: any }\n\n  constructor() {\n    super();\n\n    this.state = {\n      activeGeometry: null,\n      candidatesOnMap: set(),\n      geos: {},\n      width: 0,\n      height: 0,\n      includesNoResult: false,\n      includesTie: false,\n      x: 0,\n      y: 0,\n    };\n\n    this.onMouseMove = this.onMouseMove.bind(this);\n    this.onMouseLeave = this.onMouseLeave.bind(this);\n    this.onDocumentTouch = this.onDocumentTouch.bind(this);\n    this.getTooltipRef = this.getTooltipRef.bind(this);\n    this.canvasRenderer = this.canvasRenderer.bind(this);\n\n    this.xScale = scaleLinear();\n    this.yScale = scaleLinear();\n  }\n\n  getTooltipRef(el: HTMLElement) {\n    this.tooltip = el;\n  }\n\n  setUpCountyMap(counties: any) {\n    this.countyMap = map(counties, d => d.fips);\n  }\n\n  \n\n  setUpCandidateMap(candidates: any) {\n    this.candidateMap = map(candidates, d => d.id);\n\n  }\n\n  onMouseMove(event: MouseEvent) {\n    const { clientX: x, clientY: y, target } = event;\n    const point = getPoint(target as HTMLElement, x, y);\n\n    const coords = [this.xScale.invert(point[0]), this.yScale.invert(point[1])];\n\n    const { collection, index } = this.state.geos;\n\n    const found = index\n      .search(...coords, ...coords)\n      .map((i: number) => collection.features[i]);\n\n    const activeGeometry = find(\n      found,\n      (feature: Feature<GeoJSON.Polygon | GeoJSON.MultiPolygon>) =>\n        booleanPointInPolygon(coords, feature)\n    );\n\n    let activeCounty = null;\n\n    if (activeGeometry) {\n      const { fips } = activeGeometry.properties;\n      activeCounty = this.countyMap.get(fips);\n    }\n\n    this.setState({ activeCounty, activeGeometry }, () =>\n      relocateTooltip(this.tooltip, x, y)\n    );\n  }\n\n  onMouseLeave() {\n    this.setState({ activeCounty: null, activeGeometry: null });\n  }\n\n  onDocumentTouch(e) {\n    if (!this.base.contains(e.target)) this.onMouseLeave();\n  }\n\n  canvasRenderer(ctx: CanvasRenderingContext2D, geoPath: GeoPath) {\n    const { geos, width, height } = this.state;\n\n    const { candidatesRender, embedType } = this.props;\n\n    ctx.clearRect(0, 0, width, height);\n\n    if (!geos.collection) return;\n\n    const candidatesOnMap = set();\n    let includesNoResult = false;\n    let includesTie = false;\n\n    \n\n    geos.collection.features.forEach((feature: Feature) => {\n      const { fips } = feature.properties;\n      const county = this.countyMap.get(fips);\n\n      let fillStyle;\n\n      if (county.total_votes <= 0) {\n        includesNoResult = true;\n        fillStyle = colors.NEUTRAL;\n      } else {\n        const sortedResults = entries(county.results).sort(\n          (a, b) => b.value - a.value\n        );\n\n        const leader = sortedResults[0];\n        const second = sortedResults[1];\n\n\n        if (leader.value === second.value) {\n          includesTie = true;\n          fillStyle = colors.TIE;\n        } else {\n          const leadingId = leader.key;\n          candidatesOnMap.add(leadingId);\n         \n          const { id } = this.candidateMap.get(leadingId);\n          const result = candidatesRender.filter(cand => cand.id  == id);\n          fillStyle = result[0]['color']\n        }\n      }\n\n      ctx.beginPath();\n      geoPath(feature);\n\n      ctx.fillStyle = fillStyle;\n      ctx.fill();\n      ctx.closePath();\n    });\n\n    ctx.beginPath();\n    geoPath(geos.collection);\n\n    ctx.lineCap = 'round';\n    ctx.lineJoin = 'round';\n    ctx.strokeStyle = 'rgba(255, 255, 255, .6)';\n    ctx.lineWidth = 0.8;\n\n    ctx.stroke();\n    ctx.closePath();\n\n    geos.roads.features.forEach((feature: Feature) => {\n      if (feature.properties.level !== 'Interstate') return;\n      ctx.beginPath();\n      geoPath(feature);\n\n      ctx.lineCap = 'round';\n      ctx.lineJoin = 'round';\n\n      if (feature.properties.level === 'Interstate') {\n        ctx.strokeStyle = 'rgba(0, 0, 0, .12)';\n        ctx.lineWidth = 1;\n      } else {\n        ctx.strokeStyle = 'rgba(0, 0, 0, .08)';\n        ctx.lineWidth = 0.8;\n      }\n\n      ctx.stroke();\n      ctx.closePath();\n    });\n\n    let places_mappable = geos.places;\n\n    let embedTypeUsable = 'none'\n    \n    if (typeof embedType !== 'undefined') {\n      embedTypeUsable = embedType;\n    }\n\n    if (embedTypeUsable.includes('tribcast')) {\n      places_mappable.features = geos.places.features.filter(i => (\n        (\n          i['properties']['name'] == 'Fort Worth'\n        ) || (\n          i['properties']['name'] == 'Dallas'\n        ) || (\n          i['properties']['name'] == 'San Antonio'\n        ) || (\n          i['properties']['name'] == 'Austin'\n        ) || (\n          i['properties']['name'] == 'Houston'\n        )\n      ))\n    }\n\n    geos.places = places_mappable;\n    \n    geos.places.features.forEach((feature: Feature<Point>) => {\n      const [x, y] = geoPath.centroid(feature);\n\n      ctx.beginPath();\n      ctx.arc(x, y, 3, 0, Math.PI * 2, true);\n      ctx.strokeStyle = 'rgba(33, 33, 33, .75)';\n      ctx.lineWidth = 1.25;\n      ctx.stroke();\n      ctx.closePath();\n    });\n\n    geos.urban_areas.features.forEach((feature: Feature) => {\n      ctx.beginPath();\n      geoPath(feature);\n\n      ctx.fillStyle = 'rgba(153, 160, 175, 0.2)';\n      ctx.fill();\n      ctx.closePath();\n    });\n\n    this.setState({ candidatesOnMap, includesNoResult, includesTie });\n  }\n\n  componentWillReceiveProps(nextProps) {\n    const { candidates, counties} = nextProps;\n\n    this.setUpCandidateMap(candidates);\n    this.setUpCountyMap(counties);\n  }\n\n  getContainerDimensions() {\n    const base = this.base!;\n    const rawWidth = base.offsetWidth;\n\n    this.setState({ width });\n  }\n\n  componentDidMount() {\n    const { candidates, counties, candidatesRender } = this.props;\n\n    this.setUpCandidateMap(candidates);\n    this.setUpCountyMap(counties);\n\n    const base = this.base!;\n    const rawWidth = Math.floor(base.clientWidth);\n\n    const { topology } = this.props;\n    const geos = prepareTopoJSON(topology);\n    \n    const { bbox, heightRatio } = geos;\n    const rawHeight = Math.floor(rawWidth * heightRatio);\n\n    const width = rawWidth;\n    const height = rawHeight;\n\n    this.xScale.domain([bbox[0], bbox[2]]).range([0, width]);\n    this.yScale.domain([bbox[1], bbox[3]]).range([height, 0]);\n\n    this.props.projection.fitSize([width, height], bboxPolygon(bbox));\n\n    document.addEventListener('touchstart', this.onDocumentTouch, false);\n\n    this.setState({ geos, width, height });\n  }\n\n  render() {\n    const {\n      candidates,\n      projection,\n      precinctsReporting,\n      totalVotes,\n      candidatesRender,\n      embedType\n    } = this.props;\n    const {\n      activeCounty,\n      activeGeometry,\n      candidatesOnMap,\n      geos,\n      includesNoResult,\n      includesTie,\n      width,\n      height,\n      x,\n      y,\n    } = this.state;\n\n    return (\n      <div\n        class=\"layers-map\"\n        style={{\n          boxSizing: 'border-box',\n          width: '100%',\n          height: '100%',\n          position: 'relative',\n        }}\n        onMouseMove={this.onMouseMove}\n        onMouseLeave={this.onMouseLeave}\n      >\n        <SvgLayer\n          width={width}\n          height={height}\n          projection={projection}\n          render={({ geoPath }) => (\n            <g>\n              {geos.places && (\n                <Places geoPath={geoPath} places={geos.places.features} />\n              )}\n              {activeGeometry && (\n                <path\n                  fill=\"none\"\n                  stroke=\"black\"\n                  stroke-width=\"2\"\n                  d={geoPath(activeGeometry) || undefined}\n                />\n              )}\n            </g>\n          )}\n        />\n        <CanvasLayer\n          totalPrecincts={precinctsReporting}\n          totalVotes={totalVotes}\n          projection={projection}\n          width={width}\n          height={height}\n          render={this.canvasRenderer}\n        />\n        {/* <MapLegend\n          candidates={candidates.filter(({ id }: { id: string }) =>\n            candidatesOnMap.has(id)\n          )}\n          includesNoResult={includesNoResult}\n          includesTie={includesTie}\n        /> */}\n        <Tooltip\n          class={cx('tooltip map__tooltip', {\n            invisible: !Boolean(activeCounty),\n          })}\n          tooltipRef={this.getTooltipRef}\n        >\n          {activeCounty && (\n            <TooltipTable\n              candidatesRender={candidatesRender}\n              candidatesMap={this.candidateMap}\n              county={activeCounty}\n            />\n          )}\n        </Tooltip>\n      </div>\n    );\n  }\n}\n\nexport default LayeredMap;\n","export default function clamp(n, min, max) {\n  return Math.min(Math.max(n, min), max);\n}\n","export default function(x) {\n  return x;\n}\n","import identity from \"./identity.js\";\n\nexport default function(transform) {\n  if (transform == null) return identity;\n  var x0,\n      y0,\n      kx = transform.scale[0],\n      ky = transform.scale[1],\n      dx = transform.translate[0],\n      dy = transform.translate[1];\n  return function(input, i) {\n    if (!i) x0 = y0 = 0;\n    var j = 2, n = input.length, output = new Array(n);\n    output[0] = (x0 += input[0]) * kx + dx;\n    output[1] = (y0 += input[1]) * ky + dy;\n    while (j < n) output[j] = input[j], ++j;\n    return output;\n  };\n}\n","import reverse from \"./reverse.js\";\nimport transform from \"./transform.js\";\n\nexport default function(topology, o) {\n  if (typeof o === \"string\") o = topology.objects[o];\n  return o.type === \"GeometryCollection\"\n      ? {type: \"FeatureCollection\", features: o.geometries.map(function(o) { return feature(topology, o); })}\n      : feature(topology, o);\n}\n\nfunction feature(topology, o) {\n  var id = o.id,\n      bbox = o.bbox,\n      properties = o.properties == null ? {} : o.properties,\n      geometry = object(topology, o);\n  return id == null && bbox == null ? {type: \"Feature\", properties: properties, geometry: geometry}\n      : bbox == null ? {type: \"Feature\", id: id, properties: properties, geometry: geometry}\n      : {type: \"Feature\", id: id, bbox: bbox, properties: properties, geometry: geometry};\n}\n\nexport function object(topology, o) {\n  var transformPoint = transform(topology.transform),\n      arcs = topology.arcs;\n\n  function arc(i, points) {\n    if (points.length) points.pop();\n    for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length; k < n; ++k) {\n      points.push(transformPoint(a[k], k));\n    }\n    if (i < 0) reverse(points, n);\n  }\n\n  function point(p) {\n    return transformPoint(p);\n  }\n\n  function line(arcs) {\n    var points = [];\n    for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points);\n    if (points.length < 2) points.push(points[0]); // This should never happen per the specification.\n    return points;\n  }\n\n  function ring(arcs) {\n    var points = line(arcs);\n    while (points.length < 4) points.push(points[0]); // This may happen if an arc has only two points.\n    return points;\n  }\n\n  function polygon(arcs) {\n    return arcs.map(ring);\n  }\n\n  function geometry(o) {\n    var type = o.type, coordinates;\n    switch (type) {\n      case \"GeometryCollection\": return {type: type, geometries: o.geometries.map(geometry)};\n      case \"Point\": coordinates = point(o.coordinates); break;\n      case \"MultiPoint\": coordinates = o.coordinates.map(point); break;\n      case \"LineString\": coordinates = line(o.arcs); break;\n      case \"MultiLineString\": coordinates = o.arcs.map(line); break;\n      case \"Polygon\": coordinates = polygon(o.arcs); break;\n      case \"MultiPolygon\": coordinates = o.arcs.map(polygon); break;\n      default: return null;\n    }\n    return {type: type, coordinates: coordinates};\n  }\n\n  return geometry(o);\n}\n","export default function(array, n) {\n  var t, j = array.length, i = j - n;\n  while (i < --j) t = array[i], array[i++] = array[j], array[j] = t;\n}\n","export {default as bbox} from \"./bbox.js\";\nexport {default as feature} from \"./feature.js\";\nexport {default as mesh, meshArcs} from \"./mesh.js\";\nexport {default as merge, mergeArcs} from \"./merge.js\";\nexport {default as neighbors} from \"./neighbors.js\";\nexport {default as quantize} from \"./quantize.js\";\nexport {default as transform} from \"./transform.js\";\nexport {default as untransform} from \"./untransform.js\";\n","import { capfirst, intcomma } from 'journalize';\nimport cx from 'classnames';\nimport { Component, h } from 'preact';\nimport { PreactHTMLConverter } from 'preact-html-converter';\nconst BROADCAST_HEADER_IMG = `${process.env.PUBLIC_PATH}assets/images/election-runoff-horizontal-logo.png`;\n\n// components\nimport CountyTable from './CountyTable';\n\n// internal\nimport {\n  sort_candidates_by_party,\n  get_directory_slug,\n} from '../election-utils';\nimport sumValues from '../utils/sum-values';\n\n// text\nimport text from '../../../data/text.json';\n\nconst converter = PreactHTMLConverter();\n\ntype Props = {\n  contest: { [key: string]: any },\n  flags: { [key: string]: any },\n  columnCount: number,\n  contestTitle: string,\n  includeCountyRundown?: boolean,\n  isShowcaseRace?: boolean,\n  renderParty: any,\n  renderCandidate: any,\n  visibleCandidatesCount?: number,\n  embedType: string,\n  broadcastHeaderImage: string,\n  activeContestId: string\n};\n\nclass Contest extends Component<Props> {\n  render() {\n    const {\n      contest,\n      flags,\n      columnCount,\n      contestTitle,\n      isShowcaseRace,\n      includeCountyRundown,\n      renderParty,\n      renderCandidate,\n      tableHeader,\n      embedType,\n      broadcastHeaderImage,\n      activeContestId\n    } = this.props;\n\n    let totalVotes;\n    let candidates;\n\n    const isStatewide = contest.division_type === 'statewide';\n\n    const IsFlagged = flags && flags.length > 0 ? true : false;\n\n    // The Republic API slugs don't match the directory url slugs so we need to get them\n\n    let directory_slug;\n\n    if (contest[0]) {\n      directory_slug = get_directory_slug(contest[0].office);\n\n    }\n\n    const rowClass = cx({\n      seat__races: !isShowcaseRace,\n      seat__highlight_races: isShowcaseRace,\n    });\n\n    const titleClass = cx({\n      seat__title: !IsFlagged,\n      'seat__title flagged': IsFlagged,\n    });\n\n    \n    let embedTypeUsable = 'none'\n    \n    if (typeof embedType !== 'undefined') {\n      embedTypeUsable = embedType;\n    }\n\n    // set the class on the disclaimer, changes between partner embed and the default index page\n    const isPartner = embedTypeUsable && embedTypeUsable == 'partner' ? true : false;\n\n    const disclaimerClass = cx(\n      'disclaimer-race',\n      {\n        'disclaimer-partner': isPartner\n      } // disclaimer-partner needs to be after disclaimer-race\n    );\n\n    return (\n      <div class=\"seat\">\n        {embedTypeUsable.includes('broadcast') && (\n          <header class=\"embed-logo-container\">\n            <a href=\"https://www.texastribune.org/\" target=\"_blank\" rel=\"noopener noreferrer\">\n              <img class=\"embed-logo\" src={broadcastHeaderImage} alt=\"Texas 2020 Primary Election Results presented by The Texas Tribune\" />\n            </a>\n          </header>\n        )}\n        {IsFlagged == true && (\n          <div class=\"seat__flag\">\n            <p class=\"office__flag\">\n              <span class=\"gold-star\">★</span>Race to watch\n            </p>\n          </div>\n        )}\n\n        {!isShowcaseRace && !(embedTypeUsable == 'partner') && !(embedTypeUsable.includes('broadcast')) && (\n          <h3 class={titleClass}>\n            <span>{contestTitle}</span>\n            {directory_slug[0] != null && (\n              <a\n                href={`https://www.texastribune.org/directory/districts/${directory_slug[0]['directory-slug']}/${contest[0]['office_division']}`}\n              >\n                <span class=\"icon-div\" title=\"Click to learn more about this district\">\n                  <svg class=\"icon icon-info\">\n                    <use xlinkHref=\"#icon-info\"></use>\n                  </svg>\n                </span>\n              </a>\n            )}\n          </h3>\n        )}\n\n        {/* {contestTitle == 'Texas House District 142' && (\n          <div class={disclaimerClass}>\n            {embedTypeUsable == 'partner' && (\n              <div class=\"disclaimer-header\">Regarding results for {contestTitle}</div>\n            )}\n            {text.error.find(text => text.type == 'texas-house-district-142').value}\n          </div>\n        )}\n\n        {contestTitle == 'U.S. House District 10' && (\n          <div class={disclaimerClass}>\n            {embedTypeUsable == 'partner' && (\n              <div class=\"disclaimer-header\">Regarding results for {contestTitle}</div>\n            )}\n            {text.error.find(text => text.type == 'us-house-district-10').value}\n          </div>\n        )} */}\n\n        {IsFlagged == true && (\n          <div class=\"seat__flag\">\n            <p class=\"seat__flag__text\">{converter.convert(flags[0].value)}</p>\n          </div>\n        )}\n\n        <div class={rowClass}>\n          {!(embedTypeUsable.includes('broadcast')) && !isShowcaseRace && contest.map((party: any, index) => renderParty(party, index))}\n\n          {tableHeader}\n          \n          {isShowcaseRace && renderParty(contest)}\n          {embedTypeUsable.includes('broadcast') && renderParty(contest.find(party => party.id == activeContestId))}\n        </div>\n      </div>\n    );\n  }\n}\n\nContest.defaultProps = {\n  isShowcaseRace: false,\n  includeCountyRundown: false,\n  visibleCandidatesCount: 3,\n};\n\nexport default Contest;\n","export function basis(t1, v0, v1, v2, v3) {\n  var t2 = t1 * t1, t3 = t2 * t1;\n  return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n      + (4 - 6 * t2 + 3 * t3) * v1\n      + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n      + t3 * v3) / 6;\n}\n\nexport default function(values) {\n  var n = values.length - 1;\n  return function(t) {\n    var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n        v1 = values[i],\n        v2 = values[i + 1],\n        v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n        v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n    return basis((t - i / n) * n, v0, v1, v2, v3);\n  };\n}\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n  return function(t) {\n    return a + t * d;\n  };\n}\n\nfunction exponential(a, b, y) {\n  return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n    return Math.pow(a + t * b, y);\n  };\n}\n\nexport function hue(a, b) {\n  var d = b - a;\n  return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n  return (y = +y) === 1 ? nogamma : function(a, b) {\n    return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n  };\n}\n\nexport default function nogamma(a, b) {\n  var d = b - a;\n  return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n  var color = gamma(y);\n\n  function rgb(start, end) {\n    var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n        g = color(start.g, end.g),\n        b = color(start.b, end.b),\n        opacity = nogamma(start.opacity, end.opacity);\n    return function(t) {\n      start.r = r(t);\n      start.g = g(t);\n      start.b = b(t);\n      start.opacity = opacity(t);\n      return start + \"\";\n    };\n  }\n\n  rgb.gamma = rgbGamma;\n\n  return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n  return function(colors) {\n    var n = colors.length,\n        r = new Array(n),\n        g = new Array(n),\n        b = new Array(n),\n        i, color;\n    for (i = 0; i < n; ++i) {\n      color = colorRgb(colors[i]);\n      r[i] = color.r || 0;\n      g[i] = color.g || 0;\n      b[i] = color.b || 0;\n    }\n    r = spline(r);\n    g = spline(g);\n    b = spline(b);\n    color.opacity = 1;\n    return function(t) {\n      color.r = r(t);\n      color.g = g(t);\n      color.b = b(t);\n      return color + \"\";\n    };\n  };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","import {basis} from \"./basis.js\";\n\nexport default function(values) {\n  var n = values.length;\n  return function(t) {\n    var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n        v0 = values[(i + n - 1) % n],\n        v1 = values[i % n],\n        v2 = values[(i + 1) % n],\n        v3 = values[(i + 2) % n];\n    return basis((t - i / n) * n, v0, v1, v2, v3);\n  };\n}\n","export default function(a, b) {\n  return a = +a, b = +b, function(t) {\n    return a * (1 - t) + b * t;\n  };\n}\n","export default function(a, b) {\n  if (!b) b = [];\n  var n = a ? Math.min(b.length, a.length) : 0,\n      c = b.slice(),\n      i;\n  return function(t) {\n    for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n    return c;\n  };\n}\n\nexport function isNumberArray(x) {\n  return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n","import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n  return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n  var nb = b ? b.length : 0,\n      na = a ? Math.min(nb, a.length) : 0,\n      x = new Array(na),\n      c = new Array(nb),\n      i;\n\n  for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n  for (; i < nb; ++i) c[i] = b[i];\n\n  return function(t) {\n    for (i = 0; i < na; ++i) c[i] = x[i](t);\n    return c;\n  };\n}\n","export default function(a, b) {\n  var d = new Date;\n  return a = +a, b = +b, function(t) {\n    return d.setTime(a * (1 - t) + b * t), d;\n  };\n}\n","import value from \"./value.js\";\n\nexport default function(a, b) {\n  var i = {},\n      c = {},\n      k;\n\n  if (a === null || typeof a !== \"object\") a = {};\n  if (b === null || typeof b !== \"object\") b = {};\n\n  for (k in b) {\n    if (k in a) {\n      i[k] = value(a[k], b[k]);\n    } else {\n      c[k] = b[k];\n    }\n  }\n\n  return function(t) {\n    for (k in i) c[k] = i[k](t);\n    return c;\n  };\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n  var t = typeof b, c;\n  return b == null || t === \"boolean\" ? constant(b)\n      : (t === \"number\" ? number\n      : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n      : b instanceof color ? rgb\n      : b instanceof Date ? date\n      : isNumberArray(b) ? numberArray\n      : Array.isArray(b) ? genericArray\n      : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n      : number)(a, b);\n}\n","import cx from 'classnames';\nimport { capfirst, intcomma } from 'journalize';\nimport { Component, h, VNode } from 'preact';\n\nimport PureComponent from './PureComponent';\n\nimport formatPercent from '../utils/format-percent';\nimport PartyPill from './PartyPill';\nimport { lookup } from '../photoMap';\nimport { SHOW_DELEGATES } from '../constants'\n\ninterface Props {\n  ballotName: string;\n  candidateId: string;\n  contestIsCalled: boolean;\n  isIncumbent: boolean;\n  isWinner: boolean;\n  delegate_num:{ [key: string]: any };\n  candidateColors: { [key: string]: any };\n  party: string;\n  totalVotesInContest: number;\n  votes: number;\n}\n\nclass HeadshotCandidateRow extends PureComponent<Props> {\n  static columnCount: number;\n  static Header: VNode;\n  static Header_Prez: VNode;\n\n  render() {\n    const {\n      ballotName,\n      candidateId,\n      contestIsCalled,\n      isIncumbent,\n      isWinner,\n      party,\n      isViewable,\n      delegate_num,\n      totalVotesInContest,\n      candidateColors,\n      votes,\n    } = this.props;\n\n    \n    let getColor;\n\n    \n    if (candidateColors) {\n      getColor = candidateColors\n        .filter(obj => obj.name == ballotName)\n        .map(obj => obj.color);\n    } else {\n      getColor = ['#1755c5']\n    }\n\n\n    const divStyle = {\n      'background-color': getColor[0],\n    };\n\n    const checkStyle = {\n      'color': getColor[0],\n    }\n\n    let delegate_count;\n\n    \n    if (delegate_num && party == \"Democrat\") {\n      delegate_count = delegate_num.filter(delegate => delegate.type == candidateId)\n    }\n\n    \n\n    const IsDroppedOut =\n      ballotName == 'Julián Castro' ||\n      ballotName == 'Cory Booker' ||\n      ballotName == 'Marianne Williamson' ||\n      ballotName == 'John K. Delaney' ||\n      ballotName == 'Deval Patrick' ||\n      ballotName == 'Andrew Yang' ||\n      ballotName == 'Michael Bennet' ||\n      ballotName == 'Pete Buttigieg' ||\n      ballotName == 'Tom Steyer' ||\n      ballotName == 'Amy Klobuchar'\n\n        ? true\n        : false;\n\n\n    let rowClass = cx('candidate', 'contest__candidate-row', 'contest__candidate-row--headshot', {\n      'contest__candidate-row--winner dem--border': contestIsCalled && isWinner && party == 'Democrat',\n      'contest__candidate-row--winner rep--border': contestIsCalled && isWinner && party == 'Republican',\n    });\n\n    let checkClass = cx('check', {\n      'dem-winner': party == 'Democrat',\n      'rep-winner': party == 'Republican',\n    });\n\n    if (!isViewable) {\n      rowClass += ' race__candidate-row--hidden';\n    }\n\n    const checkmark = '\\u2713'; \n\n    return (\n      <tr class={rowClass}>\n        <td class=\"candidate__cell candidate__party\">\n          {party == 'Democrat' && <PartyPill party={party} style={divStyle} />}\n          {party == 'Republican' && <PartyPill party={party} />}\n        </td>\n        <th class=\"candidate__cell candidate__name\">\n          {contestIsCalled && isWinner && (<span class={checkClass} style={checkStyle}>{checkmark}</span>)}\n          {ballotName}{IsDroppedOut && <span class=\"dropped_out\">*</span>}{' '}\n          {isIncumbent && (\n            <span class=\"pill pill--basic\" title=\"Currently holds this seat\">\n              Incumbent\n            </span>\n          )}\n        </th>\n        <td class=\"candidate__cell candidate__votes\">{intcomma(votes)}</td>\n        <td class=\"candidate__cell candidate__pct\">\n          {formatPercent(votes, totalVotesInContest)}\n          <span class=\"candidate__pct-symbol\">%</span>\n        </td>\n        {delegate_count && SHOW_DELEGATES == true && (\n            <td class=\"candidate__cell candidate__votes\">{intcomma(delegate_count[0].value)}</td>\n          )}\n      </tr>\n    );\n  }\n}\n\nHeadshotCandidateRow.defaultProps = {\n  isIncumbent: false,\n  isCalled: false,\n  isWinner: false,\n  isViewable: true,\n};\n\nHeadshotCandidateRow.Header = (\n  <thead>\n    <tr>\n      <th class=\"contest__candidate-header\" colSpan={2}>\n        Candidates\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Votes\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Pct.\n        <span class=\"candidate__pct-symbol\">%</span>\n      </th>\n    </tr>\n  </thead>\n);\n\nHeadshotCandidateRow.Header_Prez = (\n  <thead>\n    <tr>\n      <th class=\"contest__candidate-header\" colSpan={2}>\n        Candidates\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Votes\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Pct.\n        <span class=\"candidate__pct-symbol\">%</span>\n      </th>\n       <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n           Delegates\n          </th>\n    </tr>\n  </thead>\n);\n\n\n\n\n\nHeadshotCandidateRow.columnCount = 6;\n\nexport default HeadshotCandidateRow;\n","export default function(constructor, factory, prototype) {\n  constructor.prototype = factory.prototype = prototype;\n  prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n  var prototype = Object.create(parent.prototype);\n  for (var key in definition) prototype[key] = definition[key];\n  return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n    reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n    reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n    reHex = /^#([0-9a-f]{3,8})$/,\n    reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n    reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n    reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n    reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n    reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n    reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\nvar named = {\n  aliceblue: 0xf0f8ff,\n  antiquewhite: 0xfaebd7,\n  aqua: 0x00ffff,\n  aquamarine: 0x7fffd4,\n  azure: 0xf0ffff,\n  beige: 0xf5f5dc,\n  bisque: 0xffe4c4,\n  black: 0x000000,\n  blanchedalmond: 0xffebcd,\n  blue: 0x0000ff,\n  blueviolet: 0x8a2be2,\n  brown: 0xa52a2a,\n  burlywood: 0xdeb887,\n  cadetblue: 0x5f9ea0,\n  chartreuse: 0x7fff00,\n  chocolate: 0xd2691e,\n  coral: 0xff7f50,\n  cornflowerblue: 0x6495ed,\n  cornsilk: 0xfff8dc,\n  crimson: 0xdc143c,\n  cyan: 0x00ffff,\n  darkblue: 0x00008b,\n  darkcyan: 0x008b8b,\n  darkgoldenrod: 0xb8860b,\n  darkgray: 0xa9a9a9,\n  darkgreen: 0x006400,\n  darkgrey: 0xa9a9a9,\n  darkkhaki: 0xbdb76b,\n  darkmagenta: 0x8b008b,\n  darkolivegreen: 0x556b2f,\n  darkorange: 0xff8c00,\n  darkorchid: 0x9932cc,\n  darkred: 0x8b0000,\n  darksalmon: 0xe9967a,\n  darkseagreen: 0x8fbc8f,\n  darkslateblue: 0x483d8b,\n  darkslategray: 0x2f4f4f,\n  darkslategrey: 0x2f4f4f,\n  darkturquoise: 0x00ced1,\n  darkviolet: 0x9400d3,\n  deeppink: 0xff1493,\n  deepskyblue: 0x00bfff,\n  dimgray: 0x696969,\n  dimgrey: 0x696969,\n  dodgerblue: 0x1e90ff,\n  firebrick: 0xb22222,\n  floralwhite: 0xfffaf0,\n  forestgreen: 0x228b22,\n  fuchsia: 0xff00ff,\n  gainsboro: 0xdcdcdc,\n  ghostwhite: 0xf8f8ff,\n  gold: 0xffd700,\n  goldenrod: 0xdaa520,\n  gray: 0x808080,\n  green: 0x008000,\n  greenyellow: 0xadff2f,\n  grey: 0x808080,\n  honeydew: 0xf0fff0,\n  hotpink: 0xff69b4,\n  indianred: 0xcd5c5c,\n  indigo: 0x4b0082,\n  ivory: 0xfffff0,\n  khaki: 0xf0e68c,\n  lavender: 0xe6e6fa,\n  lavenderblush: 0xfff0f5,\n  lawngreen: 0x7cfc00,\n  lemonchiffon: 0xfffacd,\n  lightblue: 0xadd8e6,\n  lightcoral: 0xf08080,\n  lightcyan: 0xe0ffff,\n  lightgoldenrodyellow: 0xfafad2,\n  lightgray: 0xd3d3d3,\n  lightgreen: 0x90ee90,\n  lightgrey: 0xd3d3d3,\n  lightpink: 0xffb6c1,\n  lightsalmon: 0xffa07a,\n  lightseagreen: 0x20b2aa,\n  lightskyblue: 0x87cefa,\n  lightslategray: 0x778899,\n  lightslategrey: 0x778899,\n  lightsteelblue: 0xb0c4de,\n  lightyellow: 0xffffe0,\n  lime: 0x00ff00,\n  limegreen: 0x32cd32,\n  linen: 0xfaf0e6,\n  magenta: 0xff00ff,\n  maroon: 0x800000,\n  mediumaquamarine: 0x66cdaa,\n  mediumblue: 0x0000cd,\n  mediumorchid: 0xba55d3,\n  mediumpurple: 0x9370db,\n  mediumseagreen: 0x3cb371,\n  mediumslateblue: 0x7b68ee,\n  mediumspringgreen: 0x00fa9a,\n  mediumturquoise: 0x48d1cc,\n  mediumvioletred: 0xc71585,\n  midnightblue: 0x191970,\n  mintcream: 0xf5fffa,\n  mistyrose: 0xffe4e1,\n  moccasin: 0xffe4b5,\n  navajowhite: 0xffdead,\n  navy: 0x000080,\n  oldlace: 0xfdf5e6,\n  olive: 0x808000,\n  olivedrab: 0x6b8e23,\n  orange: 0xffa500,\n  orangered: 0xff4500,\n  orchid: 0xda70d6,\n  palegoldenrod: 0xeee8aa,\n  palegreen: 0x98fb98,\n  paleturquoise: 0xafeeee,\n  palevioletred: 0xdb7093,\n  papayawhip: 0xffefd5,\n  peachpuff: 0xffdab9,\n  peru: 0xcd853f,\n  pink: 0xffc0cb,\n  plum: 0xdda0dd,\n  powderblue: 0xb0e0e6,\n  purple: 0x800080,\n  rebeccapurple: 0x663399,\n  red: 0xff0000,\n  rosybrown: 0xbc8f8f,\n  royalblue: 0x4169e1,\n  saddlebrown: 0x8b4513,\n  salmon: 0xfa8072,\n  sandybrown: 0xf4a460,\n  seagreen: 0x2e8b57,\n  seashell: 0xfff5ee,\n  sienna: 0xa0522d,\n  silver: 0xc0c0c0,\n  skyblue: 0x87ceeb,\n  slateblue: 0x6a5acd,\n  slategray: 0x708090,\n  slategrey: 0x708090,\n  snow: 0xfffafa,\n  springgreen: 0x00ff7f,\n  steelblue: 0x4682b4,\n  tan: 0xd2b48c,\n  teal: 0x008080,\n  thistle: 0xd8bfd8,\n  tomato: 0xff6347,\n  turquoise: 0x40e0d0,\n  violet: 0xee82ee,\n  wheat: 0xf5deb3,\n  white: 0xffffff,\n  whitesmoke: 0xf5f5f5,\n  yellow: 0xffff00,\n  yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n  copy: function(channels) {\n    return Object.assign(new this.constructor, this, channels);\n  },\n  displayable: function() {\n    return this.rgb().displayable();\n  },\n  hex: color_formatHex, // Deprecated! Use color.formatHex.\n  formatHex: color_formatHex,\n  formatHsl: color_formatHsl,\n  formatRgb: color_formatRgb,\n  toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n  return this.rgb().formatHex();\n}\n\nfunction color_formatHsl() {\n  return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n  return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n  var m, l;\n  format = (format + \"\").trim().toLowerCase();\n  return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n      : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n      : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n      : l === 4 ? new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n      : null) // invalid hex\n      : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n      : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n      : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n      : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n      : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n      : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n      : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n      : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n      : null;\n}\n\nfunction rgbn(n) {\n  return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n  if (a <= 0) r = g = b = NaN;\n  return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n  if (!(o instanceof Color)) o = color(o);\n  if (!o) return new Rgb;\n  o = o.rgb();\n  return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n  return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n  this.r = +r;\n  this.g = +g;\n  this.b = +b;\n  this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n  brighter: function(k) {\n    k = k == null ? brighter : Math.pow(brighter, k);\n    return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n  },\n  darker: function(k) {\n    k = k == null ? darker : Math.pow(darker, k);\n    return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n  },\n  rgb: function() {\n    return this;\n  },\n  displayable: function() {\n    return (-0.5 <= this.r && this.r < 255.5)\n        && (-0.5 <= this.g && this.g < 255.5)\n        && (-0.5 <= this.b && this.b < 255.5)\n        && (0 <= this.opacity && this.opacity <= 1);\n  },\n  hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n  formatHex: rgb_formatHex,\n  formatRgb: rgb_formatRgb,\n  toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n  return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\n\nfunction rgb_formatRgb() {\n  var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n  return (a === 1 ? \"rgb(\" : \"rgba(\")\n      + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n      + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n      + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n      + (a === 1 ? \")\" : \", \" + a + \")\");\n}\n\nfunction hex(value) {\n  value = Math.max(0, Math.min(255, Math.round(value) || 0));\n  return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n  if (a <= 0) h = s = l = NaN;\n  else if (l <= 0 || l >= 1) h = s = NaN;\n  else if (s <= 0) h = NaN;\n  return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n  if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n  if (!(o instanceof Color)) o = color(o);\n  if (!o) return new Hsl;\n  if (o instanceof Hsl) return o;\n  o = o.rgb();\n  var r = o.r / 255,\n      g = o.g / 255,\n      b = o.b / 255,\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      h = NaN,\n      s = max - min,\n      l = (max + min) / 2;\n  if (s) {\n    if (r === max) h = (g - b) / s + (g < b) * 6;\n    else if (g === max) h = (b - r) / s + 2;\n    else h = (r - g) / s + 4;\n    s /= l < 0.5 ? max + min : 2 - max - min;\n    h *= 60;\n  } else {\n    s = l > 0 && l < 1 ? 0 : h;\n  }\n  return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n  return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n  this.h = +h;\n  this.s = +s;\n  this.l = +l;\n  this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n  brighter: function(k) {\n    k = k == null ? brighter : Math.pow(brighter, k);\n    return new Hsl(this.h, this.s, this.l * k, this.opacity);\n  },\n  darker: function(k) {\n    k = k == null ? darker : Math.pow(darker, k);\n    return new Hsl(this.h, this.s, this.l * k, this.opacity);\n  },\n  rgb: function() {\n    var h = this.h % 360 + (this.h < 0) * 360,\n        s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n        l = this.l,\n        m2 = l + (l < 0.5 ? l : 1 - l) * s,\n        m1 = 2 * l - m2;\n    return new Rgb(\n      hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n      hsl2rgb(h, m1, m2),\n      hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n      this.opacity\n    );\n  },\n  displayable: function() {\n    return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n        && (0 <= this.l && this.l <= 1)\n        && (0 <= this.opacity && this.opacity <= 1);\n  },\n  formatHsl: function() {\n    var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n    return (a === 1 ? \"hsl(\" : \"hsla(\")\n        + (this.h || 0) + \", \"\n        + (this.s || 0) * 100 + \"%, \"\n        + (this.l || 0) * 100 + \"%\"\n        + (a === 1 ? \")\" : \", \" + a + \")\");\n  }\n}));\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n  return (h < 60 ? m1 + (m2 - m1) * h / 60\n      : h < 180 ? m2\n      : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n      : m1) * 255;\n}\n","function formatPercent(n: number, d: number): string {\n  if (d == null || d <= 0) return '0.0';\n\n  return ((n / d) * 100).toFixed(1);\n}\n\nexport default formatPercent;\n","'use strict';\n\n// We depend on intersection-observer enough that it should just be assumed as necessary\nrequire('intersection-observer');\n","import { Component, render } from 'preact';\n\nclass Portal extends Component {\n  componentDidMount() {\n    this.renderPortal();\n  }\n\n  componentWillUnmount() {\n    if (this.defaultNode) {\n      document.body.removeChild(this.defaultNode);\n    } else {\n      // Unmount the children rendered in custom node\n      render(null, this.props.node, this.portal);\n    }\n\n    this.defaultNode = null;\n    this.portal = null;\n  }\n\n  componentDidUpdate() {\n    this.renderPortal();\n  }\n\n  renderPortal() {\n    if (!this.props.node && !this.defaultNode) {\n      this.defaultNode = document.createElement('div');\n      document.body.appendChild(this.defaultNode);\n    }\n\n    const children = this.props.children;\n\n    this.portal = render(\n      (children && children[0]) || null,\n      this.props.node || this.defaultNode,\n      this.portal\n    );\n  }\n\n  render() {\n    return null;\n  }\n}\n\nexport default Portal;\n","import { h, render } from 'preact';\n\n// just in case this gets removed\nwindow.ttData = window.ttData || {};\n\n// related content\nconst relatedContentContainer = document.getElementById(\n  'related-content-container'\n);\n\nif (relatedContentContainer && window.ttData.gutenTag) {\n  import(\n    /* webpackChunkName: \"RelatedContent\" */ './components/RelatedContent'\n  ).then(({ default: RelatedContent }) =>\n    render(\n      <RelatedContent title={'Read more'} gutenTag={window.ttData.gutenTag} />,\n      relatedContentContainer\n    )\n  );\n}\n\n// trending ribbon\nconst ribbonContainer = document.getElementById('ribbon-container');\n\nif (ribbonContainer) {\n  import(\n    /* webpackChunkName: \"Ribbon\" */ './components/Ribbon'\n  ).then(({ default: Ribbon }) => render(<Ribbon />, ribbonContainer));\n}\n\n// ads\nimport(/* webpackChunkName: \"ads\" */ './utils/ad-loader').then(\n  ({ default: AdLoader }) => {\n    const ads = new AdLoader();\n    ads.init();\n  }\n);\n","/**\n * Select an element on the page. Uses `document.querySelector`, meaning it\n * will only return the first element that matches.\n *\n * @param {String} el The CSS selector to search for.\n * @param {Element} [context] The container to search within. Defaults to\n * `document`.\n * @returns {Element|null}\n */\nfunction select(el, context) {\n  return typeof el === 'string'\n    ? (context || document).querySelector(el)\n    : el || null;\n}\n\nexport default select;\n","const userAgent = navigator.userAgent;\n\nexport function isThisIE(): boolean {\n  return /Trident|MSIE|IEMobile/i.test(userAgent);\n}\n","// packages\nimport { geoIdentity, GeoIdentityTransform } from 'd3-geo';\nimport { Component, h } from 'preact';\n\n// components\nimport Contest from './Contest';\nimport CountyTable from './CountyTable';\nimport HeadshotCandidateRow from './HeadshotCandidateRow';\nimport SeatPartyDivider from './SeatPartyDivider';\nimport LayeredMap from './LayeredMap';\nimport Portal from './Portal';\n\n// utils\nimport { isThisIE } from '../utils/platform';\nimport { determineContestTitle, presidentCandidateColors, senateCandidateColors } from '../election-utils';\nimport { DEMOCRAT, NEUTRAL, OTHER } from '../colors';\nimport { SHOW_DELEGATES } from '../constants'\n\nimport topology from 'Assets/geography/texas_urban.json';\n\nconst isIE = isThisIE();\n\ninterface ContestShowcaseProps {\n  container: Element;\n  contest: any | null;\n}\n\ninterface ContestShowcaseState {\n  contestContainer: Element;\n  mapContainer: Element;\n  countiesContainer: Element;\n}\n\nclass ContestShowcase extends Component<\n  ContestShowcaseProps,\n  ContestShowcaseState\n> {\n  projection: GeoIdentityTransform;\n\n  constructor() {\n    super();\n\n    this.projection = geoIdentity().reflectY(true);\n  }\n\n  componentDidMount() {\n    const { container } = this.props;\n\n    \n\n    const contestContainer = container.querySelector('.contest-container');\n    const mapContainer = container.querySelector('.contest-map-container');\n    const countiesContainer = container.querySelector(\n      '.contest-counties-container'\n    );\n\n    this.setState({ contestContainer, mapContainer, countiesContainer });\n  }\n\n  render() {\n    const { contest, delegates } = this.props;\n    const { contestContainer, mapContainer, countiesContainer } = this.state;\n\n    const shouldDisplay5Candidates =\n      contest && contest.office == 'President' && contest.party == 'Democrat';\n\n    const visibleCandidates = shouldDisplay5Candidates ? 6 : 3;\n\n    const headerUsed = shouldDisplay5Candidates && SHOW_DELEGATES == true ? HeadshotCandidateRow.Header_Prez : HeadshotCandidateRow.Header;\n\n\n    let candidatesRender;\n\n    if (contest) {\n      let candidates = contest.candidacies;\n      candidatesRender = shouldDisplay5Candidates ? presidentCandidateColors : senateCandidateColors;\n\n    \n    }\n\n\n    if (!contest) return null;\n\n    return (\n      <span>\n        {contestContainer && (\n          <Portal\n            node={contestContainer}\n            ref={ref => (this._contestPortal = ref)}\n          >\n            <Contest\n              contest={contest}\n              contestTitle={determineContestTitle(contest)}\n              isShowcaseRace\n              renderParty={party => (\n                <SeatPartyDivider\n                  partyName={party.party}\n                  partyBallot={party}\n                  isShowcaseRace\n                  tableHeader={headerUsed}\n                  columnCount={HeadshotCandidateRow.columnCount}\n                  renderCandidate={(\n                    candidate: any,\n                    idx: number,\n                    candidatesRender: any,\n                    viewAllCandidates: any,\n                    { totalVotes }: { totalVotes: number }\n                  ) => (\n                    <HeadshotCandidateRow\n                      key={candidate.id}\n                      ballotName={candidate.name}\n                      candidateId={candidate.id}\n                      contestIsCalled={contest.is_called}\n                      delegate_num={delegates}\n                      isIncumbent={candidate.is_incumbent}\n                      isWinner={candidate.is_winner}\n                      isViewable={viewAllCandidates || idx < visibleCandidates}\n                      party={candidate.party}\n                      candidateColors={candidatesRender}\n                      totalVotesInContest={totalVotes}\n                      votes={candidate.votes}\n                    />\n                  )}\n                />\n              )}\n            />\n          </Portal>\n        )}\n        {!isIE && mapContainer && (\n          <Portal node={mapContainer} ref={ref => (this._mapPortal = ref)}>\n            <LayeredMap\n              topology={topology}\n              projection={this.projection}\n              candidates={contest.candidacies}\n              candidatesRender={candidatesRender}\n              counties={contest.counties}\n              precinctsReporting={contest.precincts_reporting}\n              totalVotes={contest.total_votes}\n            />\n          </Portal>\n        )}\n        {/* {!isIE &&\n          countiesContainer && (\n            <Portal\n              node={countiesContainer}\n              ref={ref => (this._countiesPortal = ref)}\n            >\n              <CountyTable\n                candidates={contest.candidates}\n                counties={contest.counties}\n              />\n            </Portal>\n          )} */}\n      </span>\n    );\n  }\n}\n\nexport default ContestShowcase;","class Store {\n  constructor(dbName = 'keyval-store', storeName = 'keyval') {\n    this.storeName = storeName;\n    this._dbp = new Promise((resolve, reject) => {\n      const openreq = indexedDB.open(dbName, 1);\n      openreq.onerror = () => reject(openreq.error);\n      openreq.onsuccess = () => resolve(openreq.result);\n      // First time setup: create an empty object store\n      openreq.onupgradeneeded = () => {\n        openreq.result.createObjectStore(storeName);\n      };\n    });\n  }\n  _withIDBStore(type, callback) {\n    return this._dbp.then(\n      db =>\n        new Promise((resolve, reject) => {\n          const transaction = db.transaction(this.storeName, type);\n          transaction.oncomplete = () => resolve();\n          transaction.onabort = transaction.onerror = () =>\n            reject(transaction.error);\n          callback(transaction.objectStore(this.storeName));\n        })\n    );\n  }\n}\nlet store;\nfunction getDefaultStore() {\n  if (!store) store = new Store();\n  return store;\n}\nfunction get(key, store = getDefaultStore()) {\n  let req;\n  return store\n    ._withIDBStore('readonly', store => {\n      req = store.get(key);\n    })\n    .then(() => req.result);\n}\nfunction set(key, value, store = getDefaultStore()) {\n  return store._withIDBStore('readwrite', store => {\n    store.put(value, key);\n  });\n}\nfunction del(key, store = getDefaultStore()) {\n  return store._withIDBStore('readwrite', store => {\n    store.delete(key);\n  });\n}\nfunction clear(store = getDefaultStore()) {\n  return store._withIDBStore('readwrite', store => {\n    store.clear();\n  });\n}\nfunction keys(store = getDefaultStore()) {\n  const keys = [];\n  return store\n    ._withIDBStore('readonly', store => {\n      // This would be store.getAllKeys(), but it isn't supported by Edge or Safari.\n      // And openKeyCursor isn't supported by Safari.\n      (store.openKeyCursor || store.openCursor).call(\n        store\n      ).onsuccess = function() {\n        if (!this.result) return;\n        keys.push(this.result.key);\n        this.result.continue();\n      };\n    })\n    .then(() => keys);\n}\n\nexport { Store, get, set, del, clear, keys };\n","const RE_NUM = /[\\-+]?(?:\\d*\\.|)\\d+(?:[eE][\\-+]?\\d+|)/.source;\n\nfunction getClientPosition(elem) {\n  let box;\n  let x;\n  let y;\n  const doc = elem.ownerDocument;\n  const body = doc.body;\n  const docElem = doc && doc.documentElement;\n  // 根据 GBS 最新数据，A-Grade Browsers 都已支持 getBoundingClientRect 方法，不用再考虑传统的实现方式\n  box = elem.getBoundingClientRect();\n\n  // 注：jQuery 还考虑减去 docElem.clientLeft/clientTop\n  // 但测试发现，这样反而会导致当 html 和 body 有边距/边框样式时，获取的值不正确\n  // 此外，ie6 会忽略 html 的 margin 值，幸运地是没有谁会去设置 html 的 margin\n\n  x = box.left;\n  y = box.top;\n\n  // In IE, most of the time, 2 extra pixels are added to the top and left\n  // due to the implicit 2-pixel inset border.  In IE6/7 quirks mode and\n  // IE6 standards mode, this border can be overridden by setting the\n  // document element's border to zero -- thus, we cannot rely on the\n  // offset always being 2 pixels.\n\n  // In quirks mode, the offset can be determined by querying the body's\n  // clientLeft/clientTop, but in standards mode, it is found by querying\n  // the document element's clientLeft/clientTop.  Since we already called\n  // getClientBoundingRect we have already forced a reflow, so it is not\n  // too expensive just to query them all.\n\n  // ie 下应该减去窗口的边框吧，毕竟默认 absolute 都是相对窗口定位的\n  // 窗口边框标准是设 documentElement ,quirks 时设置 body\n  // 最好禁止在 body 和 html 上边框 ，但 ie < 9 html 默认有 2px ，减去\n  // 但是非 ie 不可能设置窗口边框，body html 也不是窗口 ,ie 可以通过 html,body 设置\n  // 标准 ie 下 docElem.clientTop 就是 border-top\n  // ie7 html 即窗口边框改变不了。永远为 2\n  // 但标准 firefox/chrome/ie9 下 docElem.clientTop 是窗口边框，即使设了 border-top 也为 0\n\n  x -= docElem.clientLeft || body.clientLeft || 0;\n  y -= docElem.clientTop || body.clientTop || 0;\n\n  return {\n    left: x,\n    top: y,\n  };\n}\n\nfunction getScroll(w, top) {\n  let ret = w[`page${top ? 'Y' : 'X'}Offset`];\n  const method = `scroll${top ? 'Top' : 'Left'}`;\n  if (typeof ret !== 'number') {\n    const d = w.document;\n    // ie6,7,8 standard mode\n    ret = d.documentElement[method];\n    if (typeof ret !== 'number') {\n      // quirks mode\n      ret = d.body[method];\n    }\n  }\n  return ret;\n}\n\nfunction getScrollLeft(w) {\n  return getScroll(w);\n}\n\nfunction getScrollTop(w) {\n  return getScroll(w, true);\n}\n\nfunction getOffset(el) {\n  const pos = getClientPosition(el);\n  const doc = el.ownerDocument;\n  const w = doc.defaultView || doc.parentWindow;\n  pos.left += getScrollLeft(w);\n  pos.top += getScrollTop(w);\n  return pos;\n}\nfunction _getComputedStyle(elem, name, computedStyle_) {\n  let val = '';\n  const d = elem.ownerDocument;\n  const computedStyle =\n    computedStyle_ || d.defaultView.getComputedStyle(elem, null);\n\n  // https://github.com/kissyteam/kissy/issues/61\n  if (computedStyle) {\n    val = computedStyle.getPropertyValue(name) || computedStyle[name];\n  }\n\n  return val;\n}\n\nconst _RE_NUM_NO_PX = new RegExp(`^(${RE_NUM})(?!px)[a-z%]+$`, 'i');\nconst RE_POS = /^(top|right|bottom|left)$/;\nconst CURRENT_STYLE = 'currentStyle';\nconst RUNTIME_STYLE = 'runtimeStyle';\nconst LEFT = 'left';\nconst PX = 'px';\n\nfunction _getComputedStyleIE(elem, name) {\n  // currentStyle maybe null\n  // http://msdn.microsoft.com/en-us/library/ms535231.aspx\n  let ret = elem[CURRENT_STYLE] && elem[CURRENT_STYLE][name];\n\n  // 当 width/height 设置为百分比时，通过 pixelLeft 方式转换的 width/height 值\n  // 一开始就处理了! CUSTOM_STYLE.height,CUSTOM_STYLE.width ,cssHook 解决@2011-08-19\n  // 在 ie 下不对，需要直接用 offset 方式\n  // borderWidth 等值也有问题，但考虑到 borderWidth 设为百分比的概率很小，这里就不考虑了\n\n  // From the awesome hack by Dean Edwards\n  // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n  // If we're not dealing with a regular pixel number\n  // but a number that has a weird ending, we need to convert it to pixels\n  // exclude left right for relativity\n  if (_RE_NUM_NO_PX.test(ret) && !RE_POS.test(name)) {\n    // Remember the original values\n    const style = elem.style;\n    const left = style[LEFT];\n    const rsLeft = elem[RUNTIME_STYLE][LEFT];\n\n    // prevent flashing of content\n    elem[RUNTIME_STYLE][LEFT] = elem[CURRENT_STYLE][LEFT];\n\n    // Put in the new values to get a computed value out\n    style[LEFT] = name === 'fontSize' ? '1em' : ret || 0;\n    ret = style.pixelLeft + PX;\n\n    // Revert the changed values\n    style[LEFT] = left;\n\n    elem[RUNTIME_STYLE][LEFT] = rsLeft;\n  }\n  return ret === '' ? 'auto' : ret;\n}\n\nlet getComputedStyleX;\nif (typeof window !== 'undefined') {\n  getComputedStyleX = window.getComputedStyle\n    ? _getComputedStyle\n    : _getComputedStyleIE;\n}\n\nfunction each(arr, fn) {\n  for (let i = 0; i < arr.length; i++) {\n    fn(arr[i]);\n  }\n}\n\nfunction isBorderBoxFn(elem) {\n  return getComputedStyleX(elem, 'boxSizing') === 'border-box';\n}\n\nconst BOX_MODELS = ['margin', 'border', 'padding'];\nconst CONTENT_INDEX = -1;\nconst PADDING_INDEX = 2;\nconst BORDER_INDEX = 1;\nconst MARGIN_INDEX = 0;\n\nfunction swap(elem, options, callback) {\n  const old = {};\n  const style = elem.style;\n  let name;\n\n  // Remember the old values, and insert the new ones\n  for (name in options) {\n    if (options.hasOwnProperty(name)) {\n      old[name] = style[name];\n      style[name] = options[name];\n    }\n  }\n\n  callback.call(elem);\n\n  // Revert the old values\n  for (name in options) {\n    if (options.hasOwnProperty(name)) {\n      style[name] = old[name];\n    }\n  }\n}\n\nfunction getPBMWidth(elem, props, which) {\n  let value = 0;\n  let prop;\n  let j;\n  let i;\n  for (j = 0; j < props.length; j++) {\n    prop = props[j];\n    if (prop) {\n      for (i = 0; i < which.length; i++) {\n        let cssProp;\n        if (prop === 'border') {\n          cssProp = `${prop + which[i]}Width`;\n        } else {\n          cssProp = prop + which[i];\n        }\n        value += parseFloat(getComputedStyleX(elem, cssProp)) || 0;\n      }\n    }\n  }\n  return value;\n}\n\n/**\n * A crude way of determining if an object is a window\n * @member util\n */\nfunction isWindow(obj) {\n  // must use == for ie8\n  /* eslint eqeqeq:0 */\n  return obj != null && obj == obj.window;\n}\n\nconst domUtils = {};\n\neach(['Width', 'Height'], name => {\n  domUtils[`doc${name}`] = refWin => {\n    const d = refWin.document;\n    return Math.max(\n      // firefox chrome documentElement.scrollHeight< body.scrollHeight\n      // ie standard mode : documentElement.scrollHeight> body.scrollHeight\n      d.documentElement[`scroll${name}`],\n      // quirks : documentElement.scrollHeight 最大等于可视窗口多一点？\n      d.body[`scroll${name}`],\n      domUtils[`viewport${name}`](d),\n    );\n  };\n\n  domUtils[`viewport${name}`] = win => {\n    // pc browser includes scrollbar in window.innerWidth\n    const prop = `client${name}`;\n    const doc = win.document;\n    const body = doc.body;\n    const documentElement = doc.documentElement;\n    const documentElementProp = documentElement[prop];\n    // 标准模式取 documentElement\n    // backcompat 取 body\n    return (\n      (doc.compatMode === 'CSS1Compat' && documentElementProp) ||\n      (body && body[prop]) ||\n      documentElementProp\n    );\n  };\n});\n\n/*\n 得到元素的大小信息\n @param elem\n @param name\n @param {String} [extra]  'padding' : (css width) + padding\n 'border' : (css width) + padding + border\n 'margin' : (css width) + padding + border + margin\n */\nfunction getWH(elem, name, extra) {\n  if (isWindow(elem)) {\n    return name === 'width'\n      ? domUtils.viewportWidth(elem)\n      : domUtils.viewportHeight(elem);\n  } else if (elem.nodeType === 9) {\n    return name === 'width'\n      ? domUtils.docWidth(elem)\n      : domUtils.docHeight(elem);\n  }\n  const which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n  let borderBoxValue = name === 'width' ? elem.offsetWidth : elem.offsetHeight;\n  const computedStyle = getComputedStyleX(elem);\n  const isBorderBox = isBorderBoxFn(elem, computedStyle);\n  let cssBoxValue = 0;\n  if (borderBoxValue == null || borderBoxValue <= 0) {\n    borderBoxValue = undefined;\n    // Fall back to computed then un computed css if necessary\n    cssBoxValue = getComputedStyleX(elem, name);\n    if (cssBoxValue == null || Number(cssBoxValue) < 0) {\n      cssBoxValue = elem.style[name] || 0;\n    }\n    // Normalize '', auto, and prepare for extra\n    cssBoxValue = parseFloat(cssBoxValue) || 0;\n  }\n  if (extra === undefined) {\n    extra = isBorderBox ? BORDER_INDEX : CONTENT_INDEX;\n  }\n  const borderBoxValueOrIsBorderBox =\n    borderBoxValue !== undefined || isBorderBox;\n  const val = borderBoxValue || cssBoxValue;\n  if (extra === CONTENT_INDEX) {\n    if (borderBoxValueOrIsBorderBox) {\n      return (\n        val - getPBMWidth(elem, ['border', 'padding'], which, computedStyle)\n      );\n    }\n    return cssBoxValue;\n  }\n  if (borderBoxValueOrIsBorderBox) {\n    const padding =\n      extra === PADDING_INDEX\n        ? -getPBMWidth(elem, ['border'], which, computedStyle)\n        : getPBMWidth(elem, ['margin'], which, computedStyle);\n    return val + (extra === BORDER_INDEX ? 0 : padding);\n  }\n  return (\n    cssBoxValue +\n    getPBMWidth(elem, BOX_MODELS.slice(extra), which, computedStyle)\n  );\n}\n\nconst cssShow = {\n  position: 'absolute',\n  visibility: 'hidden',\n  display: 'block',\n};\n\n// fix #119 : https://github.com/kissyteam/kissy/issues/119\nfunction getWHIgnoreDisplay(elem) {\n  let val;\n  const args = arguments;\n  // in case elem is window\n  // elem.offsetWidth === undefined\n  if (elem.offsetWidth !== 0) {\n    val = getWH.apply(undefined, args);\n  } else {\n    swap(elem, cssShow, () => {\n      val = getWH.apply(undefined, args);\n    });\n  }\n  return val;\n}\n\nfunction css(el, name, v) {\n  let value = v;\n  if (typeof name === 'object') {\n    for (const i in name) {\n      if (name.hasOwnProperty(i)) {\n        css(el, i, name[i]);\n      }\n    }\n    return undefined;\n  }\n  if (typeof value !== 'undefined') {\n    if (typeof value === 'number') {\n      value += 'px';\n    }\n    el.style[name] = value;\n    return undefined;\n  }\n  return getComputedStyleX(el, name);\n}\n\neach(['width', 'height'], name => {\n  const first = name.charAt(0).toUpperCase() + name.slice(1);\n  domUtils[`outer${first}`] = (el, includeMargin) => {\n    return (\n      el &&\n      getWHIgnoreDisplay(el, name, includeMargin ? MARGIN_INDEX : BORDER_INDEX)\n    );\n  };\n  const which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n\n  domUtils[name] = (elem, val) => {\n    if (val !== undefined) {\n      if (elem) {\n        const computedStyle = getComputedStyleX(elem);\n        const isBorderBox = isBorderBoxFn(elem);\n        if (isBorderBox) {\n          val += getPBMWidth(elem, ['padding', 'border'], which, computedStyle);\n        }\n        return css(elem, name, val);\n      }\n      return undefined;\n    }\n    return elem && getWHIgnoreDisplay(elem, name, CONTENT_INDEX);\n  };\n});\n\n// 设置 elem 相对 elem.ownerDocument 的坐标\nfunction setOffset(elem, offset) {\n  // set position first, in-case top/left are set even on static elem\n  if (css(elem, 'position') === 'static') {\n    elem.style.position = 'relative';\n  }\n\n  const old = getOffset(elem);\n  const ret = {};\n  let current;\n  let key;\n\n  for (key in offset) {\n    if (offset.hasOwnProperty(key)) {\n      current = parseFloat(css(elem, key)) || 0;\n      ret[key] = current + offset[key] - old[key];\n    }\n  }\n  css(elem, ret);\n}\n\nexport default {\n  getWindow(node) {\n    const doc = node.ownerDocument || node;\n    return doc.defaultView || doc.parentWindow;\n  },\n  offset(el, value) {\n    if (typeof value !== 'undefined') {\n      setOffset(el, value);\n    } else {\n      return getOffset(el);\n    }\n  },\n  isWindow,\n  each,\n  css,\n  clone(obj) {\n    const ret = {};\n    for (const i in obj) {\n      if (obj.hasOwnProperty(i)) {\n        ret[i] = obj[i];\n      }\n    }\n    const overflow = obj.overflow;\n    if (overflow) {\n      for (const i in obj) {\n        if (obj.hasOwnProperty(i)) {\n          ret.overflow[i] = obj.overflow[i];\n        }\n      }\n    }\n    return ret;\n  },\n  scrollLeft(w, v) {\n    if (isWindow(w)) {\n      if (v === undefined) {\n        return getScrollLeft(w);\n      }\n      window.scrollTo(v, getScrollTop(w));\n    } else {\n      if (v === undefined) {\n        return w.scrollLeft;\n      }\n      w.scrollLeft = v;\n    }\n  },\n  scrollTop(w, v) {\n    if (isWindow(w)) {\n      if (v === undefined) {\n        return getScrollTop(w);\n      }\n      window.scrollTo(getScrollLeft(w), v);\n    } else {\n      if (v === undefined) {\n        return w.scrollTop;\n      }\n      w.scrollTop = v;\n    }\n  },\n  viewportWidth: 0,\n  viewportHeight: 0,\n  ...domUtils,\n};\n","import util from './util';\n\nfunction scrollIntoView(elem, container, config) {\n  config = config || {};\n  // document 归一化到 window\n  if (container.nodeType === 9) {\n    container = util.getWindow(container);\n  }\n\n  let allowHorizontalScroll = config.allowHorizontalScroll;\n  const onlyScrollIfNeeded = config.onlyScrollIfNeeded;\n  let alignWithTop = config.alignWithTop;\n  let alignWithLeft = config.alignWithLeft;\n  const offsetTop = config.offsetTop || 0;\n  const offsetLeft = config.offsetLeft || 0;\n  const offsetBottom = config.offsetBottom || 0;\n  const offsetRight = config.offsetRight || 0;\n\n  allowHorizontalScroll =\n    allowHorizontalScroll === undefined ? true : allowHorizontalScroll;\n\n  const isWin = util.isWindow(container);\n  const elemOffset = util.offset(elem);\n  const eh = util.outerHeight(elem);\n  const ew = util.outerWidth(elem);\n  let containerOffset;\n  let ch;\n  let cw;\n  let containerScroll;\n  let diffTop;\n  let diffBottom;\n  let win;\n  let winScroll;\n  let ww;\n  let wh;\n\n  if (isWin) {\n    win = container;\n    wh = util.height(win);\n    ww = util.width(win);\n    winScroll = {\n      left: util.scrollLeft(win),\n      top: util.scrollTop(win),\n    };\n    // elem 相对 container 可视视窗的距离\n    diffTop = {\n      left: elemOffset.left - winScroll.left - offsetLeft,\n      top: elemOffset.top - winScroll.top - offsetTop,\n    };\n    diffBottom = {\n      left: elemOffset.left + ew - (winScroll.left + ww) + offsetRight,\n      top: elemOffset.top + eh - (winScroll.top + wh) + offsetBottom,\n    };\n    containerScroll = winScroll;\n  } else {\n    containerOffset = util.offset(container);\n    ch = container.clientHeight;\n    cw = container.clientWidth;\n    containerScroll = {\n      left: container.scrollLeft,\n      top: container.scrollTop,\n    };\n    // elem 相对 container 可视视窗的距离\n    // 注意边框, offset 是边框到根节点\n    diffTop = {\n      left:\n        elemOffset.left -\n        (containerOffset.left +\n          (parseFloat(util.css(container, 'borderLeftWidth')) || 0)) -\n        offsetLeft,\n      top:\n        elemOffset.top -\n        (containerOffset.top +\n          (parseFloat(util.css(container, 'borderTopWidth')) || 0)) -\n        offsetTop,\n    };\n    diffBottom = {\n      left:\n        elemOffset.left +\n        ew -\n        (containerOffset.left +\n          cw +\n          (parseFloat(util.css(container, 'borderRightWidth')) || 0)) +\n        offsetRight,\n      top:\n        elemOffset.top +\n        eh -\n        (containerOffset.top +\n          ch +\n          (parseFloat(util.css(container, 'borderBottomWidth')) || 0)) +\n        offsetBottom,\n    };\n  }\n\n  if (diffTop.top < 0 || diffBottom.top > 0) {\n    // 强制向上\n    if (alignWithTop === true) {\n      util.scrollTop(container, containerScroll.top + diffTop.top);\n    } else if (alignWithTop === false) {\n      util.scrollTop(container, containerScroll.top + diffBottom.top);\n    } else {\n      // 自动调整\n      if (diffTop.top < 0) {\n        util.scrollTop(container, containerScroll.top + diffTop.top);\n      } else {\n        util.scrollTop(container, containerScroll.top + diffBottom.top);\n      }\n    }\n  } else {\n    if (!onlyScrollIfNeeded) {\n      alignWithTop = alignWithTop === undefined ? true : !!alignWithTop;\n      if (alignWithTop) {\n        util.scrollTop(container, containerScroll.top + diffTop.top);\n      } else {\n        util.scrollTop(container, containerScroll.top + diffBottom.top);\n      }\n    }\n  }\n\n  if (allowHorizontalScroll) {\n    if (diffTop.left < 0 || diffBottom.left > 0) {\n      // 强制向上\n      if (alignWithLeft === true) {\n        util.scrollLeft(container, containerScroll.left + diffTop.left);\n      } else if (alignWithLeft === false) {\n        util.scrollLeft(container, containerScroll.left + diffBottom.left);\n      } else {\n        // 自动调整\n        if (diffTop.left < 0) {\n          util.scrollLeft(container, containerScroll.left + diffTop.left);\n        } else {\n          util.scrollLeft(container, containerScroll.left + diffBottom.left);\n        }\n      }\n    } else {\n      if (!onlyScrollIfNeeded) {\n        alignWithLeft = alignWithLeft === undefined ? true : !!alignWithLeft;\n        if (alignWithLeft) {\n          util.scrollLeft(container, containerScroll.left + diffTop.left);\n        } else {\n          util.scrollLeft(container, containerScroll.left + diffBottom.left);\n        }\n      }\n    }\n  }\n}\n\nexport default scrollIntoView;\n","export default function debounce(func, wait, immediate) {\n  var timeout, args, context, timestamp, result;\n\n  var later = function() {\n    var last = Date.now() - timestamp;\n\n    if (last < wait && last >= 0) {\n      timeout = setTimeout(later, wait - last);\n    } else {\n      timeout = null;\n      if (!immediate) {\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      }\n    }\n  };\n\n  return function() {\n    context = this;\n    args = arguments;\n    timestamp = Date.now();\n    var callNow = immediate && !timeout;\n    if (!timeout) timeout = setTimeout(later, wait);\n    if (callNow) {\n      result = func.apply(context, args);\n      context = args = null;\n    }\n\n    return result;\n  };\n}\n","export default () => {};\n","// packages\nimport { cloneElement, Component, h } from 'preact';\nimport scrollIntoView from 'dom-scroll-into-view';\n\n// internal\nimport debounce from '../utils/debounce';\nimport noop from '../utils/noop';\n\nclass Typeahead extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      highlightedIndex: null,\n      isOpen: false,\n    };\n\n    this.handleOnBlur = this.handleOnBlur.bind(this);\n    this.handleOnClear = this.handleOnClear.bind(this);\n    this.handleOnFocus = this.handleOnFocus.bind(this);\n    this.handleOnInput = this.handleOnInput.bind(this);\n    this.debouncedHandleOnInput = debounce(\n      this.handleOnInput,\n      this.props.debounceDuration\n    );\n    this.handleKeyDown = this.handleKeyDown.bind(this);\n    this.setInputRef = this.setInputRef.bind(this);\n    this.setMenuRef = this.setMenuRef.bind(this);\n    this.setItemRef = this.setItemRef.bind(this);\n\n    this.listRefs = {};\n  }\n\n  static getDerivedStateFromProps(_, prevState) {\n    if (prevState.highlightedIndex == null) {\n      return { highlightedIndex: 0 };\n    }\n  }\n\n  componentDidUpdate() {\n    const { highlightedIndex } = this.state;\n    const count = this.getFilteredItems(this.props).length;\n\n    if (Boolean(highlightedIndex) && highlightedIndex >= count) {\n      this.setState({ highlightedIndex: 0 });\n    }\n\n    this.maybeScrollItemIntoView();\n  }\n\n  setInputRef(element) {\n    this.inputRef = element;\n  }\n\n  setMenuRef(element) {\n    this.menuRef = element;\n  }\n\n  setItemRef(element, idx) {\n    this.listRefs[`item-${idx}`] = element;\n  }\n\n  maybeScrollItemIntoView() {\n    const { highlightedIndex, isOpen } = this.state;\n\n    if (isOpen && highlightedIndex != null) {\n      const itemNode = this.listRefs[`item-${this.state.highlightedIndex}`];\n      const menuNode = this.menuRef;\n\n      if (itemNode && menuNode) {\n        scrollIntoView(itemNode, menuNode, {\n          onlyScrollIfNeeded: true,\n        });\n      }\n    }\n  }\n\n  getFilteredItems(props) {\n    let { items } = props;\n\n    const { shouldItemRender, sortItems } = props;\n\n    if (shouldItemRender) {\n      items = items.filter(item => shouldItemRender(item, props.value));\n    }\n\n    if (sortItems) {\n      items = items.sort((a, b) => sortItems(a, b, props.value));\n    }\n\n    return items;\n  }\n\n  highlightItemOnMouseEnter(highlightedIndex) {\n    this.setState({ highlightedIndex });\n  }\n\n  selectItemOnClick(item) {\n    const { getItemValue, onSelect } = this.props;\n\n    const value = getItemValue(item);\n\n    this.setState(\n      {\n        highlightedIndex: null,\n        isOpen: false,\n      },\n      () => {\n        this.inputRef.blur();\n        onSelect(value, item);\n      }\n    );\n  }\n\n  renderList() {\n    const { highlightedIndex } = this.state;\n    const props = this.props;\n\n    if (!props.value) return null;\n\n    const items = this.getFilteredItems(props);\n\n    return (\n      <ul\n        class=\"listbox\"\n        ref={this.setMenuRef}\n        onMouseDown={event => event.preventDefault()}\n      >\n        {items.map((item, idx) => {\n          return cloneElement(\n            props.renderItem(item, idx === highlightedIndex),\n            {\n              onClick: () => this.selectItemOnClick(item),\n              onMouseEnter: () => this.highlightItemOnMouseEnter(idx),\n              ref: el => this.setItemRef(el, idx),\n            }\n          );\n        })}\n        {items.length > 0 && props.renderAttribution()}\n      </ul>\n    );\n  }\n\n  handleOnClear(event) {\n    this.setState({ isOpen: false });\n\n    this.props.onClear(event);\n  }\n\n  handleOnBlur() {\n    this.setState({ isOpen: false });\n\n    const { onBlur } = this.props.inputProps;\n    if (onBlur) onBlur(event);\n  }\n\n  handleOnFocus(event) {\n    const { value } = this.props;\n\n    if (value.length > 0) this.setState({ isOpen: true });\n\n    const { onFocus } = this.props.inputProps;\n    if (onFocus) onFocus(event);\n  }\n\n  handleOnInput(event) {\n    const { value } = event.target;\n\n    this.props.onChange(value, event);\n\n    if (value.length <= 0) {\n      this.setState({ highlightedIndex: null });\n    }\n  }\n\n  handleKeyDown(event) {\n    const { isOpen } = this.state;\n\n    if (isOpen && Typeahead.keyEvents[event.key]) {\n      Typeahead.keyEvents[event.key].call(this, event);\n    } else if (!isOpen) {\n      this.setState({ isOpen: true });\n    }\n  }\n\n  render() {\n    const { inputProps, onClear, renderInput, value } = this.props;\n    const { isOpen } = this.state;\n\n    return (\n      <div class=\"typeahead\">\n        <div class=\"typeahead__input-wrapper\">\n          {renderInput({\n            ...inputProps,\n            role: 'combobox',\n            'aria-autocomplete': 'list',\n            'aria-expanded': String(isOpen),\n            autocomplete: 'off',\n            onBlur: this.handleOnBlur,\n            onFocus: this.handleOnFocus,\n            onInput: this.handleOnInput,\n            onKeyDown: this.handleKeyDown,\n            value,\n            ref: this.setInputRef,\n          })}\n          {onClear && value && (\n            <button\n              onClick={this.handleOnClear}\n              type=\"button\"\n              class=\"close\"\n              aria-label=\"Clear\"\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n          )}\n        </div>\n        {isOpen && this.renderList()}\n      </div>\n    );\n  }\n}\n\nTypeahead.defaultProps = {\n  debounceDuration: 150,\n  inputProps: {},\n  onChange: noop,\n  onClear: noop,\n  onSelect: noop,\n  renderInput: props => <input {...props} />,\n  value: '',\n};\n\nTypeahead.keyEvents = {\n  ArrowDown(event) {\n    event.preventDefault();\n\n    const items = this.getFilteredItems(this.props);\n    const itemsCount = items.length;\n    if (itemsCount < 1) return;\n\n    const { highlightedIndex } = this.state;\n\n    const newIndex =\n      highlightedIndex < itemsCount - 1\n        ? highlightedIndex + 1\n        : highlightedIndex;\n\n    this.setState({ highlightedIndex: newIndex });\n  },\n\n  ArrowUp(event) {\n    event.preventDefault();\n\n    const items = this.getFilteredItems(this.props);\n    const itemsCount = items.length;\n    if (itemsCount < 1) return;\n\n    const { highlightedIndex } = this.state;\n\n    const newIndex =\n      highlightedIndex > 0 ? highlightedIndex - 1 : highlightedIndex;\n\n    this.setState({ highlightedIndex: newIndex });\n  },\n\n  Enter(event) {\n    // not the right kind of Enter, abort\n    if (event.keyCode !== 13) return;\n\n    const { highlightedIndex, isOpen } = this.state;\n\n    if (!isOpen) {\n      // the menu is not open\n      return;\n    } else if (highlightedIndex == null) {\n      // input has control, but there's nothing selected\n      this.setState({ isOpen: false }, () => this.inputRef.select());\n    } else {\n      // the input has control and we have an item\n      event.preventDefault();\n\n      const item = this.getFilteredItems(this.props)[highlightedIndex];\n      const value = this.props.getItemValue(item);\n\n      this.setState(\n        {\n          highlightedIndex: null,\n          isOpen: false,\n        },\n        () => {\n          this.inputRef.setSelectionRange(value.length, value.length);\n          this.props.onSelect(value, item);\n        }\n      );\n    }\n  },\n\n  Escape() {\n    this.setState({\n      highlightedIndex: null,\n      isOpen: false,\n    });\n  },\n};\n\nexport default Typeahead;\n","// packages\nimport cx from 'classnames';\nimport { get, set } from '../vendor/idb-keyval';\nimport { h } from 'preact';\n\n// components\nimport CandidateRow from './CandidateRow';\nimport Contest from './Contest';\nimport SeatPartyDivider from './SeatPartyDivider';\nimport Portal from './Portal';\nimport PureComponent from './PureComponent';\nimport Typeahead from './Typeahead';\n\n// internal\nimport debounce from '../utils/debounce';\nimport { determineContestTitleYourRaces } from '../election-utils';\nimport { lookup } from '../utils/legislative-districts';\n\nconst sessionToken = new google.maps.places.AutocompleteSessionToken();\nconst autocompleteService = new google.maps.places.AutocompleteService();\n\nconst bounds = {\n  east: -93.514764,\n  west: -106.662177,\n  south: 25.843902,\n  north: 36.500199,\n};\n\nconst componentRestrictions = { country: 'us' };\nconst types = ['geocode'];\n\nconst getPredictions = input => {\n  return new Promise((resolve, reject) => {\n    autocompleteService.getPlacePredictions(\n      { bounds, componentRestrictions, input, sessionToken, types },\n      (predict, status) => {\n        if (status === 'OK') resolve(predict);\n\n        reject(new Error('No results found.'));\n      }\n    );\n  });\n};\n\n// always render what's provided, the geocoder decides\nconst shouldItemRender = () => true;\n\nclass YourRaces extends PureComponent {\n  constructor() {\n    super();\n\n    this.state = {\n      contests: [],\n      coordinates: null,\n      data: null,\n      lookupError: false,\n      lookupPending: false,\n      lookedFoundStored: false,\n      results: [],\n      value: '',\n    };\n\n    this.handleGeocode = this.handleGeocode.bind(this);\n    this.debouncedHandleGeocode = debounce(this.handleGeocode, 300);\n    this.onChange = this.onChange.bind(this);\n    this.onClear = this.onClear.bind(this);\n    this.onSelect = this.onSelect.bind(this);\n  }\n\n  onClear(value) {\n    this.setState({ value: '' });\n  }\n\n  onChange(value) {\n    this.setState({ value }, this.debouncedHandleGeocode);\n  }\n\n  handleGeocode() {\n    const { value: input } = this.state;\n\n    getPredictions(input)\n      .then(results => this.setState({ results }))\n      .catch(() => this.setState({ results: [] }));\n  }\n\n  onSelect({ name, placeId }) {\n    this.setState({ lookupError: false, lookupPending: true, value: name });\n\n    this.placesService.getDetails(\n      {\n        fields: ['geometry.location'],\n        placeId,\n        sessionToken,\n      },\n      result => {\n        const {\n          lat: latitude,\n          lng: longitude,\n        } = result.geometry.location.toJSON();\n\n        const coordinates = { latitude, longitude };\n\n        lookup(coordinates)\n          .then(({ data }) =>\n            this.setState(\n              {\n                coordinates,\n                data,\n                lookupPending: false,\n                lookedFoundStored: false,\n              },\n              () => set('your-races-lookup', data)\n            )\n          )\n          .catch(() =>\n            this.setState({\n              data: null,\n              lookupError: true,\n              lookupPending: false,\n            })\n          );\n      }\n    );\n  }\n\n  componentDidMount() {\n    this.placesService = new google.maps.places.PlacesService(this.inputRef);\n\n    get('your-races-lookup').then(data => {\n      if (data != null) {\n        this.setState({ data, lookedFoundStored: true });\n      }\n    });\n  }\n\n  render() {\n    const { contests, flags } = this.props;\n    const {\n      coordinates,\n      data,\n      lookupError,\n      lookupPending,\n      lookedFoundStored,\n      results,\n      value,\n    } = this.state;\n\n    let addressFeedback = null;\n\n    const matches = {\n      'us-house': null,\n      sboe: null,\n      'tx-senate': null,\n      'tx-house': null,\n    };\n\n    const flagMatches = {\n      'us-house': null,\n      sboe: null,\n      'tx-senate': null,\n      'tx-house': null,\n    };\n\n    if (data) {\n      matches['us-house'] = contests.filter(\n        contest =>\n          contest.office === 'U.S. House' &&\n          contest.office_division === data.us_house.district\n      );\n\n      matches['sboe'] = contests.filter(\n        contest =>\n          contest.office === 'State Board of Education' &&\n          contest.office_division === data.sboe.district\n      );\n\n      matches['tx-senate'] = contests.filter(\n        contest =>\n          contest.office === 'Texas Senate' &&\n          contest.office_division === data.tx_senate.district\n      );\n\n      matches['tx-house'] = contests.filter(\n        contest =>\n          contest.office === 'Texas House' &&\n          contest.office_division === data.tx_house.district\n      );\n\n\n      flagMatches['us-house'] = flags.filter(\n        contest =>\n          contest.type === 'us-house-district-' + data.us_house.district\n      );\n\n      flagMatches['sboe'] = flags.filter(\n        contest =>\n          contest.type ===\n          'state-board-of-education-district-' + data.sboe.district\n      );\n\n      flagMatches['tx-senate'] = flags.filter(\n        contest =>\n          contest.type === 'texas-senate-district-' + data.tx_senate.district\n      );\n\n      flagMatches['tx-house'] = flags.filter(\n        contest =>\n          contest.type === 'texas-house-district-' + data.tx_house.district\n      );\n    }\n\n    if (lookupPending) {\n      addressFeedback = (\n        <p class=\"copy copy--sans font-weight-bold text-center\">\n          Finding your details...{' '}\n          <svg class=\"icon icon-spinner animate-pulse\">\n            <use xlinkHref=\"#icon-spinner\" />\n          </svg>\n        </p>\n      );\n    }\n\n    if (lookupError) {\n      addressFeedback = (\n        <p class=\"copy copy--sans font-weight-bold text-center\">\n          Hmm... we were unable to find you in Texas. Please check your address\n          and try again!\n        </p>\n      );\n    }\n\n    if (coordinates && !lookupPending && !lookupError) {\n      addressFeedback = (\n        <p class=\"copy copy--sans font-weight-bold text-center\">\n          We found your information! These races have been personalized for you.\n        </p>\n      );\n    }\n\n    if (lookedFoundStored && !lookupPending && !lookupError) {\n      addressFeedback = (\n        <p class=\"copy copy--sans font-weight-bold text-center\">\n          Welcome back! We remembered the districts you found last time.\n        </p>\n      );\n    }\n\n    const inputProps = {\n      id: 'address-input',\n      class: 'address-input__input',\n      placeholder: '1010 Colorado St, Austin, TX, 78701',\n    };\n\n    return (\n      <div class=\"address-input\">\n        <label class=\"address-input__label\" for=\"address-input\">\n          Enter your address\n        </label>\n        <Typeahead\n          inputProps={inputProps}\n          items={results}\n          getItemValue={item => ({\n            name: item.description,\n            placeId: item.place_id,\n          })}\n          value={value}\n          onChange={this.onChange}\n          onClear={this.onClear}\n          onSelect={this.onSelect}\n          renderItem={(item, isHighlighted) => (\n            <li\n              class={cx('listbox__item', {\n                'listbox__item--highlighted': isHighlighted,\n              })}\n              key={item.id}\n            >\n              {item.description}\n            </li>\n          )}\n          renderAttribution={() => (\n            <li class=\"listbox__item listbox__item--attribution\">\n              <img src=\"assets/images/powered-by-google.png\" />\n            </li>\n          )}\n          shouldItemRender={shouldItemRender}\n          renderInput={props => (\n            <input\n              {...props}\n              ref={el => {\n                props.ref(el);\n                this.inputRef = el;\n              }}\n            />\n          )}\n        />\n        {addressFeedback}\n        {data && contests.length > 0 && (\n          <Portal\n            node={document.getElementById('your-races-results')}\n            ref={ref => (this._resultsPortal = ref)}\n          >\n            <div class=\"representative-districts contest-list\">\n              <Contest\n                key={matches['us-house'][0].office_slug}\n                contest={matches['us-house']}\n                flags={flagMatches['us-house']}\n                contestTitle={determineContestTitleYourRaces(\n                  matches['us-house'][0]\n                )}\n                renderParty={party => (\n                  <SeatPartyDivider\n                    partyName={party.party}\n                    partyBallot={party}\n                    tableHeader={CandidateRow.Header}\n                    columnCount={CandidateRow.columnCount}\n                    renderCandidate={(\n                      candidate,\n                      idx,\n                      viewAllCandidates,\n                      { totalVotes }\n                    ) => (\n                      <CandidateRow\n                        key={candidate.id}\n                        ballotName={candidate.name}\n                        candidateId={candidate.id}\n                        contestIsCalled={matches['us-house'].is_called}\n                        isIncumbent={candidate.is_incumbent}\n                        isWinner={candidate.is_winner}\n                        isViewable={viewAllCandidates || idx < 3}\n                        party={candidate.party}\n                        totalVotesInContest={totalVotes}\n                        votes={candidate.votes}\n                      />\n                    )}\n                  />\n                )}\n              />\n              {matches['sboe'].length > 0 && (\n                <Contest\n                  key={matches['sboe'][0].office_slug}\n                  contest={matches['sboe']}\n                  flags={flagMatches['sboe']}\n                  contestTitle={determineContestTitleYourRaces(\n                    matches['sboe'][0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(\n                        candidate,\n                        idx,\n                        viewAllCandidates,\n                        { totalVotes }\n                      ) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          contestIsCalled={matches['sboe'].is_called}\n                          isIncumbent={candidate.is_incumbent}\n                          isWinner={candidate.is_winner}\n                          isViewable={viewAllCandidates || idx < 3}\n                          party={candidate.party}\n                          totalVotesInContest={totalVotes}\n                          votes={candidate.votes}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              )}\n              {matches['tx-senate'].length > 0 && (\n                <Contest\n                  key={matches['tx-senate'].id}\n                  contest={matches['tx-senate']}\n                  flags={flagMatches['tx-senate']}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitleYourRaces(\n                    matches['tx-senate'][0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(candidate, { totalVotes }) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          contestIsCalled={matches['tx-senate'].is_called}\n                          isIncumbent={candidate.is_incumbent}\n                          isWinner={candidate.is_winner}\n                          party={candidate.party}\n                          totalVotesInContest={totalVotes}\n                          votes={candidate.votes}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              )}\n              <Contest\n                key={matches['tx-house'].id}\n                contest={matches['tx-house']}\n                flags={flagMatches['tx-house']}\n                columnCount={CandidateRow.columnCount}\n                contestTitle={determineContestTitleYourRaces(\n                  matches['tx-house'][0]\n                )}\n                renderParty={party => (\n                  <SeatPartyDivider\n                    partyName={party.party}\n                    partyBallot={party}\n                    tableHeader={CandidateRow.Header}\n                    columnCount={CandidateRow.columnCount}\n                    renderCandidate={(\n                      candidate,\n                      idx,\n                      viewAllCandidates,\n                      { totalVotes }\n                    ) => (\n                      <CandidateRow\n                        key={candidate.id}\n                        ballotName={candidate.name}\n                        candidateId={candidate.id}\n                        contestIsCalled={matches['tx-house'].is_called}\n                        isIncumbent={candidate.is_incumbent}\n                        isViewable={viewAllCandidates || idx < 3}\n                        isWinner={candidate.is_winner}\n                        party={candidate.party}\n                        totalVotesInContest={totalVotes}\n                        votes={candidate.votes}\n                      />\n                    )}\n                  />\n                )}\n              />\n            </div>\n          </Portal>\n        )}\n      </div>\n    );\n  }\n}\n\nexport default YourRaces;\n","import getJSON from './get-json';\n\nconst LOOKUP_URL = ({ latitude, longitude, includeGeography = false }) =>\n  `https://dv-dev.texastribune.org/legislative-lookup/?latitude=${latitude}&longitude=${longitude}`;\n\nexport function lookup({ latitude, longitude }) {\n  return getJSON(LOOKUP_URL({ latitude, longitude }));\n}\n","// packages\nimport cx from 'classnames';\nimport { Component, h } from 'preact';\n\n// components\nimport CandidateRow from './components/CandidateRow';\nimport Contest from './components/Contest';\nimport NewContestShowcase from './components/NewContestShowcase';\nimport YourRaces from './components/YourRaces';\nimport Portal from './components/Portal';\nimport SeatPartyDivider from './components/SeatPartyDivider';\n\nimport find from './utils/find';\nimport { determineContestTitle, countdown } from './election-utils';\nimport { RESULTS_IN_USE } from './endpoints';\nimport getJSON from './utils/get-json';\nimport { LENGTH_OF_CHECK_INTERVAL } from './constants';\n\ntype State = {\n  data: { [key: string]: any },\n  now: Date | null,\n};\n\nclass App extends Component<{}, State> {\n  //   timer!: number;\n\n  constructor() {\n    super();\n\n    this.state = {\n      data: [],\n      now: null,\n      timer: 0\n    };\n\n    this.fetchData = this.fetchData.bind(this);\n  }\n\n  fetchData() {\n    const now = new Date();\n    console.info('Requesting:', now);\n\n    getJSON(RESULTS_IN_USE).then(data =>\n      this.setState({ data, now }, this.startTimer)\n    );\n  }\n\n  startTimer() {\n    this.timer = window.setTimeout(this.fetchData, LENGTH_OF_CHECK_INTERVAL);\n\n    \n  }\n\n  clearTimer() {\n    window.clearTimeout(this.timer);\n  }\n\n  componentDidMount() {\n    this.fetchData();\n  }\n\n  componentWillUnmount() {\n    this.clearTimer();\n  }\n\n  componentDidUpdate() {\n    const length = Math.ceil(LENGTH_OF_CHECK_INTERVAL / 60000);\n    countdown(length); //where n is the number of minutes required.\n  }\n\n  render() {\n    const { flags, delegates } = this.props;\n    const { data } = this.state;\n\n    const seats_mapped = data.map(number => ({\n      office: number.office,\n      office_slug: number.office_slug,\n    }));\n\n    function unique(array, propertyName) {\n      return array.filter(\n        (e, i) =>\n          array.findIndex(a => a[propertyName] === e[propertyName]) === i\n      );\n    }\n\n    let unique_seats = unique(seats_mapped, 'office_slug');\n\n    return (\n      <div class=\"results\">\n        <Portal\n          node={document.getElementById('your-races')}\n          ref={ref => (this._yourPortal = ref)}\n        >\n          <YourRaces contests={data} flags={flags} />\n        </Portal>\n\n        <NewContestShowcase\n          contest={find(\n            data,\n            contest =>\n              contest.office === 'President' && contest.party === 'Democrat'\n          )}\n          delegates={delegates}\n          container={document.querySelector('#president .democrat')}\n        />\n        <NewContestShowcase\n          contest={find(\n            data,\n            contest =>\n              contest.office === 'President' && contest.party === 'Republican'\n          )}\n          container={document.querySelector('#president .republican')}\n        />\n        <NewContestShowcase\n          contest={find(\n            data,\n            contest =>\n              contest.office === 'U.S. Senate' && contest.party === 'Democrat'\n          )}\n          container={document.querySelector('#us-senate .democrat')}\n        />\n        <NewContestShowcase\n          contest={find(\n            data,\n            contest =>\n              contest.office === 'U.S. Senate' && contest.party === 'Republican'\n          )}\n          container={document.querySelector('#us-senate .republican')}\n        />\n\n        <Portal\n          node={document.querySelector('#us-house .contests')}\n          ref={ref => (this._usPortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'U.S. House')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  flags={flags.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(\n                        candidate,\n                        idx,\n                        viewAllCandidates,\n                        { totalVotes }\n                      ) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          contestIsCalled={party.is_called}\n                          isIncumbent={candidate.is_incumbent}\n                          isWinner={candidate.is_winner}\n                          isViewable={viewAllCandidates || idx < 3}\n                          party={candidate.party}\n                          totalVotesInContest={totalVotes}\n                          votes={candidate.votes}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector(\n            '#railroad-commission-of-texas .contests'\n          )}\n          ref={ref => (this._supremePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'Texas Railroad Commission')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  // includeCountyRundown\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(\n                        candidate,\n                        idx,\n                        viewAllCandidates,\n                        { totalVotes }\n                      ) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          contestIsCalled={party.is_called}\n                          isIncumbent={candidate.is_incumbent}\n                          isWinner={candidate.is_winner}\n                          isViewable={viewAllCandidates || idx < 3}\n                          party={candidate.party}\n                          totalVotesInContest={totalVotes}\n                          votes={candidate.votes}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector('#state-board-of-education .contests')}\n          ref={ref => (this._sboePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'State Board of Education')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(\n                        candidate,\n                        idx,\n                        viewAllCandidates,\n                        { totalVotes }\n                      ) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          contestIsCalled={party.is_called}\n                          isIncumbent={candidate.is_incumbent}\n                          isWinner={candidate.is_winner}\n                          isViewable={viewAllCandidates || idx < 3}\n                          party={candidate.party}\n                          totalVotesInContest={totalVotes}\n                          votes={candidate.votes}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector('#texas-supreme-court .contests')}\n          ref={ref => (this._supremePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'Texas Supreme Court')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(\n                        candidate,\n                        idx,\n                        viewAllCandidates,\n                        { totalVotes }\n                      ) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          contestIsCalled={party.is_called}\n                          isIncumbent={candidate.is_incumbent}\n                          isWinner={candidate.is_winner}\n                          isViewable={viewAllCandidates || idx < 3}\n                          party={candidate.party}\n                          totalVotesInContest={totalVotes}\n                          votes={candidate.votes}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector(\n            '#texas-court-of-criminal-appeals .contests'\n          )}\n          ref={ref => (this._crimPortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(\n                contest => contest.office === 'Texas Court of Criminal Appeals'\n              )\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(\n                        candidate,\n                        idx,\n                        viewAllCandidates,\n                        { totalVotes }\n                      ) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          contestIsCalled={party.is_called}\n                          isIncumbent={candidate.is_incumbent}\n                          isWinner={candidate.is_winner}\n                          isViewable={viewAllCandidates || idx < 3}\n                          party={candidate.party}\n                          totalVotesInContest={totalVotes}\n                          votes={candidate.votes}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector('#texas-senate .contests')}\n          ref={ref => (this._senatePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'Texas Senate')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  flags={flags.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(\n                        candidate,\n                        idx,\n                        viewAllCandidates,\n                        { totalVotes }\n                      ) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          contestIsCalled={party.is_called}\n                          isIncumbent={candidate.is_incumbent}\n                          isWinner={candidate.is_winner}\n                          isViewable={viewAllCandidates || idx < 3}\n                          party={candidate.party}\n                          totalVotesInContest={totalVotes}\n                          votes={candidate.votes}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n\n        <Portal\n          node={document.querySelector('#texas-house .contests')}\n          ref={ref => (this._housePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'Texas House')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  flags={flags.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(\n                        candidate,\n                        idx,\n                        viewAllCandidates,\n                        { totalVotes }\n                      ) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          contestIsCalled={party.is_called}\n                          isIncumbent={candidate.is_incumbent}\n                          isWinner={candidate.is_winner}\n                          isViewable={viewAllCandidates || idx < 3}\n                          party={candidate.party}\n                          totalVotesInContest={totalVotes}\n                          votes={candidate.votes}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n      </div>\n    );\n  }\n}\n\nexport default App;\n","// import JS files\nimport '../kickstart';\nimport { h, render } from 'preact';\nimport select from '../utils/select';\nimport selectAll from '../utils/select-all';\n\n// Components\nimport App from '../ResultsApp';\nimport loadJsonScript from '../utils/load-json-script';\n\nconst flags = loadJsonScript('flag_data');\n\nconst delegates = loadJsonScript('delegates_data');\n\nrender(\n  <App flags={flags} delegates={delegates} />,\n  document.getElementById('app')\n);\n\n// Navigation bar at the top\n\nconst appNav = document.getElementById('app-nav');\nconst { height } = appNav.getBoundingClientRect();\nconst appNavHeight = Math.round(height) + 10;\n\nconst appNavJumps = selectAll('.navbar__item a', appNav);\n\nappNavJumps.forEach(el => {\n  el.addEventListener('click', e => {\n    e.preventDefault();\n    const target = select(e.target.getAttribute('href'));\n\n    // var current = appNav.getElementsByClassName('active-nav');\n\n    // current[0].className = current[0].className.replace(' active-nav', '');\n\n    // var path =\n    //   e.path || (e.composedPath && e.composedPath()) || composedPath(e.target);\n    // path[1].className += ' active-nav';\n\n    window.scrollTo(\n      0,\n      window.pageYOffset + target.getBoundingClientRect().top - appNavHeight\n    );\n  });\n});\n\n// Race to Watch buttons\n\nfilterSelection('all');\nfunction filterSelection(c, id) {\n  var x, i;\n  x = document.querySelectorAll(\n    '#' + String(id) + ' .contests .office__contests > .seat'\n  );\n\n  // Add the \"show\" class (display:block) to the filtered elements, and remove the \"show\" class from the elements that are not selected\n  for (i = 0; i < x.length; i++) {\n    if (c == 'all') {\n      w3RemoveClass(x[i], 'remove');\n    } else {\n      w3RemoveClass(x[i], 'remove');\n      if (x[i].getElementsByClassName('office__flag').length == 0)\n        w3AddClass(x[i], 'remove');\n    }\n  }\n}\n\n// Show filtered elements\nfunction w3AddClass(element, name) {\n  var i, arr1, arr2;\n  arr1 = element.className.split(' ');\n  arr2 = name.split(' ');\n  for (i = 0; i < arr2.length; i++) {\n    if (arr1.indexOf(arr2[i]) == -1) {\n      element.className += ' ' + arr2[i];\n    }\n  }\n}\n\n// Hide elements that are not selected\nfunction w3RemoveClass(element, name) {\n  var i, arr1, arr2;\n  arr1 = element.className.split(' ');\n  arr2 = name.split(' ');\n  for (i = 0; i < arr2.length; i++) {\n    while (arr1.indexOf(arr2[i]) > -1) {\n      arr1.splice(arr1.indexOf(arr2[i]), 1);\n    }\n  }\n  element.className = arr1.join(' ');\n}\n\n// Add active class to the current control button (highlight it)\nvar btnContainer = document.querySelectorAll('#btnGroup');\n\nfor (var i = 0; i < btnContainer.length; i++) {\n  var btns = btnContainer[i].getElementsByClassName('button');\n\n  for (var t = 0; t < btns.length; t++) {\n    btns[t].addEventListener('click', function(event) {\n      var path =\n        event.path ||\n        (event.composedPath && event.composedPath()) ||\n        composedPath(event.target);\n\n      var currentParent = document.querySelector(\n        '#btnGroup.' + path[1].className\n      );\n      var current = currentParent.getElementsByClassName('active');\n      current[0].className = current[0].className.replace(' active', '');\n      this.className += ' active';\n      filterSelection(this.value, path[2].id);\n    });\n  }\n}\n\nif (process.env.NODE_ENV === 'development') {\n  require('preact/debug');\n}\n","import { feature, lineString } from '@turf/helpers';\n\n/**\n * Callback for coordEach\n *\n * @callback coordEachCallback\n * @param {Array<number>} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n */\n\n/**\n * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()\n *\n * @name coordEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @example\n * var features = turf.featureCollection([\n *   turf.point([26, 37], {\"foo\": \"bar\"}),\n *   turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n *   //=currentCoord\n *   //=coordIndex\n *   //=featureIndex\n *   //=multiFeatureIndex\n *   //=geometryIndex\n * });\n */\nfunction coordEach(geojson, callback, excludeWrapCoord) {\n    // Handles null Geometry -- Skips this GeoJSON\n    if (geojson === null) return;\n    var j, k, l, geometry, stopG, coords,\n        geometryMaybeCollection,\n        wrapShrink = 0,\n        coordIndex = 0,\n        isGeometryCollection,\n        type = geojson.type,\n        isFeatureCollection = type === 'FeatureCollection',\n        isFeature = type === 'Feature',\n        stop = isFeatureCollection ? geojson.features.length : 1;\n\n    // This logic may look a little weird. The reason why it is that way\n    // is because it's trying to be fast. GeoJSON supports multiple kinds\n    // of objects at its root: FeatureCollection, Features, Geometries.\n    // This function has the responsibility of handling all of them, and that\n    // means that some of the `for` loops you see below actually just don't apply\n    // to certain inputs. For instance, if you give this just a\n    // Point geometry, then both loops are short-circuited and all we do\n    // is gradually rename the input until it's called 'geometry'.\n    //\n    // This also aims to allocate as few resources as possible: just a\n    // few numbers and booleans, rather than any temporary arrays as would\n    // be required with the normalization approach.\n    for (var featureIndex = 0; featureIndex < stop; featureIndex++) {\n        geometryMaybeCollection = (isFeatureCollection ? geojson.features[featureIndex].geometry :\n            (isFeature ? geojson.geometry : geojson));\n        isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;\n        stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;\n\n        for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {\n            var multiFeatureIndex = 0;\n            var geometryIndex = 0;\n            geometry = isGeometryCollection ?\n                geometryMaybeCollection.geometries[geomIndex] : geometryMaybeCollection;\n\n            // Handles null Geometry -- Skips this geometry\n            if (geometry === null) continue;\n            coords = geometry.coordinates;\n            var geomType = geometry.type;\n\n            wrapShrink = (excludeWrapCoord && (geomType === 'Polygon' || geomType === 'MultiPolygon')) ? 1 : 0;\n\n            switch (geomType) {\n            case null:\n                break;\n            case 'Point':\n                callback(coords, coordIndex, featureIndex, multiFeatureIndex, geometryIndex);\n                coordIndex++;\n                multiFeatureIndex++;\n                break;\n            case 'LineString':\n            case 'MultiPoint':\n                for (j = 0; j < coords.length; j++) {\n                    callback(coords[j], coordIndex, featureIndex, multiFeatureIndex, geometryIndex);\n                    coordIndex++;\n                    if (geomType === 'MultiPoint') multiFeatureIndex++;\n                }\n                if (geomType === 'LineString') multiFeatureIndex++;\n                break;\n            case 'Polygon':\n            case 'MultiLineString':\n                for (j = 0; j < coords.length; j++) {\n                    for (k = 0; k < coords[j].length - wrapShrink; k++) {\n                        callback(coords[j][k], coordIndex, featureIndex, multiFeatureIndex, geometryIndex);\n                        coordIndex++;\n                    }\n                    if (geomType === 'MultiLineString') multiFeatureIndex++;\n                    if (geomType === 'Polygon') geometryIndex++;\n                }\n                if (geomType === 'Polygon') multiFeatureIndex++;\n                break;\n            case 'MultiPolygon':\n                for (j = 0; j < coords.length; j++) {\n                    if (geomType === 'MultiPolygon') geometryIndex = 0;\n                    for (k = 0; k < coords[j].length; k++) {\n                        for (l = 0; l < coords[j][k].length - wrapShrink; l++) {\n                            callback(coords[j][k][l], coordIndex, featureIndex, multiFeatureIndex, geometryIndex);\n                            coordIndex++;\n                        }\n                        geometryIndex++;\n                    }\n                    multiFeatureIndex++;\n                }\n                break;\n            case 'GeometryCollection':\n                for (j = 0; j < geometry.geometries.length; j++)\n                    coordEach(geometry.geometries[j], callback, excludeWrapCoord);\n                break;\n            default:\n                throw new Error('Unknown Geometry Type');\n            }\n        }\n    }\n}\n\n/**\n * Callback for coordReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n *  - The previousValue argument is initialValue.\n *  - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n *  - The previousValue argument is the value of the first element present in the array.\n *  - The currentValue argument is the value of the second element present in the array.\n *\n * @callback coordReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Array<number>} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n */\n\n/**\n * Reduce coordinates in any GeoJSON object, similar to Array.reduce()\n *\n * @name coordReduce\n * @param {FeatureCollection|Geometry|Feature} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentCoord, coordIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n *   turf.point([26, 37], {\"foo\": \"bar\"}),\n *   turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n *   //=previousValue\n *   //=currentCoord\n *   //=coordIndex\n *   //=featureIndex\n *   //=multiFeatureIndex\n *   //=geometryIndex\n *   return currentCoord;\n * });\n */\nfunction coordReduce(geojson, callback, initialValue, excludeWrapCoord) {\n    var previousValue = initialValue;\n    coordEach(geojson, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n        if (coordIndex === 0 && initialValue === undefined) previousValue = currentCoord;\n        else previousValue = callback(previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex);\n    }, excludeWrapCoord);\n    return previousValue;\n}\n\n/**\n * Callback for propEach\n *\n * @callback propEachCallback\n * @param {Object} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Iterate over properties in any GeoJSON object, similar to Array.forEach()\n *\n * @name propEach\n * @param {FeatureCollection|Feature} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentProperties, featureIndex)\n * @example\n * var features = turf.featureCollection([\n *     turf.point([26, 37], {foo: 'bar'}),\n *     turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propEach(features, function (currentProperties, featureIndex) {\n *   //=currentProperties\n *   //=featureIndex\n * });\n */\nfunction propEach(geojson, callback) {\n    var i;\n    switch (geojson.type) {\n    case 'FeatureCollection':\n        for (i = 0; i < geojson.features.length; i++) {\n            callback(geojson.features[i].properties, i);\n        }\n        break;\n    case 'Feature':\n        callback(geojson.properties, 0);\n        break;\n    }\n}\n\n\n/**\n * Callback for propReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n *  - The previousValue argument is initialValue.\n *  - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n *  - The previousValue argument is the value of the first element present in the array.\n *  - The currentValue argument is the value of the second element present in the array.\n *\n * @callback propReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {*} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Reduce properties in any GeoJSON object into a single value,\n * similar to how Array.reduce works. However, in this case we lazily run\n * the reduction, so an array of all properties is unnecessary.\n *\n * @name propReduce\n * @param {FeatureCollection|Feature} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentProperties, featureIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n *     turf.point([26, 37], {foo: 'bar'}),\n *     turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {\n *   //=previousValue\n *   //=currentProperties\n *   //=featureIndex\n *   return currentProperties\n * });\n */\nfunction propReduce(geojson, callback, initialValue) {\n    var previousValue = initialValue;\n    propEach(geojson, function (currentProperties, featureIndex) {\n        if (featureIndex === 0 && initialValue === undefined) previousValue = currentProperties;\n        else previousValue = callback(previousValue, currentProperties, featureIndex);\n    });\n    return previousValue;\n}\n\n/**\n * Callback for featureEach\n *\n * @callback featureEachCallback\n * @param {Feature<any>} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Iterate over features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @name featureEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentFeature, featureIndex)\n * @example\n * var features = turf.featureCollection([\n *   turf.point([26, 37], {foo: 'bar'}),\n *   turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.featureEach(features, function (currentFeature, featureIndex) {\n *   //=currentFeature\n *   //=featureIndex\n * });\n */\nfunction featureEach(geojson, callback) {\n    if (geojson.type === 'Feature') {\n        callback(geojson, 0);\n    } else if (geojson.type === 'FeatureCollection') {\n        for (var i = 0; i < geojson.features.length; i++) {\n            callback(geojson.features[i], i);\n        }\n    }\n}\n\n/**\n * Callback for featureReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n *  - The previousValue argument is initialValue.\n *  - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n *  - The previousValue argument is the value of the first element present in the array.\n *  - The currentValue argument is the value of the second element present in the array.\n *\n * @callback featureReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @name featureReduce\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n *   turf.point([26, 37], {\"foo\": \"bar\"}),\n *   turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {\n *   //=previousValue\n *   //=currentFeature\n *   //=featureIndex\n *   return currentFeature\n * });\n */\nfunction featureReduce(geojson, callback, initialValue) {\n    var previousValue = initialValue;\n    featureEach(geojson, function (currentFeature, featureIndex) {\n        if (featureIndex === 0 && initialValue === undefined) previousValue = currentFeature;\n        else previousValue = callback(previousValue, currentFeature, featureIndex);\n    });\n    return previousValue;\n}\n\n/**\n * Get all coordinates from any GeoJSON object.\n *\n * @name coordAll\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @returns {Array<Array<number>>} coordinate position array\n * @example\n * var features = turf.featureCollection([\n *   turf.point([26, 37], {foo: 'bar'}),\n *   turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * var coords = turf.coordAll(features);\n * //= [[26, 37], [36, 53]]\n */\nfunction coordAll(geojson) {\n    var coords = [];\n    coordEach(geojson, function (coord) {\n        coords.push(coord);\n    });\n    return coords;\n}\n\n/**\n * Callback for geomEach\n *\n * @callback geomEachCallback\n * @param {Geometry} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {Object} featureProperties The current Feature Properties being processed.\n * @param {Array<number>} featureBBox The current Feature BBox being processed.\n * @param {number|string} featureId The current Feature Id being processed.\n */\n\n/**\n * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()\n *\n * @name geomEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @example\n * var features = turf.featureCollection([\n *     turf.point([26, 37], {foo: 'bar'}),\n *     turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n *   //=currentGeometry\n *   //=featureIndex\n *   //=featureProperties\n *   //=featureBBox\n *   //=featureId\n * });\n */\nfunction geomEach(geojson, callback) {\n    var i, j, g, geometry, stopG,\n        geometryMaybeCollection,\n        isGeometryCollection,\n        featureProperties,\n        featureBBox,\n        featureId,\n        featureIndex = 0,\n        isFeatureCollection = geojson.type === 'FeatureCollection',\n        isFeature = geojson.type === 'Feature',\n        stop = isFeatureCollection ? geojson.features.length : 1;\n\n    // This logic may look a little weird. The reason why it is that way\n    // is because it's trying to be fast. GeoJSON supports multiple kinds\n    // of objects at its root: FeatureCollection, Features, Geometries.\n    // This function has the responsibility of handling all of them, and that\n    // means that some of the `for` loops you see below actually just don't apply\n    // to certain inputs. For instance, if you give this just a\n    // Point geometry, then both loops are short-circuited and all we do\n    // is gradually rename the input until it's called 'geometry'.\n    //\n    // This also aims to allocate as few resources as possible: just a\n    // few numbers and booleans, rather than any temporary arrays as would\n    // be required with the normalization approach.\n    for (i = 0; i < stop; i++) {\n\n        geometryMaybeCollection = (isFeatureCollection ? geojson.features[i].geometry :\n            (isFeature ? geojson.geometry : geojson));\n        featureProperties = (isFeatureCollection ? geojson.features[i].properties :\n            (isFeature ? geojson.properties : {}));\n        featureBBox = (isFeatureCollection ? geojson.features[i].bbox :\n            (isFeature ? geojson.bbox : undefined));\n        featureId = (isFeatureCollection ? geojson.features[i].id :\n            (isFeature ? geojson.id : undefined));\n        isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;\n        stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;\n\n        for (g = 0; g < stopG; g++) {\n            geometry = isGeometryCollection ?\n                geometryMaybeCollection.geometries[g] : geometryMaybeCollection;\n\n            // Handle null Geometry\n            if (geometry === null) {\n                callback(null, featureIndex, featureProperties, featureBBox, featureId);\n                continue;\n            }\n            switch (geometry.type) {\n            case 'Point':\n            case 'LineString':\n            case 'MultiPoint':\n            case 'Polygon':\n            case 'MultiLineString':\n            case 'MultiPolygon': {\n                callback(geometry, featureIndex, featureProperties, featureBBox, featureId);\n                break;\n            }\n            case 'GeometryCollection': {\n                for (j = 0; j < geometry.geometries.length; j++) {\n                    callback(geometry.geometries[j], featureIndex, featureProperties, featureBBox, featureId);\n                }\n                break;\n            }\n            default:\n                throw new Error('Unknown Geometry Type');\n            }\n        }\n        // Only increase `featureIndex` per each feature\n        featureIndex++;\n    }\n}\n\n/**\n * Callback for geomReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n *  - The previousValue argument is initialValue.\n *  - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n *  - The previousValue argument is the value of the first element present in the array.\n *  - The currentValue argument is the value of the second element present in the array.\n *\n * @callback geomReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Geometry} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {Object} featureProperties The current Feature Properties being processed.\n * @param {Array<number>} featureBBox The current Feature BBox being processed.\n * @param {number|string} featureId The current Feature Id being processed.\n */\n\n/**\n * Reduce geometry in any GeoJSON object, similar to Array.reduce().\n *\n * @name geomReduce\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n *     turf.point([26, 37], {foo: 'bar'}),\n *     turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n *   //=previousValue\n *   //=currentGeometry\n *   //=featureIndex\n *   //=featureProperties\n *   //=featureBBox\n *   //=featureId\n *   return currentGeometry\n * });\n */\nfunction geomReduce(geojson, callback, initialValue) {\n    var previousValue = initialValue;\n    geomEach(geojson, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n        if (featureIndex === 0 && initialValue === undefined) previousValue = currentGeometry;\n        else previousValue = callback(previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId);\n    });\n    return previousValue;\n}\n\n/**\n * Callback for flattenEach\n *\n * @callback flattenEachCallback\n * @param {Feature} currentFeature The current flattened feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n */\n\n/**\n * Iterate over flattened features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @name flattenEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)\n * @example\n * var features = turf.featureCollection([\n *     turf.point([26, 37], {foo: 'bar'}),\n *     turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {\n *   //=currentFeature\n *   //=featureIndex\n *   //=multiFeatureIndex\n * });\n */\nfunction flattenEach(geojson, callback) {\n    geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {\n        // Callback for single geometry\n        var type = (geometry === null) ? null : geometry.type;\n        switch (type) {\n        case null:\n        case 'Point':\n        case 'LineString':\n        case 'Polygon':\n            callback(feature(geometry, properties, {bbox: bbox, id: id}), featureIndex, 0);\n            return;\n        }\n\n        var geomType;\n\n        // Callback for multi-geometry\n        switch (type) {\n        case 'MultiPoint':\n            geomType = 'Point';\n            break;\n        case 'MultiLineString':\n            geomType = 'LineString';\n            break;\n        case 'MultiPolygon':\n            geomType = 'Polygon';\n            break;\n        }\n\n        geometry.coordinates.forEach(function (coordinate, multiFeatureIndex) {\n            var geom = {\n                type: geomType,\n                coordinates: coordinate\n            };\n            callback(feature(geom, properties), featureIndex, multiFeatureIndex);\n        });\n\n    });\n}\n\n/**\n * Callback for flattenReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n *  - The previousValue argument is initialValue.\n *  - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n *  - The previousValue argument is the value of the first element present in the array.\n *  - The currentValue argument is the value of the second element present in the array.\n *\n * @callback flattenReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n */\n\n/**\n * Reduce flattened features in any GeoJSON object, similar to Array.reduce().\n *\n * @name flattenReduce\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n *     turf.point([26, 37], {foo: 'bar'}),\n *     turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {\n *   //=previousValue\n *   //=currentFeature\n *   //=featureIndex\n *   //=multiFeatureIndex\n *   return currentFeature\n * });\n */\nfunction flattenReduce(geojson, callback, initialValue) {\n    var previousValue = initialValue;\n    flattenEach(geojson, function (currentFeature, featureIndex, multiFeatureIndex) {\n        if (featureIndex === 0 && multiFeatureIndex === 0 && initialValue === undefined) previousValue = currentFeature;\n        else previousValue = callback(previousValue, currentFeature, featureIndex, multiFeatureIndex);\n    });\n    return previousValue;\n}\n\n/**\n * Callback for segmentEach\n *\n * @callback segmentEachCallback\n * @param {Feature<LineString>} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON\n * @param {Function} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)\n * @returns {void}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n *   //=currentSegment\n *   //=featureIndex\n *   //=multiFeatureIndex\n *   //=geometryIndex\n *   //=segmentIndex\n * });\n *\n * // Calculate the total number of segments\n * var total = 0;\n * turf.segmentEach(polygon, function () {\n *     total++;\n * });\n */\nfunction segmentEach(geojson, callback) {\n    flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {\n        var segmentIndex = 0;\n\n        // Exclude null Geometries\n        if (!feature$$1.geometry) return;\n        // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n        var type = feature$$1.geometry.type;\n        if (type === 'Point' || type === 'MultiPoint') return;\n\n        // Generate 2-vertex line segments\n        coordReduce(feature$$1, function (previousCoords, currentCoord, coordIndex, featureIndexCoord, mutliPartIndexCoord, geometryIndex) {\n            var currentSegment = lineString([previousCoords, currentCoord], feature$$1.properties);\n            callback(currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex);\n            segmentIndex++;\n            return currentCoord;\n        });\n    });\n}\n\n/**\n * Callback for segmentReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n *  - The previousValue argument is initialValue.\n *  - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n *  - The previousValue argument is the value of the first element present in the array.\n *  - The currentValue argument is the value of the second element present in the array.\n *\n * @callback segmentReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature<LineString>} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n */\n\n/**\n * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON\n * @param {Function} callback a method that takes (previousValue, currentSegment, currentIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {void}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n *   //= previousSegment\n *   //= currentSegment\n *   //= featureIndex\n *   //= multiFeatureIndex\n *   //= geometryIndex\n *   //= segmentInex\n *   return currentSegment\n * });\n *\n * // Calculate the total number of segments\n * var initialValue = 0\n * var total = turf.segmentReduce(polygon, function (previousValue) {\n *     previousValue++;\n *     return previousValue;\n * }, initialValue);\n */\nfunction segmentReduce(geojson, callback, initialValue) {\n    var previousValue = initialValue;\n    var started = false;\n    segmentEach(geojson, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n        if (started === false && initialValue === undefined) previousValue = currentSegment;\n        else previousValue = callback(previousValue, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex);\n        started = true;\n    });\n    return previousValue;\n}\n\n/**\n * Callback for lineEach\n *\n * @callback lineEachCallback\n * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n */\n\n/**\n * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,\n * similar to Array.forEach.\n *\n * @name lineEach\n * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object\n * @param {Function} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @example\n * var multiLine = turf.multiLineString([\n *   [[26, 37], [35, 45]],\n *   [[36, 53], [38, 50], [41, 55]]\n * ]);\n *\n * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n *   //=currentLine\n *   //=featureIndex\n *   //=multiFeatureIndex\n *   //=geometryIndex\n * });\n */\nfunction lineEach(geojson, callback) {\n    // validation\n    if (!geojson) throw new Error('geojson is required');\n\n    flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {\n        if (feature$$1.geometry === null) return;\n        var type = feature$$1.geometry.type;\n        var coords = feature$$1.geometry.coordinates;\n        switch (type) {\n        case 'LineString':\n            callback(feature$$1, featureIndex, multiFeatureIndex, 0, 0);\n            break;\n        case 'Polygon':\n            for (var geometryIndex = 0; geometryIndex < coords.length; geometryIndex++) {\n                callback(lineString(coords[geometryIndex], feature$$1.properties), featureIndex, multiFeatureIndex, geometryIndex);\n            }\n            break;\n        }\n    });\n}\n\n/**\n * Callback for lineReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n *  - The previousValue argument is initialValue.\n *  - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n *  - The previousValue argument is the value of the first element present in the array.\n *  - The currentValue argument is the value of the second element present in the array.\n *\n * @callback lineReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed.\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @name lineReduce\n * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object\n * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var multiPoly = turf.multiPolygon([\n *   turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),\n *   turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])\n * ]);\n *\n * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n *   //=previousValue\n *   //=currentLine\n *   //=featureIndex\n *   //=multiFeatureIndex\n *   //=geometryIndex\n *   return currentLine\n * });\n */\nfunction lineReduce(geojson, callback, initialValue) {\n    var previousValue = initialValue;\n    lineEach(geojson, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n        if (featureIndex === 0 && initialValue === undefined) previousValue = currentLine;\n        else previousValue = callback(previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex);\n    });\n    return previousValue;\n}\n\nexport { coordEach, coordReduce, propEach, propReduce, featureEach, featureReduce, coordAll, geomEach, geomReduce, flattenEach, flattenReduce, segmentEach, segmentReduce, lineEach, lineReduce };\n","import { coordEach } from '@turf/meta';\n\n/**\n * Takes a set of features, calculates the bbox of all input features, and returns a bounding box.\n *\n * @name bbox\n * @param {GeoJSON} geojson any GeoJSON object\n * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @example\n * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);\n * var bbox = turf.bbox(line);\n * var bboxPolygon = turf.bboxPolygon(bbox);\n *\n * //addToMap\n * var addToMap = [line, bboxPolygon]\n */\nfunction bbox(geojson) {\n    var BBox = [Infinity, Infinity, -Infinity, -Infinity];\n    coordEach(geojson, function (coord) {\n        if (BBox[0] > coord[0]) BBox[0] = coord[0];\n        if (BBox[1] > coord[1]) BBox[1] = coord[1];\n        if (BBox[2] < coord[0]) BBox[2] = coord[0];\n        if (BBox[3] < coord[1]) BBox[3] = coord[1];\n    });\n    return BBox;\n}\n\nexport default bbox;\n","// This has emptied out results i.e. is static\nconst STATIC_FLAT_RESULTS_URL = 'https://s3.amazonaws.com/sos-test-2.texastribune.org/2020_primary/republic_json/results_FLAT_static.json';\n\n// Results from the Secretary of State\nconst FLAT_RESULTS_URL = 'https://s3.amazonaws.com/sos-test-2.texastribune.org/2020_primary/republic_json/results_FLAT.json';\n\n// Includes fake results data for testing\nconst FAKE_RESULTS_URL = 'https://s3.amazonaws.com/sos-test-2.texastribune.org/2020_primary/republic_json/results_FLAT_sample_results.json';\nconst FAKE_RESULTS_URL_TWO = 'https://s3.amazonaws.com/sos-test-2.texastribune.org/2020_primary/republic_json/results_FLAT_Feb26_TEST.json';\n\n// Used for homepage takeover\nconst HOMEPAGE_URL =\n'https://s3.amazonaws.com/sos.texastribune.org/top-news/2020-primary.json';\n\n// Calls TT stories using the API\nconst STORY_API_URL = (id: number): string =>\n  `https://www.texastribune.org/api/v2/content/${id}/?format=json&fields=lead_art,short_summary,url,homepage_headline&__=${+new Date()}`;\n\n// What we are using across the ap\n// will be used on the results page, in the homepage takeover\n// and in the embeds\nconst RESULTS_IN_USE = FLAT_RESULTS_URL\n\nexport {\n  RESULTS_IN_USE,\n  HOMEPAGE_URL,\n  STORY_API_URL,\n};\n","/**\n * Grabs the contents of a `jsonScript` created JSON inline string and returns\n * it as a JSON object. If the element does not exist, or if the script\n * element does not have the JSON MIME type, null is returned instead.\n *\n * @param  {String} elementId the ID of the JSON script element\n * @return {Object|null}\n */\nexport default function loadJsonScript(elementId) {\n  const element = document.getElementById(elementId);\n\n  if (element && element.getAttribute('type') === 'application/json') {\n    return JSON.parse(element.textContent);\n  } else {\n    return null;\n  }\n}\n","export var prefix = \"$\";\n\nfunction Map() {}\n\nMap.prototype = map.prototype = {\n  constructor: Map,\n  has: function(key) {\n    return (prefix + key) in this;\n  },\n  get: function(key) {\n    return this[prefix + key];\n  },\n  set: function(key, value) {\n    this[prefix + key] = value;\n    return this;\n  },\n  remove: function(key) {\n    var property = prefix + key;\n    return property in this && delete this[property];\n  },\n  clear: function() {\n    for (var property in this) if (property[0] === prefix) delete this[property];\n  },\n  keys: function() {\n    var keys = [];\n    for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));\n    return keys;\n  },\n  values: function() {\n    var values = [];\n    for (var property in this) if (property[0] === prefix) values.push(this[property]);\n    return values;\n  },\n  entries: function() {\n    var entries = [];\n    for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});\n    return entries;\n  },\n  size: function() {\n    var size = 0;\n    for (var property in this) if (property[0] === prefix) ++size;\n    return size;\n  },\n  empty: function() {\n    for (var property in this) if (property[0] === prefix) return false;\n    return true;\n  },\n  each: function(f) {\n    for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);\n  }\n};\n\nfunction map(object, f) {\n  var map = new Map;\n\n  // Copy constructor.\n  if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });\n\n  // Index array by numeric index or specified key function.\n  else if (Array.isArray(object)) {\n    var i = -1,\n        n = object.length,\n        o;\n\n    if (f == null) while (++i < n) map.set(i, object[i]);\n    else while (++i < n) map.set(f(o = object[i], i, object), o);\n  }\n\n  // Convert object to map.\n  else if (object) for (var key in object) map.set(key, object[key]);\n\n  return map;\n}\n\nexport default map;\n","import {default as map, prefix} from \"./map\";\n\nfunction Set() {}\n\nvar proto = map.prototype;\n\nSet.prototype = set.prototype = {\n  constructor: Set,\n  has: proto.has,\n  add: function(value) {\n    value += \"\";\n    this[prefix + value] = value;\n    return this;\n  },\n  remove: proto.remove,\n  clear: proto.clear,\n  values: proto.keys,\n  size: proto.size,\n  empty: proto.empty,\n  each: proto.each\n};\n\nfunction set(object, f) {\n  var set = new Set;\n\n  // Copy constructor.\n  if (object instanceof Set) object.each(function(value) { set.add(value); });\n\n  // Otherwise, assume it’s an array.\n  else if (object) {\n    var i = -1, n = object.length;\n    if (f == null) while (++i < n) set.add(object[i]);\n    else while (++i < n) set.add(f(object[i], i, object));\n  }\n\n  return set;\n}\n\nexport default set;\n","export default function(map) {\n  var entries = [];\n  for (var key in map) entries.push({key: key, value: map[key]});\n  return entries;\n}\n","export {default as nest} from \"./nest\";\nexport {default as set} from \"./set\";\nexport {default as map} from \"./map\";\nexport {default as keys} from \"./keys\";\nexport {default as values} from \"./values\";\nexport {default as entries} from \"./entries\";\n","import { polygon, validateBBox } from '@turf/helpers';\n\n/**\n * Takes a bbox and returns an equivalent {@link Polygon|polygon}.\n *\n * @name bboxPolygon\n * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @returns {Feature<Polygon>} a Polygon representation of the bounding box\n * @example\n * var bbox = [0, 0, 10, 10];\n *\n * var poly = turf.bboxPolygon(bbox);\n *\n * //addToMap\n * var addToMap = [poly]\n */\nfunction bboxPolygon(bbox) {\n    validateBBox(bbox);\n    // Convert BBox positions to Numbers\n    // No performance loss for including Number()\n    // https://github.com/Turfjs/turf/issues/1119\n    var west = Number(bbox[0]);\n    var south = Number(bbox[1]);\n    var east = Number(bbox[2]);\n    var north = Number(bbox[3]);\n\n    if (bbox.length === 6) throw new Error('@turf/bbox-polygon does not support BBox with 6 positions');\n\n    var lowLeft = [west, south];\n    var topLeft = [west, north];\n    var topRight = [east, north];\n    var lowRight = [east, south];\n\n    return polygon([[\n        lowLeft,\n        lowRight,\n        topRight,\n        topLeft,\n        lowLeft\n    ]]);\n}\n\nexport default bboxPolygon;\n","import { isNumber } from '@turf/helpers';\n\n/**\n * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.\n *\n * @name getCoord\n * @param {Array<number>|Geometry<Point>|Feature<Point>} obj Object\n * @returns {Array<number>} coordinates\n * @example\n * var pt = turf.point([10, 10]);\n *\n * var coord = turf.getCoord(pt);\n * //= [10, 10]\n */\nfunction getCoord(obj) {\n    if (!obj) throw new Error('obj is required');\n\n    var coordinates = getCoords(obj);\n\n    // getCoord() must contain at least two numbers (Point)\n    if (coordinates.length > 1 && isNumber(coordinates[0]) && isNumber(coordinates[1])) {\n        return coordinates;\n    } else {\n        throw new Error('Coordinate is not a valid Point');\n    }\n}\n\n/**\n * Unwrap coordinates from a Feature, Geometry Object or an Array of numbers\n *\n * @name getCoords\n * @param {Array<number>|Geometry|Feature} obj Object\n * @returns {Array<number>} coordinates\n * @example\n * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);\n *\n * var coord = turf.getCoords(poly);\n * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]\n */\nfunction getCoords(obj) {\n    if (!obj) throw new Error('obj is required');\n    var coordinates;\n\n    // Array of numbers\n    if (obj.length) {\n        coordinates = obj;\n\n    // Geometry Object\n    } else if (obj.coordinates) {\n        coordinates = obj.coordinates;\n\n    // Feature\n    } else if (obj.geometry && obj.geometry.coordinates) {\n        coordinates = obj.geometry.coordinates;\n    }\n    // Checks if coordinates contains a number\n    if (coordinates) {\n        containsNumber(coordinates);\n        return coordinates;\n    }\n    throw new Error('No valid coordinates');\n}\n\n/**\n * Checks if coordinates contains a number\n *\n * @name containsNumber\n * @param {Array<any>} coordinates GeoJSON Coordinates\n * @returns {boolean} true if Array contains a number\n */\nfunction containsNumber(coordinates) {\n    if (coordinates.length > 1 && isNumber(coordinates[0]) && isNumber(coordinates[1])) {\n        return true;\n    }\n\n    if (Array.isArray(coordinates[0]) && coordinates[0].length) {\n        return containsNumber(coordinates[0]);\n    }\n    throw new Error('coordinates must only contain numbers');\n}\n\n/**\n * Enforce expectations about types of GeoJSON objects for Turf.\n *\n * @name geojsonType\n * @param {GeoJSON} value any GeoJSON object\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} if value is not the expected type.\n */\nfunction geojsonType(value, type, name) {\n    if (!type || !name) throw new Error('type and name required');\n\n    if (!value || value.type !== type) {\n        throw new Error('Invalid input to ' + name + ': must be a ' + type + ', given ' + value.type);\n    }\n}\n\n/**\n * Enforce expectations about types of {@link Feature} inputs for Turf.\n * Internally this uses {@link geojsonType} to judge geometry types.\n *\n * @name featureOf\n * @param {Feature} feature a feature with an expected geometry type\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} error if value is not the expected type.\n */\nfunction featureOf(feature, type, name) {\n    if (!feature) throw new Error('No feature passed');\n    if (!name) throw new Error('.featureOf() requires a name');\n    if (!feature || feature.type !== 'Feature' || !feature.geometry) {\n        throw new Error('Invalid input to ' + name + ', Feature with geometry required');\n    }\n    if (!feature.geometry || feature.geometry.type !== type) {\n        throw new Error('Invalid input to ' + name + ': must be a ' + type + ', given ' + feature.geometry.type);\n    }\n}\n\n/**\n * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.\n * Internally this uses {@link geojsonType} to judge geometry types.\n *\n * @name collectionOf\n * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} if value is not the expected type.\n */\nfunction collectionOf(featureCollection, type, name) {\n    if (!featureCollection) throw new Error('No featureCollection passed');\n    if (!name) throw new Error('.collectionOf() requires a name');\n    if (!featureCollection || featureCollection.type !== 'FeatureCollection') {\n        throw new Error('Invalid input to ' + name + ', FeatureCollection required');\n    }\n    for (var i = 0; i < featureCollection.features.length; i++) {\n        var feature = featureCollection.features[i];\n        if (!feature || feature.type !== 'Feature' || !feature.geometry) {\n            throw new Error('Invalid input to ' + name + ', Feature with geometry required');\n        }\n        if (!feature.geometry || feature.geometry.type !== type) {\n            throw new Error('Invalid input to ' + name + ': must be a ' + type + ', given ' + feature.geometry.type);\n        }\n    }\n}\n\n/**\n * Get Geometry from Feature or Geometry Object\n *\n * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object\n * @returns {Geometry|null} GeoJSON Geometry Object\n * @throws {Error} if geojson is not a Feature or Geometry Object\n * @example\n * var point = {\n *   \"type\": \"Feature\",\n *   \"properties\": {},\n *   \"geometry\": {\n *     \"type\": \"Point\",\n *     \"coordinates\": [110, 40]\n *   }\n * }\n * var geom = turf.getGeom(point)\n * //={\"type\": \"Point\", \"coordinates\": [110, 40]}\n */\nfunction getGeom(geojson) {\n    if (!geojson) throw new Error('geojson is required');\n    if (geojson.geometry !== undefined) return geojson.geometry;\n    if (geojson.coordinates || geojson.geometries) return geojson;\n    throw new Error('geojson must be a valid Feature or Geometry Object');\n}\n\n/**\n * Get Geometry Type from Feature or Geometry Object\n *\n * @throws {Error} **DEPRECATED** in v5.0.0 in favor of getType\n */\nfunction getGeomType() {\n    throw new Error('invariant.getGeomType has been deprecated in v5.0 in favor of invariant.getType');\n}\n\n/**\n * Get GeoJSON object's type, Geometry type is prioritize.\n *\n * @param {GeoJSON} geojson GeoJSON object\n * @param {string} [name] name of the variable to display in error message\n * @returns {string} GeoJSON type\n * @example\n * var point = {\n *   \"type\": \"Feature\",\n *   \"properties\": {},\n *   \"geometry\": {\n *     \"type\": \"Point\",\n *     \"coordinates\": [110, 40]\n *   }\n * }\n * var geom = turf.getType(point)\n * //=\"Point\"\n */\nfunction getType(geojson, name) {\n    if (!geojson) throw new Error((name || 'geojson') + ' is required');\n    // GeoJSON Feature & GeometryCollection\n    if (geojson.geometry && geojson.geometry.type) return geojson.geometry.type;\n    // GeoJSON Geometry & FeatureCollection\n    if (geojson.type) return geojson.type;\n    throw new Error((name || 'geojson') + ' is invalid');\n}\n\nexport { getCoord, getCoords, containsNumber, geojsonType, featureOf, collectionOf, getGeom, getGeomType, getType };\n","import { getCoord, getCoords } from '@turf/invariant';\n\n// http://en.wikipedia.org/wiki/Even%E2%80%93odd_rule\n// modified from: https://github.com/substack/point-in-polygon/blob/master/index.js\n// which was modified from http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html\n\n/**\n * Takes a {@link Point} and a {@link Polygon} or {@link MultiPolygon} and determines if the point resides inside the polygon. The polygon can\n * be convex or concave. The function accounts for holes.\n *\n * @name booleanPointInPolygon\n * @param {Coord} point input point\n * @param {Feature<Polygon|MultiPolygon>} polygon input polygon or multipolygon\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.ignoreBoundary=false] True if polygon boundary should be ignored when determining if the point is inside the polygon otherwise false.\n * @returns {boolean} `true` if the Point is inside the Polygon; `false` if the Point is not inside the Polygon\n * @example\n * var pt = turf.point([-77, 44]);\n * var poly = turf.polygon([[\n *   [-81, 41],\n *   [-81, 47],\n *   [-72, 47],\n *   [-72, 41],\n *   [-81, 41]\n * ]]);\n *\n * turf.booleanPointInPolygon(pt, poly);\n * //= true\n */\nfunction booleanPointInPolygon(point, polygon, options) {\n    // Optional parameters\n    options = options || {};\n    if (typeof options !== 'object') throw new Error('options is invalid');\n    var ignoreBoundary = options.ignoreBoundary;\n\n    // validation\n    if (!point) throw new Error('point is required');\n    if (!polygon) throw new Error('polygon is required');\n\n    var pt = getCoord(point);\n    var polys = getCoords(polygon);\n    var type = (polygon.geometry) ? polygon.geometry.type : polygon.type;\n    var bbox = polygon.bbox;\n\n    // Quick elimination if point is not inside bbox\n    if (bbox && inBBox(pt, bbox) === false) return false;\n\n    // normalize to multipolygon\n    if (type === 'Polygon') polys = [polys];\n\n    for (var i = 0, insidePoly = false; i < polys.length && !insidePoly; i++) {\n        // check if it is in the outer ring first\n        if (inRing(pt, polys[i][0], ignoreBoundary)) {\n            var inHole = false;\n            var k = 1;\n            // check for the point in any of the holes\n            while (k < polys[i].length && !inHole) {\n                if (inRing(pt, polys[i][k], !ignoreBoundary)) {\n                    inHole = true;\n                }\n                k++;\n            }\n            if (!inHole) insidePoly = true;\n        }\n    }\n    return insidePoly;\n}\n\n/**\n * inRing\n *\n * @private\n * @param {Array<number>} pt [x,y]\n * @param {Array<Array<number>>} ring [[x,y], [x,y],..]\n * @param {boolean} ignoreBoundary ignoreBoundary\n * @returns {boolean} inRing\n */\nfunction inRing(pt, ring, ignoreBoundary) {\n    var isInside = false;\n    if (ring[0][0] === ring[ring.length - 1][0] && ring[0][1] === ring[ring.length - 1][1]) ring = ring.slice(0, ring.length - 1);\n\n    for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n        var xi = ring[i][0], yi = ring[i][1];\n        var xj = ring[j][0], yj = ring[j][1];\n        var onBoundary = (pt[1] * (xi - xj) + yi * (xj - pt[0]) + yj * (pt[0] - xi) === 0) &&\n            ((xi - pt[0]) * (xj - pt[0]) <= 0) && ((yi - pt[1]) * (yj - pt[1]) <= 0);\n        if (onBoundary) return !ignoreBoundary;\n        var intersect = ((yi > pt[1]) !== (yj > pt[1])) &&\n        (pt[0] < (xj - xi) * (pt[1] - yi) / (yj - yi) + xi);\n        if (intersect) isInside = !isInside;\n    }\n    return isInside;\n}\n\n/**\n * inBBox\n *\n * @private\n * @param {Position} pt point [x,y]\n * @param {BBox} bbox BBox [west, south, east, north]\n * @returns {boolean} true/false if point is inside BBox\n */\nfunction inBBox(pt, bbox) {\n    return bbox[0] <= pt[0] &&\n           bbox[1] <= pt[1] &&\n           bbox[2] >= pt[0] &&\n           bbox[3] >= pt[1];\n}\n\nexport default booleanPointInPolygon;\n","import cx from 'classnames';\nimport { capfirst, intcomma } from 'journalize';\nimport { Component, h, VNode } from 'preact';\n\nimport PartyPill from './PartyPill';\nimport PureComponent from './PureComponent';\n\nimport formatPercent from '../utils/format-percent';\n\ninterface Props {\n  ballotName: string;\n  candidateId: string;\n  contestIsCalled: boolean;\n  isIncumbent: boolean;\n  isWinner: boolean;\n  party: string;\n  totalVotesInContest: number;\n  votes: number;\n}\n\nclass CandidateRow extends Component<Props> {\n  static Header: VNode;\n  static countyHeader: VNode;\n  static columnCount: number;\n\n  render() {\n    const {\n      ballotName,\n      contestIsCalled,\n      isIncumbent,\n      isWinner,\n      isViewable,\n      candidateColor,\n      party,\n      totalVotesInContest,\n      votes,\n    } = this.props;\n\n    let divStyle;\n\n    let checkStyle;\n\n    if (candidateColor) {\n      divStyle = {\n        'background-color': candidateColor,\n      };\n      checkStyle = {\n        'color': candidateColor,\n      };\n    }\n\n    let rowClass = cx('candidate', 'contest__candidate-row', {\n      'contest__candidate-row--winner dem--border': contestIsCalled && isWinner && party == 'Democrat',\n      'contest__candidate-row--winner rep--border': contestIsCalled && isWinner && party == 'Republican',\n    });\n\n    let checkClass = cx('check', {\n      'dem-winner': party == 'Democrat',\n      'rep-winner': party == 'Republican',\n    });\n\n    if (!isViewable) {\n      rowClass += ' race__candidate-row--hidden';\n    }\n\n    const checkmark = '\\u2713';\n\n    return (\n      <tr class={rowClass}>\n        <td class=\"candidate__cell candidate__party\">\n          {!candidateColor && <PartyPill party={party} />}\n          {candidateColor && <PartyPill party={party} style={divStyle} />}\n        </td>\n        <th class=\"candidate__cell candidate__name\">\n          {isWinner && (<span class={checkClass} style={checkStyle}>{checkmark}</span>)}\n          {ballotName}{' '}\n          {isIncumbent && (\n            <span class=\"pill pill--basic\" title=\"Currently holds this seat\">\n              Incumbent\n            </span>\n          )}\n        </th>\n        <td class=\"candidate__cell candidate__votes\">{intcomma(votes)}</td>\n        <td class=\"candidate__cell candidate__pct\">\n          {formatPercent(votes, totalVotesInContest)}\n          <span class=\"candidate__pct-symbol\">%</span>\n        </td>\n      </tr>\n    );\n  }\n}\n\nCandidateRow.defaultProps = {\n  contestIsCalled: false,\n  isViewable: true,\n};\n\nCandidateRow.Header = (\n  <thead>\n    <tr>\n      <th class=\"contest__candidate-header\" colSpan={2}>\n        Candidates\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Votes\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Pct.\n        <span class=\"candidate__pct-symbol\">%</span>\n      </th>\n    </tr>\n  </thead>\n);\n\nCandidateRow.countyHeader = (\n  <thead>\n    <tr>\n      <th class=\"contest__candidate-header\" colSpan={2}>\n        Candidates\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Votes\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Pct.\n        <span class=\"candidate__pct-symbol\">%</span>\n      </th>\n    </tr>\n  </thead>\n);\n\nCandidateRow.columnCount = 4;\n\nexport default CandidateRow;\n","/* global Node, Window */\n\n/**\n * Select all matching elements on the page. Uses `document.querySelectorAll`.\n *\n * @param {String} el The CSS selector to search for.\n * @param {Element} [context] The container to search within. Defaults to\n * `document`.\n * @returns {Element[]}\n */\nfunction selectAll(el, context) {\n  // if `el` is a Node or Window, return it in an Array\n  if (el instanceof Node || el instanceof Window) return [el];\n\n  return Array.prototype.slice.call(\n    typeof el === 'string'\n      ? (context || document).querySelectorAll(el)\n      : el || []\n  );\n}\n\nexport default selectAll;\n","import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n    reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n  return function() {\n    return b;\n  };\n}\n\nfunction one(b) {\n  return function(t) {\n    return b(t) + \"\";\n  };\n}\n\nexport default function(a, b) {\n  var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n      am, // current match in a\n      bm, // current match in b\n      bs, // string preceding current number in b, if any\n      i = -1, // index in s\n      s = [], // string constants and placeholders\n      q = []; // number interpolators\n\n  // Coerce inputs to strings.\n  a = a + \"\", b = b + \"\";\n\n  // Interpolate pairs of numbers in a & b.\n  while ((am = reA.exec(a))\n      && (bm = reB.exec(b))) {\n    if ((bs = bm.index) > bi) { // a string precedes the next number in b\n      bs = b.slice(bi, bs);\n      if (s[i]) s[i] += bs; // coalesce with previous string\n      else s[++i] = bs;\n    }\n    if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n      if (s[i]) s[i] += bm; // coalesce with previous string\n      else s[++i] = bm;\n    } else { // interpolate non-matching numbers\n      s[++i] = null;\n      q.push({i: i, x: number(am, bm)});\n    }\n    bi = reB.lastIndex;\n  }\n\n  // Add remains of b.\n  if (bi < b.length) {\n    bs = b.slice(bi);\n    if (s[i]) s[i] += bs; // coalesce with previous string\n    else s[++i] = bs;\n  }\n\n  // Special optimization for only a single match.\n  // Otherwise, interpolate each of the numbers and rejoin the string.\n  return s.length < 2 ? (q[0]\n      ? one(q[0].x)\n      : zero(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","const LENGTH_OF_CHECK_INTERVAL = 1000 * 60 * 2; // 2 minutes\nconst TIMERS_SHOULD_RUN = false;\n\nconst SHOW_DELEGATES = true;\n\nexport { LENGTH_OF_CHECK_INTERVAL, TIMERS_SHOULD_RUN, SHOW_DELEGATES };\n","import { capfirst } from 'journalize';\nimport { LENGTH_OF_CHECK_INTERVAL } from './constants';\n\nconst PARTY_SORT_ORDER = [\n  'democrat',\n  'republican',\n  'libertarian',\n  'independent',\n  'write-in',\n];\n\nexport const presidentCandidateColors = [\n  {\n    name: 'Bernie Sanders',\n    color: '#1755c5',\n    id: 'e8f0e1e0-ce06-4824-a556-37f75a7b5173',\n  },\n  {\n    name: 'Amy Klobuchar',\n    color: '#5acc7d',\n    id: 'd97c403a-bd59-4f6e-94d6-8afe7b735f78',\n  },\n  {\n    name: 'Joseph R. Biden',\n    color: '#fcbec3',\n    id: 'ea10604d-e47a-468e-b7b7-3e9b43fb015b',\n  },\n  {\n    name: 'Pete Buttigieg',\n    color: '#ffc200',\n    id: 'd47b167e-eec5-44b7-b24f-354da354c165',\n  },\n  {\n    name: 'Elizabeth Warren',\n    color: '#91dfe5',\n    id: 'edb93d1d-cbb8-48e8-8adf-a73a09c901e4',\n  },\n  {\n    name: 'Michael R. Bloomberg',\n    color: '#FF822D',\n    id: '4892e451-3cf8-4c77-b910-f9e1794ef186',\n  },\n  {\n    name: 'Michael Bennet',\n    color: '#888888',\n    id: '88d47a81-5cd7-498e-a211-c12c19f029f8',\n  },\n  {\n    name: 'Cory Booker',\n    color: '#888888',\n    id: 'b1eee99a-56c1-448c-be5d-c88c1428a450',\n  },\n  {\n    name: 'Julián Castro',\n    color: '#888888',\n    id: '332829d6-735c-4552-8c94-ed4cc94c6310',\n  },\n  {\n    name: 'Roque \"Rocky\" De La Fuente',\n    color: '#888888',\n    id: '40ac6c36-839e-4a2d-a2fa-0f597f86de42',\n  },\n  {\n    name: 'John K. Delaney',\n    color: '#888888',\n    id: 'aad5e2b1-426f-4be3-96cc-6e589607981d',\n  },\n  {\n    name: 'Tulsi Gabbard',\n    color: '#888888',\n    id: 'a44186a5-1d0c-4851-b760-eff93978e6e8',\n  },\n  {\n    name: 'Deval Patrick',\n    color: '#888888',\n    id: 'ae9859d9-4514-42d6-b6e1-30979ea2b4f1',\n  },\n  {\n    name: 'Tom Steyer',\n    color: '#888888',\n    id: '686aad9e-0d0f-41b7-9a14-e9c6eb5a5583',\n  },\n  {\n    name: 'Robby Wells',\n    color: '#888888',\n    id: '645793e1-394a-4778-a6d9-26a83c3f17ba',\n  },\n  {\n    name: 'Marianne Williamson',\n    color: '#888888',\n    id: '04ed822a-fffd-4d41-9cb6-876143ceb4c2',\n  },\n  {\n    name: 'Andrew Yang',\n    color: '#888888',\n    id: '408cf41b-6450-47a2-905a-4cde7e577226',\n  },\n];\n\nexport const senateCandidateColors = [\n  {\n    name: 'Chris Bell',\n    color: '#91dfe5',\n    id: '50de2927-a6e0-4008-b0cc-d1187aa139b2',\n  },\n  {\n    name: 'Michael Cooper',\n    color: '#888888',\n    id: '170eb94b-714b-4514-a850-2b52606ee7b2',\n  },\n  {\n    name: 'Amanda K. Edwards',\n    color: '#ffc200',\n    id: '775fcfa6-4eee-483e-ac7d-eafb2979d4cc',\n  },\n  {\n    name: 'Jack Daniel Foster Jr.',\n    color: '#888888',\n    id: 'fbf493e5-f979-4beb-bff6-8abdfa032246',\n  },\n  {\n    name: 'Annie \"Mamá\" Garcia',\n    color: '#FF822D',\n    id: '2e61ecb0-2bd7-4d67-a94d-65e1bdba13d0',\n  },\n  {\n    name: 'Victor Hugo Harris',\n    color: '#888888',\n    id: 'f928f369-4338-465e-9ef4-ed79bfe2e0b1',\n  },\n  {\n    name: 'Mary \"MJ\" Hegar',\n    color: '#1755c5',\n    id: '5eef65f9-b464-44c2-a269-2b9f265b4837',\n  },\n  {\n    name: 'Sema Hernandez',\n    color: '#182b4b',\n    id: '85ba7cdc-80d6-4ee8-a23d-238d0d9e3f06',\n  },\n  {\n    name: 'D. R. Hunter',\n    color: '#888888',\n    id: '13b29be8-d8c7-43bc-b5ae-289e1aadd142',\n  },\n  {\n    name: 'Adrian Ocegueda',\n    color: '#888888',\n    id: '7f9a6f05-fa6b-4447-8d43-2d03ed9e6261',\n  },\n  {\n    name: 'Cristina Tzintzún Ramirez',\n    color: '#fcbec3',\n    id: '01b59a67-89a5-4fe3-947e-52dba799e240',\n  },\n  {\n    name: 'Royce West',\n    color: '#5acc7d',\n    id: '3894feeb-6314-454b-a1b3-b7b7e3a8991c',\n  },\n];\n\n\n\n\nconst TT_directory_slugs = [{'office': 'Texas House', 'directory-slug': 'tx-house'},  {'office': 'Texas Senate', 'directory-slug': 'tx-senate'}, {'office': 'U.S. House', 'directory-slug': 'us-house'}, {'office': 'State Board of Education', 'directory-slug': 'sboe'}];\n\nexport function get_directory_slug(office) {\n  return TT_directory_slugs.filter(slug => slug.office == office)\n}\n\nexport function sort_candidates_by_party(candidates) {\n  return candidates.sort(\n    (a, b) =>\n      PARTY_SORT_ORDER.indexOf(a.party) - PARTY_SORT_ORDER.indexOf(b.party)\n  );\n}\n\nexport function countdown(minutes) {\n  var seconds = 60;\n\n  var now = new Date().getTime();\n  // target timestamp; we will compute the remaining time\n  // relative to this date.\n  var target = new Date(now + LENGTH_OF_CHECK_INTERVAL);\n  // update frequency; note, this is flexible, and when the tab is\n  // inactive, there are no guarantees that the countdown will update\n  // at this frequency.\n  var update = 500;\n\n  var int = setInterval(function () {\n    var countdown_div = document.querySelectorAll('.countdown');\n    // current timestamp\n    var now = new Date();\n    // remaining time, in seconds\n    var remaining = (target - now) / 1000;\n    \n    // if done, alert\n    if (remaining < 1 && remaining > 0 ) {\n      Array.prototype.forEach.call(countdown_div, function(el) {\n        el.innerHTML = \"Updating\"\n      });\n      return;\n  \n    }\n\n    if (remaining < 0) {\n      clearInterval(int);\n      return;\n    }\n    \n    // format\n    var minutes = ~~(remaining / 60);\n    var seconds = ~~(remaining % 60);\n  \n    \n    // display\n    Array.prototype.forEach.call(countdown_div, function(el) {\n\n      el.innerHTML = \"Update in <span class='counter'>\" + \n      format(minutes) + \":\" + format(seconds) + \"</span>\"\n    })\n  }, update);\n}\n\nfunction format(num) {\n  return num < 10 ? \"0\" + num : num;\n}\n\n\n//   function tick() {\n//     var counter = document.querySelectorAll('.counter');\n//     var countdown_div = document.querySelectorAll('.countdown');\n//     var current_minutes = minutes - 1;\n\n//     seconds--;\n\n//     Array.prototype.forEach.call(countdown_div, function(el) {\n//       el.innerHTML = \"Update in <span class='counter'>\" + \n//         current_minutes.toString() +\n//         ':' +\n//         (seconds < 10 ? '0' : '') +\n//         String(seconds) + \"</span>\"\n//     });\n\n//     if (seconds > 0) {\n//       setTimeout(tick, 1000);\n//     } else {\n//       if (minutes > 1) {\n//         countdown(minutes - 1);\n//       }\n//       if (minutes == 1 && seconds == 0) {\n//         Array.prototype.forEach.call(countdown_div, function(el) {\n//       el.innerHTML = \"Updating\"\n//     });\n//       }\n//     }\n//   }\n//   tick();\n// }\n\nexport function determineDistrictTitle(contest) {\n  return `${contest.office} ${\n    contest.office === 'President' || contest.division_type === 'class' ? '' : (contest.division_type === 'place' && contest.office_division === 1) ? 'Chief Justice' : capfirst(contest.division_type) + ' ' + contest.office_division\n  }`.trim();\n}\n\nexport function determineContestTitle(contest) {\n  if (contest.division_type === 'statewide' || contest.division_type === 'seat')\n    return '';\n\n  return determineDistrictTitle(contest);\n}\n\nexport function determineContestTitleYourRaces(contest) {\n  return determineDistrictTitle(contest);\n}\n","/**\n * A wrapper for the initial response from a fetch call that funnels to\n * res.json().\n *\n * @private\n * @param {Response} res\n * @returns {Promise}\n */\nfunction jsonResponse(res) {\n  if (!res.ok) throw new Error(`${res.status}: ${res.statusText}`);\n\n  return res.json();\n}\n\n/**\n * A light wrapper around fetch that assumes you're seeking a JSON response.\n *\n * @param {String|Request} input\n * @param {Object} init\n * @returns {Promise}\n */\nexport default function getJSON(input, init) {\n  return fetch(input, init).then(jsonResponse);\n}\n","// Adds floating point numbers with twice the normal precision.\n// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and\n// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)\n// 305–363 (1997).\n// Code adapted from GeographicLib by Charles F. F. Karney,\n// http://geographiclib.sourceforge.net/\n\nexport default function() {\n  return new Adder;\n}\n\nfunction Adder() {\n  this.reset();\n}\n\nAdder.prototype = {\n  constructor: Adder,\n  reset: function() {\n    this.s = // rounded value\n    this.t = 0; // exact error\n  },\n  add: function(y) {\n    add(temp, y, this.t);\n    add(this, temp.s, this.s);\n    if (this.s) this.t += temp.t;\n    else this.s = temp.t;\n  },\n  valueOf: function() {\n    return this.s;\n  }\n};\n\nvar temp = new Adder;\n\nfunction add(adder, a, b) {\n  var x = adder.s = a + b,\n      bv = x - a,\n      av = x - bv;\n  adder.t = (a - av) + (b - bv);\n}\n","import adder from \"../adder.js\";\nimport {abs} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nvar areaSum = adder(),\n    areaRingSum = adder(),\n    x00,\n    y00,\n    x0,\n    y0;\n\nvar areaStream = {\n  point: noop,\n  lineStart: noop,\n  lineEnd: noop,\n  polygonStart: function() {\n    areaStream.lineStart = areaRingStart;\n    areaStream.lineEnd = areaRingEnd;\n  },\n  polygonEnd: function() {\n    areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop;\n    areaSum.add(abs(areaRingSum));\n    areaRingSum.reset();\n  },\n  result: function() {\n    var area = areaSum / 2;\n    areaSum.reset();\n    return area;\n  }\n};\n\nfunction areaRingStart() {\n  areaStream.point = areaPointFirst;\n}\n\nfunction areaPointFirst(x, y) {\n  areaStream.point = areaPoint;\n  x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction areaPoint(x, y) {\n  areaRingSum.add(y0 * x - x0 * y);\n  x0 = x, y0 = y;\n}\n\nfunction areaRingEnd() {\n  areaPoint(x00, y00);\n}\n\nexport default areaStream;\n","import {sqrt} from \"../math.js\";\n\n// TODO Enforce positive area for exterior, negative area for interior?\n\nvar X0 = 0,\n    Y0 = 0,\n    Z0 = 0,\n    X1 = 0,\n    Y1 = 0,\n    Z1 = 0,\n    X2 = 0,\n    Y2 = 0,\n    Z2 = 0,\n    x00,\n    y00,\n    x0,\n    y0;\n\nvar centroidStream = {\n  point: centroidPoint,\n  lineStart: centroidLineStart,\n  lineEnd: centroidLineEnd,\n  polygonStart: function() {\n    centroidStream.lineStart = centroidRingStart;\n    centroidStream.lineEnd = centroidRingEnd;\n  },\n  polygonEnd: function() {\n    centroidStream.point = centroidPoint;\n    centroidStream.lineStart = centroidLineStart;\n    centroidStream.lineEnd = centroidLineEnd;\n  },\n  result: function() {\n    var centroid = Z2 ? [X2 / Z2, Y2 / Z2]\n        : Z1 ? [X1 / Z1, Y1 / Z1]\n        : Z0 ? [X0 / Z0, Y0 / Z0]\n        : [NaN, NaN];\n    X0 = Y0 = Z0 =\n    X1 = Y1 = Z1 =\n    X2 = Y2 = Z2 = 0;\n    return centroid;\n  }\n};\n\nfunction centroidPoint(x, y) {\n  X0 += x;\n  Y0 += y;\n  ++Z0;\n}\n\nfunction centroidLineStart() {\n  centroidStream.point = centroidPointFirstLine;\n}\n\nfunction centroidPointFirstLine(x, y) {\n  centroidStream.point = centroidPointLine;\n  centroidPoint(x0 = x, y0 = y);\n}\n\nfunction centroidPointLine(x, y) {\n  var dx = x - x0, dy = y - y0, z = sqrt(dx * dx + dy * dy);\n  X1 += z * (x0 + x) / 2;\n  Y1 += z * (y0 + y) / 2;\n  Z1 += z;\n  centroidPoint(x0 = x, y0 = y);\n}\n\nfunction centroidLineEnd() {\n  centroidStream.point = centroidPoint;\n}\n\nfunction centroidRingStart() {\n  centroidStream.point = centroidPointFirstRing;\n}\n\nfunction centroidRingEnd() {\n  centroidPointRing(x00, y00);\n}\n\nfunction centroidPointFirstRing(x, y) {\n  centroidStream.point = centroidPointRing;\n  centroidPoint(x00 = x0 = x, y00 = y0 = y);\n}\n\nfunction centroidPointRing(x, y) {\n  var dx = x - x0,\n      dy = y - y0,\n      z = sqrt(dx * dx + dy * dy);\n\n  X1 += z * (x0 + x) / 2;\n  Y1 += z * (y0 + y) / 2;\n  Z1 += z;\n\n  z = y0 * x - x0 * y;\n  X2 += z * (x0 + x);\n  Y2 += z * (y0 + y);\n  Z2 += z * 3;\n  centroidPoint(x0 = x, y0 = y);\n}\n\nexport default centroidStream;\n","import {tau} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nexport default function PathContext(context) {\n  this._context = context;\n}\n\nPathContext.prototype = {\n  _radius: 4.5,\n  pointRadius: function(_) {\n    return this._radius = _, this;\n  },\n  polygonStart: function() {\n    this._line = 0;\n  },\n  polygonEnd: function() {\n    this._line = NaN;\n  },\n  lineStart: function() {\n    this._point = 0;\n  },\n  lineEnd: function() {\n    if (this._line === 0) this._context.closePath();\n    this._point = NaN;\n  },\n  point: function(x, y) {\n    switch (this._point) {\n      case 0: {\n        this._context.moveTo(x, y);\n        this._point = 1;\n        break;\n      }\n      case 1: {\n        this._context.lineTo(x, y);\n        break;\n      }\n      default: {\n        this._context.moveTo(x + this._radius, y);\n        this._context.arc(x, y, this._radius, 0, tau);\n        break;\n      }\n    }\n  },\n  result: noop\n};\n","import adder from \"../adder.js\";\nimport {sqrt} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nvar lengthSum = adder(),\n    lengthRing,\n    x00,\n    y00,\n    x0,\n    y0;\n\nvar lengthStream = {\n  point: noop,\n  lineStart: function() {\n    lengthStream.point = lengthPointFirst;\n  },\n  lineEnd: function() {\n    if (lengthRing) lengthPoint(x00, y00);\n    lengthStream.point = noop;\n  },\n  polygonStart: function() {\n    lengthRing = true;\n  },\n  polygonEnd: function() {\n    lengthRing = null;\n  },\n  result: function() {\n    var length = +lengthSum;\n    lengthSum.reset();\n    return length;\n  }\n};\n\nfunction lengthPointFirst(x, y) {\n  lengthStream.point = lengthPoint;\n  x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction lengthPoint(x, y) {\n  x0 -= x, y0 -= y;\n  lengthSum.add(sqrt(x0 * x0 + y0 * y0));\n  x0 = x, y0 = y;\n}\n\nexport default lengthStream;\n","export default function PathString() {\n  this._string = [];\n}\n\nPathString.prototype = {\n  _radius: 4.5,\n  _circle: circle(4.5),\n  pointRadius: function(_) {\n    if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;\n    return this;\n  },\n  polygonStart: function() {\n    this._line = 0;\n  },\n  polygonEnd: function() {\n    this._line = NaN;\n  },\n  lineStart: function() {\n    this._point = 0;\n  },\n  lineEnd: function() {\n    if (this._line === 0) this._string.push(\"Z\");\n    this._point = NaN;\n  },\n  point: function(x, y) {\n    switch (this._point) {\n      case 0: {\n        this._string.push(\"M\", x, \",\", y);\n        this._point = 1;\n        break;\n      }\n      case 1: {\n        this._string.push(\"L\", x, \",\", y);\n        break;\n      }\n      default: {\n        if (this._circle == null) this._circle = circle(this._radius);\n        this._string.push(\"M\", x, \",\", y, this._circle);\n        break;\n      }\n    }\n  },\n  result: function() {\n    if (this._string.length) {\n      var result = this._string.join(\"\");\n      this._string = [];\n      return result;\n    } else {\n      return null;\n    }\n  }\n};\n\nfunction circle(radius) {\n  return \"m0,\" + radius\n      + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius\n      + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius\n      + \"z\";\n}\n","import identity from \"../identity.js\";\nimport stream from \"../stream.js\";\nimport pathArea from \"./area.js\";\nimport pathBounds from \"./bounds.js\";\nimport pathCentroid from \"./centroid.js\";\nimport PathContext from \"./context.js\";\nimport pathMeasure from \"./measure.js\";\nimport PathString from \"./string.js\";\n\nexport default function(projection, context) {\n  var pointRadius = 4.5,\n      projectionStream,\n      contextStream;\n\n  function path(object) {\n    if (object) {\n      if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n      stream(object, projectionStream(contextStream));\n    }\n    return contextStream.result();\n  }\n\n  path.area = function(object) {\n    stream(object, projectionStream(pathArea));\n    return pathArea.result();\n  };\n\n  path.measure = function(object) {\n    stream(object, projectionStream(pathMeasure));\n    return pathMeasure.result();\n  };\n\n  path.bounds = function(object) {\n    stream(object, projectionStream(pathBounds));\n    return pathBounds.result();\n  };\n\n  path.centroid = function(object) {\n    stream(object, projectionStream(pathCentroid));\n    return pathCentroid.result();\n  };\n\n  path.projection = function(_) {\n    return arguments.length ? (projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream, path) : projection;\n  };\n\n  path.context = function(_) {\n    if (!arguments.length) return context;\n    contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);\n    if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n    return path;\n  };\n\n  path.pointRadius = function(_) {\n    if (!arguments.length) return pointRadius;\n    pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n    return path;\n  };\n\n  return path.projection(projection).context(context);\n}\n","import cx from 'classnames';\nimport { h } from 'preact';\nimport { apnumber } from 'journalize';\nimport { SHOW_DELEGATES } from '../constants';\n\nfunction OtherCandidate({ isViewable, candidateCount, embedType, onClick, showDelegates }) {\n  const classes = cx('candidate race__candidate-row', {\n    'race__candidate-row--hidden': !isViewable,\n  });\n  \n  return (\n    <tr class={classes}>\n      <td\n        class=\"candidate__cell candidate__party t-align-center\"\n        onClick={onClick}\n      >\n        <svg class=\"icon icon-angle-down\">\n          <use xlinkHref=\"#icon-angle-down\" />\n        </svg>\n      </td>\n      <th class=\"candidate__cell candidate__name\">\n        <button class={embedType} onClick={onClick}>Show All ({candidateCount}) </button>\n      </th>\n      {SHOW_DELEGATES == true && showDelegates == true && (\n        <th class=\"candidate__cell candidate__votes\"></th>\n      )}\n      <th class=\"candidate__cell candidate__votes\"></th>\n      <th class=\"candidate__cell candidate__pct\"></th>\n    </tr>\n  );\n}\n\nexport default OtherCandidate;\n","import cx from 'classnames';\nimport { capfirst, intcomma } from 'journalize';\nimport { Component, h } from 'preact';\n\nimport PartyPill from './PartyPill';\nimport OtherCandidate from './OtherCandidate';\nimport PureComponent from './PureComponent';\n\n// internal\nimport { sort_candidates_by_party, presidentCandidateColors, senateCandidateColors } from '../election-utils';\nimport sumValues from '../utils/sum-values';\nimport { DEMOCRAT, NEUTRAL, OTHER } from '../colors';\n\ninterface Props {\n  partyName: string;\n  tableHeader: JSX.Element;\n  isShowcaseRace?: boolean;\n  isHomepage?: boolean;\n  columnCount: number;\n  visibleCandidatesCount: number;\n  partyBallot: { [key: string]: any };\n  renderCandidate: any;\n  contestTitle: string;\n  embedType: string;\n}\n\nclass SeatPartyDivider extends Component {\n  constructor() {\n    super();\n\n    this.state = {\n      viewAllCandidates: false,\n    };\n    this.onViewableToggle = this.onViewableToggle.bind(this);\n  }\n\n  onViewableToggle() {\n    this.setState(prevState => ({\n      viewAllCandidates: !prevState.viewAllCandidates, // set viewAllCandidates to what is wasn't before\n    }));\n  }\n  render() {\n    const {\n      partyName,\n      partyBallot,\n      tableHeader,\n      isShowcaseRace,\n      isHomepage,\n      columnCount,\n      visibleCandidatesCount,\n      renderCandidate,\n      contestTitle,\n      embedType,\n    } = this.props;\n\n    const { viewAllCandidates } = this.state;\n\n    const shouldDisplayResult = partyBallot.contest_result !== 'not called';\n\n    const totalVotes = sumValues(partyBallot.candidacies, 'votes');\n\n    let candidates = partyBallot.candidacies;\n\n    let candidatesRender;\n\n    let visibleCandidates = visibleCandidatesCount;\n\n    let shouldDisplay5Candidates;\n\n    let embedTypeUsable = 'none'\n    \n    if (typeof embedType !== 'undefined') {\n      embedTypeUsable = embedType;\n    }\n\n    if (isShowcaseRace || embedTypeUsable.includes('broadcast')) {\n\n      shouldDisplay5Candidates =\n        partyBallot.office == 'President' && partyBallot.party == 'Democrat';\n\n      candidatesRender = shouldDisplay5Candidates ? presidentCandidateColors : senateCandidateColors;\n\n      visibleCandidates = shouldDisplay5Candidates ? 6 : 3;\n    }\n\n    if (partyBallot <= 0) {\n      candidates = sort_candidates_by_party(candidates);\n    }\n\n    const rowClass = cx('seat__race', {\n      'seat__race--Democrat': partyName == 'Democrat',\n      'seat__race--Republican': partyName == 'Republican',\n    });\n\n    const contestCalledClass = cx('contest__called-row', {\n      'dem-winner-banner': partyName == 'Democrat',\n      'rep-winner-banner': partyName == 'Republican',\n    });\n\n    const contestResults =\n      partyBallot.contest_result == 'runoff'\n        ? `Will continue to ${partyBallot.contest_result}`\n        : (partyBallot.contest_result == 'winner') ? `Projected ${partyBallot.contest_result}` : `${partyBallot.contest_result}`;\n\n    const precinctsClass = cx('contest__precincts', {\n      'tribcast' : embedType == 'tribcast'\n    })\n\n    const countdownClass = cx('countdown', {\n      'tribcast' : embedType == 'tribcast'\n    })\n\n    return (\n      <div class={rowClass}>\n        <div class=\"race\">\n          <h4 class=\"race__title\">\n            {embedTypeUsable == 'partner' || embedTypeUsable.includes('broadcast') || isHomepage ? ( isHomepage ? <span>\n                <h3 class=\"seat__title\">{contestTitle} - {partyName}ic Primary </h3> \n              </span> : <span>\n                <h3 class=\"seat__title\">{contestTitle} - </h3> {partyName}\n              </span>\n            ) : (\n              <span>{partyName}</span>\n            )}\n\n          </h4>\n          \n\n          <table class=\"race__candidates\">\n            {tableHeader}\n            <tbody>\n              {shouldDisplayResult && (\n                <tr class={contestCalledClass}>\n                  <td colSpan={columnCount}>{contestResults}</td>\n                </tr>\n              )}\n              {(embedTypeUsable.includes('broadcast')) ||\n                (isShowcaseRace &&\n                  candidates.map((candidate: any, idx: any) =>\n                    renderCandidate(\n                      candidate,\n                      idx,\n                      candidatesRender,\n                      viewAllCandidates,\n                      { totalVotes }\n                    )\n                  ))}\n\n              {!isShowcaseRace &&\n                candidates.map((candidate: any, idx: any) =>\n                  renderCandidate(candidate, idx, viewAllCandidates, {\n                    totalVotes,\n                  })\n                )}\n              {(!(\n                embedTypeUsable.includes('broadcast')\n                ) && !isHomepage) && candidates.length > visibleCandidates && (\n                  <OtherCandidate\n                    isViewable={!viewAllCandidates}\n                    candidateCount={candidates.length}\n                    embedType={embedType}\n                    onClick={() => {\n                      this.onViewableToggle();\n                    }}\n                    showDelegates={shouldDisplay5Candidates}\n                  />\n                )}\n            </tbody>\n            \n            {candidates.length > visibleCandidates && viewAllCandidates && (\n              <tr class=\"candidate race__candidate-row\">\n                <td\n                  class=\"candidate__cell candidate__party t-align-center\"\n                  onClick={() => {\n                    this.onViewableToggle();\n                  }}\n                >\n                  <svg class=\"icon icon-angle-up\">\n                    <use xlinkHref=\"#icon-angle-up\" />\n                  </svg>\n                </td>\n                <th class=\"candidate__cell candidate__name\">\n                  <button class={embedType}\n                    onClick={() => {\n                      this.onViewableToggle();\n                    }}\n                  >\n                    Show fewer ({visibleCandidates})\n                  </button>\n                </th>\n                <th class=\"candidate__cell candidate__votes\"> </th>\n                <th class=\"candidate__cell candidate__pct\"></th>\n              </tr>\n            )}\n          </table>\n          \n          {isHomepage && (\n            <div class='homepage-link__full_results'><a href='https://apps.texastribune.org/features/2020/primary-election-results/'>View Full Results</a></div>\n          )}\n          {isHomepage && (\n            <div class='dropped_out__div' style=\"margin-top: 0.625rem;\">*Dropped out</div>\n          )}\n          {isHomepage && (\n            <div class=\"contest__metrics\" style=\"margin-top: 0.625rem;\">\n              <p class=\"contest__precincts\">\n                {`${intcomma(\n                  partyBallot.pollinglocationsreporting\n                )} of ${intcomma(\n                  partyBallot.total_pollinglocations\n                )} total polling locations reporting (${partyBallot.pollinglocations_reporting_percent.toFixed(\n                  1\n                )}%)`}\n              </p>\n              \n            </div>\n          )}\n\n        {!isHomepage && (\n          <div>\n            {(partyBallot.office == 'President' && partyBallot.party == 'Democrat') && \n              (<div class='dropped_out__div'>*Dropped out</div>\n            )}\n            <div class=\"contest__metrics\" style=\"padding-top: 3px;\">\n              <p class={precinctsClass}>\n                {`${intcomma(\n                  partyBallot.pollinglocationsreporting\n                )} of ${intcomma(\n                  partyBallot.total_pollinglocations\n                )} total polling locations reporting (${partyBallot.pollinglocations_reporting_percent.toFixed(\n                  1\n                )}%)`}\n              </p>\n              \n            </div>\n          </div>\n        )}\n\n        {/* include on all of the results tables */}\n        {(partyBallot.office == 'President' && partyBallot.party == 'Democrat') ? (\n          <p class={precinctsClass} style=\"padding-top: 3px;\">Source: Texas Secretary of State and Texas Democratic Party</p>\n        ) : (\n          <p class={precinctsClass} style=\"padding-top: 3px;\">Source: Texas Secretary of State</p>\n        )}\n\n        {!isHomepage && (\n          <div class={countdownClass}>\n            Updating <span class=\"counter\"></span>\n          </div>\n        )}\n      </div>\n      </div>\n    );\n  }\n}\n\nSeatPartyDivider.defaultProps = {\n  visibleCandidatesCount: 3,\n  isShowcaseRace: false,\n  isHomepage: false,\n};\n\nexport default SeatPartyDivider;\n","export default function sumValues(arr, key) {\n  return arr.reduce((acc, obj) => acc + obj[key], 0);\n}\n","const hOP = Object.prototype.hasOwnProperty;\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x: any, y: any): boolean {\n  // SameValue algorithm\n  if (x === y) {\n    // Steps 1-5, 7-10\n    // Steps 6.b-6.e: +0 != -0\n    // Added the nonzero y check to make Flow happy, but it is redundant\n    return x !== 0 || y !== 0 || 1 / x === 1 / y;\n  }\n  // Step 6.a: NaN == NaN\n  return x !== x && y !== y;\n}\n\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\nfunction shallowEqual(objA: object, objB: object): boolean {\n  if (is(objA, objB)) {\n    return true;\n  }\n\n  if (\n    typeof objA !== 'object' ||\n    objA === null ||\n    typeof objB !== 'object' ||\n    objB === null\n  ) {\n    return false;\n  }\n\n  const keysA = Object.keys(objA);\n  const keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  // Test for A's keys different from B.\n  for (let i = 0; i < keysA.length; i++) {\n    if (!hOP.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nexport default shallowEqual;\n","// packages\nimport { Component } from 'preact';\n\n// internal\nimport shallowEqual from '../utils/shallow-equal';\n\nabstract class PureComponent<P = {}, S = {}> extends Component<P, S> {\n  shouldComponentUpdate(props, state) {\n    const check =\n      shallowEqual(props, this.props) && shallowEqual(state, this.state);\n    // if (props.projection)\n    //   console.log(\n    //     'projection check:',\n    //     props.projection === this.props.projection,\n    //     !check\n    //   );\n    return !check;\n  }\n}\n\nexport default PureComponent;\n","export default function _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}","export default function(x) {\n  return function() {\n    return x;\n  };\n}\n","/**\n * A for-loop version of Array.prototype.find so IE and friends can play.\n *\n * @private\n * @param  {Array} arr\n * @param  {Function} predicate\n * @return {*|undefined}\n * @throws {TypeError} Argument predicate must be a function\n */\nexport default function find(\n  arr: Array<any>,\n  predicate: Function\n): any | undefined {\n  if (typeof predicate !== 'function') {\n    throw new TypeError('predicate must be a function');\n  }\n\n  for (let i = 0; i < arr.length; i++) {\n    if (predicate(arr[i], i, arr)) {\n      return arr[i];\n    }\n  }\n\n  return undefined;\n}\n","// packages\nimport cx from 'classnames';\nimport { capfirst } from 'journalize';\nimport memoize from 'lodash.memoize';\nimport { h } from 'preact';\n\ntype Props = {\n  excludeInitial?: boolean;\n  party: string;\n  style: string;\n};\n\nfunction PartyPill({ excludeInitial, party, style }: Props) {\n  const partyPrefix = party.slice(0, 3).toLowerCase();\n  const partyInitial = party[0].toUpperCase();\n\n  const classes = cx('circle-pill', `pill--${partyPrefix}`);\n\n  return (\n    <span class={classes} style={style} title={capfirst(party)}>\n      {!excludeInitial && partyInitial}\n    </span>\n  );\n}\n\nPartyPill.defaultProps = {\n  excludeInitial: false,\n};\n\nexport default memoize(PartyPill, ({ party, style }) => ({\n  party: party,\n  style: style,\n}));\n","/**\n * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.\n */\nvar earthRadius = 6371008.8;\n\n/**\n * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.\n */\nvar factors = {\n    meters: earthRadius,\n    metres: earthRadius,\n    millimeters: earthRadius * 1000,\n    millimetres: earthRadius * 1000,\n    centimeters: earthRadius * 100,\n    centimetres: earthRadius * 100,\n    kilometers: earthRadius / 1000,\n    kilometres: earthRadius / 1000,\n    miles: earthRadius / 1609.344,\n    nauticalmiles: earthRadius / 1852,\n    inches: earthRadius * 39.370,\n    yards: earthRadius / 1.0936,\n    feet: earthRadius * 3.28084,\n    radians: 1,\n    degrees: earthRadius / 111325,\n};\n\n/**\n * Units of measurement factors based on 1 meter.\n */\nvar unitsFactors = {\n    meters: 1,\n    metres: 1,\n    millimeters: 1000,\n    millimetres: 1000,\n    centimeters: 100,\n    centimetres: 100,\n    kilometers: 1 / 1000,\n    kilometres: 1 / 1000,\n    miles: 1 / 1609.344,\n    nauticalmiles: 1 / 1852,\n    inches: 39.370,\n    yards: 1 / 1.0936,\n    feet: 3.28084,\n    radians: 1 / earthRadius,\n    degrees: 1 / 111325,\n};\n\n/**\n * Area of measurement factors based on 1 square meter.\n */\nvar areaFactors = {\n    meters: 1,\n    metres: 1,\n    millimeters: 1000000,\n    millimetres: 1000000,\n    centimeters: 10000,\n    centimetres: 10000,\n    kilometers: 0.000001,\n    kilometres: 0.000001,\n    acres: 0.000247105,\n    miles: 3.86e-7,\n    yards: 1.195990046,\n    feet: 10.763910417,\n    inches: 1550.003100006\n};\n\n/**\n * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.\n *\n * @name feature\n * @param {Geometry} geometry input geometry\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a GeoJSON Feature\n * @example\n * var geometry = {\n *   \"type\": \"Point\",\n *   \"coordinates\": [110, 50]\n * };\n *\n * var feature = turf.feature(geometry);\n *\n * //=feature\n */\nfunction feature(geometry, properties, options) {\n    // Optional Parameters\n    options = options || {};\n    if (!isObject(options)) throw new Error('options is invalid');\n    var bbox = options.bbox;\n    var id = options.id;\n\n    // Validation\n    if (geometry === undefined) throw new Error('geometry is required');\n    if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');\n    if (bbox) validateBBox(bbox);\n    if (id) validateId(id);\n\n    // Main\n    var feat = {type: 'Feature'};\n    if (id) feat.id = id;\n    if (bbox) feat.bbox = bbox;\n    feat.properties = properties || {};\n    feat.geometry = geometry;\n    return feat;\n}\n\n/**\n * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.\n * For GeometryCollection type use `helpers.geometryCollection`\n *\n * @name geometry\n * @param {string} type Geometry Type\n * @param {Array<number>} coordinates Coordinates\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry\n * @returns {Geometry} a GeoJSON Geometry\n * @example\n * var type = 'Point';\n * var coordinates = [110, 50];\n *\n * var geometry = turf.geometry(type, coordinates);\n *\n * //=geometry\n */\nfunction geometry(type, coordinates, options) {\n    // Optional Parameters\n    options = options || {};\n    if (!isObject(options)) throw new Error('options is invalid');\n    var bbox = options.bbox;\n\n    // Validation\n    if (!type) throw new Error('type is required');\n    if (!coordinates) throw new Error('coordinates is required');\n    if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');\n    if (bbox) validateBBox(bbox);\n\n    // Main\n    var geom;\n    switch (type) {\n    case 'Point': geom = point(coordinates).geometry; break;\n    case 'LineString': geom = lineString(coordinates).geometry; break;\n    case 'Polygon': geom = polygon(coordinates).geometry; break;\n    case 'MultiPoint': geom = multiPoint(coordinates).geometry; break;\n    case 'MultiLineString': geom = multiLineString(coordinates).geometry; break;\n    case 'MultiPolygon': geom = multiPolygon(coordinates).geometry; break;\n    default: throw new Error(type + ' is invalid');\n    }\n    if (bbox) geom.bbox = bbox;\n    return geom;\n}\n\n/**\n * Creates a {@link Point} {@link Feature} from a Position.\n *\n * @name point\n * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<Point>} a Point feature\n * @example\n * var point = turf.point([-75.343, 39.984]);\n *\n * //=point\n */\nfunction point(coordinates, properties, options) {\n    if (!coordinates) throw new Error('coordinates is required');\n    if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');\n    if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');\n    if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');\n\n    return feature({\n        type: 'Point',\n        coordinates: coordinates\n    }, properties, options);\n}\n\n/**\n * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.\n *\n * @name points\n * @param {Array<Array<number>>} coordinates an array of Points\n * @param {Object} [properties={}] Translate these properties to each Feature\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Point>} Point Feature\n * @example\n * var points = turf.points([\n *   [-75, 39],\n *   [-80, 45],\n *   [-78, 50]\n * ]);\n *\n * //=points\n */\nfunction points(coordinates, properties, options) {\n    if (!coordinates) throw new Error('coordinates is required');\n    if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');\n\n    return featureCollection(coordinates.map(function (coords) {\n        return point(coords, properties);\n    }), options);\n}\n\n/**\n * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.\n *\n * @name polygon\n * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<Polygon>} Polygon Feature\n * @example\n * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });\n *\n * //=polygon\n */\nfunction polygon(coordinates, properties, options) {\n    if (!coordinates) throw new Error('coordinates is required');\n\n    for (var i = 0; i < coordinates.length; i++) {\n        var ring = coordinates[i];\n        if (ring.length < 4) {\n            throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');\n        }\n        for (var j = 0; j < ring[ring.length - 1].length; j++) {\n            // Check if first point of Polygon contains two numbers\n            if (i === 0 && j === 0 && !isNumber(ring[0][0]) || !isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');\n            if (ring[ring.length - 1][j] !== ring[0][j]) {\n                throw new Error('First and last Position are not equivalent.');\n            }\n        }\n    }\n\n    return feature({\n        type: 'Polygon',\n        coordinates: coordinates\n    }, properties, options);\n}\n\n/**\n * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.\n *\n * @name polygons\n * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection\n * @example\n * var polygons = turf.polygons([\n *   [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],\n *   [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],\n * ]);\n *\n * //=polygons\n */\nfunction polygons(coordinates, properties, options) {\n    if (!coordinates) throw new Error('coordinates is required');\n    if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');\n\n    return featureCollection(coordinates.map(function (coords) {\n        return polygon(coords, properties);\n    }), options);\n}\n\n/**\n * Creates a {@link LineString} {@link Feature} from an Array of Positions.\n *\n * @name lineString\n * @param {Array<Array<number>>} coordinates an array of Positions\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<LineString>} LineString Feature\n * @example\n * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});\n * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});\n *\n * //=linestring1\n * //=linestring2\n */\nfunction lineString(coordinates, properties, options) {\n    if (!coordinates) throw new Error('coordinates is required');\n    if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');\n    // Check if first point of LineString contains two numbers\n    if (!isNumber(coordinates[0][1]) || !isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');\n\n    return feature({\n        type: 'LineString',\n        coordinates: coordinates\n    }, properties, options);\n}\n\n/**\n * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.\n *\n * @name lineStrings\n * @param {Array<Array<number>>} coordinates an array of LinearRings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<LineString>} LineString FeatureCollection\n * @example\n * var linestrings = turf.lineStrings([\n *   [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],\n *   [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]\n * ]);\n *\n * //=linestrings\n */\nfunction lineStrings(coordinates, properties, options) {\n    if (!coordinates) throw new Error('coordinates is required');\n    if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');\n\n    return featureCollection(coordinates.map(function (coords) {\n        return lineString(coords, properties);\n    }), options);\n}\n\n/**\n * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.\n *\n * @name featureCollection\n * @param {Feature[]} features input features\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {FeatureCollection} FeatureCollection of Features\n * @example\n * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});\n * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});\n * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});\n *\n * var collection = turf.featureCollection([\n *   locationA,\n *   locationB,\n *   locationC\n * ]);\n *\n * //=collection\n */\nfunction featureCollection(features, options) {\n    // Optional Parameters\n    options = options || {};\n    if (!isObject(options)) throw new Error('options is invalid');\n    var bbox = options.bbox;\n    var id = options.id;\n\n    // Validation\n    if (!features) throw new Error('No features passed');\n    if (!Array.isArray(features)) throw new Error('features must be an Array');\n    if (bbox) validateBBox(bbox);\n    if (id) validateId(id);\n\n    // Main\n    var fc = {type: 'FeatureCollection'};\n    if (id) fc.id = id;\n    if (bbox) fc.bbox = bbox;\n    fc.features = features;\n    return fc;\n}\n\n/**\n * Creates a {@link Feature<MultiLineString>} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiLineString\n * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiLineString>} a MultiLineString feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);\n *\n * //=multiLine\n */\nfunction multiLineString(coordinates, properties, options) {\n    if (!coordinates) throw new Error('coordinates is required');\n\n    return feature({\n        type: 'MultiLineString',\n        coordinates: coordinates\n    }, properties, options);\n}\n\n/**\n * Creates a {@link Feature<MultiPoint>} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiPoint\n * @param {Array<Array<number>>} coordinates an array of Positions\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPoint>} a MultiPoint feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPt = turf.multiPoint([[0,0],[10,10]]);\n *\n * //=multiPt\n */\nfunction multiPoint(coordinates, properties, options) {\n    if (!coordinates) throw new Error('coordinates is required');\n\n    return feature({\n        type: 'MultiPoint',\n        coordinates: coordinates\n    }, properties, options);\n}\n\n/**\n * Creates a {@link Feature<MultiPolygon>} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiPolygon\n * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPolygon>} a multipolygon feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);\n *\n * //=multiPoly\n *\n */\nfunction multiPolygon(coordinates, properties, options) {\n    if (!coordinates) throw new Error('coordinates is required');\n\n    return feature({\n        type: 'MultiPolygon',\n        coordinates: coordinates\n    }, properties, options);\n}\n\n/**\n * Creates a {@link Feature<GeometryCollection>} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name geometryCollection\n * @param {Array<Geometry>} geometries an array of GeoJSON Geometries\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature\n * @example\n * var pt = {\n *     \"type\": \"Point\",\n *       \"coordinates\": [100, 0]\n *     };\n * var line = {\n *     \"type\": \"LineString\",\n *     \"coordinates\": [ [101, 0], [102, 1] ]\n *   };\n * var collection = turf.geometryCollection([pt, line]);\n *\n * //=collection\n */\nfunction geometryCollection(geometries, properties, options) {\n    if (!geometries) throw new Error('geometries is required');\n    if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');\n\n    return feature({\n        type: 'GeometryCollection',\n        geometries: geometries\n    }, properties, options);\n}\n\n/**\n * Round number to precision\n *\n * @param {number} num Number\n * @param {number} [precision=0] Precision\n * @returns {number} rounded number\n * @example\n * turf.round(120.4321)\n * //=120\n *\n * turf.round(120.4321, 2)\n * //=120.43\n */\nfunction round(num, precision) {\n    if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');\n    if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');\n    var multiplier = Math.pow(10, precision || 0);\n    return Math.round(num * multiplier) / multiplier;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @name radiansToLength\n * @param {number} radians in radians across the sphere\n * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.\n * @returns {number} distance\n */\nfunction radiansToLength(radians, units) {\n    if (radians === undefined || radians === null) throw new Error('radians is required');\n\n    if (units && typeof units !== 'string') throw new Error('units must be a string');\n    var factor = factors[units || 'kilometers'];\n    if (!factor) throw new Error(units + ' units is invalid');\n    return radians * factor;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @name lengthToRadians\n * @param {number} distance in real units\n * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.\n * @returns {number} radians\n */\nfunction lengthToRadians(distance, units) {\n    if (distance === undefined || distance === null) throw new Error('distance is required');\n\n    if (units && typeof units !== 'string') throw new Error('units must be a string');\n    var factor = factors[units || 'kilometers'];\n    if (!factor) throw new Error(units + ' units is invalid');\n    return distance / factor;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet\n *\n * @name lengthToDegrees\n * @param {number} distance in real units\n * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.\n * @returns {number} degrees\n */\nfunction lengthToDegrees(distance, units) {\n    return radiansToDegrees(lengthToRadians(distance, units));\n}\n\n/**\n * Converts any bearing angle from the north line direction (positive clockwise)\n * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line\n *\n * @name bearingToAzimuth\n * @param {number} bearing angle, between -180 and +180 degrees\n * @returns {number} angle between 0 and 360 degrees\n */\nfunction bearingToAzimuth(bearing) {\n    if (bearing === null || bearing === undefined) throw new Error('bearing is required');\n\n    var angle = bearing % 360;\n    if (angle < 0) angle += 360;\n    return angle;\n}\n\n/**\n * Converts an angle in radians to degrees\n *\n * @name radiansToDegrees\n * @param {number} radians angle in radians\n * @returns {number} degrees between 0 and 360 degrees\n */\nfunction radiansToDegrees(radians) {\n    if (radians === null || radians === undefined) throw new Error('radians is required');\n\n    var degrees = radians % (2 * Math.PI);\n    return degrees * 180 / Math.PI;\n}\n\n/**\n * Converts an angle in degrees to radians\n *\n * @name degreesToRadians\n * @param {number} degrees angle between 0 and 360 degrees\n * @returns {number} angle in radians\n */\nfunction degreesToRadians(degrees) {\n    if (degrees === null || degrees === undefined) throw new Error('degrees is required');\n\n    var radians = degrees % 360;\n    return radians * Math.PI / 180;\n}\n\n/**\n * Converts a length to the requested unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @param {number} length to be converted\n * @param {string} originalUnit of the length\n * @param {string} [finalUnit='kilometers'] returned unit\n * @returns {number} the converted length\n */\nfunction convertLength(length, originalUnit, finalUnit) {\n    if (length === null || length === undefined) throw new Error('length is required');\n    if (!(length >= 0)) throw new Error('length must be a positive number');\n\n    return radiansToLength(lengthToRadians(length, originalUnit), finalUnit || 'kilometers');\n}\n\n/**\n * Converts a area to the requested unit.\n * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches\n * @param {number} area to be converted\n * @param {string} [originalUnit='meters'] of the distance\n * @param {string} [finalUnit='kilometers'] returned unit\n * @returns {number} the converted distance\n */\nfunction convertArea(area, originalUnit, finalUnit) {\n    if (area === null || area === undefined) throw new Error('area is required');\n    if (!(area >= 0)) throw new Error('area must be a positive number');\n\n    var startFactor = areaFactors[originalUnit || 'meters'];\n    if (!startFactor) throw new Error('invalid original units');\n\n    var finalFactor = areaFactors[finalUnit || 'kilometers'];\n    if (!finalFactor) throw new Error('invalid final units');\n\n    return (area / startFactor) * finalFactor;\n}\n\n/**\n * isNumber\n *\n * @param {*} num Number to validate\n * @returns {boolean} true/false\n * @example\n * turf.isNumber(123)\n * //=true\n * turf.isNumber('foo')\n * //=false\n */\nfunction isNumber(num) {\n    return !isNaN(num) && num !== null && !Array.isArray(num);\n}\n\n/**\n * isObject\n *\n * @param {*} input variable to validate\n * @returns {boolean} true/false\n * @example\n * turf.isObject({elevation: 10})\n * //=true\n * turf.isObject('foo')\n * //=false\n */\nfunction isObject(input) {\n    return (!!input) && (input.constructor === Object);\n}\n\n/**\n * Validate BBox\n *\n * @private\n * @param {Array<number>} bbox BBox to validate\n * @returns {void}\n * @throws Error if BBox is not valid\n * @example\n * validateBBox([-180, -40, 110, 50])\n * //=OK\n * validateBBox([-180, -40])\n * //=Error\n * validateBBox('Foo')\n * //=Error\n * validateBBox(5)\n * //=Error\n * validateBBox(null)\n * //=Error\n * validateBBox(undefined)\n * //=Error\n */\nfunction validateBBox(bbox) {\n    if (!bbox) throw new Error('bbox is required');\n    if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');\n    if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');\n    bbox.forEach(function (num) {\n        if (!isNumber(num)) throw new Error('bbox must only contain numbers');\n    });\n}\n\n/**\n * Validate Id\n *\n * @private\n * @param {string|number} id Id to validate\n * @returns {void}\n * @throws Error if Id is not valid\n * @example\n * validateId([-180, -40, 110, 50])\n * //=Error\n * validateId([-180, -40])\n * //=Error\n * validateId('Foo')\n * //=OK\n * validateId(5)\n * //=OK\n * validateId(null)\n * //=Error\n * validateId(undefined)\n * //=Error\n */\nfunction validateId(id) {\n    if (!id) throw new Error('id is required');\n    if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');\n}\n\n// Deprecated methods\nfunction radians2degrees() {\n    throw new Error('method has been renamed to `radiansToDegrees`');\n}\n\nfunction degrees2radians() {\n    throw new Error('method has been renamed to `degreesToRadians`');\n}\n\nfunction distanceToDegrees() {\n    throw new Error('method has been renamed to `lengthToDegrees`');\n}\n\nfunction distanceToRadians() {\n    throw new Error('method has been renamed to `lengthToRadians`');\n}\n\nfunction radiansToDistance() {\n    throw new Error('method has been renamed to `radiansToLength`');\n}\n\nfunction bearingToAngle() {\n    throw new Error('method has been renamed to `bearingToAzimuth`');\n}\n\nfunction convertDistance() {\n    throw new Error('method has been renamed to `convertLength`');\n}\n\nexport { earthRadius, factors, unitsFactors, areaFactors, feature, geometry, point, points, polygon, polygons, lineString, lineStrings, featureCollection, multiLineString, multiPoint, multiPolygon, geometryCollection, round, radiansToLength, lengthToRadians, lengthToDegrees, bearingToAzimuth, radiansToDegrees, degreesToRadians, convertLength, convertArea, isNumber, isObject, validateBBox, validateId, radians2degrees, degrees2radians, distanceToDegrees, distanceToRadians, radiansToDistance, bearingToAngle, convertDistance };\n","export function initRange(domain, range) {\n  switch (arguments.length) {\n    case 0: break;\n    case 1: this.range(domain); break;\n    default: this.range(range).domain(domain); break;\n  }\n  return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n  switch (arguments.length) {\n    case 0: break;\n    case 1: this.interpolator(domain); break;\n    default: this.interpolator(interpolator).domain(domain); break;\n  }\n  return this;\n}\n","var array = Array.prototype;\n\nexport var map = array.map;\nexport var slice = array.slice;\n","export default function(a, b) {\n  return a = +a, b = +b, function(t) {\n    return Math.round(a * (1 - t) + b * t);\n  };\n}\n","export default function(x) {\n  return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateNumber, interpolateRound} from \"d3-interpolate\";\nimport {map, slice} from \"./array\";\nimport constant from \"./constant\";\nimport number from \"./number\";\n\nvar unit = [0, 1];\n\nexport function identity(x) {\n  return x;\n}\n\nfunction normalize(a, b) {\n  return (b -= (a = +a))\n      ? function(x) { return (x - a) / b; }\n      : constant(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(domain) {\n  var a = domain[0], b = domain[domain.length - 1], t;\n  if (a > b) t = a, a = b, b = t;\n  return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n  var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n  if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n  else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n  return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n  var j = Math.min(domain.length, range.length) - 1,\n      d = new Array(j),\n      r = new Array(j),\n      i = -1;\n\n  // Reverse descending domains.\n  if (domain[j] < domain[0]) {\n    domain = domain.slice().reverse();\n    range = range.slice().reverse();\n  }\n\n  while (++i < j) {\n    d[i] = normalize(domain[i], domain[i + 1]);\n    r[i] = interpolate(range[i], range[i + 1]);\n  }\n\n  return function(x) {\n    var i = bisect(domain, x, 1, j) - 1;\n    return r[i](d[i](x));\n  };\n}\n\nexport function copy(source, target) {\n  return target\n      .domain(source.domain())\n      .range(source.range())\n      .interpolate(source.interpolate())\n      .clamp(source.clamp())\n      .unknown(source.unknown());\n}\n\nexport function transformer() {\n  var domain = unit,\n      range = unit,\n      interpolate = interpolateValue,\n      transform,\n      untransform,\n      unknown,\n      clamp = identity,\n      piecewise,\n      output,\n      input;\n\n  function rescale() {\n    piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;\n    output = input = null;\n    return scale;\n  }\n\n  function scale(x) {\n    return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n  }\n\n  scale.invert = function(y) {\n    return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n  };\n\n  scale.domain = function(_) {\n    return arguments.length ? (domain = map.call(_, number), clamp === identity || (clamp = clamper(domain)), rescale()) : domain.slice();\n  };\n\n  scale.range = function(_) {\n    return arguments.length ? (range = slice.call(_), rescale()) : range.slice();\n  };\n\n  scale.rangeRound = function(_) {\n    return range = slice.call(_), interpolate = interpolateRound, rescale();\n  };\n\n  scale.clamp = function(_) {\n    return arguments.length ? (clamp = _ ? clamper(domain) : identity, scale) : clamp !== identity;\n  };\n\n  scale.interpolate = function(_) {\n    return arguments.length ? (interpolate = _, rescale()) : interpolate;\n  };\n\n  scale.unknown = function(_) {\n    return arguments.length ? (unknown = _, scale) : unknown;\n  };\n\n  return function(t, u) {\n    transform = t, untransform = u;\n    return rescale();\n  };\n}\n\nexport default function continuous(transform, untransform) {\n  return transformer()(transform, untransform);\n}\n","export default function(x) {\n  return function() {\n    return x;\n  };\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n  if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n  var match;\n  return new FormatSpecifier({\n    fill: match[1],\n    align: match[2],\n    sign: match[3],\n    symbol: match[4],\n    zero: match[5],\n    width: match[6],\n    comma: match[7],\n    precision: match[8] && match[8].slice(1),\n    trim: match[9],\n    type: match[10]\n  });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n  this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n  this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n  this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n  this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n  this.zero = !!specifier.zero;\n  this.width = specifier.width === undefined ? undefined : +specifier.width;\n  this.comma = !!specifier.comma;\n  this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n  this.trim = !!specifier.trim;\n  this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n  return this.fill\n      + this.align\n      + this.sign\n      + this.symbol\n      + (this.zero ? \"0\" : \"\")\n      + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n      + (this.comma ? \",\" : \"\")\n      + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n      + (this.trim ? \"~\" : \"\")\n      + this.type;\n};\n","// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimal(1.23) returns [\"123\", 0].\nexport default function(x, p) {\n  if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n  var i, coefficient = x.slice(0, i);\n\n  // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n  // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n  return [\n    coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n    +x.slice(i + 1)\n  ];\n}\n","import formatDecimal from \"./formatDecimal.js\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n  var d = formatDecimal(x, p);\n  if (!d) return x + \"\";\n  var coefficient = d[0],\n      exponent = d[1],\n      i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n      n = coefficient.length;\n  return i === n ? coefficient\n      : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n      : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n      : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n  decimal: \".\",\n  thousands: \",\",\n  grouping: [3],\n  currency: [\"$\", \"\"],\n  minus: \"-\"\n});\n\nexport default function defaultLocale(definition) {\n  locale = formatLocale(definition);\n  format = locale.format;\n  formatPrefix = locale.formatPrefix;\n  return locale;\n}\n","import formatDecimal from \"./formatDecimal.js\";\n\nexport default function(x) {\n  return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;\n}\n","import formatDecimal from \"./formatDecimal.js\";\n\nexport default function(x, p) {\n  var d = formatDecimal(x, p);\n  if (!d) return x + \"\";\n  var coefficient = d[0],\n      exponent = d[1];\n  return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n      : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n      : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\n\nexport default {\n  \"%\": function(x, p) { return (x * 100).toFixed(p); },\n  \"b\": function(x) { return Math.round(x).toString(2); },\n  \"c\": function(x) { return x + \"\"; },\n  \"d\": function(x) { return Math.round(x).toString(10); },\n  \"e\": function(x, p) { return x.toExponential(p); },\n  \"f\": function(x, p) { return x.toFixed(p); },\n  \"g\": function(x, p) { return x.toPrecision(p); },\n  \"o\": function(x) { return Math.round(x).toString(8); },\n  \"p\": function(x, p) { return formatRounded(x * 100, p); },\n  \"r\": formatRounded,\n  \"s\": formatPrefixAuto,\n  \"X\": function(x) { return Math.round(x).toString(16).toUpperCase(); },\n  \"x\": function(x) { return Math.round(x).toString(16); }\n};\n","export default function(x) {\n  return x;\n}\n","import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport {prefixExponent} from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\n\nvar map = Array.prototype.map,\n    prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n  var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n      currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n      currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n      decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n      numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n      percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n      minus = locale.minus === undefined ? \"-\" : locale.minus + \"\",\n      nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n  function newFormat(specifier) {\n    specifier = formatSpecifier(specifier);\n\n    var fill = specifier.fill,\n        align = specifier.align,\n        sign = specifier.sign,\n        symbol = specifier.symbol,\n        zero = specifier.zero,\n        width = specifier.width,\n        comma = specifier.comma,\n        precision = specifier.precision,\n        trim = specifier.trim,\n        type = specifier.type;\n\n    // The \"n\" type is an alias for \",g\".\n    if (type === \"n\") comma = true, type = \"g\";\n\n    // The \"\" type, and any invalid type, is an alias for \".12~g\".\n    else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n    // If zero fill is specified, padding goes after sign and before digits.\n    if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n    // Compute the prefix and suffix.\n    // For SI-prefix, the suffix is lazily computed.\n    var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n        suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n\n    // What format function should we use?\n    // Is this an integer type?\n    // Can this type generate exponential notation?\n    var formatType = formatTypes[type],\n        maybeSuffix = /[defgprs%]/.test(type);\n\n    // Set the default precision if not specified,\n    // or clamp the specified precision to the supported range.\n    // For significant precision, it must be in [1, 21].\n    // For fixed precision, it must be in [0, 20].\n    precision = precision === undefined ? 6\n        : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n        : Math.max(0, Math.min(20, precision));\n\n    function format(value) {\n      var valuePrefix = prefix,\n          valueSuffix = suffix,\n          i, n, c;\n\n      if (type === \"c\") {\n        valueSuffix = formatType(value) + valueSuffix;\n        value = \"\";\n      } else {\n        value = +value;\n\n        // Perform the initial formatting.\n        var valueNegative = value < 0;\n        value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n        // Trim insignificant zeros.\n        if (trim) value = formatTrim(value);\n\n        // If a negative value rounds to zero during formatting, treat as positive.\n        if (valueNegative && +value === 0) valueNegative = false;\n\n        // Compute the prefix and suffix.\n        valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n\n        valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n        // Break the formatted value into the integer “value” part that can be\n        // grouped, and fractional or exponential “suffix” part that is not.\n        if (maybeSuffix) {\n          i = -1, n = value.length;\n          while (++i < n) {\n            if (c = value.charCodeAt(i), 48 > c || c > 57) {\n              valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n              value = value.slice(0, i);\n              break;\n            }\n          }\n        }\n      }\n\n      // If the fill character is not \"0\", grouping is applied before padding.\n      if (comma && !zero) value = group(value, Infinity);\n\n      // Compute the padding.\n      var length = valuePrefix.length + value.length + valueSuffix.length,\n          padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n      // If the fill character is \"0\", grouping is applied after padding.\n      if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n      // Reconstruct the final output based on the desired alignment.\n      switch (align) {\n        case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n        case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n        case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n        default: value = padding + valuePrefix + value + valueSuffix; break;\n      }\n\n      return numerals(value);\n    }\n\n    format.toString = function() {\n      return specifier + \"\";\n    };\n\n    return format;\n  }\n\n  function formatPrefix(specifier, value) {\n    var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n        e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n        k = Math.pow(10, -e),\n        prefix = prefixes[8 + e / 3];\n    return function(value) {\n      return f(k * value) + prefix;\n    };\n  }\n\n  return {\n    format: newFormat,\n    formatPrefix: formatPrefix\n  };\n}\n","export default function(grouping, thousands) {\n  return function(value, width) {\n    var i = value.length,\n        t = [],\n        j = 0,\n        g = grouping[0],\n        length = 0;\n\n    while (i > 0 && g > 0) {\n      if (length + g + 1 > width) g = Math.max(1, width - length);\n      t.push(value.substring(i -= g, i + g));\n      if ((length += g + 1) > width) break;\n      g = grouping[j = (j + 1) % grouping.length];\n    }\n\n    return t.reverse().join(thousands);\n  };\n}\n","export default function(numerals) {\n  return function(value) {\n    return value.replace(/[0-9]/g, function(i) {\n      return numerals[+i];\n    });\n  };\n}\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n  out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n    switch (s[i]) {\n      case \".\": i0 = i1 = i; break;\n      case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n      default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n    }\n  }\n  return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, max) {\n  step = Math.abs(step), max = Math.abs(max) - step;\n  return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function(start, stop, count, specifier) {\n  var step = tickStep(start, stop, count),\n      precision;\n  specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n  switch (specifier.type) {\n    case \"s\": {\n      var value = Math.max(Math.abs(start), Math.abs(stop));\n      if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n      return formatPrefix(specifier, value);\n    }\n    case \"\":\n    case \"e\":\n    case \"g\":\n    case \"p\":\n    case \"r\": {\n      if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n      break;\n    }\n    case \"f\":\n    case \"%\": {\n      if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n      break;\n    }\n  }\n  return format(specifier);\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, value) {\n  return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step) {\n  return Math.max(0, -exponent(Math.abs(step)));\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport continuous, {copy, identity} from \"./continuous\";\nimport {initRange} from \"./init\";\nimport tickFormat from \"./tickFormat\";\n\nexport function linearish(scale) {\n  var domain = scale.domain;\n\n  scale.ticks = function(count) {\n    var d = domain();\n    return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n  };\n\n  scale.tickFormat = function(count, specifier) {\n    var d = domain();\n    return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n  };\n\n  scale.nice = function(count) {\n    if (count == null) count = 10;\n\n    var d = domain(),\n        i0 = 0,\n        i1 = d.length - 1,\n        start = d[i0],\n        stop = d[i1],\n        step;\n\n    if (stop < start) {\n      step = start, start = stop, stop = step;\n      step = i0, i0 = i1, i1 = step;\n    }\n\n    step = tickIncrement(start, stop, count);\n\n    if (step > 0) {\n      start = Math.floor(start / step) * step;\n      stop = Math.ceil(stop / step) * step;\n      step = tickIncrement(start, stop, count);\n    } else if (step < 0) {\n      start = Math.ceil(start * step) / step;\n      stop = Math.floor(stop * step) / step;\n      step = tickIncrement(start, stop, count);\n    }\n\n    if (step > 0) {\n      d[i0] = Math.floor(start / step) * step;\n      d[i1] = Math.ceil(stop / step) * step;\n      domain(d);\n    } else if (step < 0) {\n      d[i0] = Math.ceil(start * step) / step;\n      d[i1] = Math.floor(stop * step) / step;\n      domain(d);\n    }\n\n    return scale;\n  };\n\n  return scale;\n}\n\nexport default function linear() {\n  var scale = continuous(identity, identity);\n\n  scale.copy = function() {\n    return copy(scale, linear());\n  };\n\n  initRange.apply(scale, arguments);\n\n  return linearish(scale);\n}\n","var t0 = new Date,\n    t1 = new Date;\n\nexport default function newInterval(floori, offseti, count, field) {\n\n  function interval(date) {\n    return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n  }\n\n  interval.floor = function(date) {\n    return floori(date = new Date(+date)), date;\n  };\n\n  interval.ceil = function(date) {\n    return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n  };\n\n  interval.round = function(date) {\n    var d0 = interval(date),\n        d1 = interval.ceil(date);\n    return date - d0 < d1 - date ? d0 : d1;\n  };\n\n  interval.offset = function(date, step) {\n    return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n  };\n\n  interval.range = function(start, stop, step) {\n    var range = [], previous;\n    start = interval.ceil(start);\n    step = step == null ? 1 : Math.floor(step);\n    if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n    do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n    while (previous < start && start < stop);\n    return range;\n  };\n\n  interval.filter = function(test) {\n    return newInterval(function(date) {\n      if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n    }, function(date, step) {\n      if (date >= date) {\n        if (step < 0) while (++step <= 0) {\n          while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n        } else while (--step >= 0) {\n          while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n        }\n      }\n    });\n  };\n\n  if (count) {\n    interval.count = function(start, end) {\n      t0.setTime(+start), t1.setTime(+end);\n      floori(t0), floori(t1);\n      return Math.floor(count(t0, t1));\n    };\n\n    interval.every = function(step) {\n      step = Math.floor(step);\n      return !isFinite(step) || !(step > 0) ? null\n          : !(step > 1) ? interval\n          : interval.filter(field\n              ? function(d) { return field(d) % step === 0; }\n              : function(d) { return interval.count(0, d) % step === 0; });\n    };\n  }\n\n  return interval;\n}\n","import interval from \"./interval.js\";\n\nvar year = interval(function(date) {\n  date.setMonth(0, 1);\n  date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setFullYear(date.getFullYear() + step);\n}, function(start, end) {\n  return end.getFullYear() - start.getFullYear();\n}, function(date) {\n  return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\nyear.every = function(k) {\n  return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n    date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n    date.setMonth(0, 1);\n    date.setHours(0, 0, 0, 0);\n  }, function(date, step) {\n    date.setFullYear(date.getFullYear() + step * k);\n  });\n};\n\nexport default year;\nexport var years = year.range;\n","import interval from \"./interval.js\";\n\nvar month = interval(function(date) {\n  date.setDate(1);\n  date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setMonth(date.getMonth() + step);\n}, function(start, end) {\n  return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, function(date) {\n  return date.getMonth();\n});\n\nexport default month;\nexport var months = month.range;\n","import interval from \"./interval.js\";\nimport {durationMinute, durationWeek} from \"./duration.js\";\n\nfunction weekday(i) {\n  return interval(function(date) {\n    date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n    date.setHours(0, 0, 0, 0);\n  }, function(date, step) {\n    date.setDate(date.getDate() + step * 7);\n  }, function(start, end) {\n    return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n  });\n}\n\nexport var sunday = weekday(0);\nexport var monday = weekday(1);\nexport var tuesday = weekday(2);\nexport var wednesday = weekday(3);\nexport var thursday = weekday(4);\nexport var friday = weekday(5);\nexport var saturday = weekday(6);\n\nexport var sundays = sunday.range;\nexport var mondays = monday.range;\nexport var tuesdays = tuesday.range;\nexport var wednesdays = wednesday.range;\nexport var thursdays = thursday.range;\nexport var fridays = friday.range;\nexport var saturdays = saturday.range;\n","export var durationSecond = 1e3;\nexport var durationMinute = 6e4;\nexport var durationHour = 36e5;\nexport var durationDay = 864e5;\nexport var durationWeek = 6048e5;\n","import interval from \"./interval.js\";\nimport {durationDay, durationMinute} from \"./duration.js\";\n\nvar day = interval(function(date) {\n  date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setDate(date.getDate() + step);\n}, function(start, end) {\n  return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;\n}, function(date) {\n  return date.getDate() - 1;\n});\n\nexport default day;\nexport var days = day.range;\n","import interval from \"./interval.js\";\nimport {durationHour, durationMinute, durationSecond} from \"./duration.js\";\n\nvar hour = interval(function(date) {\n  date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\n}, function(date, step) {\n  date.setTime(+date + step * durationHour);\n}, function(start, end) {\n  return (end - start) / durationHour;\n}, function(date) {\n  return date.getHours();\n});\n\nexport default hour;\nexport var hours = hour.range;\n","import interval from \"./interval.js\";\nimport {durationMinute, durationSecond} from \"./duration.js\";\n\nvar minute = interval(function(date) {\n  date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\n}, function(date, step) {\n  date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n  return (end - start) / durationMinute;\n}, function(date) {\n  return date.getMinutes();\n});\n\nexport default minute;\nexport var minutes = minute.range;\n","import interval from \"./interval.js\";\nimport {durationSecond} from \"./duration.js\";\n\nvar second = interval(function(date) {\n  date.setTime(date - date.getMilliseconds());\n}, function(date, step) {\n  date.setTime(+date + step * durationSecond);\n}, function(start, end) {\n  return (end - start) / durationSecond;\n}, function(date) {\n  return date.getUTCSeconds();\n});\n\nexport default second;\nexport var seconds = second.range;\n","import interval from \"./interval.js\";\n\nvar millisecond = interval(function() {\n  // noop\n}, function(date, step) {\n  date.setTime(+date + step);\n}, function(start, end) {\n  return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = function(k) {\n  k = Math.floor(k);\n  if (!isFinite(k) || !(k > 0)) return null;\n  if (!(k > 1)) return millisecond;\n  return interval(function(date) {\n    date.setTime(Math.floor(date / k) * k);\n  }, function(date, step) {\n    date.setTime(+date + step * k);\n  }, function(start, end) {\n    return (end - start) / k;\n  });\n};\n\nexport default millisecond;\nexport var milliseconds = millisecond.range;\n","import interval from \"./interval.js\";\nimport {durationWeek} from \"./duration.js\";\n\nfunction utcWeekday(i) {\n  return interval(function(date) {\n    date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n    date.setUTCHours(0, 0, 0, 0);\n  }, function(date, step) {\n    date.setUTCDate(date.getUTCDate() + step * 7);\n  }, function(start, end) {\n    return (end - start) / durationWeek;\n  });\n}\n\nexport var utcSunday = utcWeekday(0);\nexport var utcMonday = utcWeekday(1);\nexport var utcTuesday = utcWeekday(2);\nexport var utcWednesday = utcWeekday(3);\nexport var utcThursday = utcWeekday(4);\nexport var utcFriday = utcWeekday(5);\nexport var utcSaturday = utcWeekday(6);\n\nexport var utcSundays = utcSunday.range;\nexport var utcMondays = utcMonday.range;\nexport var utcTuesdays = utcTuesday.range;\nexport var utcWednesdays = utcWednesday.range;\nexport var utcThursdays = utcThursday.range;\nexport var utcFridays = utcFriday.range;\nexport var utcSaturdays = utcSaturday.range;\n","import interval from \"./interval.js\";\nimport {durationDay} from \"./duration.js\";\n\nvar utcDay = interval(function(date) {\n  date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setUTCDate(date.getUTCDate() + step);\n}, function(start, end) {\n  return (end - start) / durationDay;\n}, function(date) {\n  return date.getUTCDate() - 1;\n});\n\nexport default utcDay;\nexport var utcDays = utcDay.range;\n","import interval from \"./interval.js\";\n\nvar utcYear = interval(function(date) {\n  date.setUTCMonth(0, 1);\n  date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setUTCFullYear(date.getUTCFullYear() + step);\n}, function(start, end) {\n  return end.getUTCFullYear() - start.getUTCFullYear();\n}, function(date) {\n  return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = function(k) {\n  return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n    date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n    date.setUTCMonth(0, 1);\n    date.setUTCHours(0, 0, 0, 0);\n  }, function(date, step) {\n    date.setUTCFullYear(date.getUTCFullYear() + step * k);\n  });\n};\n\nexport default utcYear;\nexport var utcYears = utcYear.range;\n","import {\n  timeDay,\n  timeSunday,\n  timeMonday,\n  timeThursday,\n  timeYear,\n  utcDay,\n  utcSunday,\n  utcMonday,\n  utcThursday,\n  utcYear\n} from \"d3-time\";\n\nfunction localDate(d) {\n  if (0 <= d.y && d.y < 100) {\n    var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n    date.setFullYear(d.y);\n    return date;\n  }\n  return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n  if (0 <= d.y && d.y < 100) {\n    var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n    date.setUTCFullYear(d.y);\n    return date;\n  }\n  return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newDate(y, m, d) {\n  return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0};\n}\n\nexport default function formatLocale(locale) {\n  var locale_dateTime = locale.dateTime,\n      locale_date = locale.date,\n      locale_time = locale.time,\n      locale_periods = locale.periods,\n      locale_weekdays = locale.days,\n      locale_shortWeekdays = locale.shortDays,\n      locale_months = locale.months,\n      locale_shortMonths = locale.shortMonths;\n\n  var periodRe = formatRe(locale_periods),\n      periodLookup = formatLookup(locale_periods),\n      weekdayRe = formatRe(locale_weekdays),\n      weekdayLookup = formatLookup(locale_weekdays),\n      shortWeekdayRe = formatRe(locale_shortWeekdays),\n      shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n      monthRe = formatRe(locale_months),\n      monthLookup = formatLookup(locale_months),\n      shortMonthRe = formatRe(locale_shortMonths),\n      shortMonthLookup = formatLookup(locale_shortMonths);\n\n  var formats = {\n    \"a\": formatShortWeekday,\n    \"A\": formatWeekday,\n    \"b\": formatShortMonth,\n    \"B\": formatMonth,\n    \"c\": null,\n    \"d\": formatDayOfMonth,\n    \"e\": formatDayOfMonth,\n    \"f\": formatMicroseconds,\n    \"H\": formatHour24,\n    \"I\": formatHour12,\n    \"j\": formatDayOfYear,\n    \"L\": formatMilliseconds,\n    \"m\": formatMonthNumber,\n    \"M\": formatMinutes,\n    \"p\": formatPeriod,\n    \"q\": formatQuarter,\n    \"Q\": formatUnixTimestamp,\n    \"s\": formatUnixTimestampSeconds,\n    \"S\": formatSeconds,\n    \"u\": formatWeekdayNumberMonday,\n    \"U\": formatWeekNumberSunday,\n    \"V\": formatWeekNumberISO,\n    \"w\": formatWeekdayNumberSunday,\n    \"W\": formatWeekNumberMonday,\n    \"x\": null,\n    \"X\": null,\n    \"y\": formatYear,\n    \"Y\": formatFullYear,\n    \"Z\": formatZone,\n    \"%\": formatLiteralPercent\n  };\n\n  var utcFormats = {\n    \"a\": formatUTCShortWeekday,\n    \"A\": formatUTCWeekday,\n    \"b\": formatUTCShortMonth,\n    \"B\": formatUTCMonth,\n    \"c\": null,\n    \"d\": formatUTCDayOfMonth,\n    \"e\": formatUTCDayOfMonth,\n    \"f\": formatUTCMicroseconds,\n    \"H\": formatUTCHour24,\n    \"I\": formatUTCHour12,\n    \"j\": formatUTCDayOfYear,\n    \"L\": formatUTCMilliseconds,\n    \"m\": formatUTCMonthNumber,\n    \"M\": formatUTCMinutes,\n    \"p\": formatUTCPeriod,\n    \"q\": formatUTCQuarter,\n    \"Q\": formatUnixTimestamp,\n    \"s\": formatUnixTimestampSeconds,\n    \"S\": formatUTCSeconds,\n    \"u\": formatUTCWeekdayNumberMonday,\n    \"U\": formatUTCWeekNumberSunday,\n    \"V\": formatUTCWeekNumberISO,\n    \"w\": formatUTCWeekdayNumberSunday,\n    \"W\": formatUTCWeekNumberMonday,\n    \"x\": null,\n    \"X\": null,\n    \"y\": formatUTCYear,\n    \"Y\": formatUTCFullYear,\n    \"Z\": formatUTCZone,\n    \"%\": formatLiteralPercent\n  };\n\n  var parses = {\n    \"a\": parseShortWeekday,\n    \"A\": parseWeekday,\n    \"b\": parseShortMonth,\n    \"B\": parseMonth,\n    \"c\": parseLocaleDateTime,\n    \"d\": parseDayOfMonth,\n    \"e\": parseDayOfMonth,\n    \"f\": parseMicroseconds,\n    \"H\": parseHour24,\n    \"I\": parseHour24,\n    \"j\": parseDayOfYear,\n    \"L\": parseMilliseconds,\n    \"m\": parseMonthNumber,\n    \"M\": parseMinutes,\n    \"p\": parsePeriod,\n    \"q\": parseQuarter,\n    \"Q\": parseUnixTimestamp,\n    \"s\": parseUnixTimestampSeconds,\n    \"S\": parseSeconds,\n    \"u\": parseWeekdayNumberMonday,\n    \"U\": parseWeekNumberSunday,\n    \"V\": parseWeekNumberISO,\n    \"w\": parseWeekdayNumberSunday,\n    \"W\": parseWeekNumberMonday,\n    \"x\": parseLocaleDate,\n    \"X\": parseLocaleTime,\n    \"y\": parseYear,\n    \"Y\": parseFullYear,\n    \"Z\": parseZone,\n    \"%\": parseLiteralPercent\n  };\n\n  // These recursive directive definitions must be deferred.\n  formats.x = newFormat(locale_date, formats);\n  formats.X = newFormat(locale_time, formats);\n  formats.c = newFormat(locale_dateTime, formats);\n  utcFormats.x = newFormat(locale_date, utcFormats);\n  utcFormats.X = newFormat(locale_time, utcFormats);\n  utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n  function newFormat(specifier, formats) {\n    return function(date) {\n      var string = [],\n          i = -1,\n          j = 0,\n          n = specifier.length,\n          c,\n          pad,\n          format;\n\n      if (!(date instanceof Date)) date = new Date(+date);\n\n      while (++i < n) {\n        if (specifier.charCodeAt(i) === 37) {\n          string.push(specifier.slice(j, i));\n          if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n          else pad = c === \"e\" ? \" \" : \"0\";\n          if (format = formats[c]) c = format(date, pad);\n          string.push(c);\n          j = i + 1;\n        }\n      }\n\n      string.push(specifier.slice(j, i));\n      return string.join(\"\");\n    };\n  }\n\n  function newParse(specifier, Z) {\n    return function(string) {\n      var d = newDate(1900, undefined, 1),\n          i = parseSpecifier(d, specifier, string += \"\", 0),\n          week, day;\n      if (i != string.length) return null;\n\n      // If a UNIX timestamp is specified, return it.\n      if (\"Q\" in d) return new Date(d.Q);\n      if (\"s\" in d) return new Date(d.s * 1000 + (\"L\" in d ? d.L : 0));\n\n      // If this is utcParse, never use the local timezone.\n      if (Z && !(\"Z\" in d)) d.Z = 0;\n\n      // The am-pm flag is 0 for AM, and 1 for PM.\n      if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n      // If the month was not specified, inherit from the quarter.\n      if (d.m === undefined) d.m = \"q\" in d ? d.q : 0;\n\n      // Convert day-of-week and week-of-year to day-of-year.\n      if (\"V\" in d) {\n        if (d.V < 1 || d.V > 53) return null;\n        if (!(\"w\" in d)) d.w = 1;\n        if (\"Z\" in d) {\n          week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n          week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n          week = utcDay.offset(week, (d.V - 1) * 7);\n          d.y = week.getUTCFullYear();\n          d.m = week.getUTCMonth();\n          d.d = week.getUTCDate() + (d.w + 6) % 7;\n        } else {\n          week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n          week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n          week = timeDay.offset(week, (d.V - 1) * 7);\n          d.y = week.getFullYear();\n          d.m = week.getMonth();\n          d.d = week.getDate() + (d.w + 6) % 7;\n        }\n      } else if (\"W\" in d || \"U\" in d) {\n        if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n        day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n        d.m = 0;\n        d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n      }\n\n      // If a time zone is specified, all fields are interpreted as UTC and then\n      // offset according to the specified time zone.\n      if (\"Z\" in d) {\n        d.H += d.Z / 100 | 0;\n        d.M += d.Z % 100;\n        return utcDate(d);\n      }\n\n      // Otherwise, all fields are in local time.\n      return localDate(d);\n    };\n  }\n\n  function parseSpecifier(d, specifier, string, j) {\n    var i = 0,\n        n = specifier.length,\n        m = string.length,\n        c,\n        parse;\n\n    while (i < n) {\n      if (j >= m) return -1;\n      c = specifier.charCodeAt(i++);\n      if (c === 37) {\n        c = specifier.charAt(i++);\n        parse = parses[c in pads ? specifier.charAt(i++) : c];\n        if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n      } else if (c != string.charCodeAt(j++)) {\n        return -1;\n      }\n    }\n\n    return j;\n  }\n\n  function parsePeriod(d, string, i) {\n    var n = periodRe.exec(string.slice(i));\n    return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseShortWeekday(d, string, i) {\n    var n = shortWeekdayRe.exec(string.slice(i));\n    return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseWeekday(d, string, i) {\n    var n = weekdayRe.exec(string.slice(i));\n    return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseShortMonth(d, string, i) {\n    var n = shortMonthRe.exec(string.slice(i));\n    return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseMonth(d, string, i) {\n    var n = monthRe.exec(string.slice(i));\n    return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseLocaleDateTime(d, string, i) {\n    return parseSpecifier(d, locale_dateTime, string, i);\n  }\n\n  function parseLocaleDate(d, string, i) {\n    return parseSpecifier(d, locale_date, string, i);\n  }\n\n  function parseLocaleTime(d, string, i) {\n    return parseSpecifier(d, locale_time, string, i);\n  }\n\n  function formatShortWeekday(d) {\n    return locale_shortWeekdays[d.getDay()];\n  }\n\n  function formatWeekday(d) {\n    return locale_weekdays[d.getDay()];\n  }\n\n  function formatShortMonth(d) {\n    return locale_shortMonths[d.getMonth()];\n  }\n\n  function formatMonth(d) {\n    return locale_months[d.getMonth()];\n  }\n\n  function formatPeriod(d) {\n    return locale_periods[+(d.getHours() >= 12)];\n  }\n\n  function formatQuarter(d) {\n    return 1 + ~~(d.getMonth() / 3);\n  }\n\n  function formatUTCShortWeekday(d) {\n    return locale_shortWeekdays[d.getUTCDay()];\n  }\n\n  function formatUTCWeekday(d) {\n    return locale_weekdays[d.getUTCDay()];\n  }\n\n  function formatUTCShortMonth(d) {\n    return locale_shortMonths[d.getUTCMonth()];\n  }\n\n  function formatUTCMonth(d) {\n    return locale_months[d.getUTCMonth()];\n  }\n\n  function formatUTCPeriod(d) {\n    return locale_periods[+(d.getUTCHours() >= 12)];\n  }\n\n  function formatUTCQuarter(d) {\n    return 1 + ~~(d.getUTCMonth() / 3);\n  }\n\n  return {\n    format: function(specifier) {\n      var f = newFormat(specifier += \"\", formats);\n      f.toString = function() { return specifier; };\n      return f;\n    },\n    parse: function(specifier) {\n      var p = newParse(specifier += \"\", false);\n      p.toString = function() { return specifier; };\n      return p;\n    },\n    utcFormat: function(specifier) {\n      var f = newFormat(specifier += \"\", utcFormats);\n      f.toString = function() { return specifier; };\n      return f;\n    },\n    utcParse: function(specifier) {\n      var p = newParse(specifier += \"\", true);\n      p.toString = function() { return specifier; };\n      return p;\n    }\n  };\n}\n\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\n    numberRe = /^\\s*\\d+/, // note: ignores next directive\n    percentRe = /^%/,\n    requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n  var sign = value < 0 ? \"-\" : \"\",\n      string = (sign ? -value : value) + \"\",\n      length = string.length;\n  return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n  return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n  return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n  var map = {}, i = -1, n = names.length;\n  while (++i < n) map[names[i].toLowerCase()] = i;\n  return map;\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 1));\n  return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 1));\n  return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 4));\n  return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n  var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n  return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseQuarter(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 1));\n  return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 3));\n  return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 3));\n  return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 6));\n  return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n  var n = percentRe.exec(string.slice(i, i + 1));\n  return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n  var n = numberRe.exec(string.slice(i));\n  return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i));\n  return n ? (d.s = +n[0], i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n  return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n  return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n  return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n  return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n  return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n  return formatMilliseconds(d, p) + \"000\";\n}\n\nfunction formatMonthNumber(d, p) {\n  return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n  return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n  return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n  var day = d.getDay();\n  return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n  return pad(timeSunday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction formatWeekNumberISO(d, p) {\n  var day = d.getDay();\n  d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n  return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n  return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n  return pad(timeMonday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction formatYear(d, p) {\n  return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n  return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n  var z = d.getTimezoneOffset();\n  return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n      + pad(z / 60 | 0, \"0\", 2)\n      + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n  return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n  return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n  return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n  return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n  return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n  return formatUTCMilliseconds(d, p) + \"000\";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n  return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n  return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n  return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n  var dow = d.getUTCDay();\n  return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n  return pad(utcSunday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n  var day = d.getUTCDay();\n  d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n  return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n  return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n  return pad(utcMonday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n  return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n  return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n  return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n  return \"%\";\n}\n\nfunction formatUnixTimestamp(d) {\n  return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n  return Math.floor(+d / 1000);\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var timeFormat;\nexport var timeParse;\nexport var utcFormat;\nexport var utcParse;\n\ndefaultLocale({\n  dateTime: \"%x, %X\",\n  date: \"%-m/%-d/%Y\",\n  time: \"%-I:%M:%S %p\",\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\nexport default function defaultLocale(definition) {\n  locale = formatLocale(definition);\n  timeFormat = locale.format;\n  timeParse = locale.parse;\n  utcFormat = locale.utcFormat;\n  utcParse = locale.utcParse;\n  return locale;\n}\n","import {bisector, tickStep} from \"d3-array\";\nimport {timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond} from \"d3-time\";\nimport {timeFormat} from \"d3-time-format\";\nimport {map} from \"./array\";\nimport continuous, {copy, identity} from \"./continuous\";\nimport {initRange} from \"./init\";\nimport nice from \"./nice\";\n\nvar durationSecond = 1000,\n    durationMinute = durationSecond * 60,\n    durationHour = durationMinute * 60,\n    durationDay = durationHour * 24,\n    durationWeek = durationDay * 7,\n    durationMonth = durationDay * 30,\n    durationYear = durationDay * 365;\n\nfunction date(t) {\n  return new Date(t);\n}\n\nfunction number(t) {\n  return t instanceof Date ? +t : +new Date(+t);\n}\n\nexport function calendar(year, month, week, day, hour, minute, second, millisecond, format) {\n  var scale = continuous(identity, identity),\n      invert = scale.invert,\n      domain = scale.domain;\n\n  var formatMillisecond = format(\".%L\"),\n      formatSecond = format(\":%S\"),\n      formatMinute = format(\"%I:%M\"),\n      formatHour = format(\"%I %p\"),\n      formatDay = format(\"%a %d\"),\n      formatWeek = format(\"%b %d\"),\n      formatMonth = format(\"%B\"),\n      formatYear = format(\"%Y\");\n\n  var tickIntervals = [\n    [second,  1,      durationSecond],\n    [second,  5,  5 * durationSecond],\n    [second, 15, 15 * durationSecond],\n    [second, 30, 30 * durationSecond],\n    [minute,  1,      durationMinute],\n    [minute,  5,  5 * durationMinute],\n    [minute, 15, 15 * durationMinute],\n    [minute, 30, 30 * durationMinute],\n    [  hour,  1,      durationHour  ],\n    [  hour,  3,  3 * durationHour  ],\n    [  hour,  6,  6 * durationHour  ],\n    [  hour, 12, 12 * durationHour  ],\n    [   day,  1,      durationDay   ],\n    [   day,  2,  2 * durationDay   ],\n    [  week,  1,      durationWeek  ],\n    [ month,  1,      durationMonth ],\n    [ month,  3,  3 * durationMonth ],\n    [  year,  1,      durationYear  ]\n  ];\n\n  function tickFormat(date) {\n    return (second(date) < date ? formatMillisecond\n        : minute(date) < date ? formatSecond\n        : hour(date) < date ? formatMinute\n        : day(date) < date ? formatHour\n        : month(date) < date ? (week(date) < date ? formatDay : formatWeek)\n        : year(date) < date ? formatMonth\n        : formatYear)(date);\n  }\n\n  function tickInterval(interval, start, stop, step) {\n    if (interval == null) interval = 10;\n\n    // If a desired tick count is specified, pick a reasonable tick interval\n    // based on the extent of the domain and a rough estimate of tick size.\n    // Otherwise, assume interval is already a time interval and use it.\n    if (typeof interval === \"number\") {\n      var target = Math.abs(stop - start) / interval,\n          i = bisector(function(i) { return i[2]; }).right(tickIntervals, target);\n      if (i === tickIntervals.length) {\n        step = tickStep(start / durationYear, stop / durationYear, interval);\n        interval = year;\n      } else if (i) {\n        i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n        step = i[1];\n        interval = i[0];\n      } else {\n        step = Math.max(tickStep(start, stop, interval), 1);\n        interval = millisecond;\n      }\n    }\n\n    return step == null ? interval : interval.every(step);\n  }\n\n  scale.invert = function(y) {\n    return new Date(invert(y));\n  };\n\n  scale.domain = function(_) {\n    return arguments.length ? domain(map.call(_, number)) : domain().map(date);\n  };\n\n  scale.ticks = function(interval, step) {\n    var d = domain(),\n        t0 = d[0],\n        t1 = d[d.length - 1],\n        r = t1 < t0,\n        t;\n    if (r) t = t0, t0 = t1, t1 = t;\n    t = tickInterval(interval, t0, t1, step);\n    t = t ? t.range(t0, t1 + 1) : []; // inclusive stop\n    return r ? t.reverse() : t;\n  };\n\n  scale.tickFormat = function(count, specifier) {\n    return specifier == null ? tickFormat : format(specifier);\n  };\n\n  scale.nice = function(interval, step) {\n    var d = domain();\n    return (interval = tickInterval(interval, d[0], d[d.length - 1], step))\n        ? domain(nice(d, interval))\n        : scale;\n  };\n\n  scale.copy = function() {\n    return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));\n  };\n\n  return scale;\n}\n\nexport default function() {\n  return initRange.apply(calendar(timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments);\n}\n","import interval from \"./interval.js\";\n\nvar utcMonth = interval(function(date) {\n  date.setUTCDate(1);\n  date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setUTCMonth(date.getUTCMonth() + step);\n}, function(start, end) {\n  return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, function(date) {\n  return date.getUTCMonth();\n});\n\nexport default utcMonth;\nexport var utcMonths = utcMonth.range;\n","import interval from \"./interval.js\";\nimport {durationHour} from \"./duration.js\";\n\nvar utcHour = interval(function(date) {\n  date.setUTCMinutes(0, 0, 0);\n}, function(date, step) {\n  date.setTime(+date + step * durationHour);\n}, function(start, end) {\n  return (end - start) / durationHour;\n}, function(date) {\n  return date.getUTCHours();\n});\n\nexport default utcHour;\nexport var utcHours = utcHour.range;\n","import interval from \"./interval.js\";\nimport {durationMinute} from \"./duration.js\";\n\nvar utcMinute = interval(function(date) {\n  date.setUTCSeconds(0, 0);\n}, function(date, step) {\n  date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n  return (end - start) / durationMinute;\n}, function(date) {\n  return date.getUTCMinutes();\n});\n\nexport default utcMinute;\nexport var utcMinutes = utcMinute.range;\n","export {\n  default as scaleBand,\n  point as scalePoint\n} from \"./band\";\n\nexport {\n  default as scaleIdentity\n} from \"./identity\";\n\nexport {\n  default as scaleLinear\n} from \"./linear\";\n\nexport {\n  default as scaleLog\n} from \"./log\";\n\nexport {\n  default as scaleSymlog\n} from \"./symlog\";\n\nexport {\n  default as scaleOrdinal,\n  implicit as scaleImplicit\n} from \"./ordinal\";\n\nexport {\n  default as scalePow,\n  sqrt as scaleSqrt\n} from \"./pow\";\n\nexport {\n  default as scaleQuantile\n} from \"./quantile\";\n\nexport {\n  default as scaleQuantize\n} from \"./quantize\";\n\nexport {\n  default as scaleThreshold\n} from \"./threshold\";\n\nexport {\n  default as scaleTime\n} from \"./time\";\n\nexport {\n  default as scaleUtc\n} from \"./utcTime\";\n\nexport {\n  default as scaleSequential,\n  sequentialLog as scaleSequentialLog,\n  sequentialPow as scaleSequentialPow,\n  sequentialSqrt as scaleSequentialSqrt,\n  sequentialSymlog as scaleSequentialSymlog\n} from \"./sequential\";\n\nexport {\n  default as scaleSequentialQuantile\n} from \"./sequentialQuantile\";\n\nexport {\n  default as scaleDiverging,\n  divergingLog as scaleDivergingLog,\n  divergingPow as scaleDivergingPow,\n  divergingSqrt as scaleDivergingSqrt,\n  divergingSymlog as scaleDivergingSymlog\n} from \"./diverging\";\n\nexport {\n  default as tickFormat\n} from \"./tickFormat\";\n"],"sourceRoot":""}