{"version":3,"sources":["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:///./app/scripts/colors.ts","webpack:///./app/scripts/components/BalancePower.js","webpack:///./app/scripts/components/OtherCandidate.js","webpack:///./app/scripts/utils/competitive.ts","webpack:///./app/scripts/components/Contest.tsx","webpack:///./app/scripts/components/AnimatedNumber.tsx","webpack:///./app/scripts/components/TinyMap.tsx","webpack:///./app/scripts/utils/tooltip-html.ts","webpack:///./node_modules/d3-jetpack/src/translate-selection.js","webpack:///./node_modules/d3-jetpack/src/parseAttributes.js","webpack:///./node_modules/d3-jetpack/src/insert.js","webpack:///./node_modules/d3-jetpack/src/at.js","webpack:///./node_modules/d3-jetpack/src/st.js","webpack:///./node_modules/d3-jetpack/src/wordwrap.js","webpack:///./node_modules/d3-jetpack/node_modules/d3-array/src/sum.js","webpack:///./node_modules/d3-jetpack/index.js","webpack:///./node_modules/d3-jetpack/src/append.js","webpack:///./node_modules/d3-jetpack/src/parent.js","webpack:///./node_modules/d3-jetpack/src/selectAppend.js","webpack:///./node_modules/d3-jetpack/src/tspans.js","webpack:///./node_modules/d3-jetpack/src/appendMany.js","webpack:///./app/scripts/utils/format-numbers.js","webpack:///./app/scripts/components/MiniBarChart.js","webpack:///./app/scripts/components/AnalysisTableRow.tsx","webpack:///./app/scripts/components/AnalysisTable.tsx","webpack:///./app/scripts/components/FramesChild.js","webpack:///./app/scripts/components/HeadshotCandidateRow.tsx","webpack:///./app/scripts/components/AsyncComponent.js","webpack:///./app/scripts/vendor/flatqueue.js","webpack:///./app/scripts/vendor/flatbush.js","webpack:///./app/scripts/utils/prepare-topojson.ts","webpack:///./app/scripts/components/MapTypeButtons.tsx","webpack:///./app/scripts/utils/format-percent.ts","webpack:///./config/modern-polyfills.js","webpack:///./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack:///./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack:///./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack:///./app/scripts/components/PctChange.tsx","webpack:///./app/scripts/utils/winner-class.ts","webpack:///../../index.ts","webpack:///./app/scripts/endpoints.ts","webpack:///./app/scripts/utils/load-json-script.js","webpack:///./app/scripts/utils/sum-values.js","webpack:///./app/scripts/components/CandidateRow.tsx","webpack:///./app/scripts/components/VoteBar.tsx","webpack:///./app/scripts/constants.ts","webpack:///./app/scripts/EmbedApp.tsx","webpack:///./app/scripts/packs/embed.tsx","webpack:///./app/scripts/election-utils.ts","webpack:///./app/scripts/utils/get-json.js","webpack:///./app/scripts/utils/shallow-equal.ts","webpack:///./app/scripts/components/PureComponent.tsx","webpack:///../src/utils.mjs","webpack:///../src/constants.mjs","webpack:///../src/framer.mjs","webpack:///../src/frames.mjs","webpack:///./app/scripts/utils/find.ts","webpack:///./app/scripts/components/PartyPill.tsx"],"names":["x","transform","identity","x0","y0","kx","scale","ky","dx","translate","dy","input","i","j","n","length","output","Array","topology","o","objects","type","features","geometries","map","feature","id","bbox","properties","geometry","object","transformPoint","arcs","arc","points","pop","a","k","push","array","t","reverse","point","p","line","ring","polygon","coordinates","GOVERNOR","name","color","lean_color","rgbaColor","SENATE","SHOWCASE_COLORS","Governor","REPUBLICAN","DEMOCRAT","NEUTRAL","TIE","UNKNOWN_SEAT","stroke","BalancePower","Component","constructor","super","this","state","width","bodyWidth","createGraphic","bind","redrawGraphic","getContainerWidth","componentDidMount","_this$props","props","className","pastData","currentData","window","addEventListener","componentDidUpdate","_this$props2","layoutSeats","total","minRows","arguments","undefined","defaultRows","rowOptions","evenRows","find","option","seats","d3","column","Math","floor","row","columns","rows","half","sideColumns","ceil","hasMiddleSeat","left","right","seat","middle","concat","fullRows","extra","forEach","height","drawSeats","selector","_ref","segments","labels","center","halfway","description","fullWidth","minSeat","layout","seatSize","max","_layout","marginTop","aboveSeats","labelRows","centerLine","labelsHeight","cell","min","chartRoom","getChartRoom","seatsRoom","size","optionCell","dotRadius","chartWidth","chartBottom","centerX","chartLeft","container","empty","majorityText","svg","append","attr","style","unknown","d","seatSegments","segment","middleIndex","findIndex","isLeft","indexOf","indexes","filter","sort","b","inColumn","some","open","selectAll","data","enter","text","labelTop","lines","anchor","_ref2","centerText","textWidth","node","getComputedTextLength","clearance","pastVacant","vacant","isSenate","getZeroUncontested","num","seatText","remove","republican","democrat","safeRepublican","uncontested_republican","republican_not_up_for_election","safeDemocrat","uncontested_democrat","democrat_not_up_for_election","short","leftLabels","rightLabels","safeName","currentOnly","body","document","getComputedStyle","minHeight","parseFloat","used","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","from","children","child","position","getBoundingClientRect","room","offsetWidth","_this$props3","_this$getContainerWid2","setState","componentWillUnmount","removeEventListener","render","_this$props4","chamber","h","class","chamberText","OtherCandidate","isViewable","candidateCount","embedType","onClick","classes","cx","xlinkHref","competitiveSlugs","isCompetitive","contest","Set","loadJsonScript","election_type","has","office_slug","PLAIN_SPECIAL_ELECTIONS","WINNER_BOX_CLASSES","rep","dem","lib","ind","gre","withCandidateKey","candidate","key","attributes","_objectSpread","COMPETITIVE_NOTE","competitive_note","block","value","join","Contest","viewAllCandidates","onViewableToggle","prevState","directory_slug","contestTitle","columnCount","isShowcaseRace","renderCandidate","annotations","notes","tableHeader","isHomepage","asOf","feedSource","source","candidatesRender","showRedrawn","converter","PreactHTMLConverter","shouldDisplayResult","contest_result","get_directory_slug","office","getDistrictNum","division_type","office_division","candidates","totalVotes","sumValues","candidacies","uncontested","sort_candidates_by_party","sort_candidates_by_votes","pct_votes","formatPercent","estimated_votes_mid","eevp","pct_votes_turnout","pct_votes_turnout_zero_winner","pct_votes_turnout_w_uncontested","text_conditionals","pct_votes_explain","text_conditional_winner_zero","ManualoverrideSource","showcaseClass","seat__races","seat__highlight_races","hasSpecialStyling","includes","raceClass","seatClass","klaxon","alert_winners","alert_conditionals","hasTurnoutmodel","winner","is_winner","winnerColorClass","winnerClass","party","winnerCheckClass","isUncontestedResult","boxWinner","showWinnerBox","winnerCustomColor","isArray","c","winnerBoxClass","slice","toLowerCase","contestMetricsClass","homepage__metrics","precinctsClass","IsAnnotations","IsNoted","target","href","title","rel","aria-hidden","isCanvass","intcomma","pollinglocationsreporting","total_pollinglocations","pollinglocations_reporting_percent","toFixed","convert","idx","visibleCandidatesCount","defaultProps","includeCountyRundown","Odometer","options","auto","AnimatedNumber","odometerFormat","odometerEl","createElement","el","appendChild","odometer","format","theme","duration","precision","formatDigits","digits","wholePart","split","digit","addDigit","getFractionalDigitCount","_len","values","_key","apply","keepTrailingZeros","shouldComponentUpdate","nextProps","update","srEl","textContent","ref","TinyMap","_defineProperty","createMap","redrawMap","findLeading","setUpCandidateMap","candidateMap","setUpCountyMap","counties","countyMap","fips","category","fillStyle","county","get","total_votes","sortedResults","entries","results","leader","second","leadingId","cand","geos","prepareTopoJSON","projection","reflectY","fitSize","collection","pathGenerator","g_tinymap","inCategory","foundCounty","countiesData","shaded","Number","fill","tooltipHTML","html","linkBase","replace","xy","dim","getBBox","call","parts","shift","tag","constantNull","camelCaseAttrs","test","addStyle","sel","wrapPx","addPx","match","fn","val","CHAR_W","A","B","C","D","E","e","F","f","G","g","H","I","J","K","L","l","M","m","N","O","P","Q","q","R","r","S","s","T","U","u","V","v","W","w","X","Y","y","Z","z","maxCharactersPerLine","minCharactersPerLine","monospace","w1","maxChars","minChars","maxLineW","minLineW","words","w2","lw","round","ww","valueof","sum","index","char_w","selection","prototype","translateSelection","transition","create","parseAttributes","creator","select","insert","before","insertBefore","parent","parents","parentNode","selectAppend","tspans","lh","appendMany","console","warn","temp","at","st","prop","property","customNumFormat","intword","MiniBarChart","breakPoint","onResize","resizeFrame","categoryNumbers","officeSlug","maxNum","_this$getContainerWid","_this$state","newcand","obj","last_name","category_votes","labelWidth","measureLabels","margin","top","bottom","showPrecinctsReporting","diagonalStripePattern","localeCompare","range","domain","isNaN","entry","padding","bandwidth","ticks","tickFormat","tickSize","wordwrap","nodes","foundCandidate","customBarNumFormat","axis","longest","grid","base","parentElement","closest","querySelector","gap","columnGap","tinyMap","firstElementChild","clientWidth","_this$getContainerWid3","requestAnimationFrame","cancelAnimationFrame","AnalysisTableRow","categoryClass","categoryLabel","geocategories","category_text","capfirst","categoryExplain","geocategories_explain","category_explain","categoryTooltip","geocategories_tooltip","category_tooltip","tooltipId","aria-label","aria-describedby","role","dangerouslySetInnerHTML","__html","AnalysisTable","result","arr","criteria","newObj","summedEntries","arrayByCategories","reduce","acc","currentValue","Object","item","totals","arrayToGetMost","votes_still_to_count","estimated_votes","largest_number","createArray","findCounties","findCounties2","APTotalVotesToCount","arrayCounties","keys","parseInt","objectCategories","arrayToGetLargest","context","categories_headline","regions_tooltip","categories","FramesChild","createRef","polling","initFrameAndPoll","sendFrameHeight","klass","formatVotes","formatPct","pctValue","votes","HeadshotCandidateRow","PureComponent","getColor","ballotName","contestIsCalled","candidateId","contestResult","isIncumbent","isWinner","totalVotesInContest","candidateColors","divStyle","checkStyle","IsAsterisk","rowClass","checkClass","PartyPill","VoteBar","PctChange","isCalled","Header","colSpan","asyncComponent","importComponent","PreactComponent","component","then","default","FlatQueue","ids","clear","pos","parentValue","halfLength","bestIndex","bestValue","rightValue","peek","peekValue","ARRAY_TYPES","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","Flatbush","ArrayBuffer","Error","_Uint8Array","_Uint8Array2","_slicedToArray","magic","versionAndType","_Uint16Array","nodeSize","_Uint32Array","numItems","ArrayType","numNodes","_levelBounds","IndexArrayType","arrayTypeIndex","nodesByteSize","BYTES_PER_ELEMENT","_boxes","_indices","_pos","minX","minY","maxX","maxY","Infinity","set","_queue","add","finish","hilbertValues","hilbert","boxes","indices","pivot","swap","end","nodeMinX","nodeMinY","nodeMaxX","nodeMaxY","nodeIndex","search","filterFn","level","queue","neighbors","maxResults","maxDistance","maxDistSquared","upperBound","axisDist","dist","i0","i1","roadsObject","placesObject","urbanAreasObject","roads","places","urban_areas","bounds","heightRatio","MAP_TYPES","label","MapTypeButtons","active","onSelect","require","_arrayLikeToArray","Symbol","iterator","next","done","toString","TypeError","PARTY_CLASSES","rounded","direction","changeCount","componentWillReceiveProps","prev","clearTimeout","timer","setTimeout","partyClass","PI","geom","feat","isNumber","lineString","isObject","HOMEPAGE_URL","STORY_API_URL","showBubbleMap","showCategoriesMap","RESULTS_IN_USE","elementId","element","getElementById","getAttribute","JSON","parse","CandidateRow","candidatesNum","candidateColor","isMapRow","countyHeader","coordEach","geojson","callback","excludeWrapCoord","stopG","coords","geometryMaybeCollection","isGeometryCollection","wrapShrink","coordIndex","isFeatureCollection","isFeature","stop","featureIndex","geomIndex","multiFeatureIndex","geometryIndex","geomType","index_default","recompute","coord","LENGTH_OF_CHECK_INTERVAL","LayeredMap","pastPowerBalance","analysisData","SENATE_RACE","slug","GOVERNOR_RACE","SWITCHER_SETS","RESULTS_PAGE_URL","BALANCE_TITLES","OFFICE_ANCHORS","Comptroller","MapSwitcher","updateResultsLink","link","race","races","setAttribute","renderMap","aria-selected","BalanceEmbed","pass","App","contests","mapTypes","geoIdentity","fetchData","getJSONWithLastModified","lastModified","lastUpdatedFormat","Date","startTimer","clearTimer","useButtonLink","_link$parentElement","items","buttonLink","hasMap","_ref3","classList","_this","_ref4","_loop","_ref6","findContests","specialSlug","matches","general","annotationType","renderTable","determineDistrictTitle","partyName","_ref7","is_called","is_incumbent","candidatesRenderFor","renderMapTable","showLastUpdated","_this$props5","determineContestTitle","_ref8","sizerContests","mapId","typeMap","other","typeRace","precinctsReporting","precincts_reporting","minLegendRows","most","renderCategories","renderSwitcher","sizerSlugs","raceSlug","Boolean","renderBalance","chamberContests","prepareBalanceData","total_current","_ref9","EMBED_TYPES","TYPE_ALIASES","region","params","URLSearchParams","location","EmbedApp","journalize","date","time","aptime","toUpperCase","toDateString","apdate","chunk","_","delay","ms","NaN","PARTY_SORT_ORDER","TT_directory_slugs","vote_pct","cand_num","label_conditionals","winner_conditionals","trim","division_number","determineContestTitleYourRaces","jsonResponse","res","ok","status","statusText","json","getJSON","init","fetch","header","headers","getTime","hOP","hasOwnProperty","is","shallowEqual","objA","objB","keysA","keysB","allowfullscreen","referrerpolicy","sandbox","src","documentElement","offsetHeight","postMessage","sentinel","setInterval","removeChild","iframe","contentWindow","predicate","excludeInitial","partyPrefix","partyInitial","memoize"],"mappings":"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","file":"embed.1142707f26.mjs","sourcesContent":["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","// This is where we set up the custom colors for the maps\n\nlet opacity = '0.4';\n\nconst GOVERNOR = [\n  {\n    name: 'Greg Abbott',\n    color: '#EF564A',\n    lean_color: '#F6A79D',\n    rgbaColor: 'rgba(239,86,74,' + opacity + ')',\n  },\n  {\n    name: \"Gina Hinojosa\",\n    color: '#1755c5',\n    lean_color: '#6DACD3',\n    rgbaColor: 'rgba(23,85,194,' + opacity + ')',\n  },\n  {\n    name: 'Pat Dixon',\n    color: '#be9304',\n    lean_color: '#edc74a',\n    rgbaColor: 'rgba(190, 147, 4,' + opacity + ')',\n  },\n];\n\nconst SENATE = [\n  {\n    name: 'Ken Paxton',\n    color: '#EF564A',\n    lean_color: '#F6A79D',\n    rgbaColor: 'rgba(239,86,74,' + opacity + ')',\n  },\n  {\n    name: 'James Talarico',\n    color: '#1755c5',\n    lean_color: '#6DACD3',\n    rgbaColor: 'rgba(23,85,194,' + opacity + ')',\n  },\n  {\n    name: 'Ted Brown',\n    color: '#be9304',\n    lean_color: '#edc74a',\n    rgbaColor: 'rgba(190, 147, 4,' + opacity + ')',\n  },\n];\n\nconst RAILROAD = [\n  {\n    name: 'Bo French',\n    color: '#EF564A',\n    lean_color: '#F6A79D',\n    rgbaColor: 'rgba(239,86,74,' + opacity + ')',\n  },\n  {\n    name: 'Jon Rosenthal',\n    color: '#1755c5',\n    lean_color: '#6DACD3',\n    rgbaColor: 'rgba(23,85,194,' + opacity + ')',\n  },\n  {\n    name: 'Arthur DiBianca',\n    color: '#be9304',\n    lean_color: '#edc74a',\n    rgbaColor: 'rgba(190, 147, 4,' + opacity + ')',\n  },\n];\n\nconst LIEUTENANT_GOVERNOR = [\n  {\n    name: 'Dan Patrick',\n    color: '#EF564A',\n    lean_color: '#F6A79D',\n    rgbaColor: 'rgba(239,86,74,' + opacity + ')',\n  },\n  {\n    name: 'Vikki Goodwin',\n    color: '#1755c5',\n    lean_color: '#6DACD3',\n    rgbaColor: 'rgba(23,85,194,' + opacity + ')',\n  },\n  {\n    name: 'Anthony Cristo',\n    color: '#be9304',\n    lean_color: '#edc74a',\n    rgbaColor: 'rgba(190, 147, 4,' + opacity + ')',\n  },\n  {\n    // Same green as the Green Party pill ($color-green)\n    name: 'Kevin McCormick',\n    color: '#4f7d5a',\n    lean_color: '#91ba9b',\n    rgbaColor: 'rgba(79, 125, 90,' + opacity + ')',\n  },\n];\n\n// Map colors for each showcase race, keyed by contest office\nconst SHOWCASE_COLORS: { [office: string]: typeof GOVERNOR } = {\n  Governor: GOVERNOR,\n  'U.S. Senate': SENATE,\n  'Texas Railroad Commission': RAILROAD,\n  'Lieutenant Governor': LIEUTENANT_GOVERNOR,\n};\n\nconst OTHER = '#888888';\n\nconst REPUBLICAN = '#EF564A'\nconst DEMOCRAT = '#1755c5'\nconst DEMOCRAT_LEAN = '#6DACD3'\nconst REPUBLICAN_LEAN = '#F6A79D';\n\nconst NEUTRAL = '#F2F2F2';\nconst TIE = '#8264B0';\n\nexport { GOVERNOR, SENATE, RAILROAD, SHOWCASE_COLORS, NEUTRAL, TIE, OTHER, REPUBLICAN, DEMOCRAT, DEMOCRAT_LEAN, REPUBLICAN_LEAN };","import * as d3 from 'd3';\nimport { Component, h } from 'preact';\n\nimport { DEMOCRAT, REPUBLICAN } from '../colors';\n\nconst VACANT = '#d9d9d9';\nconst UP_FOR_GRABS = '#bdbdbd';\nconst SAFE_REPUBLICAN = '#ab261b';\nconst SAFE_DEMOCRAT = '#113a85';\n// Drawn as an empty outline\nconst UNKNOWN_SEAT = { name: 'Unknown', color: '#fff', stroke: '#8c8c8c' };\nconst MIN_EMBED_SEAT = 22;\nconst MIN_EMBED_SEAT_NARROW = 28;\nconst NARROW_SCREEN = 480;\nconst MIN_EMBED_SEAT_LARGE_CHAMBER = 18;\nconst SMALL_SCREEN = 300;\n\nclass BalancePower extends Component {\n  constructor() {\n    super();\n\n    this.state = {\n      width: null,\n      bodyWidth: null,\n    };\n\n    this.createGraphic = this.createGraphic.bind(this);\n    this.redrawGraphic = this.redrawGraphic.bind(this);\n    this.getContainerWidth = this.getContainerWidth.bind(this);\n  }\n\n  // Draw once the containers from render() are in the page\n  componentDidMount() {\n    const { className, pastData, currentData } = this.props;\n\n    window.addEventListener('resize', this.redrawGraphic);\n    this.createGraphic(className, pastData, currentData);\n  }\n\n  componentDidUpdate() {\n    const { className, pastData, currentData } = this.props;\n\n    this.createGraphic(className, pastData, currentData);\n  }\n\n  layoutSeats(total, minRows = 0) {\n    const defaultRows = total >= 100 ? [5, 4, 6] : [3, 2, 4];\n    const rowOptions =\n      minRows > defaultRows[0] ? [minRows, minRows + 1] : defaultRows;\n    const evenRows = rowOptions.find(\n      option => option >= minRows && total % option == 0\n    );\n\n    if (evenRows) {\n      const seats = d3.range(total).map(i => ({\n        column: Math.floor(i / evenRows),\n        row: i % evenRows,\n      }));\n\n      return { seats, columns: total / evenRows, rows: evenRows };\n    }\n\n    \n    if (minRows <= defaultRows[0]) {\n      const rows = rowOptions[0];\n      const half = Math.floor(total / 2);\n      const sideColumns = Math.ceil(half / rows);\n      const hasMiddleSeat = total % 2 == 1;\n      const columns = sideColumns * 2 + (hasMiddleSeat ? 1 : 0);\n\n      const left = d3.range(half).map(i => ({\n        column: Math.floor(i / rows),\n        row: i % rows,\n      }));\n\n      const right = left\n        .map(seat => ({ column: columns - 1 - seat.column, row: seat.row }))\n        .reverse();\n\n      const middle = hasMiddleSeat\n        ? [{ column: sideColumns, row: Math.floor(rows / 2) }]\n        : [];\n\n      return { seats: left.concat(middle, right), columns, rows };\n    }\n\n\n    const columns = Math.ceil(total / rowOptions[0]);\n    const fullRows = Math.floor(total / columns);\n    const extra = total % columns;\n    const rows = fullRows + (extra ? 1 : 0);\n\n    const seats = [];\n    d3.range(columns).forEach(column => {\n      const height = fullRows + (column < extra ? 1 : 0);\n      d3.range(height).forEach(row => seats.push({ column, row }));\n    });\n\n    return { seats, columns, rows };\n  }\n\n  \n  drawSeats(selector, { width, total, segments, labels, center, halfway, description, fullWidth }) {\n    // Embeds wrap onto as many rows as they need to keep the dots big\n    let minSeat = MIN_EMBED_SEAT;\n    if (total >= 100) {\n      if (width <= SMALL_SCREEN) minSeat = MIN_EMBED_SEAT_LARGE_CHAMBER;\n    } else if (width <= NARROW_SCREEN) {\n      minSeat = MIN_EMBED_SEAT_NARROW;\n    }\n    const layout = seatSize => {\n      const minRows = fullWidth\n        ? Math.ceil(total / Math.max(1, Math.floor(width / seatSize)))\n        : 0;\n      return this.layoutSeats(total, minRows);\n    };\n    let { seats, columns, rows } = layout(minSeat);\n\n    // Room above the seats for the majority number and the label over the seats\n    const marginTop = halfway || (center && center.aboveSeats) ? 24 : 4;\n    const labelLineHeight = 20;\n    const labelRows = Math.max(labels.left.length, labels.right.length);\n    const centerLine = center && !center.aboveSeats ? center.line : 0;\n    const labelsHeight =\n      6 + Math.max(labelRows, centerLine + 1) * labelLineHeight;\n\n    // Embeds fill their container; on the results page the chart is capped\n    let cell = fullWidth\n      ? width / columns\n      : Math.min(width / columns, 500 / columns, 36);\n\n    // On small screens, use the biggest dots that keep the chart within the\n    // height of the tallest results table, even if it leaves the chart a\n    // little narrower than the embed\n    const chartRoom = fullWidth && width <= SMALL_SCREEN && this.getChartRoom();\n    if (chartRoom) {\n      const seatsRoom = chartRoom - marginTop - labelsHeight;\n      cell = Math.min(cell, seatsRoom / rows);\n      for (let size = Math.floor(width); size >= 1; size--) {\n        const option = layout(size);\n        const optionCell = Math.min(\n          width / option.columns,\n          seatsRoom / option.rows\n        );\n        if (optionCell > cell) {\n          ({ seats, columns, rows } = option);\n          cell = optionCell;\n        }\n      }\n    }\n    const dotRadius = cell * 0.42;\n    const chartWidth = cell * columns;\n    const chartBottom = marginTop + cell * rows;\n    const height = chartBottom + labelsHeight;\n    const centerX = width / 2;\n    const chartLeft = centerX - chartWidth / 2;\n\n    const container = d3.select(selector);\n    if (container.empty()) return;\n\n    const svg = container\n      .append('svg')\n      .attr('width', width)\n      .attr('height', height)\n      .attr('role', 'img')\n      .attr('aria-label', description)\n      // Inline, it'd add a line's descender below the room it was sized for\n      .style('display', chartRoom ? 'block' : null);\n\n    // If the counts fall short of the chamber, the seats nobody accounts for\n    // are left empty in the middle so both parties stay pinned to their edges\n    const unknown = Math.max(0, total - d3.sum(segments, d => d.seats));\n    const seatSegments = [];\n    segments.forEach(segment => {\n      for (let i = 0; i < segment.seats; i++) seatSegments.push(segment);\n      if (segment.middle) {\n        for (let i = 0; i < unknown; i++) seatSegments.push(UNKNOWN_SEAT);\n      }\n    });\n\n    // When the open seats are labeled from above, move them to the top of\n    // their column so the label sits right over them. Any seats from the\n    // left-hand party that share the column drop to the bottom of it. If\n    // both parties share the column, the open seats go between them instead,\n    // with the right-hand party on top.\n    if (center && center.aboveSeats) {\n      const middleIndex = segments.findIndex(segment => segment.middle);\n      const isLeft = segment => segments.indexOf(segment) < middleIndex;\n\n      d3.range(columns).forEach(column => {\n        const indexes = d3\n          .range(seatSegments.length)\n          .filter(i => seats[i] && seats[i].column == column)\n          .sort((a, b) => seats[a].row - seats[b].row);\n        const inColumn = indexes.map(i => seatSegments[i]);\n\n        if (!inColumn.some(segment => segment.middle)) return;\n\n        const open = inColumn.filter(segment => segment.middle);\n        const right = inColumn.filter(\n          segment => !segment.middle && !isLeft(segment)\n        );\n        const left = inColumn.filter(segment => isLeft(segment));\n\n        (left.length && right.length\n          ? right.concat(open, left)\n          : open.concat(right, left)\n        ).forEach((segment, i) => (seatSegments[indexes[i]] = segment));\n      });\n    }\n\n    svg\n      .append('g')\n      .selectAll('circle')\n      .data(seats.filter((seat, i) => seatSegments[i]))\n      .enter()\n      .append('circle')\n      .attr('class', 'balance-seat')\n      .attr('cx', d => chartLeft + cell * (d.column + 0.5))\n      .attr('cy', d => marginTop + cell * (d.row + 0.5))\n      .attr('r', dotRadius)\n      .attr('fill', (d, i) => seatSegments[i].color)\n      .attr('stroke', (d, i) => seatSegments[i].stroke || 'none')\n      .append('title')\n      .text((d, i) => seatSegments[i].name);\n\n    // Whichever party's seats cross the middle of the chart has the majority\n    let majorityText;\n\n    if (halfway) {\n      majorityText = svg\n        .append('text')\n        .attr('class', 'text-majority')\n        .attr('text-anchor', 'middle')\n        .attr('x', centerX)\n        .attr('y', 14)\n        .style('fill', '#000')\n        .text(halfway);\n\n      svg\n        .append('line')\n        .attr('class', 'annotation-line')\n        .attr('x1', centerX)\n        .attr('x2', centerX)\n        .attr('y1', 19)\n        .attr('y2', chartBottom + 2);\n    }\n\n    const labelTop = chartBottom + 6;\n\n    [\n      { lines: labels.left, x: chartLeft, anchor: 'start' },\n      { lines: labels.right, x: chartLeft + chartWidth, anchor: 'end' },\n    ].forEach(({ lines, x, anchor }) => {\n      svg\n        .append('g')\n        .selectAll('text')\n        .data(lines)\n        .enter()\n        .append('text')\n        .attr('class', (d, i) => (i == 0 ? 'bar-title' : 'bar-title-uncontested'))\n        .attr('text-anchor', anchor)\n        .attr('x', x)\n        .attr('y', (d, i) => labelTop + 15 + i * labelLineHeight)\n        .style('fill', d => d.color)\n        .text(d => d.text);\n    });\n\n    if (!center) return;\n\n    const centerText = svg\n      .append('text')\n      .attr('class', 'balance-center-label')\n      .attr('text-anchor', 'middle')\n      .attr('x', centerX)\n      .text(center.text);\n\n    // Centered on its own line under the party labels\n    if (!center.aboveSeats) {\n      centerText.attr('y', labelTop + 15 + center.line * labelLineHeight);\n      return;\n    }\n\n    // Above the chart, starting at the left edge of its seats\n    const textWidth = centerText.node().getComputedTextLength();\n\n    let x =\n      d3.min(\n        seats.filter((seat, i) => seatSegments[i] && seatSegments[i].middle),\n        d => chartLeft + cell * (d.column + 0.5)\n      ) - dotRadius;\n\n    // Keep it inside the chart and clear of the majority number\n    x = Math.max(chartLeft, Math.min(x, chartLeft + chartWidth - textWidth));\n\n    if (majorityText) {\n      const clearance = majorityText.node().getComputedTextLength() / 2 + 8;\n\n      if (x < centerX + clearance && x + textWidth > centerX - clearance) {\n        x =\n          x + textWidth / 2 < centerX\n            ? centerX - clearance - textWidth\n            : centerX + clearance;\n      }\n    }\n\n    centerText.attr('text-anchor', 'start').attr('x', x).attr('y', 14);\n  }\n\n  createGraphic(className, pastData, currentData) {\n    let { width } = this.getContainerWidth(className);\n\n    const pastVacant = pastData.vacant || 0;\n    const isSenate = className == 'texas-senate';\n    // The U.S. House chart is only the Texas delegation, so it has no majority\n    const halfway = className != 'us-house' ? currentData.halfway : null;\n\n    function getZeroUncontested(num) {\n      return num > 0 ? num : 'None';\n    }\n\n    function seatText(num) {\n      return `${num} seat${num == 1 ? '' : 's'}`;\n    }\n\n    d3.selectAll(`.${className}-graphic-previous svg`).remove();\n\n    d3.selectAll(`.${className}-graphic-current svg`).remove();\n\n    // Currently vacant seats sit between Republicans and Democrats\n    this.drawSeats(`.${className}-graphic-previous`, {\n      width,\n      total: pastData.total,\n      halfway,\n      segments: [\n        { name: 'Republican', seats: pastData.republican, color: REPUBLICAN },\n        { name: 'Vacant', seats: pastVacant, color: VACANT, middle: true },\n        { name: 'Democrat', seats: pastData.democrat, color: DEMOCRAT },\n      ],\n      labels: {\n        left: [{ text: `${pastData.republican} Republicans`, color: REPUBLICAN }],\n        right: [{ text: `${pastData.democrat} Democrats`, color: DEMOCRAT }],\n      },\n      center: pastVacant > 0 && {\n        text: `${pastVacant} vacant`,\n        aboveSeats: true,\n      },\n      description: `${pastData.republican} Republicans, ${pastData.democrat} Democrats and ${seatText(pastVacant)} vacant`,\n    });\n\n    // Seats that weren't in play (uncontested or not up for election) sit on\n    // the outside in a darker shade, with the undecided seats in the middle\n    const safeRepublican =\n      currentData.uncontested_republican +\n      pastData.republican_not_up_for_election;\n    const safeDemocrat =\n      currentData.uncontested_democrat + pastData.democrat_not_up_for_election;\n    const republican = currentData.republican + safeRepublican;\n    const democrat = currentData.democrat + safeDemocrat;\n\n    // Small embeds abbreviate the parties (\"X R\") so the labels fit\n    const short = this.props.fullWidth && width <= SMALL_SCREEN;\n\n    const leftLabels = [\n      { text: short ? `${republican} R` : `${republican} Republicans`, color: REPUBLICAN },\n      {\n        text: `${getZeroUncontested(currentData.uncontested_republican)} uncontested`,\n        color: SAFE_REPUBLICAN,\n      },\n    ];\n\n    const rightLabels = [\n      { text: short ? `${democrat} D` : `${democrat} Democrats`, color: DEMOCRAT },\n      {\n        text: `${getZeroUncontested(currentData.uncontested_democrat)} uncontested`,\n        color: SAFE_DEMOCRAT,\n      },\n    ];\n\n    if (isSenate) {\n      leftLabels.push({\n        text: `${pastData.republican_not_up_for_election} not up for election`,\n        color: SAFE_REPUBLICAN,\n      });\n      rightLabels.push({\n        text: `${pastData.democrat_not_up_for_election} not up for election`,\n        color: SAFE_DEMOCRAT,\n      });\n    }\n\n    const safeName = isSenate\n      ? 'uncontested or not up for election'\n      : 'uncontested';\n\n    this.drawSeats(`.${className}-graphic-current`, {\n      width,\n      fullWidth: this.props.fullWidth,\n      total: currentData.total,\n      halfway,\n      segments: [\n        { name: `Republican, ${safeName}`, seats: safeRepublican, color: SAFE_REPUBLICAN },\n        { name: 'Republican', seats: currentData.republican, color: REPUBLICAN },\n        { name: 'Up for grabs', seats: currentData.vacant, color: UP_FOR_GRABS, middle: true },\n        { name: 'Democrat', seats: currentData.democrat, color: DEMOCRAT },\n        { name: `Democrat, ${safeName}`, seats: safeDemocrat, color: SAFE_DEMOCRAT },\n      ],\n      labels: { left: leftLabels, right: rightLabels },\n      // On its own line so it can't run into the labels on either side. The\n      // embeds show it under the title instead.\n      center: !this.props.currentOnly && currentData.vacant > 0 && {\n        text: `${currentData.vacant} up for grabs`,\n        line: leftLabels.length,\n      },\n      description: `${republican} Republicans, ${democrat} Democrats and ${seatText(currentData.vacant)} still up for grabs`,\n    });\n  }\n\n  // Height the embed's min-height (the tallest results table, in\n  // _embed.scss) leaves for this chart, measured while the chart is removed\n  getChartRoom() {\n    const body = document.body;\n    const style = getComputedStyle(body);\n    const minHeight = parseFloat(style.minHeight);\n    if (!minHeight) return null;\n\n    let used =\n      parseFloat(style.paddingTop) +\n      parseFloat(style.paddingBottom) +\n      parseFloat(style.borderTopWidth) +\n      parseFloat(style.borderBottomWidth);\n    Array.from(body.children).forEach(child => {\n      if (getComputedStyle(child).position != 'absolute') {\n        used += child.getBoundingClientRect().height;\n      }\n    });\n\n    const room = minHeight - used;\n    return room > 0 ? room : null;\n  }\n\n  getContainerWidth(className) {\n    let base;\n\n    const body = d3.select('body');\n\n    base = d3.select(`.${className}-balance-graphic`);\n\n    const width = base.node().offsetWidth;\n    const bodyWidth = body.node().offsetWidth;\n\n    return { width, bodyWidth };\n  }\n\n  redrawGraphic() {\n    const { className, pastData, currentData } = this.props;\n\n    d3.selectAll(`.${className}-graphic-previous svg`).remove();\n    d3.selectAll(`.${className}-graphic-current svg`).remove();\n\n    let { width, bodyWidth } = this.getContainerWidth(className);\n\n    this.setState({ width: width, bodyWidth: bodyWidth });\n    this.createGraphic(className, pastData, currentData);\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('resize', this.redrawGraphic);\n  }\n\n  render() {\n    const { className, chamber, currentOnly, currentData } = this.props;\n\n    // Embeds show only the current breakdown, without the narrative text\n    if (currentOnly) {\n      return (\n        <div id=\"balance-graphics\">\n          {currentData.vacant > 0 && (\n            <p class=\"embed-balance__up-for-grabs\">\n              {`${currentData.vacant} up for grabs`}\n            </p>\n          )}\n          <div class={`${className}-graphic-current`}></div>\n        </div>\n      );\n    }\n\n    const chamberText =\n      chamber == 'U.S. House'\n        ? 'the Texas delegation in'\n        : 'the balance of power in';\n\n    return (\n      <div id=\"balance-graphics\">\n        <p class=\"t-copy copy--narrative\">\n          {`Going into the November election, ${chamberText} the ${chamber} was broken down like this: `}\n        </p>\n        <div class={`${className}-graphic-previous`}></div>\n        <p class=\"t-copy copy--narrative\">\n          {`Here how it'll look starting in January:`}\n        </p>\n        <div class={`${className}-graphic-current`}></div>\n      </div>\n    );\n  }\n}\n\nexport default BalancePower;\n","import cx from 'classnames';\nimport { h } from 'preact';\n\nfunction OtherCandidate({ isViewable, candidateCount, embedType, onClick }) {\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}>\n          Show All ({candidateCount}){' '}\n        </button>\n      </th>\n      <th class=\"candidate__cell candidate__votes\"></th>\n      <th class=\"candidate__cell candidate__pct\"></th>\n    </tr>\n  );\n}\n\nexport default OtherCandidate;","import loadJsonScript from './load-json-script';\n\n// Office slugs of the races the hotlist sheet rates competitive (\"hot\"), from\n// the `competitive_data` script in index.html (see competitiveSlugs in\n// project.config.js). Missing on pages that don't embed it, like embeds.\nlet competitiveSlugs: Set<string> | null = null;\n\nfunction isCompetitive(contest: { office_slug: string; election_type: string }) {\n  if (!competitiveSlugs) {\n    competitiveSlugs = new Set(loadJsonScript('competitive_data') || []);\n  }\n\n  // The hotlist rates the general election seats, not special elections\n  return (\n    contest.election_type !== 'special' &&\n    competitiveSlugs.has(contest.office_slug)\n  );\n}\n\nexport default isCompetitive;\n","import cx from 'classnames';\nimport { intcomma } from 'journalize';\nimport { Component, h } from 'preact';\n\nimport OtherCandidate from './OtherCandidate';\nimport { PreactHTMLConverter } from 'preact-html-converter';\n\n// internal\nimport {\n  sort_candidates_by_party,\n  sort_candidates_by_votes,\n  alert_conditionals,\n  alert_winners,\n  text_conditionals,\n  text_conditional_winner_zero,\n  get_directory_slug,\n  getDistrictNum\n} from '../election-utils';\nimport sumValues from '../utils/sum-values';\nimport formatPercent from '../utils/format-percent';\nimport winnerClass from '../utils/winner-class';\nimport isCompetitive from '../utils/competitive';\nimport text from 'Data/text.json';\n\nimport { isCanvass, visibleCandidatesCount } from '../endpoints';\n\nconst PLAIN_SPECIAL_ELECTIONS: string[] = [];\n\n// Spelled out in full so PurgeCSS (config/tasks/unused-css.js) keeps them.\n// Same party colors as the PartyPill circles.\nconst WINNER_BOX_CLASSES: { [prefix: string]: string } = {\n  rep: 'winner-box--rep',\n  dem: 'winner-box--dem',\n  lib: 'winner-box--lib',\n  ind: 'winner-box--ind',\n  gre: 'winner-box--gre',\n};\n\n\n\nfunction withCandidateKey(row: any, candidate: any) {\n  if (row && row.key == null && candidate.id != null) {\n    row.key = candidate.id;\n    row.attributes = { ...row.attributes, key: candidate.id };\n  }\n  return row;\n}\n\n// From the text doc's [+competitive_note]; may contain a link\nconst COMPETITIVE_NOTE = (text.competitive_note || [])\n  .map((block) => block.value)\n  .join(' ');\n\ntype Props = {\n  contest: { [key: string]: any };\n  columnCount: number;\n  contestTitle: string;\n  includeCountyRundown?: boolean;\n  isShowcaseRace?: boolean;\n  renderParty: any;\n  renderCandidate: any;\n  candidatesRender: any;\n  showRedrawn?: boolean;\n  embedType: string;\n  broadcastHeaderImage: string;\n  activeContestId: string;\n  tableHeader: JSX.Element;\n  annotations: { [key: string]: any };\n  notes: { [key: string]: any };\n  isHomepage?: boolean;\n  asOf: string;\n  source: string;\n};\n\nclass Contest extends Component<Props> {\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, \n    }));\n  }\n  render() {\n    const {\n      contest,\n      columnCount,\n      contestTitle,\n      isShowcaseRace,\n      renderCandidate,\n      annotations,\n      notes,\n      tableHeader,\n      isHomepage,\n      asOf,\n      source: feedSource,\n      embedType,\n      candidatesRender,\n      showRedrawn,\n    } = this.props;\n\n    \n    const source = feedSource || 'Associated Press';\n\n    const { viewAllCandidates } = this.state;\n\n    const converter = PreactHTMLConverter();\n\n    const shouldDisplayResult = contest.contest_result !== 'not called';\n\n    let directory_slug, district_num;\n\n    if (contest) {\n      directory_slug = get_directory_slug(contest.office);\n      district_num = getDistrictNum(contest.division_type, contest.office_division)\n    }\n\n    const totalVotes = sumValues(contest.candidacies, 'votes');\n\n    let candidates;\n\n    candidates =\n      totalVotes == 0\n        ? sort_candidates_by_party(contest.candidacies, 'table')\n        : sort_candidates_by_votes(contest.candidacies);\n\n    const uncontested = candidates.length == 1;\n\n    const pct_votes = source == 'Decision Desk HQ' ? formatPercent(\n      totalVotes,\n      contest.estimated_votes_mid\n    )  : contest.eevp\n\n    const pct_votes_turnout =\n      pct_votes < 100\n        ? `An estimated ${pct_votes}% of votes have been counted, according to the ${source}.`\n        : `An estimated >99% of votes have been counted, according to the ${source}.`;\n\n\n    const pct_votes_turnout_zero_winner = \n    pct_votes == 0 && shouldDisplayResult \n    ? ``\n    : pct_votes_turnout;\n\n    const pct_votes_turnout_w_uncontested =\n        (uncontested == true)\n           ? text_conditionals(pct_votes, contest.candidacies.length) :\n           pct_votes_turnout_zero_winner\n\n    const pct_votes_explain = !shouldDisplayResult && !uncontested\n      ? text_conditionals(pct_votes, contest.candidacies.length)\n      : text_conditional_winner_zero(pct_votes, contest.candidacies.length);\n\n    let firstShowcaseRace;\n\n    let embedTypeUsable = 'none';\n\n    if (typeof embedType !== 'undefined') {\n      embedTypeUsable = embedType;\n    }\n\n\n    const showcaseClass = cx({\n      seat__races: !isShowcaseRace,\n      seat__highlight_races: isShowcaseRace,\n    });\n\n\n    const hasSpecialStyling =\n      contest.election_type == 'special' &&\n      !PLAIN_SPECIAL_ELECTIONS.includes(contest.office_slug);\n\n    let raceClass = cx('seat__race', {\n      'special-election': hasSpecialStyling,\n      'general-seat-before-special': (contest.office_slug == 'us-house-district-18') || (contest.office_slug == 'texas-house-district-56'),\n    })\n\n    let seatClass = cx('seat',  {\n      'special-election__grid': hasSpecialStyling,\n    })\n\n    const klaxon_sos = 'Race has been declared'; // if we switch sources to TX SOS and someone else has declared the winner\n\n    const klaxon = shouldDisplayResult\n      ? source == 'Decision Desk HQ' || source == 'Associated Press'\n        ? alert_winners(contest.contest_result, contest.office)\n        : klaxon_sos\n      : alert_conditionals(pct_votes, contest.candidacies.length);\n\n    const checkmark = '\\u2713';\n\n    let hasTurnoutmodel = (source == 'Decision Desk HQ' || source == 'Associated Press')? true : false;\n\n    // Color the checkmark by the winner's party\n    const winner = candidates.find((candidate: any) => candidate.is_winner);\n    const winnerColorClass =\n      shouldDisplayResult && hasTurnoutmodel && winner\n        ? winnerClass(winner.party, contest.contest_result)\n        : '';\n    const winnerCheckClass = cx('check', winnerColorClass);\n\n    // Box above the table once the AP calls the race, in the winner's pill color.\n    // Uncontested races get it too, for their only candidate\n    const isUncontestedResult =\n      contest.contest_result == 'uncontested' && uncontested;\n    const boxWinner = isUncontestedResult ? candidates[0] : winner;\n    const showWinnerBox =\n      (contest.contest_result == 'winner' &&\n        source == 'Associated Press' &&\n        winner) ||\n      isUncontestedResult;\n    const winnerCustomColor =\n      showWinnerBox && Array.isArray(candidatesRender)\n        ? (candidatesRender.find((c: any) => c.name == boxWinner.name) || {}).color\n        : undefined;\n    const winnerBoxClass = cx(\n      'winner-box',\n      showWinnerBox &&\n        !winnerCustomColor &&\n        WINNER_BOX_CLASSES[(boxWinner.party || '').slice(0, 3).toLowerCase()]\n    );\n\n\n    const contestMetricsClass = cx('contest__metrics', {\n      homepage__metrics: isHomepage,\n      'non-homepage__metrics': !isHomepage,\n    });\n\n\n    const precinctsClass = cx('contest__precincts');\n\n    let ManualoverrideSource;\n\n\n    ManualoverrideSource = '';\n\n    const IsAnnotations =\n      annotations && annotations.length > 0 && annotations[0].value != ''\n        ? true\n        : false;\n\n    const IsNoted = notes && notes.length > 0 ? true : false;\n\n    return (\n      <div class={seatClass}>\n        <div class={showcaseClass}>\n          <div class={raceClass}>\n          {!isShowcaseRace && (\n              <h3 class=\"seat__title\">\n                <span>{contest.election_type == 'special' && (\n                <div class=\"special-election__title\">Special Election</div>\n              )}{contestTitle}</span>\n                {directory_slug[0] != null && (\n              <a class=\"t-links-unset\"\n                target=\"_blank\"\n                href={`https://directory.texastribune.org/districts/${directory_slug[0]['directory-slug']}/${contest['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                {/* Texas' congressional map was redrawn mid-decade in 2025.\n                Only shown where asked for (the U.S. House section and the\n                personalized results). */}\n                {showRedrawn && contest.office === 'U.S. House' && (\n                  <span class=\"term-limit seat__redrawn\">Redrawn in <a href=\"https://www.texastribune.org/2025/08/18/texas-redistricting-maps-charts-analysis/\" target=\"_blank\" rel=\"noopener noreferrer\">2025</a></span>\n                )}\n              </h3>\n            )}\n            <div class=\"race\">\n              {embedType == 'homepage' && (\n                <span>\n                  <div class=\"office__title\">{contestTitle}</div>\n                </span>\n              )}\n              {/* {embedType == 'internal' && (\n                <span>\n                  <h2 class=\"office__title\">{contestTitle}</h2>\n                </span>\n              )} */}\n\n              <div class={contestMetricsClass}>\n                {/* Once the AP calls the race, the winner box replaces the\n                    \"projected a winner\" line */}\n                {showWinnerBox && (\n                  <div\n                    class={winnerBoxClass}\n                    style={\n                      winnerCustomColor\n                        ? { 'background-color': winnerCustomColor }\n                        : undefined\n                    }\n                  >\n                    <span class=\"winner-box__check\" aria-hidden=\"true\">\n                      {checkmark}\n                    </span>\n                    <span class=\"winner-box__text\">{boxWinner.name}</span>\n                    <span class=\"winner-box__source\">\n                      {isUncontestedResult ? 'Uncontested' : 'AP projection'}\n                    </span>\n                  </div>\n                )}\n                {!showWinnerBox && isCanvass == false && (\n                  <h4 class=\"klaxon__text\">\n                    {shouldDisplayResult && (source == 'Decision Desk HQ' || source == 'Associated Press') ? (\n                      <span class={winnerCheckClass}>{checkmark}</span>\n                    ) : (\n                      ''\n                    )}\n                    {klaxon}\n                  </h4>\n                )}\n                {ManualoverrideSource == '' && isCanvass == false && (\n                  <p class={precinctsClass}>\n                    {source == 'Texas Secretary of State'\n                      ? `${intcomma(\n                          contest.pollinglocationsreporting\n                        )} of ${intcomma(\n                          contest.total_pollinglocations\n                        )} polling locations reporting (${contest.pollinglocations_reporting_percent.toFixed(\n                          1\n                        )}%).`\n                      : pct_votes_turnout_w_uncontested}{' '}\n                    {converter.convert(pct_votes_explain)}\n                  </p>\n                )}\n                {\n                  (ManualoverrideSource =! '' &&\n                    source != 'Texas Secretary of State' &&\n                    source != 'Decision Desk HQ' &&\n                    source != 'Associated Press' &&\n                    isCanvass == false && (\n                      <p class={precinctsClass}>\n                        {`${intcomma(\n                          contest.pollinglocationsreporting\n                        )} of ${intcomma(\n                          contest.total_pollinglocations\n                        )} polling locations reporting (${contest.pollinglocations_reporting_percent.toFixed(\n                          1\n                        )}%).`}\n\n                        {/* <span class=\"source\">{` Source: ${ManualoverrideSource}`}</span> */}\n                      </p>\n                    ))\n                }\n              </div>\n\n              <table class=\"race__candidates\">\n                {tableHeader}\n                <tbody>\n                  {isShowcaseRace &&\n                    candidates.map((candidate: any, idx: any) =>\n                      withCandidateKey(\n                        renderCandidate(\n                          candidate,\n                          idx,\n                          candidatesRender,\n                          viewAllCandidates,\n                          { totalVotes }\n                        ),\n                        candidate\n                      )\n                    )}\n\n                  {!isShowcaseRace &&\n                    candidates.map((candidate: any, idx: any) =>\n                      withCandidateKey(\n                        renderCandidate(candidate, idx, viewAllCandidates, {\n                          totalVotes,\n                        }),\n                        candidate\n                      )\n                    )}\n                  {candidates.length > visibleCandidatesCount && (\n                    <OtherCandidate\n                      isViewable={!viewAllCandidates}\n                      candidateCount={candidates.length}\n                      embedType={embedType}\n                      onClick={() => {\n                        this.onViewableToggle();\n                      }}\n                    />\n                  )}\n                </tbody>\n                {candidates.length > visibleCandidatesCount &&\n                  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\n                          class={embedType}\n                          onClick={() => {\n                            this.onViewableToggle();\n                          }}\n                        >\n                          Show fewer ({visibleCandidatesCount})\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              {isCompetitive(contest) && (\n                <div class=\"competitive-note\">\n                  <svg class=\"icon competitive-note__icon\" aria-hidden=\"true\">\n                    <use xlinkHref=\"#icon-fire\" />\n                  </svg>\n                  <p class=\"competitive-note__text\">\n                    {converter.convert(COMPETITIVE_NOTE)}\n                  </p>\n                </div>\n              )}\n              {IsNoted == true && (\n                <div class=\"anno-text notes-annotations\">\n                  <span class=\"is-sr-only\">Note:</span>\n                  <svg class=\"icon note-icon anno-div\" aria-hidden=\"true\">\n                    <use xlinkHref=\"#note-icon\" />\n                  </svg>\n                  <p class=\"note__text\">{converter.convert(notes[0].value)}</p>\n                </div>\n              )}\n              {IsAnnotations == true && (\n                <div class=\"anno-text notes-annotations t-wrap-balance\">\n                  <span class=\"is-sr-only\">Note:</span>\n                  <svg class=\"icon note-icon anno-div\" aria-hidden=\"true\">\n                    <use xlinkHref=\"#note-icon\" />\n                  </svg>\n\n                  <p class=\"annotations t-links-underlined\">\n                    <span class=\"font-weight-bold\">Noteworthy: </span>\n                    {converter.convert(annotations[0].value)}\n                  </p>\n                </div>\n              )}\n\n              {/* Source on every card; last updated only on homepage and internal embeds */}\n\n              <div class=\"below-races\">\n                <div class=\"source\">{` Source: ${source}`}</div>\n                {(embedType == 'homepage' || embedType == 'internal') && (\n                  <div class=\"countdown\">\n                    <span class=\"counter-homepage\">LAST UPDATED {asOf}</span>\n                  </div>\n                )}\n              </div>\n\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nContest.defaultProps = {\n  isShowcaseRace: false,\n  includeCountyRundown: false,\n};\n\nexport default Contest;","// packages\nimport Odometer from 'odometer';\nimport { Component, h } from 'preact';\n\n\nOdometer.options.auto = false;\n\ninterface Props {\n  value: number;\n  format: (n: number) => string;\n  odometerFormat?: string;\n}\n\n// Odometer drops trailing zeros after the decimal point so this fixes it\nfunction keepTrailingZeros(odometer: any) {\n  const { precision } = odometer.format;\n  if (!precision) return;\n\n  odometer.formatDigits = function (value: number) {\n    this.digits = [];\n    let wholePart = false;\n    value\n      .toFixed(precision)\n      .split('')\n      .reverse()\n      .forEach((digit: string) => {\n        if (digit === '.') wholePart = true;\n        this.addDigit(digit, wholePart);\n      });\n  };\n\n  const getFractionalDigitCount = odometer.getFractionalDigitCount;\n  odometer.getFractionalDigitCount = function (...values: number[]) {\n    return Math.max(precision, getFractionalDigitCount.apply(this, values));\n  };\n\n  // Redraw the initial value with the tweaked formatting\n  odometer.render();\n}\n\n// Rolling number powered by the odometer library\nclass AnimatedNumber extends Component<Props> {\n  el: HTMLElement;\n  srEl: HTMLElement;\n  odometer: any;\n\n  componentDidMount() {\n    const { value, odometerFormat } = this.props;\n\n    // Preact 8 can recycle the DOM of an unmounted AnimatedNumber (e.g. when\n    // the embed switcher swaps races). Odometer hands back the old instance\n    // for an element that already has one, which leaves the number blank, so\n    // always give it a brand-new element.\n    const odometerEl = document.createElement('span');\n    this.el.appendChild(odometerEl);\n\n    this.odometer = new Odometer({\n      el: odometerEl,\n      value,\n      format: odometerFormat || '(,ddd)',\n      theme: 'plain',\n      duration: 1200,\n    });\n\n    keepTrailingZeros(this.odometer);\n  }\n\n  shouldComponentUpdate(nextProps: Props) {\n    if (nextProps.value !== this.props.value) {\n      this.odometer.update(nextProps.value);\n      this.srEl.textContent = nextProps.format(nextProps.value);\n    }\n\n    return false;\n  }\n\n  render({ value, format }: Props) {\n    return (\n      <span class=\"animated-number\">\n        <span class=\"is-sr-only\" ref={(el) => (this.srEl = el)}>\n          {format(value)}\n        </span>\n        <span aria-hidden=\"true\" ref={(el) => (this.el = el)} />\n      </span>\n    );\n  }\n}\n\nexport default AnimatedNumber;\n","import * as d3 from 'd3';\nimport { Component, h } from 'preact';\n\nimport { entries, map, Map } from 'd3-collection';\n\nimport topology from 'Assets/geography/texas_urban.json';\n\nimport countiesData from 'Data/data.json';\n\nimport prepareTopoJSON from '../utils/prepare-topojson';\n\nimport { TIE } from '../colors';\n\ninterface Props {\n  category: string;\n  contest: { [key: string]: any };\n  candidatesRender: any;\n}\n\nclass TinyMap extends Component<Props> {\n  candidateMap!: Map<any>;\n  countyMap!: Map<any>;\n\n  constructor() {\n    super();\n\n    this.createMap = this.createMap.bind(this);\n    this.redrawMap = this.redrawMap.bind(this);\n    this.findLeading = this.findLeading.bind(this);\n  }\n\n  setUpCandidateMap(candidates: any) {\n    this.candidateMap = map(candidates, (d) => d.id);\n  }\n\n  setUpCountyMap(counties: any) {\n    this.countyMap = map(counties, (d) => d.fips);\n  }\n\n  componentDidMount() {\n    const { category, contest } = this.props;\n\n    this.setUpCandidateMap(contest.candidacies);\n    this.setUpCountyMap(contest.counties);\n\n    this.createMap(contest, category);\n\n    window.addEventListener('resize', () => {\n      this.redrawMap();\n    });\n  }\n\n  componentDidUpdate() {\n    const { category, contest } = this.props;\n\n    this.setUpCandidateMap(contest.candidacies);\n    this.setUpCountyMap(contest.counties);\n\n    this.createMap(contest, category);\n  }\n\n  findLeading(fips) {\n    const { candidatesRender } = this.props;\n\n    const county = this.countyMap.get(fips);\n\n    let fillStyle;\n\n    if (county.total_votes <= 0) {\n      fillStyle = '#666';\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      if (leader.value === second.value) {\n        fillStyle = TIE;\n      } else {\n        const leadingId = leader.key;\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    return fillStyle;\n  }\n\n  createMap(contest, category) {\n    d3.selectAll(`.${category}-${contest.office_slug} svg`).remove();\n\n    const container = d3.select(`.${category}-${contest.office_slug}`);\n\n    const geos = prepareTopoJSON(topology);\n\n    let projection = d3\n      .geoIdentity()\n      .reflectY(true)\n      .fitSize([75, 75], geos.collection);\n\n    let pathGenerator = d3.geoPath().projection(projection);\n\n    let tinymap = container\n      .append('svg')\n      .attr('id', 'tinymap')\n      .attr('role', 'presentation')\n      .attr('width', 75)\n      .attr('height', 75);\n\n    let g_tinymap = tinymap\n      .append('g')\n      .attr('class', 'tinymap')\n      .attr('width', 75)\n      .attr('height', 75);\n\n    const inCategory = (d) => {\n      let foundCounty = countiesData.counties.find(\n        (a) => a.county == d.properties.name\n      );\n      return foundCounty && foundCounty.category == category;\n    };\n\n    // Draw the gray counties first so their outlines can't paint over the\n    // edges of the shaded ones\n    const features = geos.collection.features\n      .map((d) => ({ d, shaded: inCategory(d) }))\n      .sort((a, b) => Number(a.shaded) - Number(b.shaded));\n\n    const fill = ({ d, shaded }) =>\n      shaded ? this.findLeading(d.properties.fips) : '#d0d0d0';\n\n    let tinycounties = g_tinymap\n      .selectAll('.tinycounties')\n      .data(features)\n      .enter()\n      .append('path')\n      .attr('d', ({ d }) => pathGenerator(d))\n      // A thin outline in the fill color just closes the hairline gaps\n      // between counties; at this size a 1px one is wider than many counties\n      .attr('stroke', fill)\n      .attr('stroke-width', '0.3')\n      .attr('stroke-linejoin', 'round')\n      .attr('class', 'tinycounties')\n      .attr('fill', fill);\n  }\n\n  redrawMap() {\n    const { category, contest } = this.props;\n\n    d3.selectAll(`.${category}-${contest.office_slug} svg`).remove();\n    this.createMap(contest, category);\n  }\n\n  render() {\n    const { category, contest } = this.props;\n\n    return (\n      <div\n        id='tinymapcontainer'\n        class={`${category}-${contest.office_slug}`}\n      ></div>\n    );\n  }\n}\n\nexport default TinyMap;","// In an embed (linkBase set), tooltip links that jump to a section of the\n// results page (\"#about-the-data\") need the page's URL, and every link opens\n// in a new tab instead of inside the iframe\nexport default function tooltipHTML(html: string, linkBase?: string) {\n  if (!linkBase) return html;\n  return html\n    .replace(/href=\"#/g, `href=\"${linkBase}#`)\n    .replace(/<a /g, '<a target=\"_blank\" rel=\"noopener noreferrer\" ');\n}\n","export default function(xy, dim) {\n  var node = this.node()\n  return !node ? this : node.getBBox ?\n    this.attr('transform', function(d,i) {\n      var p = typeof xy == 'function' ? xy.call(this, d,i) : xy;\n      if (dim === 0) p = [p, 0]; else if (dim === 1) p = [0, p];\n      return 'translate(' + p[0] +','+ p[1]+')';\n    }) :\n    this.style('transform', function(d,i) {\n      var p = typeof xy == 'function' ? xy.call(this, d,i) : xy;\n      if (dim === 0) p = [p, 0]; else if (dim === 1) p = [0, p];\n      return 'translate(' + p[0] +'px,'+ p[1]+'px)';\n    });\n}\n","export default function(name) {\n  if (typeof name === \"string\") {\n    var attr = {},\n      parts = name.split(/([\\.#])/g), p;\n      name = parts.shift();\n    while ((p = parts.shift())) {\n      if (p == '.') attr['class'] = attr['class'] ? attr['class'] + ' ' + parts.shift() : parts.shift();\n      else if (p == '#') attr.id = parts.shift();\n    }\n    return {tag: name, attr: attr};\n  }\n  return name;\n}\n","import {creator, selector} from \"d3-selection\";\nimport parseAttributes from \"./parseAttributes.js\";\n\nfunction constantNull() {\n  return null;\n}\n\nexport default function(name, before) {\n  var n = parseAttributes(name),\n      create = creator(n.tag),\n      select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n\n  var s = this.select(function() {\n    return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n  });\n\n\n  //attrs not provided by default in v4\n  for (var key in n.attr) { s.attr(key, n.attr[key]); }\n  return s;\n}","const camelCaseAttrs = /^(allowReorder|attributeName|attributeType|autoReverse|baseFrequency|baseProfile|calcMode|clipPathUnits|contentScriptType|contentStyleType|diffuseConstant|edgeMode|externalResourcesRequired|filterRes|filterUnits|glyphRef|gradientTransform|gradientUnits|kernelMatrix|kernelUnitLength|keyPoints|keySplines|keyTimes|lengthAdjust|limitingConeAngle|markerHeight|markerUnits|markerWidth|maskContentUnits|maskUnits|numOctaves|pathLength|patternContentUnits|patternTransform|patternUnits|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|referrerPolicy|refX|refY|repeatCount|repeatDur|requiredExtensions|requiredFeatures|specularConstant|specularExponent|spreadMethod|startOffset|stdDeviation|stitchTiles|surfaceScale|systemLanguage|tableValues|targetX|targetY|textLength|viewBox|viewTarget|xChannelSelector|yChannelSelector|zoomAndPan)$/;\n\nexport default function(name, value) {\n  if (typeof(name) == 'object'){\n    for (var key in name){\n      this.attr(camelCaseAttrs.test(key) ? key : key.replace(/([a-z\\d])([A-Z])/g, '$1-$2').toLowerCase(), name[key]);\n    }\n    return this;\n  } else{\n    return arguments.length == 1 ? this.attr(name) : this.attr(name, value);\n  }\n}\n","import ƒ from \"./f.js\";\n\nexport default function(name, value) {\n  if (typeof(name) == 'object'){\n    for (var key in name){\n      addStyle(this, key, name[key]);\n    }\n    return this;\n  } else {\n    return arguments.length == 1 ? this.style(name) : addStyle(this, name, value);\n  }\n\n\n  function addStyle(sel, style, value){\n    style = style.replace(/([a-z\\d])([A-Z])/g, '$1-$2').toLowerCase();\n\n    var pxStyles = 'top left bottom right padding-top padding-left padding-bottom padding-right border-top b-width border-left-width border-botto-width m border-right-width margin-top margin-left margin-bottom margin-right font-size width stroke-width line-height margin padding border border-radius max-width min-width max-height min-height';\n\n    if (~pxStyles.indexOf(style) ){\n      sel.style(style, typeof value == 'function' ? wrapPx(value) : addPx(value));\n    } else{\n      sel.style(style, value);\n    }\n\n    return sel;\n  }\n\n  function addPx(d){ return d.match ? d : d + 'px'; }\n  function wrapPx(fn){\n    return function(){\n      var val = fn.apply(this, arguments)\n      return addPx(val)\n    }\n\n  }\n}\n","import {sum} from 'd3-array';\n\n// while this might not be reprentative for all fonts, it is\n// still better than assuming every character has the same width\n// (set monospace=true if you want to bypass this)\nvar CHAR_W = {\n    A:7,a:7,B:8,b:7,C:8,c:6,D:9,d:7,E:7,e:7,F:7,f:4,G:9,g:7,H:9,h:7,I:3,i:3,J:5,j:3,K:8,k:6,L:7,l:3,M:11,\n    m:11,N:9,n:7,O:9,o:7,P:8,p:7,Q:9,q:7,R:8,r:4,S:8,s:6,T:7,t:4,U:9,u:7,V:7,v:6,W:11,w:9,X:7,x:6,Y:7,y:6,Z:7,z:5,\n    '.':2,',':2,':':2,';':2\n};\n\nexport default function(line, maxCharactersPerLine, minCharactersPerLine, monospace) {\n    var l, lines = [], w = [], words = [], w1, maxChars, minChars, maxLineW, minLineW;\n    w1 = line.split(' ');\n    w1.forEach(function(s, i) {\n        var w2 = s.split('-');\n        var lw = (i < w1.length - 1 ? ' ' : '');\n        if (w2.length > 1) {\n            w2.forEach(function(t, j) {\n                w.push(t + (j < w2.length - 1 ? '-' : lw));\n            });\n        } else {\n            w.push(s + lw);\n        }\n    });\n    maxChars = maxCharactersPerLine || 40;\n    minChars = minCharactersPerLine || Math.max(3, Math.min(maxChars * 0.5, 0.75 * w.map(word_len).sort(num_asc)[Math.round(w.length / 2)]));\n    maxLineW = maxChars * CHAR_W.a;\n    minLineW = minChars * CHAR_W.a;\n    l = 0;\n    w.forEach(function(d) {\n        var ww = sum(d.split('').map(char_w));\n        if (l + ww > maxLineW && l > minLineW) {\n            lines.push(words.join(''));\n            words.length = 0;\n            l = 0;\n        }\n        l += ww;\n        return words.push(d);\n    });\n    if (words.length) {\n        lines.push(words.join(''));\n    }\n    return lines.filter(function(d) {\n        return d !== '';\n    });\n    function char_w(c) { return !monospace && CHAR_W[c] || CHAR_W.a; }\n    function word_len(d) { return d.length; }\n    function num_asc(a, b) { return a - b; }\n}\n\n","export default function sum(values, valueof) {\n  let sum = 0;\n  if (valueof === undefined) {\n    for (let value of values) {\n      if (value = +value) {\n        sum += value;\n      }\n    }\n  } else {\n    let index = -1;\n    for (let value of values) {\n      if (value = +valueof(value, ++index, values)) {\n        sum += value;\n      }\n    }\n  }\n  return sum;\n}\n","import {selection} from \"d3-selection\";\nimport {transition} from \"d3-transition\";\n\nimport translateSelection from \"./src/translate-selection.js\";\nimport append from \"./src/append.js\";\nimport insert from \"./src/insert.js\";\nimport parent from \"./src/parent.js\";\nimport selectAppend from \"./src/selectAppend.js\";\nimport tspans from \"./src/tspans.js\";\nimport appendMany from \"./src/appendMany.js\";\nimport at from \"./src/at.js\";\nimport st from \"./src/st.js\";\n\nselection.prototype.translate = translateSelection;\ntransition.prototype.translate = translateSelection;\nselection.prototype.append = append;\nselection.prototype.insert = insert;\nselection.prototype.parent = parent;\nselection.prototype.selectAppend = selectAppend;\nselection.prototype.tspans = tspans;\nselection.prototype.appendMany = appendMany;\nselection.prototype.at = at;\nselection.prototype.st = st;\ntransition.prototype.at = at;\ntransition.prototype.st = st;\nselection.prototype.prop = selection.prototype.property;\n\nexport {default as wordwrap} from \"./src/wordwrap.js\";\nexport {default as parseAttributes} from \"./src/parseAttributes.js\";\nexport {default as f} from \"./src/f.js\";\nexport {default as ascendingKey} from \"./src/ascendingKey.js\";\nexport {default as descendingKey} from \"./src/descendingKey.js\";\nexport {default as conventions} from \"./src/conventions.js\";\nexport {default as drawAxis} from \"./src/drawAxis.js\";\nexport {default as attachTooltip} from \"./src/attachTooltip.js\";\nexport {default as loadData} from \"./src/loadData.js\";\nexport {default as nestBy} from \"./src/nestBy.js\";\nexport {default as round} from \"./src/round.js\";\nexport {default as clamp} from \"./src/clamp.js\";\nexport {default as polygonClip} from \"./src/polygonClip.js\";\nexport {default as timer} from \"./src/timer.js\";\nexport {default as interval} from \"./src/interval.js\";\nexport {default as timeout} from \"./src/timeout.js\";\n","import {creator} from \"d3-selection\";\nimport parseAttributes from \"./parseAttributes.js\";\n\nexport default function(name) {\n  var create, n;\n\n  if (typeof name === \"function\"){\n    create = name;\n  } else {\n    n = parseAttributes(name)\n    create = creator(n.tag);\n  }\n  var sel = this.select(function(){\n    return this.appendChild(create.apply(this, arguments));\n  });\n\n  if (n) for (var key in n.attr) { sel.attr(key, n.attr[key]); }\n  return sel;\n}\n\n","import {creator} from \"d3-selection\";\n\nexport default function() {\n  var parents = [];\n  return this.filter(function() {\n    if (parents.indexOf(this.parentNode) > -1) return false;\n    parents.push(this.parentNode);\n    return true;\n  }).select(function() {\n    return this.parentNode;\n  });\n}\n","import {selector} from \"d3-selection\";\nimport {creator} from \"d3-selection\";\nimport parseAttributes from \"./parseAttributes.js\";\n\nexport default function(name) {\n  var select = selector(name),\n     n = parseAttributes(name), s;\n\n  name = creator(n.tag);\n\n  s = this.select(function() {\n    return select.apply(this, arguments) ||\n        this.appendChild(name.apply(this, arguments));\n  });\n\n  //attrs not provided by default in v4\n  for (var key in n.attr) { s.attr(key, n.attr[key]); }\n  return s;\n}\n","export default function(lines, lh) {\n  return this.selectAll('tspan')\n      .data(function(d, i) {\n        return (typeof(lines) === 'function' ? lines.call(this, d, i) : lines)\n          .map(function(l) {\n            return { line: l, parent: d };\n          });\n      })\n      .enter()\n    .append('tspan')\n      .text(function(d) { return d.line; })\n      .attr('x', 0)\n      .attr('dy', function(d, i) { return i ? (typeof(lh) === 'function' ? lh.call(this, d.parent, d.line, i) : lh) || 15 : 0; });\n}\n","export default function(name, data){\n  if (typeof(data) == 'string'){\n    console.warn(\"DEPRECATED: jetpack's appendMany order of arguments has changed. It's appendMany('div', data) from now on\")\n    var temp = data\n    data = name\n    name = temp\n  }\n\n  return this.selectAll(null).data(data).enter().append(name);\n}\n","import { intword, intcomma } from 'journalize';\nimport * as d3 from 'd3';\n\nexport function customNumFormat(d, i) {\n  if (i == 0) {\n    return ``;\n  } else if (i == 1) {\n    return `${d3.format('~s')(d)}`;\n  } else if (i == 2) {\n    return `${intcomma(intword(d)).replace(' million', 'M')}`;\n  } else if (i == 3) {\n    return `${intcomma(intword(d)).replace(' million', 'M')}`;\n  }\n}\n\nexport function customNumFormatMini(d, i) {\n  if (i == 0) {\n    return ``;\n  } else if (i == 1) {\n    return `${d3.format('~s')(d)}`;\n  } else if (i == 2) {\n    return `${intcomma(intword(d)).replace(' million', 'M')}`;\n  }\n}\n\nexport function customBarNumFormat(d) {\n  return `${intcomma(intword(d)).replace(' million', 'M')}`;\n}","import * as d3 from 'd3';\nimport { Component, h } from 'preact';\nimport { wordwrap } from 'd3-jetpack';\n\nimport { showPrecinctsReporting } from '../endpoints';\n\nimport { customNumFormat, customBarNumFormat } from '../utils/format-numbers';\n\nclass MiniBarChart extends Component {\n  constructor() {\n    super();\n\n    this.state = {\n      width: null,\n      height: 90,\n      bodyWidth: null,\n      breakPoint: 768,\n    };\n\n    this.createGraphic = this.createGraphic.bind(this);\n    this.redrawGraphic = this.redrawGraphic.bind(this);\n    this.getContainerWidth = this.getContainerWidth.bind(this);\n    this.onResize = this.onResize.bind(this);\n    this.resizeFrame = null;\n  }\n\n  componentDidMount() {\n    const {\n      className,\n      categoryNumbers,\n      candidatesRender,\n      candidates,\n      officeSlug,\n      maxNum,\n    } = this.props;\n    let { width, bodyWidth } = this.getContainerWidth(officeSlug);\n\n    this.setState({ width: width, bodyWidth: bodyWidth }, () => {\n      this.createGraphic(\n        className,\n        categoryNumbers,\n        candidatesRender,\n        candidates,\n        officeSlug,\n        maxNum\n      );\n    });\n\n    window.addEventListener('resize', this.onResize);\n  }\n\n  componentDidUpdate() {\n    const {\n      className,\n      categoryNumbers,\n      candidatesRender,\n      candidates,\n      officeSlug,\n      maxNum,\n    } = this.props;\n\n    this.createGraphic(\n      className,\n      categoryNumbers,\n      candidatesRender,\n      candidates,\n      officeSlug,\n      maxNum\n    );\n  }\n\n  createGraphic(\n    className,\n    categoryNumbers,\n    candidatesRender,\n    candidates,\n    officeSlug,\n    maxNum\n  ) {\n    let { width, bodyWidth } = this.getContainerWidth(officeSlug);\n\n    let { height, breakPoint } = this.state;\n\n    d3.selectAll(`.bar-chart-${className}-${officeSlug} svg`).remove();\n\n    const container = d3.select(`.bar-chart-${className}-${officeSlug}`);\n\n    let newcand = candidates.map((obj) => ({\n      ...obj,\n      last_name: obj.name.split(' ').slice(-1).join(' '),\n      category_votes: categoryNumbers[1][0][obj.id],\n    }));\n\n    // chart setup\n    // Widen the left margin when a name label (like \"Rosenthal\") is longer\n    // than the default leaves room for; 12 is the label's gap from the bars\n    const labelWidth = this.measureLabels(container, newcand);\n    let margin = {\n      top: 0,\n      bottom: 20,\n      right: 30,\n      left: Math.max(70, Math.ceil(labelWidth) + 12),\n    };\n\n    (width = width - margin.left - margin.right),\n      (height =\n        categoryNumbers[1][0]['votes_still_to_count'] > 0 && showPrecinctsReporting ==  true\n          ? 90 - margin.top - margin.bottom\n          : 68 - margin.top - margin.bottom);\n\n    const isMobile = bodyWidth < breakPoint;\n\n    let svg = container\n      .append('svg')\n      .attr('width', width + margin.left + margin.right)\n      .attr('height', height + margin.top + margin.bottom);\n\n    let diagonalStripePattern = svg\n      .append('defs')\n      .append('pattern')\n      .attr('id', 'diagonal-stripe')\n      .attr('patternUnits', 'userSpaceOnUse')\n      .attr('patternTransform', 'rotate(45 0 0)')\n      .attr('width', 6)\n      .attr('height', 6);\n\n    diagonalStripePattern\n      .append('rect')\n      .attr('width', 6)\n      .attr('height', 6)\n      .style('fill', '#d9d9d9');\n\n    diagonalStripePattern\n      .append('line')\n      .attr('x1', 0)\n      .attr('y1', 0)\n      .attr('x2', 0)\n      .attr('y2', 6)\n      .style('stroke', 'black')\n      .style('stroke-width', 0.5);\n\n    let g = svg\n      .append('g')\n      .attr('class', `bar-chart-${className}-${officeSlug}-group`)\n      .attr('width', width)\n      .attr('transform', `translate(${margin.left},${margin.top})`);\n\n    // if (categoryNumbers[1][0]['votes_still_to_count'] > 0 && showPrecinctsReporting == true && isNaN(categoryNumbers[1][0]['votes_still_to_count']) == false) {\n    //   newcand.push({\n    //     category_votes: categoryNumbers[1][0]['votes_still_to_count'],\n    //     last_name: 'Votes left to count',\n    //     party: 'A-Votes',\n    //   });\n    // }\n\n    newcand = newcand.sort(function (a, b) {\n      return a.party.localeCompare(b.party);\n    });\n\n    let altMaxNum = 2963326;\n\n    var x = d3.scaleLinear().range([0, width]).domain([0, isNaN(maxNum) == true ? altMaxNum : maxNum]);\n\n    var y = d3\n      .scaleBand()\n      .domain(\n        newcand.map(function (entry) {\n          return entry.last_name;\n        })\n      )\n      .range([height, 0])\n      .padding(0.4);\n\n    // light gray bar underneath\n    let graybars = g\n      .selectAll('.bar-gray')\n      .data(newcand)\n      .enter()\n      .append('rect')\n      .attr('class', 'bar-light-gray')\n      .attr('fill', '#F5F5F5')\n      .attr('width', x(isNaN(maxNum) == true ? altMaxNum : maxNum))\n      .attr('y', (d) => y(d.last_name))\n      .attr('height', y.bandwidth());\n\n    // add the x Axis\n    g.append('g')\n      .attr('transform', 'translate(0,' + height + ')')\n      .call(\n        d3.axisBottom(x).ticks(3).tickFormat(customNumFormat).tickSize(-height)\n      )\n      .attr('class', 'axis axis--x')\n      .selectAll('text')\n      .attr('dy', '0.99em');\n\n    // add the y Axis\n    g.append('g')\n      .attr('class', 'axis axis--y')\n      .style('text-anchor', 'end')\n      .call(d3.axisLeft(y))\n      .selectAll('text')\n      .attr('y', 5)\n      .attr('x', -5)\n      .attr('text-anchor', 'end')\n      .text('')\n      .tspans((d) => wordwrap(d, 10))\n      .attr('x', -12);\n\n    d3.selectAll('tspan')\n      .nodes()\n      .forEach((d) => {\n        if (d.textContent == 'Votes left ') {\n          d.textContent = d.textContent.replace(/[ \\t]+$/g, '');\n        }\n      });\n\n    // append the rectangles for the bar chart\n    let bars = g\n      .selectAll('.bar')\n      .data(newcand)\n      .enter()\n      .append('rect')\n      .attr('class', 'bar-category')\n      .attr('fill', (d) => {\n        let foundCandidate = candidatesRender.find((a) => a.id == d.id);\n        if (foundCandidate) return foundCandidate.color;\n        else return '#bdbdbd';\n      })\n      .attr('width', (d) => x(d.category_votes))\n      .attr('y', (d) => y(d.last_name))\n      .attr('height', y.bandwidth());\n\n    g.selectAll('.bar')\n      .data(newcand)\n      .enter()\n      .append('text')\n      .attr('x', (d) => x(d.category_votes) + 3)\n      .attr('text-anchor', 'start')\n      .attr('y', (d) => y(d.last_name) + y.bandwidth() / 2)\n      .attr('dy', '.35em')\n      .text((d) => customBarNumFormat(d.category_votes));\n  }\n\n\n  // Width of the longest y-axis label line, measured in a throwaway axis group\n  // so it picks up the same .axis--y font styles as the real labels\n  measureLabels(container, candidates) {\n    const svg = container.append('svg');\n    const axis = svg.append('g').attr('class', 'axis axis--y');\n    let longest = 0;\n\n    candidates.forEach((d) => {\n      wordwrap(d.last_name, 10).forEach((line) => {\n        const text = axis.append('text').text(line).node();\n        longest = Math.max(longest, text.getComputedTextLength());\n      });\n    });\n\n    svg.remove();\n    return longest;\n  }\n\n  getContainerWidth(office_slug) {\n    const bodyWidth = document.body.offsetWidth;\n    const grid = this.base && this.base.parentElement.closest('.category-inline-grid');\n\n    if (!grid) {\n      const showcase = document.querySelector('.contest-showcase__contest');\n      return { width: showcase.offsetWidth - 80, bodyWidth };\n    }\n\n    const gap = parseFloat(getComputedStyle(grid).columnGap) || 0;\n    const tinyMap = grid.firstElementChild;\n    const width = Math.floor(\n      grid.parentElement.clientWidth - tinyMap.offsetWidth - gap\n    );\n\n    return { width, bodyWidth };\n  }\n\n  redrawGraphic() {\n    const { officeSlug } = this.props;\n    let { width, bodyWidth } = this.getContainerWidth(officeSlug);\n\n    this.setState({ width: width, bodyWidth: bodyWidth });\n  }\n\n  onResize() {\n    if (this.resizeFrame) return;\n\n    this.resizeFrame = window.requestAnimationFrame(() => {\n      this.resizeFrame = null;\n      this.redrawGraphic();\n    });\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('resize', this.onResize);\n    if (this.resizeFrame) window.cancelAnimationFrame(this.resizeFrame);\n  }\n\n  render() {\n    const { className, officeSlug } = this.props;\n\n    return (\n      <div\n        class={`category-bar-chart bar-chart-${className}-${officeSlug}`}\n      ></div>\n    );\n  }\n}\n\nexport default MiniBarChart;","import cx from 'classnames';\nimport { capfirst } from 'journalize';\nimport { Component, h } from 'preact';\n\nimport TinyMap from './TinyMap';\nimport tooltipHTML from '../utils/tooltip-html';\n\nimport text from 'Data/text.json';\nimport MiniBarChart from './MiniBarChart';\n\ninterface Props {\n  category: string;\n  maxNum: number;\n  categoryNumbers: { [key: string]: any };\n  contest: { [key: string]: any };\n  candidates: { [key: string]: any };\n  candidatesRender: any;\n  linkBase?: string;\n}\n\nclass AnalysisTableRow extends Component {\n  constructor() {\n    super();\n  }\n\n  render() {\n    const {\n      category,\n      categoryNumbers,\n      candidatesRender,\n      contest,\n      maxNum,\n      candidates,\n      linkBase,\n    } = this.props;\n\n    let categoryClass = cx(\n      'category-bar-chart-' + category + '-' + contest.office_slug\n    );\n\n    // Labels come from the text doc; fall back to the sheet's category name so\n    // a category missing from the doc doesn't break the whole graphic\n    const categoryLabel = (text.geocategories || []).find(\n      (a) => a.type == category\n    );\n    const category_text = categoryLabel\n      ? categoryLabel['value']\n      : capfirst(category);\n\n    const categoryExplain = (text.geocategories_explain || []).find(\n      (a) => a.type == category\n    );\n    const category_explain = categoryExplain ? categoryExplain['value'] : '';\n\n    const categoryTooltip = (text.geocategories_tooltip || []).find(\n      (a) => a.type == category\n    );\n    const category_tooltip = categoryTooltip ? categoryTooltip['value'] : '';\n    const tooltipId = `category-info-tooltip-${category}-${contest.office_slug}`;\n\n    return (\n      <div class='category-grid t-sans'>\n        <h4 class='map__title'>\n          {category_text}\n          {category_tooltip && (\n            <span class='category__info'>\n              <button\n                type='button'\n                class='category__info-pill'\n                aria-label={`About ${category_text.toLowerCase()}`}\n                aria-describedby={tooltipId}\n              >\n                <svg class='icon icon-info' aria-hidden='true'>\n                  <use xlinkHref='#icon-info'></use>\n                </svg>\n              </button>\n              <span\n                id={tooltipId}\n                role='tooltip'\n                class='category__info-tooltip'\n                dangerouslySetInnerHTML={{\n                  __html: tooltipHTML(category_tooltip, linkBase),\n                }}\n              />\n            </span>\n          )}\n        </h4>\n        {category_explain && (\n          <p\n            class='map__explain'\n            dangerouslySetInnerHTML={{ __html: category_explain }}\n          />\n        )}\n        <div class='category-inline-grid'>\n          <TinyMap\n            contest={contest}\n            category={category}\n            candidatesRender={candidatesRender}\n          />\n          <div class={categoryClass}>\n            <MiniBarChart\n              className={category}\n              maxNum={maxNum}\n              officeSlug={contest.office_slug}\n              categoryNumbers={categoryNumbers}\n              candidatesRender={candidatesRender}\n              candidates={candidates}\n            />\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default AnalysisTableRow;","import { Component, h } from 'preact';\n\nimport AnalysisTableRow from './AnalysisTableRow';\n\nimport { APTotalVotesToCount } from '../election-utils';\nimport tooltipHTML from '../utils/tooltip-html';\n\nimport { SENATE, SHOWCASE_COLORS } from '../colors';\n\nimport { showPrecinctsReporting } from '../endpoints';\n\nimport countiesData from 'Data/data.json';\nimport context from 'Data/text.json';\n\ntype Props = {\n  contest: { [key: string]: any },\n};\n\nclass AnalysisTable extends Component<Props> {\n  constructor() {\n    super();\n  }\n\n  render() {\n    const { contest, candidates, counties, linkBase } = this.props;\n\n    let candidatesRender, sourceMap;\n\n    if (contest) {\n      let candidates = contest.candidacies;\n\n\n      candidatesRender = (SHOWCASE_COLORS[contest.office] || SENATE).map((object) => {\n        const result = candidates\n          .filter((obj) => obj.name == object.name)\n          .map((obj) => obj.id);\n        return { ...object, id: result[0] };\n      });\n\n      sourceMap = contest.source;\n    }\n\n\n    function groupBy(arr, criteria) {\n      const newObj = arr.reduce(function (acc, currentValue) {\n        if (!acc[currentValue[criteria]]) {\n          acc[currentValue[criteria]] = [];\n        }\n        const findCounties = counties\n          .filter((county) => county.county == currentValue['county'])\n          .map((obj) => obj.results)[0];\n        const findCounties2 = counties\n          .filter((county) => county.county == currentValue['county'])\n          .map((obj) => APTotalVotesToCount(obj['eevp'], obj['total_votes']))[0];\n        let arrayCounties = {\n          ...currentValue,\n          ...findCounties,\n          estimated_votes: findCounties2,\n        };\n\n        acc[currentValue[criteria]].push(arrayCounties);\n        return acc;\n      }, {});\n\n      const summedEntries = [];\n\n      Object.entries(newObj).forEach(function (val, idx) {\n        const result = val[1].reduce((r, e, i, a) => {\n          const candidateIds = Object.keys(e);\n          candidateIds.forEach((k) => (r[k] = (r[k] || 0) + parseInt(e[k])));\n\n          if (!a[i + 1])\n            Object.keys(e)\n              .filter((k) => typeof e[k] == 'string')\n              .forEach((k) => (r[k] /= val[1].length));\n          r['category'] = e.category;\n          delete r['county'];\n          delete r['county_CAPS'];\n\n          return r;\n        });\n\n        summedEntries.push(result);\n      });\n      return summedEntries;\n    }\n\n\n\n\n\n    function createArray(arr, criteria) {\n      const newObj = arr.reduce(function (acc, currentValue) {\n        if (!acc[currentValue[criteria]]) {\n          acc[currentValue[criteria]] = [];\n        }\n        acc[currentValue[criteria]].push(currentValue);\n        return acc;\n      }, []);\n\n      Object.entries(newObj).forEach(function (item, idx) {\n        function sum(obj) {\n          var sum = 0;\n          var arrayToGetMost = [];\n          for (var el in obj) {\n            if (el !== 'category' && el !== 'estimated_votes') {\n              sum += parseFloat(obj[el]);\n              arrayToGetMost.push(obj[el]);\n            }\n          }\n          return [sum, arrayToGetMost];\n        }\n        var totals = sum(item[1][0]);\n        item[1][0].total_votes = totals[0];\n        item[1][0].votes_still_to_count =\n          item[1][0].estimated_votes - totals[0];\n        totals[1].push(item[1][0].estimated_votes - totals[0]);\n        item[1][0].largest_number = Math.max(...totals[1]);\n        delete item[1][0].category;\n      });\n      return newObj;\n    }\n\n    const countiesByCategory = groupBy(countiesData.counties, 'category');\n\n    const arrayByCategories = createArray(countiesByCategory, 'category');\n\n\n    const objectCategories = Object.entries(arrayByCategories);\n\n\n    let arrayToGetLargest = [];\n\n    var sumofVotesLeftToCount = 0;\n\n    objectCategories.forEach((item) => {\n      arrayToGetLargest.push(item[1][0].largest_number);\n      sumofVotesLeftToCount += item[1][0].votes_still_to_count;\n    });\n\n\n    return (\n      <span>\n        <h3 class='category__title t-sans'>\n          {context.categories_headline}\n          <span class='category__info'>\n            <button\n              type='button'\n              class='category__info-pill'\n              aria-label='How we define these regions'\n              aria-describedby='category-info-tooltip'\n            >\n              ?\n            </button>\n            {context.regions_tooltip && (\n              <span\n                id='category-info-tooltip'\n                role='tooltip'\n                class='category__info-tooltip'\n                dangerouslySetInnerHTML={{\n                  __html: tooltipHTML(\n                    context.regions_tooltip\n                      .map((item) => item.value)\n                      .join(' '),\n                    linkBase\n                  ),\n                }}\n              />\n            )}\n          </span>\n        </h3>\n        <div class='category-grids t-sans'>\n          {objectCategories && objectCategories.map((categories) => (\n            <AnalysisTableRow\n              contest={contest}\n              category={categories[0]}\n              maxNum={Math.max(...arrayToGetLargest)}\n              categoryNumbers={categories}\n              candidates={candidates}\n              candidatesRender={candidatesRender}\n              linkBase={linkBase}\n            />\n          ))}\n        </div>\n        {/* {sumofVotesLeftToCount > 0 && showPrecinctsReporting == true && (\n          <ul class='graphic-footer'>\n            <li data-note>Note: {context.categories_notes}</li>\n          </ul>\n        )} */}\n      </span>\n    );\n  }\n}\n\nexport default AnalysisTable;","import { Component, h, createRef } from 'preact';\nimport { initFrameAndPoll, sendFrameHeight } from '@newswire/frames';\n\nclass FramesChild extends Component {\n  constructor(props) {\n    super(props);\n    this.ref = createRef();\n\n    const { polling } = this.props;\n\n    let opts = {};\n    if (polling) opts.polling = polling;\n  }\n\n  componentDidMount() {\n    const { polling } = this.props;\n\n    initFrameAndPoll(polling);\n  }\n\n  componentDidUpdate() {\n    sendFrameHeight();\n  }\n\n  render({ class: klass }) {\n    return (\n      <div class={klass} ref={this.ref}>\n        {this.props.children}\n      </div>\n    );\n  }\n}\n\nexport default FramesChild;","import cx from 'classnames';\nimport { intcomma } from 'journalize';\nimport { h, VNode } from 'preact';\n\nimport PureComponent from './PureComponent';\n\nimport winnerClass from '../utils/winner-class';\nimport AnimatedNumber from './AnimatedNumber';\nimport PctChange from './PctChange';\nimport PartyPill from './PartyPill';\nimport VoteBar from './VoteBar';\n\ninterface Props {\n  ballotName: string;\n  candidateId: string;\n  contestIsCalled: boolean;\n  contestResult: string;\n  isIncumbent: boolean;\n  isWinner: boolean;\n  candidateColors: { [key: string]: any };\n  party: string;\n  totalVotesInContest: number;\n  votes: number;\n}\n\nconst formatVotes = (n: number) => intcomma(Math.round(n));\nconst formatPct = (n: number) => n.toFixed(1);\nconst pctValue = (votes: number, total: number) =>\n  total == null || total <= 0 ? 0 : (votes / total) * 100;\n\nclass HeadshotCandidateRow extends PureComponent<Props> {\n  static columnCount: number;\n  static Header: VNode;\n\n  render() {\n    const {\n      ballotName,\n      candidateId,\n      contestIsCalled,\n      contestResult,\n      isIncumbent,\n      isWinner,\n      party,\n      isViewable,\n      totalVotesInContest,\n      candidateColors,\n      votes,\n    } = this.props;\n\n    let getColor;\n\n    if (candidateColors) {\n      getColor = candidateColors\n        .filter(obj => obj.name == ballotName)\n        .map(obj => obj.color);\n    } else {\n      getColor = ['#777777'];\n    }\n\n    const divStyle = {\n      'background-color': getColor[0],\n    };\n\n    const checkStyle = {\n      color: getColor[0],\n    };\n\n    const IsAsterisk = ballotName == 'Rick Perry' ? true : false;\n\n    let rowClass = cx(\n      'candidate',\n      'contest__candidate-row',\n      'contest__candidate-row--headshot',\n      {\n        'contest__candidate-row--winner dem--border':\n          contestIsCalled && isWinner && party == 'Democrat',\n        'contest__candidate-row--winner rep--border':\n          contestIsCalled && isWinner && party == 'Republican',\n      }\n    );\n\n    const checkClass = cx('check', winnerClass(party, contestResult));\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            <PartyPill party={party} style={divStyle} />\n        </td>\n        <th class=\"candidate__cell candidate__name\">\n          <span class=\"candidate__name-line\">\n            {contestIsCalled && isWinner && contestResult != 'runoff' && (\n              <span class={checkClass} style={checkStyle}>\n                {checkmark}\n              </span>\n            )}\n            {contestIsCalled && isWinner && contestResult == 'runoff' && (\n              <span class={checkClass}>{checkmark}</span>\n            )}\n            {contestIsCalled && isWinner && contestResult != 'runoff' ? (\n              <span class={checkClass}>{ballotName}</span>\n            ) : (\n              ballotName\n            )}\n            {IsAsterisk && <span class=\"asterisk\">*</span>}{' '}\n            {isIncumbent && (\n              <span class=\"pill pill--basic\" title=\"Currently holds this seat\">\n                Incumbent\n              </span>\n            )}\n          </span>\n          <VoteBar\n            value={pctValue(votes, totalVotesInContest)}\n            party={party}\n            color={getColor[0]}\n          />\n        </th>\n        <td class=\"candidate__cell candidate__votes\"><AnimatedNumber value={votes} format={formatVotes} /></td>\n        <td class=\"candidate__cell candidate__pct\">\n          <PctChange value={pctValue(votes, totalVotesInContest)} party={party} />\n          <AnimatedNumber\n            value={pctValue(votes, totalVotesInContest)}\n            format={formatPct}\n            odometerFormat=\"(,ddd).d\"\n          />\n          <span class=\"candidate__pct-symbol\">%</span>\n        </td>\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.columnCount = 6;\n\nexport default HeadshotCandidateRow;","import { Component as PreactComponent, h } from 'preact';\n\nfunction resolve(m) {\n  return m && m.default ? m.default : m;\n}\n\nfunction asyncComponent(importComponent) {\n  return class extends PreactComponent {\n    constructor() {\n      super();\n\n      this.state = { component: null };\n    }\n\n    componentDidMount() {\n      importComponent().then(component =>\n        this.setState({ component: resolve(component) })\n      );\n    }\n\n    render() {\n      const { component: Component } = this.state;\n\n      return Component ? <Component {...this.props} /> : null;\n    }\n  };\n}\n\nexport default asyncComponent;\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}","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}","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;","import { h } from 'preact';\n\nconst MAP_TYPES = [\n  { type: 'categorical', label: 'By candidate' },\n  { type: 'breakdown', label: 'Breakdown' },\n];\n\n// Toggle between the county map (\"By candidate\") and the pie cartogram\nconst MapTypeButtons = ({ active, onSelect }) => (\n  <div class=\"map-btn-group\">\n    {MAP_TYPES.map(({ type, label }) => (\n      <button\n        className={\n          active === type ? 'map-button map-button--active' : 'map-button'\n        }\n        onClick={() => onSelect(type)}\n      >\n        {label}\n      </button>\n    ))}\n  </div>\n);\n\nexport default MapTypeButtons;\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;","'use strict';\n\n// We depend on intersection-observer enough that it should just be assumed as necessary\nrequire('intersection-observer');\n","function _arrayLikeToArray(r, a) {\n  (null == a || a > r.length) && (a = r.length);\n  for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n  return n;\n}\nexport { _arrayLikeToArray as default };","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nfunction _slicedToArray(r, e) {\n  return arrayWithHoles(r) || iterableToArrayLimit(r, e) || unsupportedIterableToArray(r, e) || nonIterableRest();\n}\nexport { _slicedToArray as default };","function _arrayWithHoles(r) {\n  if (Array.isArray(r)) return r;\n}\nexport { _arrayWithHoles as default };","function _iterableToArrayLimit(r, l) {\n  var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n  if (null != t) {\n    var e,\n      n,\n      i,\n      u,\n      a = [],\n      f = !0,\n      o = !1;\n    try {\n      if (i = (t = t.call(r)).next, 0 === l) {\n        if (Object(t) !== t) return;\n        f = !1;\n      } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n    } catch (r) {\n      o = !0, n = r;\n    } finally {\n      try {\n        if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n      } finally {\n        if (o) throw n;\n      }\n    }\n    return a;\n  }\n}\nexport { _iterableToArrayLimit as default };","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _unsupportedIterableToArray(r, a) {\n  if (r) {\n    if (\"string\" == typeof r) return arrayLikeToArray(r, a);\n    var t = {}.toString.call(r).slice(8, -1);\n    return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r, a) : void 0;\n  }\n}\nexport { _unsupportedIterableToArray as default };","function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableRest as default };","import { Component, h } from 'preact';\n\n\ninterface Props {\n  value: number;\n  party?: string;\n  // Custom candidate color, used in place of the party color when set\n  color?: string;\n}\n\ninterface State {\n  direction: 'up' | 'down' | null;\n  // Bumped on each change so the fade animation restarts\n  changeCount: number;\n}\n\n// How long the arrow stays up, including its fade out (see .pct-change__arrow)\nconst VISIBLE_MS = 5000;\n\n// Spelled out in full so PurgeCSS (config/tasks/unused-css.js) keeps them.\n// Same party colors as the PartyPill circles.\nconst PARTY_CLASSES: { [prefix: string]: string } = {\n  rep: 'pct-change--rep',\n  dem: 'pct-change--dem',\n  lib: 'pct-change--lib',\n  ind: 'pct-change--ind',\n  gre: 'pct-change--gre',\n};\n\n// Compare what readers see, so tiny shifts that round away don't flip the arrow\nconst rounded = (n: number) => Math.round(n * 10) / 10;\n\n// Arrow that briefly shows whether a percent rose or fell in a results refresh\nclass PctChange extends Component<Props, State> {\n  state: State = { direction: null, changeCount: 0 };\n  timer: number;\n\n  componentWillReceiveProps(nextProps: Props) {\n    const prev = rounded(this.props.value);\n    const next = rounded(nextProps.value);\n\n    if (next !== prev) {\n      window.clearTimeout(this.timer);\n      this.setState({\n        direction: next > prev ? 'up' : 'down',\n        changeCount: this.state.changeCount + 1,\n      });\n      this.timer = window.setTimeout(\n        () => this.setState({ direction: null }),\n        VISIBLE_MS\n      );\n    }\n  }\n\n  componentWillUnmount() {\n    window.clearTimeout(this.timer);\n  }\n\n  render({ party, color }: Props, { direction, changeCount }: State) {\n    const partyClass = party && PARTY_CLASSES[party.slice(0, 3).toLowerCase()];\n\n    return (\n      <span\n        class={partyClass ? `pct-change ${partyClass}` : 'pct-change'}\n        style={color ? { color } : undefined}\n      >\n        {direction && (\n          <span key={changeCount} class=\"pct-change__arrow\">\n            <svg aria-hidden=\"true\">\n              <use\n                xlinkHref={direction === 'up' ? '#icon-up-arrow' : '#icon-down-arrow'}\n              />\n            </svg>\n            <span class=\"is-sr-only\">{direction === 'up' ? 'Up' : 'Down'}</span>\n          </span>\n        )}\n      </span>\n    );\n  }\n}\n\nexport default PctChange;\n","// Maps a winner's party to its color class (.dem-winner, .rep-winner,\n// .lib-winner, .gre-winner, .ind-winner). Uses the same three-letter prefix\n// as PartyPill, so it doesn't depend on exact party spellings.\nfunction winnerClass(party: string, contestResult?: string): string {\n  if (contestResult == 'runoff') return 'runoff-winner';\n  if (!party) return '';\n\n  return `${party.slice(0, 3).toLowerCase()}-winner`;\n}\n\nexport default winnerClass;\n","import { BBox } from \"geojson\";\nimport { AllGeoJSON } from \"@turf/helpers\";\nimport { coordEach } from \"@turf/meta\";\n\n/**\n * Calculates the bounding box for any GeoJSON object, including FeatureCollection.\n * Uses geojson.bbox if available and options.recompute is not set.\n *\n * @function\n * @param {GeoJSON} geojson any GeoJSON object\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.recompute] Whether to ignore an existing bbox property on geojson\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(\n  geojson: AllGeoJSON,\n  options: {\n    recompute?: boolean;\n  } = {}\n): BBox {\n  if (geojson.bbox != null && true !== options.recompute) {\n    return geojson.bbox;\n  }\n  const result: BBox = [Infinity, Infinity, -Infinity, -Infinity];\n  coordEach(geojson, (coord) => {\n    if (result[0] > coord[0]) {\n      result[0] = coord[0];\n    }\n    if (result[1] > coord[1]) {\n      result[1] = coord[1];\n    }\n    if (result[2] < coord[0]) {\n      result[2] = coord[0];\n    }\n    if (result[3] < coord[1]) {\n      result[3] = coord[1];\n    }\n  });\n  return result;\n}\n\nexport { bbox };\nexport default bbox;\n","// Live results being updated by Republic\nconst FLAT_RESULTS_URL =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2026_general/republic_json/results_FLAT.json';\n\n// This has emptied out results i.e. is static\nconst STATIC_FLAT_RESULTS_URL =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2026_general/republic_json/results_static_FLAT.json';\n\n// This has the final certified results and is static\nconst FINAL_RESULTS_URL =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2024_general/republic_json/results_FLAT_FINAL_RESULTS.json'\n\n// Includes fake results data for testing\nconst FAKE_RESULTS_URL =\n  'https://s3.us-east-1.amazonaws.com/sos-test-2.texastribune.org/2024_general/republic_json/results_FLAT_COMPLETE_TEST.json';\n\nconst FAKE_RESULTS_URL_TWO =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2024_general/republic_json/results_FLAT_AP_test.json';\n\n// Used for homepage takeover\nconst HOMEPAGE_URL =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2024_general/homepage_takeover/2024-general.json';\n\n// Calls TT stories using the API\nconst STORY_API_URL = (id: number): string =>\n  `https://www.texastribune.org/api/v2/articles/${id}/?format=json&fields=sitewide_image,summary,authors,url,pub_date,updated_date,homepage_headline`;\n\n// This is for the other candidates for the hide/show toggle\nconst visibleCandidatesCount = 6;\n\n// This is for the other candidates for the hide/show toggle just in the homepage\nconst visibleCandidatesCountHomepage = 2;\n\n// Show bubble map toggle option. Set to false if we want to hide it.\nconst showBubbleMap = true;\n\n// Show categories map toggle option. Set to false if we want to hide it.\nconst showCategoriesMap = true;\n\n// Show precincts or estimated votes still being counted text\nconst showPrecinctsReporting = false;\n\n// Adds the checkmark if this is the final official results from local canvass\nconst isCanvass = false;\n\n// Show last updated timestamp, set to true to last updated text\nconst showLastUpdated = false;\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  visibleCandidatesCount,\n  visibleCandidatesCountHomepage,\n  showPrecinctsReporting,\n  isCanvass,\n  showLastUpdated,\n  showBubbleMap,\n  showCategoriesMap,\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","/**\n * Sums up values of a property across objects in an array.\n *\n * @param {Array} arr An array of objects.\n * @param {String} key The property to sum across objects.\n * @return {Number}\n */\nexport default function sumValues(arr, key) {\n  return arr.reduce((acc, obj) => acc + obj[key], 0);\n}\n","import cx from 'classnames';\nimport { intcomma } from 'journalize';\nimport { Component, h, VNode } from 'preact';\n\nimport AnimatedNumber from './AnimatedNumber';\nimport PartyPill from './PartyPill';\nimport PctChange from './PctChange';\nimport PureComponent from './PureComponent';\nimport VoteBar from './VoteBar';\n\nimport winnerClass from '../utils/winner-class';\n\n\ninterface Props {\n  ballotName: string;\n  candidateId: string;\n  contestIsCalled: boolean;\n  contestResult: string;\n  isIncumbent: boolean;\n  isWinner: boolean;\n  isMapRow: boolean;\n  party: string;\n  totalVotesInContest: number;\n  votes: number;\n}\n\n\nconst formatVotes = (n: number) => intcomma(Math.round(n));\nconst formatPct = (n: number) => n.toFixed(1);\nconst pctValue = (votes: number, total: number) =>\n  total == null || total <= 0 ? 0 : (votes / total) * 100;\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      contestResult,\n      isIncumbent,\n      isWinner,\n      isViewable,\n      candidatesNum,\n      candidateColor,\n      isMapRow,\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    const uncontested = candidatesNum == 1;\n\n    let rowClass = cx('candidate', 'contest__candidate-row', {\n      'contest__candidate-row--winner dem--border':\n        contestIsCalled && isWinner && party == 'Democrat',\n      'contest__candidate-row--winner rep--border':\n        contestIsCalled && isWinner && party == 'Republican',\n      'contest__candidate-row--winner gre--border':\n        contestIsCalled && isWinner && party == 'Green',\n      'contest__candidate-row--winner lib--border':\n        contestIsCalled && isWinner && party == 'Libertarian',\n    });\n\n    const checkClass = cx('check', winnerClass(party, contestResult));\n\n    if (!isViewable) {\n      rowClass += ' race__candidate-row--hidden';\n    }\n\n    const checkmark = '\\u2713';\n\n    // const IsAsterisk =\n    // context['asterisks'].filter(candidate => candidate.value == ballotName).length > 0\n    //     ? true\n    //     : false;\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          <span class=\"candidate__name-line\">\n            {/* The feed can flag is_winner before the race is called, so only\n                style a winner once it is (same as HeadshotCandidateRow) */}\n            {contestIsCalled && isWinner &&\n              (contestResult == 'winner' || contestResult == 'uncontested') && (\n                <span class={checkClass}>{checkmark}</span>\n              )}\n            {contestIsCalled && isWinner && contestResult == 'runoff' && (\n              <span class={checkClass}>{checkmark}</span>\n            )}\n            {contestIsCalled && isWinner && !isMapRow && contestResult != 'runoff' ? (\n              <span class={checkClass}>{ballotName}</span>\n            ) : (\n              ballotName\n            )}\n            {/* {IsAsterisk && <span class=\"asterisk_out\">*</span>}{' '} */}\n            {isIncumbent && (\n              <span class=\"pill pill--basic\" title=\"Currently holds this seat\">\n                Incumbent\n              </span>\n            )}\n          </span>\n          {!uncontested && (\n            <VoteBar\n              value={pctValue(votes, totalVotesInContest)}\n              party={party}\n              color={candidateColor}\n            />\n          )}\n        </th>\n        <td class=\"candidate__cell candidate__votes\">{uncontested == false ? (\n          isMapRow ? (\n            formatVotes(votes)\n          ) : (\n            <AnimatedNumber value={votes} format={formatVotes} />\n          )\n        ) : '—'}</td>\n        <td class=\"candidate__cell candidate__pct\">\n        {uncontested == false ? (\n          isMapRow ? (\n            formatPct(pctValue(votes, totalVotesInContest))\n          ) : (\n            <span>\n              <PctChange\n                value={pctValue(votes, totalVotesInContest)}\n                party={party}\n                color={candidateColor}\n              />\n              <AnimatedNumber\n                value={pctValue(votes, totalVotesInContest)}\n                format={formatPct}\n                odometerFormat=\"(,ddd).d\"\n              />\n            </span>\n          )\n        ) : '—'}\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;","import { h } from 'preact';\n\n\ninterface Props {\n  // Percent of the vote, 0-100\n  value: number;\n  party?: string;\n  // Custom candidate color, used in place of the party color when set\n  color?: string;\n}\n\n// Spelled out in full so PurgeCSS (config/tasks/unused-css.js) keeps them.\n// Same party colors as the PartyPill circles.\nconst PARTY_CLASSES: { [prefix: string]: string } = {\n  rep: 'vote-bar__fill--rep',\n  dem: 'vote-bar__fill--dem',\n  lib: 'vote-bar__fill--lib',\n  ind: 'vote-bar__fill--ind',\n  gre: 'vote-bar__fill--gre',\n};\n\n// Thin bar under a candidate's name showing their share of the vote\nfunction VoteBar({ value, party, color }: Props) {\n  const partyClass = party && PARTY_CLASSES[party.slice(0, 3).toLowerCase()];\n  const width = Math.max(0, Math.min(100, value || 0));\n\n  const style: { [key: string]: string } = { width: `${width}%` };\n  if (color) style['background-color'] = color;\n\n  return (\n    <span class=\"vote-bar\" aria-hidden=\"true\">\n      <span\n        class={partyClass ? `vote-bar__fill ${partyClass}` : 'vote-bar__fill'}\n        style={style}\n      />\n    </span>\n  );\n}\n\nexport default VoteBar;\n","const LENGTH_OF_CHECK_INTERVAL = 1000 * 60 * 2; // 2 minutes\nconst TIMERS_SHOULD_RUN = false;\n\nexport { LENGTH_OF_CHECK_INTERVAL, TIMERS_SHOULD_RUN };","// packages\nimport { geoIdentity } from 'd3-geo';\nimport { Component, h } from 'preact';\n\n// components\nimport AnalysisTable from './components/AnalysisTable';\nimport asyncComponent from './components/AsyncComponent';\nimport BalancePower from './components/BalancePower';\nimport CandidateRow from './components/CandidateRow';\nimport Contest from './components/Contest';\nimport FramesChild from './components/FramesChild';\nimport HeadshotCandidateRow from './components/HeadshotCandidateRow';\nimport MapTypeButtons from './components/MapTypeButtons';\n\n// internal\nimport { getJSONWithLastModified } from './utils/get-json';\nimport {\n  determineContestTitle,\n  determineDistrictTitle,\n  lastUpdatedFormat,\n  prepareBalanceData,\n} from './election-utils';\nimport {\n  RESULTS_IN_USE,\n  showBubbleMap,\n  visibleCandidatesCount,\n} from './endpoints';\nimport { SENATE, SHOWCASE_COLORS } from './colors';\nimport { LENGTH_OF_CHECK_INTERVAL } from './constants';\n\nimport analysisData from 'Data/data.json';\nimport topology from 'Assets/geography/texas_urban.json';\n\nconst LayeredMap = asyncComponent(() =>\n  import(/* webpackChunkName: \"LayeredMap\" */ './components/LayeredMap')\n);\n\nconst pastPowerBalance = analysisData['past_balance_of_power'];\n\n// anchor: the race's id on the results page\nconst SENATE_RACE = {\n  slug: 'us-senate-class-2',\n  label: 'U.S. Senate',\n  anchor: 'us-senate',\n};\nconst GOVERNOR_RACE = { slug: 'governor', label: 'Governor', anchor: 'governor' };\n\n// Races in the map switcher, picked by the mapswitch slug\n// (?mapswitch=lieutenant-governor). A blank or unknown slug gets the default.\nconst SWITCHER_SETS = {\n  default: [\n    SENATE_RACE,\n    GOVERNOR_RACE,\n    {\n      slug: 'texas-railroad-commission-seat-2',\n      label: 'Railroad Commission',\n      anchor: 'railroad-commission-of-texas',\n    },\n  ],\n  'lieutenant-governor': [\n    SENATE_RACE,\n    GOVERNOR_RACE,\n    {\n      slug: 'lieutenant-governor',\n      label: 'Lieutenant Governor',\n      anchor: 'lieutenant-governor',\n    },\n  ],\n};\n\n// Where the switcher's \"All races\" tab goes\nconst RESULTS_PAGE_URL =\n  'https://apps.texastribune.org/features/2026/texas-general-election-live-results-2026/';\n\n// Balance of power embed titles that differ from the chamber name\nconst BALANCE_TITLES: { [chamber: string]: string } = {\n  'U.S. House': 'Texas’ delegation in the U.S. House',\n};\n\n// Each office's section id on the results page (index.html), so \"View\n// results\" can jump straight to it\nconst OFFICE_ANCHORS: { [office: string]: string } = {\n  'U.S. Senate': 'us-senate',\n  Governor: 'governor',\n  'Texas Railroad Commission': 'railroad-commission-of-texas',\n  'Lieutenant Governor': 'lieutenant-governor',\n  'Attorney General': 'attorney-general',\n  Comptroller: 'comptroller',\n  'Land Commissioner': 'land-commissioner',\n  'Agriculture Commissioner': 'agriculture-commissioner',\n  'U.S. House': 'us-house',\n  'State Board of Education': 'state-board-of-education',\n  'Texas Supreme Court': 'texas-supreme-court',\n  'Texas Court of Criminal Appeals': 'texas-court-of-criminal-appeals',\n  'Texas Fifteenth Court of Appeals': 'fifteenth-court-of-appeals',\n  'Texas Senate': 'texas-senate',\n  'Texas House': 'texas-house',\n};\n\nclass MapSwitcher extends Component<any, { active: number }> {\n  state = { active: 0 };\n\n  componentDidMount() {\n    this.updateResultsLink();\n  }\n\n  componentDidUpdate() {\n    this.updateResultsLink();\n  }\n\n  // Point the page's \"View full results\" button (if it has one) at this race\n  updateResultsLink() {\n    const link = document.getElementById('results-link');\n    const race = this.props.races[this.state.active];\n    if (link && race) link.setAttribute('href', `${RESULTS_PAGE_URL}#${race.anchor}`);\n  }\n\n  render() {\n    const { races, renderMap } = this.props;\n    const active = races[this.state.active] ? this.state.active : 0;\n\n    return (\n      <div class=\"embed-switcher\">\n        <div class=\"embed-switcher__tabs\" role=\"tablist\">\n          {races.map(({ label }, idx) => (\n            <button\n              type=\"button\"\n              role=\"tab\"\n              aria-selected={idx === active}\n              class={\n                idx === active\n                  ? 'embed-switcher__tab embed-switcher__tab--active'\n                  : 'embed-switcher__tab'\n              }\n              onClick={() => this.setState({ active: idx })}\n            >\n              {label}\n            </button>\n          ))}\n          <a\n            class=\"embed-switcher__tab embed-switcher__tab--link\"\n            href={RESULTS_PAGE_URL}\n          >\n            All races\n            <span class=\"c-icon c-icon--baseline\">\n              <svg aria-hidden=\"true\">\n                <use xlinkHref=\"#long-arrow-right\"></use>\n              </svg>\n            </span>\n          </a>\n        </div>\n        {renderMap(races[active].contest)}\n      </div>\n    );\n  }\n}\n\n\nclass BalanceEmbed extends Component<any, { pass: number }> {\n  state = { pass: 0 };\n\n  componentDidMount() {\n    this.setState({ pass: 1 });\n  }\n\n  componentDidUpdate() {\n    if (this.state.pass === 1) this.setState({ pass: 2 });\n  }\n\n  render() {\n    const { pastData, currentData } = this.props;\n\n    return (\n      <div class={`embed-balance ${pastData.className}-balance-graphic`}>\n        {/* Same title style as the results table embeds */}\n        <h3 class=\"seat__title embed-balance__title\">\n          {BALANCE_TITLES[pastData.chamber] || pastData.chamber}\n        </h3>\n        <div class=\"balance-of-power-container\">\n          {this.state.pass > 0 && (\n            <BalancePower\n              pastData={pastData}\n              chamber={pastData.chamber}\n              className={pastData.className}\n              currentData={currentData}\n              currentOnly\n              fullWidth\n            />\n          )}\n        </div>\n      </div>\n    );\n  }\n}\n\nclass App extends Component<any, any> {\n  timer!: number;\n\n  constructor() {\n    super();\n\n    // mapTypes: \"By candidate\"/\"Breakdown\" choice for each map, by map id\n    this.state = { contests: [], asOf: null, mapTypes: {} };\n\n    this.projection = geoIdentity().reflectY(true);\n    this.fetchData = this.fetchData.bind(this);\n  }\n\n  fetchData() {\n    // \"Last updated\" is when the results file last changed\n    getJSONWithLastModified(RESULTS_IN_USE).then(\n      ({ data: contests, lastModified }) => {\n        const asOf = lastUpdatedFormat(lastModified || new Date());\n        this.setState({ contests, asOf }, this.startTimer);\n      }\n    );\n  }\n\n  startTimer() {\n    this.timer = window.setTimeout(this.fetchData, LENGTH_OF_CHECK_INTERVAL);\n  }\n\n  clearTimer() {\n    window.clearTimeout(this.timer);\n  }\n\n  componentDidMount() {\n    this.useButtonLink();\n    this.fetchData();\n  }\n\n  componentDidUpdate() {\n    this.updateResultsLink();\n  }\n\n  componentWillUnmount() {\n    this.clearTimer();\n  }\n\n  // Map embeds, and embeds built with ?button=1, get the gray \"View results\"\n  // button, like the homepage embed, instead of the text link\n  useButtonLink() {\n    const { items, buttonLink } = this.props;\n    const link = document.getElementById('results-link');\n    const hasMap = items.some(\n      ({ type }) => type === 'map' || type === 'mapswitch' || type === 'category'\n    );\n    if (!link || !(hasMap || buttonLink)) return;\n\n    link.className =\n      'c-button c-button--standard c-button--partner-embeds l-display-block';\n    link.textContent = 'View results';\n    link.parentElement?.classList.add('results-link--button');\n  }\n\n  // Point the page's \"View results\" link at the results page section for the\n  // first thing this embed shows. The map switcher sets its own link.\n  updateResultsLink() {\n    const { items } = this.props;\n    const link = document.getElementById('results-link');\n    if (!link || items.some(({ type }) => type === 'mapswitch')) return;\n\n    let office;\n    for (const { type, slug } of items) {\n      if (type === 'balance') {\n        const pastData = pastPowerBalance.find(item => item.className === slug);\n        office = pastData && pastData.chamber;\n      } else {\n        const contest = this.findContests(slug)[0];\n        office = contest && contest.office;\n      }\n      if (office) break;\n    }\n\n    const anchor = office && OFFICE_ANCHORS[office];\n    link.setAttribute(\n      'href',\n      anchor ? `${RESULTS_PAGE_URL}#${anchor}` : RESULTS_PAGE_URL\n    );\n  }\n\n  // Seats with both a special and a general election (like HD-93) share an\n  // office_slug. \"<slug>-special\" picks the special; the plain slug picks the\n  // general (or the special, if that's the only race for the seat).\n  findContests(slug) {\n    const { contests } = this.state;\n    const specialSlug = slug.replace(/-special$/, '');\n    if (specialSlug !== slug) {\n      return contests.filter(\n        contest =>\n          contest.office_slug === specialSlug &&\n          contest.election_type === 'special'\n      );\n    }\n\n    const matches = contests.filter(contest => contest.office_slug === slug);\n    const general = matches.filter(\n      contest => contest.election_type !== 'special'\n    );\n    return general.length ? general : matches;\n  }\n\n  // Annotations and notes for a special election use \"<slug>-special\"\n  annotationType(contest) {\n    return contest.election_type == 'special'\n      ? contest.office_slug + '-special'\n      : contest.office_slug;\n  }\n\n  renderTable(contest) {\n    const { notes, annotations, embedType } = this.props;\n    const { asOf } = this.state;\n\n    return (\n      <Contest\n        key={contest.id}\n        contest={contest}\n        columnCount={CandidateRow.columnCount}\n        contestTitle={determineDistrictTitle(contest)}\n        embedType={embedType}\n        partyName={contest.party}\n        tableHeader={HeadshotCandidateRow.Header}\n        asOf={asOf}\n        annotations={annotations.filter(\n          item => item.type === this.annotationType(contest)\n        )}\n        notes={notes.filter(item => item.type === this.annotationType(contest))}\n        source={contest.source}\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={contest.is_called}\n            contestResult={contest.contest_result}\n            isIncumbent={candidate.is_incumbent}\n            isWinner={candidate.is_winner}\n            isViewable={viewAllCandidates || idx < visibleCandidatesCount}\n            party={candidate.party}\n            totalVotesInContest={totalVotes}\n            votes={candidate.votes}\n          />\n        )}\n      />\n    );\n  }\n\n  // Map colors for each candidate in a showcase race\n  candidatesRenderFor(contest) {\n    return (SHOWCASE_COLORS[contest.office] || SENATE).map(object => {\n      const match = contest.candidacies.find(c => c.name == object.name);\n      return { ...object, id: match && match.id };\n    });\n  }\n\n  // Results table that sits above the map\n  renderMapTable(contest, showLastUpdated) {\n    const { notes, annotations, embedType } = this.props;\n    const { asOf } = this.state;\n    const candidatesRender = this.candidatesRenderFor(contest);\n\n    return (\n      <Contest\n        contest={contest}\n        contestTitle={determineContestTitle(contest)}\n        isShowcaseRace\n        candidatesRender={candidatesRender}\n        annotations={annotations.filter(\n          item => item.type === this.annotationType(contest)\n        )}\n        notes={notes.filter(item => item.type === this.annotationType(contest))}\n        asOf={asOf}\n        embedType={showLastUpdated ? embedType : undefined}\n        source={contest.source}\n        tableHeader={HeadshotCandidateRow.Header}\n        columnCount={HeadshotCandidateRow.columnCount}\n        renderCandidate={(\n          candidate,\n          idx,\n          candidatesRender,\n          viewAllCandidates,\n          { totalVotes }\n        ) => (\n          <HeadshotCandidateRow\n            key={candidate.id}\n            ballotName={candidate.name}\n            candidateId={candidate.id}\n            contestIsCalled={contest.is_called}\n            contestResult={contest.contest_result}\n            isIncumbent={candidate.is_incumbent}\n            isWinner={candidate.is_winner}\n            isViewable={viewAllCandidates || idx < visibleCandidatesCount}\n            party={candidate.party}\n            candidateColors={candidatesRender}\n            totalVotesInContest={totalVotes}\n            votes={candidate.votes}\n          />\n        )}\n      />\n    );\n  }\n\n  // showLastUpdated: show the \"Last updated\" time under the table (the\n  // three-race switcher does; single map embeds don't)\n  // sizerContests: other races whose tables are drawn invisibly in the same\n  // spot, so the table area is as tall as the tallest of them and the map\n  // doesn't jump when switching races\n  renderMap(contest, showLastUpdated = false, sizerContests = []) {\n    const candidatesRender = this.candidatesRenderFor(contest);\n\n    const mapId = `map-${contest.office_slug}`;\n    const { mapTypes } = this.state;\n    const typeMap = mapTypes[mapId] || 'categorical';\n\n    return (\n      <div class=\"embed-map\" key={mapId}>\n        <div class=\"embed-map__header\">\n          {/* Other races' titles sit invisibly in the same spot, so a title\n              that wraps to two lines reserves that room on every race */}\n          <h3 class=\"embed-map__title\">\n            <span>{contest.office}</span>\n            {sizerContests\n              .filter(other => other.id !== contest.id)\n              .map(other => (\n                <span\n                  key={`title-sizer-${other.id}`}\n                  class=\"embed-map__title-sizer\"\n                  aria-hidden=\"true\"\n                >\n                  {other.office}\n                </span>\n              ))}\n          </h3>\n          {showBubbleMap && (\n            <MapTypeButtons\n              active={typeMap}\n              onSelect={type =>\n                this.setState({ mapTypes: { ...mapTypes, [mapId]: type } })\n              }\n            />\n          )}\n        </div>\n        {/* Results table first, map below it */}\n        <div class=\"embed-map__table\">\n          <div key={`table-${contest.id}`}>\n            {this.renderMapTable(contest, showLastUpdated)}\n          </div>\n          {sizerContests\n            .filter(other => other.id !== contest.id)\n            .map(other => (\n              <div\n                key={`sizer-${other.id}`}\n                class=\"embed-map__table-sizer\"\n                aria-hidden=\"true\"\n              >\n                {this.renderMapTable(other, showLastUpdated)}\n              </div>\n            ))}\n        </div>\n        <div id={mapId} class=\"embed-map__map\">\n          <LayeredMap\n            typeMap={typeMap}\n            topology={topology}\n            projection={this.projection}\n            candidates={contest.candidacies}\n            candidatesRender={candidatesRender}\n            source={contest.source}\n            counties={contest.counties}\n            typeRace={mapId}\n            precinctsReporting={contest.precincts_reporting}\n            totalVotes={contest.total_votes}\n            minLegendRows={sizerContests.reduce(\n              (most, other) => Math.max(most, other.candidacies.length),\n              0\n            )}\n          />\n        </div>\n      </div>\n    );\n  }\n\n  // Regional breakdown grids (tiny maps + bar charts) from the results page\n  renderCategories(contest) {\n    if (!contest.counties || !contest.counties.length) return null;\n\n    // Same candidates the results page charts: just the Republican and the\n    // Democrat (the showcase colors also include third parties for the map)\n    return (\n      <div class=\"embed-categories\" key={`category-${contest.office_slug}`}>\n        <h3 class=\"embed-map__title\">{contest.office}</h3>\n        <AnalysisTable\n          contest={contest}\n          candidates={contest.candidacies.filter(candidate =>\n            ['Republican', 'Democrat'].includes(candidate.party)\n          )}\n          counties={contest.counties}\n          linkBase={RESULTS_PAGE_URL}\n        />\n      </div>\n    );\n  }\n\n  renderSwitcher(slug) {\n    const races = (SWITCHER_SETS[slug] || SWITCHER_SETS.default).map(race => ({\n      ...race,\n      contest: this.findContests(race.slug)[0],\n    })).filter(race => race.contest);\n\n    if (!races.length) return null;\n\n    // Size the table to the tallest race in any switcher (Lieutenant Governor\n    // has an extra candidate), so every switcher embed is the same height\n    const sizerSlugs: string[] = [];\n    Object.keys(SWITCHER_SETS).forEach(key =>\n      SWITCHER_SETS[key].forEach(race => {\n        if (sizerSlugs.indexOf(race.slug) === -1) sizerSlugs.push(race.slug);\n      })\n    );\n    const sizerContests = sizerSlugs\n      .map(raceSlug => this.findContests(raceSlug)[0])\n      .filter(Boolean);\n\n    return (\n      <MapSwitcher\n        key=\"mapswitch\"\n        races={races}\n        renderMap={contest => this.renderMap(contest, true, sizerContests)}\n      />\n    );\n  }\n\n  renderBalance(className) {\n    const pastData = pastPowerBalance.find(\n      item => item.className === className\n    );\n    if (!pastData) return null;\n\n    const chamberContests = this.state.contests.filter(\n      contest => contest.office === pastData.chamber\n    );\n\n    return (\n      <BalanceEmbed\n        key={`balance-${className}`}\n        pastData={pastData}\n        currentData={prepareBalanceData(\n          chamberContests,\n          pastData.className,\n          pastData.chamber,\n          pastData.total_current,\n          pastData.halfway\n        )}\n      />\n    );\n  }\n\n  render() {\n    const { items } = this.props;\n    const { contests } = this.state;\n\n    if (!contests.length) return <FramesChild class=\"embed\" polling={500} />;\n\n    return (\n      <FramesChild class=\"embed\" polling={500}>\n        <div class=\"seat__race_wrapper\">\n          {items.map(({ type, slug }) => {\n            if (type === 'balance') return this.renderBalance(slug);\n            if (type === 'mapswitch') return this.renderSwitcher(slug);\n\n            \n            const matches = this.findContests(slug);\n            if (!matches.length) return null;\n\n            if (type === 'category') return this.renderCategories(matches[0]);\n\n            return type === 'map'\n              ? this.renderMap(matches[0])\n              : matches.map(contest => this.renderTable(contest));\n          })}\n        </div>\n      </FramesChild>\n    );\n  }\n}\n\nexport default App;\n","import { render, h } from 'preact';\n\nimport loadJsonScript from '../utils/load-json-script';\n\nimport EmbedApp from '../EmbedApp';\n\nconst EMBED_TYPES = ['map', 'mapswitch', 'contest', 'balance', 'category'];\n\n// Other names that work in the URL (?region= is the regional breakdown)\nconst TYPE_ALIASES: { [alias: string]: string } = { region: 'category' };\n\nconst params = new URLSearchParams(location.search);\n\n// Keep the order the embeds were checked in the builder, across all types\nconst items = Array.from(params)\n  .map(([type, slug]) => ({ type: TYPE_ALIASES[type] || type, slug }))\n  .filter(({ type }) => EMBED_TYPES.indexOf(type) >= 0);\n\n// Pages like the homepage embed can set what shows when the URL picks nothing\nif (!items.length) items.push(...(loadJsonScript('default_embed_items') || []));\n\n// ?button=1 swaps the \"View results\" text link for the gray button\nconst buttonLink = params.has('button');\n\nconst annotations = loadJsonScript('annotations_data');\n\nconst notes = loadJsonScript('notes_data');\n\nrender(\n  <EmbedApp\n    items={items}\n    annotations={annotations}\n    notes={notes}\n    buttonLink={buttonLink}\n    embedType={'internal'}\n  />,\n  document.getElementById('app')\n);\n","var journalize = require('journalize');\n\nimport { capfirst } from 'journalize';\n\nimport context from 'Data/text.json';\n\nimport find from './utils/find';\n\n// AP-style time with uppercase meridiem, like \"9:42 P.M.\" (or \"NOON\"), with\n// the date in front (\"Nov. 3, 2026, 9:42 P.M.\") when it wasn't today\nexport function lastUpdatedFormat(date) {\n  const time = journalize.aptime(date).toUpperCase();\n\n  return date.toDateString() === new Date().toDateString()\n    ? time\n    : `${journalize.apdate(date)}, ${time}`;\n}\n\nexport function format(num) {\n  return num < 10 ? '0' + num : num;\n}\n\nexport const chunk = (arr, size) =>\n  arr.reduce((acc, _, i) => {\n    if (i % size === 0) acc.push(arr.slice(i, i + size));\n    return acc;\n  }, []);\n\nexport const delay = (function() {\n  var timer = 0;\n  return function(callback, ms) {\n    clearTimeout(timer);\n    timer = setTimeout(callback, ms);\n  };\n})();\n\nexport function APTotalVotesToCount(eevp, total_votes) {\n  return eevp > 0 ? Math.round((100 * total_votes)/eevp) : NaN\n}\n\nconst PARTY_SORT_ORDER = [\n  'Republican',\n  'Democrat',\n  'Libertarian',\n  'Green',\n  'Independent',\n  'Write-in',\n];\n// This is just the order for the top page\nconst PARTY_SORT_ORDER_TOP = [\n  'Democrat',\n  'Republican',\n  'Libertarian',\n  'Green',\n  'Independent',\n  'Write-in',\n];\n\n// If we need light blue #99d2da; background-color:rgba(153, 210, 218, .1)\n// If we need dark blue #325ba8; background-color:rgba(90, 137, 204, .1)\n\nconst TT_directory_slugs = [\n  { office: 'Texas House', 'directory-slug': 'tx-house' },\n  { office: 'Texas Senate', 'directory-slug': 'tx-senate' },\n  { office: 'U.S. House', 'directory-slug': 'us-house' },\n  { office: 'State Board of Education', 'directory-slug': 'sboe' },\n];\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, type) {\n  if (type == 'top_races')\n  {\n    return candidates.sort(\n      (a, b) =>\n        PARTY_SORT_ORDER.indexOf(a.party) - PARTY_SORT_ORDER.indexOf(b.party)\n    );\n  }\n\n  else {\n    return candidates.sort(\n      (a, b) =>\n        PARTY_SORT_ORDER.indexOf(a.party) - PARTY_SORT_ORDER.indexOf(b.party)\n    );\n  }\n \n}\n\nexport function sort_candidates_by_votes(candidates) {\n  return candidates.sort(\n    (a, b) =>\n      b.votes - a.votes\n  );\n}\n\nexport function alert_conditionals(vote_pct, cand_num) {\n  if (vote_pct == 0 && cand_num > 1) {\n    return context.label_conditionals['zero-results'];\n  } else if (vote_pct > 0 && vote_pct <= 50 && cand_num > 1) {\n    return context.label_conditionals['more-than-0-less-than-50'];\n  } else if (vote_pct > 50 && vote_pct < 90 && cand_num > 1) {\n    return context.label_conditionals['more-than-50-no-winner'];\n  } else if (vote_pct >= 90 && cand_num > 1) {\n    return context.label_conditionals['all-results-in-no-winner'];\n  } else if (cand_num == 1) {\n    return context.label_conditionals['uncontested'];\n  }\n}\n\nexport function alert_winners(result, office) {\n  if (result == 'winner' && office != 'President') {\n    return context.winner_conditionals['winner'];\n  } else if (result == 'winner' && office == 'President') {\n    return context.winner_conditionals['winner_prez'];\n  } else if (result == 'uncontested') {\n    return context.winner_conditionals['uncontested'];\n  } else if (result == 'runoff') {\n    return context.winner_conditionals['runoff'];\n  }\n}\n\nexport function text_conditionals(vote_pct, cand_num) {\n  if (vote_pct == 0 && cand_num > 1) {\n    return context.text_conditionals['zero-results'];\n  } else if (vote_pct > 1 && vote_pct <= 50 && cand_num > 1) {\n    return context.text_conditionals['more-than-0-less-than-50'];\n  } else if (vote_pct > 50 && vote_pct < 90 && cand_num > 1) {\n    return context.text_conditionals['more-than-50-no-winner'];\n  } else if (vote_pct >= 90 && cand_num > 1) {\n    return context.text_conditionals['all-results-in-no-winner'];\n  } else if (cand_num == 1) {\n    return context.text_conditionals['uncontested'];\n  }\n}\n\nexport function text_conditional_winner_zero(vote_pct, cand_num) {\n  if (vote_pct == 0 && cand_num > 1) {\n    return context.text_conditionals['zero-results_winner'];\n  } else {\n    return ``;\n  }\n}\n\nexport function determineDistrictTitle(contest) {\n  return `${contest.office} ${\n    contest.office === 'President' ||\n    contest.division_type === 'class' ||\n    contest.division_type === 'statewide'\n      ? ''\n      : contest.division_type === 'place' && contest.office_division === 1\n      ? 'Chief Justice'\n      : capfirst(contest.division_type) + ' ' + contest.office_division\n  }`.trim();\n}\n\nexport function getDistrictNum(division_type, division_number) {\n  return capfirst(division_type) + ' ' + division_number\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// Seat counts for the balance of power chart. Shared by the results page and embeds.\nexport function prepareBalanceData(data, className, chamber, total, halfway) {\n  let republican = 0,\n    democrat = 0,\n    vacant = 0,\n    uncontested_republican = 0,\n    uncontested_democrat = 0;\n\n  // Filter out special elections from the balance of power (they won't be in power for long)\n\n  let data_wo_special = data.filter((race) => race.election_type == 'general')\n\n  data_wo_special.forEach((contest) => {\n    if (\n      contest.contest_result == 'not called' &&\n      contest.candidacies.length > 1\n    ) {\n      vacant++;\n    } else if (\n      (contest.contest_result == 'not called' ||\n        contest.contest_result == 'uncontested') &&\n      contest.candidacies.length == 1 &&\n      contest.candidacies[0].party == 'Republican'\n    ) {\n      uncontested_republican++;\n    } else if (\n      (contest.contest_result == 'not called' ||\n        contest.contest_result == 'uncontested') &&\n      contest.candidacies.length == 1 &&\n      contest.candidacies[0].party == 'Democrat'\n    ) {\n      uncontested_democrat++;\n    } else if (\n      contest.contest_result == 'winner' &&\n      contest.candidacies.length > 1 &&\n      find(contest.candidacies, (candidate) => candidate.is_winner === true) && \n      find(contest.candidacies, (candidate) => candidate.is_winner === true)\n        .party == 'Republican'\n    ) {\n      republican++;\n    } else if (\n      contest.contest_result == 'winner' &&\n      contest.candidacies.length > 1 &&\n      find(contest.candidacies, (candidate) => candidate.is_winner === true) && \n      find(contest.candidacies, (candidate) => candidate.is_winner === true)\n        .party == 'Democrat'\n    ) {\n      democrat++;\n    }\n  });\n\n  return {\n    chamber: chamber,\n    className: className,\n    republican: republican,\n    democrat: democrat,\n    vacant: vacant,\n    halfway: halfway,\n    total: total,\n    uncontested_republican: uncontested_republican,\n    uncontested_democrat: uncontested_democrat,\n  };\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\n/**\n * Like getJSON, but also returns when the file was last modified (from the\n * Last-Modified header S3 sends), so \"last updated\" reflects the data itself.\n * lastModified is null if the header is missing.\n *\n * @param {String|Request} input\n * @param {Object} init\n * @returns {Promise<{data: any, lastModified: Date|null}>}\n */\nexport function getJSONWithLastModified(input, init) {\n  return fetch(input, init).then(res => {\n    const header = res.headers.get('Last-Modified');\n    const lastModified = header ? new Date(header) : null;\n\n    return jsonResponse(res).then(data => ({\n      data,\n      lastModified:\n        lastModified && !isNaN(lastModified.getTime()) ? lastModified : null,\n    }));\n  });\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;","// 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 * A white-list of attributes to consider booleans for our purposes. Because\n * iframe attributes like \"sandbox\" actually mean something when they're an\n * empty string, we can't assume that means \"true\" across the board.\n *\n * @private\n * @type {Array}\n */\nconst booleans = ['allowfullscreen'];\n\n/**\n * Searches an element's attributes and returns an Object of all the ones that\n * begin with a specified prefix. Each matching attribute name is returned\n * without the prefix.\n *\n * @private\n * @param  {Element} element\n * @param  {string} prefix\n * @return {object}\n */\nfunction getMatchingAttributes(element, prefix) {\n  // prepare the object to return\n  const attrs = {};\n\n  // grab all the attributes off the element\n  const map = element.attributes;\n\n  // get a count of the number of attributes\n  const length = map.length;\n\n  // get the prefix's length\n  const prefixLength = prefix.length;\n\n  // loop through the attributes\n  for (let i = 0; i < length; i++) {\n    // get each attribute key\n    const key = map[i].name;\n\n    // continue if the key begins with supplied prefix\n    if (key.substr(0, prefixLength) === prefix) {\n      // slice off the prefix to get the bare field key\n      const field = key.slice(prefixLength);\n\n      // grab the value associated with the key\n      let value = map[i].value;\n\n      if (booleans.indexOf(field) > -1) {\n        value = true;\n      }\n\n      // add matching key to object\n      attrs[field] = value;\n    }\n  }\n\n  return attrs;\n}\n\nfunction extend(obj, props) {\n  for (let i in props) obj[i] = props[i];\n  return obj;\n}\n\nexport { extend, getMatchingAttributes };\n","const EMBED_SIZE = 'embed-size';\nconst AMP_SENTINEL = 'amp';\nconst FRAME_PREFIX = 'data-frame-';\nconst FRAME_AUTO_INITIALIZED_ATTRIBUTE = `${FRAME_PREFIX}auto-initialized`;\nconst FRAME_SRC_ATTRIBUTE = `${FRAME_PREFIX}src`;\n\nexport {\n  AMP_SENTINEL,\n  EMBED_SIZE,\n  FRAME_PREFIX,\n  FRAME_AUTO_INITIALIZED_ATTRIBUTE,\n  FRAME_SRC_ATTRIBUTE,\n};\n","import { extend, getMatchingAttributes } from './utils.mjs';\nimport {\n  AMP_SENTINEL,\n  EMBED_SIZE,\n  FRAME_PREFIX,\n  FRAME_AUTO_INITIALIZED_ATTRIBUTE,\n  FRAME_SRC_ATTRIBUTE,\n} from './constants.mjs';\n\n/**\n * The Framer object to be called in the host page. Effectively a wrapper around\n * interactions with an embedded iframe.\n *\n * @param {object} options options used to prepare the iframe\n * @param {Element} options.container the containing DOM element for the iframe\n * @param {string} options.src the URL to set as the `src` of the iframe\n * @param {boolean} [options.allowfullscreen] toggles the `allowfullscreen` attribute\n * @param {string} [options.name] sets the `name` attribute\n * @param {string} [options.referrerpolicy] sets the `referrerpolicy` attribute\n * @param {string} [options.sandbox] sets the `sandbox` attribute\n * @param {string} [options.title] sets the `title` attribute\n */\nclass Framer {\n  constructor({\n    allowfullscreen = false,\n    container,\n    name,\n    referrerpolicy,\n    sandbox = 'allow-scripts',\n    src,\n    title,\n  }) {\n    this.container = container;\n    this.src = src;\n    this.allowfullscreen = allowfullscreen;\n    this.name = name;\n    this.referrerpolicy = referrerpolicy;\n    this.sandbox = sandbox;\n    this.title = title;\n\n    this.processMessage_ = this.processMessage_.bind(this);\n    window.addEventListener('message', this.processMessage_, false);\n\n    this.createIframe_();\n  }\n\n  /**\n   * Removes event listeners and removes the iframe from the container.\n   *\n   * @returns {void}\n   * @example\n   *\n   * const framer = new Framer(...);\n   * // tears down the Framer\n   * framer.remove();\n   */\n  remove() {\n    window.removeEventListener('message', this.processMessage_, false);\n    this.container.removeChild(this.iframe);\n    // important to de-reference the iframe so it can be GC'ed\n    this.iframe = null;\n  }\n\n  /**\n   * Creates the iframe element and sets the source of the iframe.\n   *\n   * @private\n   * @returns {void}\n   */\n  createIframe_() {\n    const iframe = (this.iframe = document.createElement('iframe'));\n\n    iframe.setAttribute('src', this.src);\n    iframe.setAttribute('width', '100%');\n    iframe.setAttribute('scrolling', 'no');\n    iframe.setAttribute('marginheight', '0');\n    iframe.setAttribute('frameborder', '0');\n\n    if (this.allowfullscreen) {\n      iframe.setAttribute('allowfullscreen', '');\n    }\n\n    if (this.name) {\n      iframe.setAttribute('name', name);\n    }\n\n    if (this.referrerpolicy) {\n      iframe.setAttribute('referrerpolicy', this.referrerpolicy);\n    }\n\n    iframe.setAttribute('sandbox', this.sandbox);\n\n    if (this.title) {\n      iframe.setAttribute('title', this.title);\n    }\n\n    this.container.appendChild(iframe);\n  }\n\n  /**\n   * Receives a message from the frame. Checks to make sure it is only listening\n   * to the iframe it created, and that the sentinel value and type matches.\n   *\n   * @private\n   * @param {Event} event\n   * @returns {void}\n   */\n  processMessage_(event) {\n    // this message isn't from our created frame, stop here\n    if (event.source !== this.iframe.contentWindow) return;\n\n    const { data } = event;\n\n    // if the sentinel and type matches, update our height\n    if (data.sentinel === AMP_SENTINEL && data.type === EMBED_SIZE) {\n      this.setIframeHeight_(data.height);\n    }\n  }\n\n  /**\n   * Sets the iframe's height.\n   *\n   * @private\n   * @param {number} height\n   * @returns {void}\n   */\n  setIframeHeight_(height) {\n    this.iframe.setAttribute('height', height);\n  }\n}\n\n/**\n * Automatically initializes any frames that have not already been\n * auto-activated.\n *\n * @returns {Array} An array of all the created Framers\n * @example\n *\n * // sets up all frames that have not been initialized yet\n * autoInitFrames();\n */\nfunction autoInitFrames() {\n  const elements = document.querySelectorAll(\n    `[${FRAME_SRC_ATTRIBUTE}]:not([${FRAME_AUTO_INITIALIZED_ATTRIBUTE}])`\n  );\n\n  const activated = [];\n\n  for (let i = 0; i < elements.length; i++) {\n    const container = elements[i];\n\n    const attributes = getMatchingAttributes(container, FRAME_PREFIX);\n    container.setAttribute(FRAME_AUTO_INITIALIZED_ATTRIBUTE, '');\n\n    activated.push(\n      new Framer(\n        extend(\n          {\n            container,\n          },\n          attributes\n        )\n      )\n    );\n  }\n\n  return activated;\n}\n\nexport { autoInitFrames, Framer };\n","// internal\nimport { AMP_SENTINEL, EMBED_SIZE } from './constants.mjs';\nimport { extend } from './utils.mjs';\n\n/**\n * A wrapper around postMessage to normalize the message body. Automatically\n * includes the AMP sentinel value.\n *\n * @private\n * @param {string} type Type of message being sent\n * @param {Object} [data] Any additional data to send\n * @returns {void}\n */\nfunction sendMessage(type, data = {}) {\n  window.parent.postMessage(\n    extend({ sentinel: AMP_SENTINEL, type }, data),\n    '*'\n  );\n}\n\n/**\n * Gets the height of the current document's body. Uses offsetHeight to ensure\n * that margins are accounted for.\n *\n * @private\n * @returns {number}\n */\nfunction getDocumentHeight() {\n  return document.documentElement.offsetHeight;\n}\n\n/**\n * Sends the current document's height or provided value to the host window\n * using postMessage.\n *\n * @param {number} [height] The height to pass to the host page, is determined automatically if not passed\n * @returns {void}\n * @example\n *\n * // Uses the document's height to tell the host page\n * sendFrameHeight();\n *\n * // Pass a height you've determined in another way\n * sendFrameHeight(500);\n *\n */\nfunction sendFrameHeight(height = getDocumentHeight()) {\n  sendMessage(EMBED_SIZE, { height });\n}\n\n/**\n * Sets up an event listener for the load event that sends the new frame\n * height to the host. Automatically removes itself once fired.\n *\n * @returns {void}\n * @example\n *\n * // once the frame's load event is fired, tell the host page its new height\n * sendHeightOnLoad();\n */\nfunction sendHeightOnLoad() {\n  window.addEventListener('load', function cb() {\n    sendFrameHeight();\n\n    window.removeEventListener('load', cb);\n  });\n}\n\n/**\n * Sets up an event listener for the resize event that sends the new frame\n * height to the host.\n *\n * @returns {void}\n * @example\n *\n * // every time the frame is resized, tell the host page what its new height is\n * sendHeightOnResize();\n */\nfunction sendHeightOnResize() {\n  window.addEventListener('resize', () => sendFrameHeight());\n}\n\n/**\n * Sends height updates to the host page on an interval.\n *\n * @param {number} [delay] How long to set the interval\n * @returns {void}\n * @example\n *\n * // will call sendFrameHeight every 300ms\n * sendHeightOnPoll();\n *\n * // will call sendFrameHeight every 150ms\n * sendHeightOnPoll(150);\n */\nfunction sendHeightOnPoll(delay = 300) {\n  setInterval(sendFrameHeight, delay);\n}\n\n/**\n * A helper for running the standard functions for setting up a frame.\n *\n * Automatically calls an sendFrameHeight, sendHeightOnLoad and sendHeightOnResize.\n *\n * @returns {void}\n * @example\n *\n * initFrame();\n */\nfunction initFrame() {\n  sendFrameHeight();\n  sendHeightOnLoad();\n  sendHeightOnResize();\n}\n\n/**\n * Initializes a frame, then sets up a poll to continue to update on an interval.\n *\n * @param {number} [delay] An optional custom delay to pass to sendHeightOnPoll\n * @returns {void}\n * @example\n *\n * // calls initFrame, then calls sendHeightOnPoll\n * initFrameAndPoll();\n */\nfunction initFrameAndPoll(delay) {\n  initFrame();\n  sendHeightOnPoll(delay);\n}\n\nexport {\n  initFrame,\n  initFrameAndPoll,\n  sendFrameHeight,\n  sendHeightOnLoad,\n  sendHeightOnPoll,\n  sendHeightOnResize,\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}","// 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}));"],"sourceRoot":""}