{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"React\"","webpack:///./src/main/webapp/src/utils.js","webpack:///./src/main/webapp/src/books.js","webpack:///./src/main/webapp/src/widgets/ErrorWidget.jsx","webpack:///./src/main/webapp/src/widgets/Checks.jsx","webpack:///./src/main/webapp/src/request/json.js","webpack:///./node_modules/query-string/index.js","webpack:///./src/main/webapp/src/context/env.js","webpack:///./src/main/webapp/src/feature-test.js","webpack:///./node_modules/array-find-index/index.js","webpack:///../../src/parse/strip-accents.ts","webpack:///../../src/parse/split-lineup-player-name.ts","webpack:///../../src/parse/upper-caser.ts","webpack:///./src/main/webapp/src/fetch.js","webpack:///external \"ReactDOM\"","webpack:///../src/MatchUtils.ts","webpack:///../src/dates.ts","webpack:///./node_modules/lodash/isObject.js","webpack:///./node_modules/lodash/_root.js","webpack:///./node_modules/lodash/_Symbol.js","webpack:///./node_modules/lodash/debounce.js","webpack:///./src/main/webapp/src/polyfills.promise-allsettled.js","webpack:///../src/strings.ts","webpack:///../src/parameter-validation.ts","webpack:///../src/points-scored.ts","webpack:///../src/PlayerUtils.ts","webpack:///../../src/parse/pen-pics-line-handler.ts","webpack:///../src/career-records.ts","webpack:///../../../src/parse/wtcc/key-generators.ts","webpack:///../../../src/parse/still-crowing/key-generators.ts","webpack:///../../../src/parse/stormy-sixties/key-generators.ts","webpack:///./node_modules/strict-uri-encode/index.js","webpack:///./node_modules/decode-uri-component/index.js","webpack:///./node_modules/split-on-first/index.js","webpack:///./node_modules/lodash/now.js","webpack:///./node_modules/lodash/_freeGlobal.js","webpack:///(webpack)/buildin/global.js","webpack:///./node_modules/lodash/toNumber.js","webpack:///./node_modules/lodash/isSymbol.js","webpack:///./node_modules/lodash/_baseGetTag.js","webpack:///./node_modules/lodash/_getRawTag.js","webpack:///./node_modules/lodash/_objectToString.js","webpack:///./node_modules/lodash/isObjectLike.js","webpack:///./src/main/webapp/src/services/service-worker.js","webpack:///./src/main/webapp/src/services/post-message.js","webpack:///./src/main/webapp/src/AddToHomeScreenElement.js","webpack:///./src/main/webapp/src/sw-api.js","webpack:///./node_modules/react-share/src/utils/iconFactory.jsx","webpack:///./node_modules/react-share/src/FacebookIcon.js","webpack:///./node_modules/react-share/src/TwitterIcon.js","webpack:///./node_modules/react-share/src/EmailIcon.js","webpack:///./src/main/webapp/src/widgets/SocialIcons.jsx","webpack:///./src/main/webapp/src/widgets/PlayerStats/PlayerLink.jsx","webpack:///./src/main/webapp/src/array.js","webpack:///./src/main/webapp/src/widgets/MatchStats/MatchLineupRowWidget.jsx","webpack:///./src/main/webapp/src/widgets/MatchStats/MatchLineupWidget.jsx","webpack:///./src/main/webapp/src/widgets/MatchStats/MatchWidget.jsx","webpack:///./src/main/webapp/src/widgets/loadIntoState.js","webpack:///./src/main/webapp/src/widgets/LoadingImage.jsx","webpack:///./node_modules/@babel/runtime/helpers/esm/extends.js","webpack:///./node_modules/resolve-pathname/esm/resolve-pathname.js","webpack:///./node_modules/tiny-invariant/dist/tiny-invariant.esm.js","webpack:///./node_modules/history/esm/history.js","webpack:///./src/main/webapp/src/widgets/History.jsx","webpack:///./src/main/webapp/src/widgets/MatchStats/MatchLink.jsx","webpack:///./src/main/webapp/src/State.jsx","webpack:///./src/main/webapp/src/WindowResizeWidget.jsx","webpack:///./src/main/webapp/src/widgets/MatchStats/MatchStatsPageWidget.jsx","webpack:///./src/main/webapp/src/widgets/MatchList/MatchListDateHeaderWidget.jsx","webpack:///./src/main/webapp/src/widgets/MatchList/MatchListWidget.jsx","webpack:///./src/main/webapp/src/widgets/BookIcon.jsx","webpack:///./src/main/webapp/src/widgets/BookIconLinks.jsx","webpack:///./src/main/webapp/src/is.js","webpack:///./src/main/webapp/src/widgets/MatchList/MatchListsPageWidget.jsx","webpack:///./src/main/webapp/src/widgets/PenPics/PenPicLink.jsx","webpack:///./src/main/webapp/src/widgets/PenPics/PenPicImg.jsx","webpack:///./src/main/webapp/src/widgets/PlayerStats/PlayerStatsWidget.jsx","webpack:///./src/main/webapp/src/widgets/PlayerStats/PlayerStatsPageWidget.jsx","webpack:///./src/main/webapp/src/widgets/PenPics/PenPicWidget.jsx","webpack:///./src/main/webapp/src/widgets/PenPics/PenPicsPageWidget.jsx","webpack:///./src/main/webapp/src/widgets/CareerStatistics/CareerStatisticsWidget.jsx","webpack:///./src/main/webapp/src/widgets/CareerStatistics/CareerStatisticsPageWidget.jsx","webpack:///./src/main/webapp/src/widgets/CareerRecords/CareerRecordsTableWidget.jsx","webpack:///./src/main/webapp/src/widgets/CareerRecords/CareerRecordsWidget2.jsx","webpack:///./src/main/webapp/src/widgets/CareerRecords/CareerRecordsPageWidget.jsx","webpack:///./src/main/webapp/src/widgets/AppConfig/AddToHomeScreenWidget.jsx","webpack:///./src/main/webapp/src/widgets/AppConfig/OfflineCacheWidget.jsx","webpack:///./src/main/webapp/src/services/offline-cache.js","webpack:///./src/main/webapp/src/services/urlBase64ToUint8Array.js","webpack:///./src/main/webapp/src/services/notifications.js","webpack:///./src/main/webapp/src/widgets/AppConfig/NotificationsWidget.jsx","webpack:///./src/main/webapp/src/widgets/AppConfig/AppConfigPageWidget.jsx","webpack:///./src/main/webapp/src/widgets/Admin/AdminPageWidget.jsx","webpack:///./src/main/webapp/src/widgets/Timeline/useJSONData.js","webpack:///./src/main/webapp/src/widgets/Timeline/TimelinePageWidget.jsx","webpack:///./src/main/webapp/src/main.jsx"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","1","__webpack_require__","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","p","jsonpScriptSrc","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","window","oldJsonpFunction","slice","s","React","MatchUtils","require","PlayerUtils","careerRecordsLists","wtcc","keyGenerators","stillCrowing","stormySixties","dates","getPlayerKeyGenerators","book","findBookIdx","books","bookOrBookKey","bookKey","findIndex","findPlayerIdxForPenPic","penPicsData","playerKey","playerKeyGenerator","penPicsPlayerKeyGenerator","penPic","findBookForDate","matchDate","matchDateTime","parseDDMMYYYY","bookIdx","startDate","getTime","ErrorWidget","Component","render","this","props","style","background","color","border","borderRadius","fontWeight","padding","Tick","Cross","async","postJSON","input","body","init","defaultInit","method","headers","JSON","stringify","fetch","throwIfBadResponse","response","text","parse","status","getErrorMessage","ob","String","strictUriEncode","decodeComponent","splitOnFirst","validateArrayFormatSeparator","TypeError","encode","options","strict","encodeURIComponent","decode","removeHash","hashStart","indexOf","extract","queryStart","parseValue","parseNumbers","Number","isNaN","trim","parseBooleans","toLowerCase","assign","sort","arrayFormat","arrayFormatSeparator","formatter","result","accumulator","exec","replace","concat","newValue","split","map","item","parserForArrayFormat","ret","param","keys","k","reduce","Boolean","Array","isArray","keysSorter","a","b","index","skipNull","join","encoderForArrayFormat","objectCopy","filter","x","parseUrl","url","query","stringifyUrl","queryFromUrl","parsedQueryFromUrl","hash","getHash","queryString","EnvContext","createContext","Consumer","Provider","withEnv","wrapped","env","displayName","isBeforeInstallPromptSupported","isNotificationsSupported","isOfflineCacheSupported","isPushMessagesSupported","arr","predicate","ctx","list","len","opts","fetchMatches","fetchPenPics","fetchPenPicsImgs","fetchKeysToFullNames","fetchJSON","matchDataUrl","penPicsDataUrl","penPicsImgsUrl","keysToFullNamesUrl","results","allSettled","failedFetches","_","failedNames","matches","penPics","penPicsImgs","keysToFullNames","ReactDOM","us","playerAndMatches","INVALID_DATE","Date","dd","mm","yyyy","date","freeGlobal","freeSelf","self","root","Function","isObject","now","toNumber","nativeMax","Math","max","nativeMin","min","func","wait","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","time","args","thisArg","apply","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","arguments","cancel","flush","wrappedPromises","it","then","val","reason","fromFront","setBoolean","fromEnd","removeCharsFromEnds","chars","fromStart","str","padStr","substring","firstName","lastName","player","firstNameLastNamePlayerKeyGenerator","DUPLICATE_LAST_NAMES_UPPER","first","charCodeAt","toString","toUpperCase","singleMatcher","RegExp","multiMatcher","decodeComponents","components","decodeURIComponent","left","right","tokens","match","encodedURI","replaceMap","entries","customDecodeURIComponent","string","separator","separatorIndex","global","g","isSymbol","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","other","valueOf","isBinary","test","baseGetTag","isObjectLike","getRawTag","objectToString","symToStringTag","objectProto","nativeObjectToString","isOwn","tag","unmasked","getServiceWorkerRegistration","navigator","serviceWorker","ready","postMessage","msg","sw","controller","registration","active","getServiceWorker","chan","MessageChannel","port1","onmessage","port2","AddToHomeScreenElement","constructor","logger","addToHomeScreenImgClass","$parent","onClickAddToHome","setBeforeInstallPromptEvent","beforeinstallprompt","log","preventDefault","prompt","choiceResult","userChoice","outcome","icon","element","find","addElement","html","$","prepend","on","maybeAddElement","performance","jQueryPromise","pollInterval","start","check","waitForGlobal","showUpdateUI","updateAppMenuItem","getElementById","onClick","waiting","removeEventListener","addEventListener","sbMenu","querySelector","appConfigMenuItem","insertBefore","serviceWorkerRegisterSuccess","scope","githash","timestamp","el","innerText","setServiceWorkerVersionInMenu","preventDevToolsReloadLoop","location","reload","css","showAppConfigMenu","callback","listenForInstallingWorkerStateChange","installing","state","onNewServiceWorker","addToHomeScreenElement","beforeInstallPrompt","registerServiceWorker","register","registerBeforeInstallPrompt","iconFactory","network","iconConfig","Icon","className","iconBgStyle","logoFillColor","round","size","baseStyle","width","height","classes","viewBox","cx","cy","fill","defaultProps","FacebookIcon","mask","TwitterIcon","EmailIcon","inlineIcon","href","display","textAlign","paddingLeft","paddingRight","SocialIcons","tableLayout","PlayerLink","children","lineupPlayerKeyGenerator","params","qs","intersperse","getItem","existingItem","interspersed","arr2","addBefore","addAfter","MatchLineupRowWidget","super","onClickPlayer1","onClickPlayer2","player1","number","player2","reservesCell","reserves","home","cellClassName","subsCell","subs","renderPlayerLinkPredicate","sub","renderPlayerLink","span","playerCell","useBreak","line1","line2","narrowMode","capt","team","centreCell","reserves1","reserves2","subs1","subs2","centreCellValue","MatchLineupWidget","renderPlayerRows","rows","numPlayers","team1","lineup","team2","lineup1","lineup2","p1","p2","row","onLineupRowClicked","renderScorerRows","mapScorersToElements","scorers","HA","scorer","amount","NON_BREAKING_SPACE","amountStr","displayType","scorerElements1","scorerElements2","franceAtHome","reservesOrSubsRow","cellSpacing","cellPadding","MatchImage","filename","toISOString","imgSrc","maxWidth","maxHeight","MatchWidget","prevLink","nextLink","dateStr","competitionStr","competition","noop","prevLinkClick","nextLinkClick","nameAndScore","score","misc","venue","loadIntoState","component","stateSupplier","loadingFlagName","errorStateName","setState","newState","LoadingImage","verticalAlign","_extends","source","isAbsolute","pathname","charAt","spliceOne","pop","resolvePathname","to","from","hasTrailingSlash","toParts","fromParts","isToAbs","isFromAbs","mustEndAbs","last","up","part","unshift","substr","invariant","condition","addLeadingSlash","path","stripBasename","prefix","hasBasename","stripTrailingSlash","createPath","search","createLocation","currentLocation","hashIndex","searchIndex","parsePath","decodeURI","URIError","createTransitionManager","listeners","setPrompt","nextPrompt","confirmTransitionTo","action","getUserConfirmation","appendListener","fn","isActive","listener","notifyListeners","_len","_key","forEach","canUseDOM","getConfirmation","confirm","getHistoryState","history","createBrowserHistory","ua","globalHistory","canUseHistory","userAgent","needsHashChangeListener","_props","_props$forceRefresh","forceRefresh","_props$getUserConfirm","_props$keyLength","keyLength","basename","getDOMLocation","historyState","_ref","_window$location","createKey","random","transitionManager","nextState","handlePopState","isExtraneousPopstateEvent","handlePop","handleHashChange","forceNextPop","ok","fromLocation","toLocation","toIndex","allKeys","fromIndex","delta","go","revertPop","initialLocation","createHref","listenerCount","checkDOMListeners","isBlocked","pushState","prevIndex","nextKeys","replaceState","goBack","goForward","block","unblock","listen","unlisten","History","handleHistory","createHistory","componentDidMount","componentWillUnmount","initial","componentDidUpdate","prevProps","prevState","onHistoryChange","stateChanged","pushParams","newParams","merge","MatchLink","setBook","_fetch","makeState","newBookIdx","setBookForDate","setBookAndPlayer","localeCompare","sortPenPics","playerIdx","WindowResizeWidget","handleResize","debounce","resizeCategoryCallback","container","off","ref","MatchStatsPageWidget","resizeCategory","queryDateToMatchDate","queryDate","formatDDMMYYYY","matchDateToQueryDate","onClickNextPrev","matchIdx","findMatch","newMatchIdx","newNarrowMode","renderWithHistory","loading","loadingError","match0","MatchListDateHeaderWidget","MatchListWidget","renderMatchListItem","renderMatchLinks","MM","displayDate","dateClass","venueClass","renderMatchListItems","oldYear","items","id","iconSrc","BookIcon","title","alt","BookIconLinks","selectedBookKey","isUndefined","isNull","paddingBottom","MatchListsPageWidget","onBookClick","newBookKey","mainComponent","PenPicLink","PenPicImg","onImgLoaded","sendTiming","penPicImgUrl","onLoad","scoreDom","showZero","AppearanceRow1","idx","appearance","renderMatchLink","whiteSpace","versus","scores","tries","goals","drops","AppearanceRow2","colSpan","YearRow","year","PlayerStatsWidget","makeAppearances","stats","appearanceWithDisplayDate","renderPlayerStats","sum","appearances","getPlayerInfo","createPlayerAndMatchMap","flattenMatches","them","getUsAndThem","getPlayerStatsForMatches","playerName","PlayerStatsPageWidget","generatePlayerKey","playerKeyGenerators","fullName","playerFullName","PenPicWidget","onPrevClick","onNextClick","penPicData","penPicImg","showPrevLink","showNextLink","data-player-key","data-display-name","line","PenPicsPageWidget","nextPrevClick","newPlayerIdx","FRANCE_TEAM_NAMES","CareerDetailsLineWidget","details","CareerStatisticsWidget","playerContent","lines","usAndThem","statsStr","getPlayerStatsForTeamStr","statsPerYear","widgets","yearStr","YY","detailsAndCommas","stat","players","playerList","matchArr","allStats","pts","getPlayerList","playerAndMatchMap","isFrance","teamName","fullNameStr","playerAndMatches1","playerAndMatches2","shouldComponentUpdate","nextProps","CareerStatisticsPageWidget","CareerRecordsTableWidget","renderRow","rank","statName","prevRank","StatTypeLink","CareerRecordsWidget","onStatTypeLinkClick","statType","heading","filterByMatchTeamPlayer","listSize","lists","views","ViewLink","view","CareerRecordsPageWidget","viewIdx","onViewLinkClick","viewsForBook","linkDiv","links","HomeScreenIcon","AddToHomeScreenWidget","OfflineCacheWidget","offlineCacheSupported","offlineCacheInUse","populateCacheResult","populateAppCache","cachedResources","clearAppCache","plural","num","postfix","toggleUseOfflineCache","catch","renderSupported","renderNotSupported","urlBase64ToUint8Array","base64String","base64","repeat","rawData","atob","outputArray","Uint8Array","unsubscribe","subscription","getSubscription","pushManager","WithDefaultPermission","requestingPermission","requestPermission","onPermissionChange","permission","permissionResult","Notification","disabled","WithDeniedPermission","WithGrantedPermission","testNotificationError","subscribed","subscriptionChanging","subscribeError","unsubscribeError","setSubscriptionState","additionalState","onClickSubscribe","subscribeUrl","subscribe","userVisibleOnly","applicationServerKey","plainSubscription","subscribeEndpoint","serverSubscribe","onClickUnsubscribe","unsubscribeUrl","unsubscribeEndpoint","serverUnsubscribe","showNotification","NotificationsWidget","renderUnsupported","AppConfigPageWidget","host","AdminPageWidget","default","AdminWidget","useJSONData","setData","useState","setError","setLoading","useEffect","json","effect","asJson","prop","ob2","WTCCTiming","HtmlStartMs","record","submit","_navigation","_timing","Timeline","TL","timeline","initialize","timelineContainerElement","timelineData","addFlags","timelineDataCopy","setHeight","timelineOptions","hash_bookmark","scale_factor","patchTimeMarkerData","events","TLTimelineLoaded","_storyslider","_slides","parseMatchSummary","summary","score1","score2","getMarkerHeadline","france","oppo","headline","flag","media","thumbnail","_patchTimeMarkerData","TimeMarker","data2","Util","mergeData","getComputedStyle","onWindowResize","updateDisplay","TimelineWidget","timelineContainerRef","useRef","timelineRef","current","TimelineSelectionWidget","TimelinePageWidget","pages","PlayerStatsPage","MatchStatsPage","MatchListsPage","PenPicsPage","CareerStatisticsPage","CareerRecordsPage","AdminPage","TimelinePage","AppConfigPage","__APP_CONFIG__","page","dom","wtccGlobal","utils","swAPI"],"mappings":"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","file":"main.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({\"0\":\"AdminWidget\"}[chunkId]||chunkId) + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/dist/modern/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 43);\n","module.exports = React;","// come out of site/src/main/webapp/src and into extract-stats\r\n\r\nconst MatchUtils = require(\"../../../../../extract-stats/build/MatchUtils\");\r\nconst PlayerUtils = require(\"../../../../../extract-stats/build/PlayerUtils\");\r\nconst { careerRecordsLists } = require(\"../../../../../extract-stats/build/career-records\");\r\nconst wtcc = {\r\n keyGenerators: require(\"../../../../../extract-stats/build/parse/wtcc/key-generators\"),\r\n};\r\nconst stillCrowing = {\r\n keyGenerators: require(\"../../../../../extract-stats/build/parse/still-crowing/key-generators\"),\r\n};\r\nconst stormySixties = {\r\n keyGenerators: require(\"../../../../../extract-stats/build/parse/stormy-sixties/key-generators\"),\r\n};\r\nconst dates = require(\"../../../../../extract-stats/build/dates\");\r\n\r\nmodule.exports = {\r\n MatchUtils,\r\n PlayerUtils,\r\n careerRecordsLists,\r\n wtcc,\r\n stillCrowing,\r\n stormySixties,\r\n dates,\r\n};\r\n","import findIndex from \"array-find-index\";\r\n\r\nimport { wtcc, stillCrowing, stormySixties, dates } from \"./utils\";\r\n\r\n/**\r\n * A book.\r\n * @typedef {Object} Book\r\n * @property {string} key\r\n */\r\n\r\n/**\r\n * A pen pic.\r\n * @typedef {Object} PenPic\r\n * @property {string} name\r\n * @property {string} team\r\n * @property {string} text\r\n */\r\n\r\nexport function getPlayerKeyGenerators(book) {\r\n const bookKey = (book && typeof book !== \"string\") ? book.key : book;\r\n switch (bookKey) {\r\n case \"still-crowing\": return stillCrowing.keyGenerators;\r\n case \"stormy-sixties\": return stormySixties.keyGenerators;\r\n default: return wtcc.keyGenerators;\r\n }\r\n}\r\n\r\n/**\r\n * @param {Book[]} books\r\n * @param {string|Book} bookOrBookKey\r\n * @return {number}\r\n */\r\nexport function findBookIdx(books, bookOrBookKey) {\r\n const bookKey = (bookOrBookKey && typeof bookOrBookKey !== \"string\") ? bookOrBookKey.key : bookOrBookKey;\r\n return findIndex(books, (book) => book.key === bookKey);\r\n}\r\n\r\n/**\r\n * @param {PenPic[]} penPicsData\r\n * @param {string} playerKey\r\n * @param {Book} book\r\n * @return {number}\r\n */\r\nexport function findPlayerIdxForPenPic(penPicsData, playerKey, book) {\r\n const playerKeyGenerator = getPlayerKeyGenerators(book).penPicsPlayerKeyGenerator;\r\n return findIndex(penPicsData, (penPic) => playerKeyGenerator(penPic) === playerKey);\r\n}\r\n\r\n/**\r\n * @param {Book[]} books\r\n * @param {string} matchDate\r\n * @return {number}\r\n */\r\nexport function findBookForDate(books, matchDate) {\r\n if (!matchDate) {\r\n throw new Error(`matchDate cannot be falsy [${matchDate}]`);\r\n }\r\n const matchDateTime = dates.parseDDMMYYYY(matchDate);\r\n for (let bookIdx = books.length - 1; bookIdx >= 0; bookIdx--) {\r\n // dates.parseDDMMYYYY() actually parses a DD/MM/YYYY style date.\r\n const startDate = dates.parseDDMMYYYY(books[bookIdx].startDate);\r\n if (matchDateTime >= startDate.getTime()) {\r\n return bookIdx;\r\n }\r\n }\r\n return -1;\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nclass ErrorWidget extends Component {\r\n render() {\r\n const { message } = this.props;\r\n const style = {\r\n background: \"#f8d7da\",\r\n color: \"#721c24\",\r\n border: \"solid 1px #f5c6cb\",\r\n borderRadius: \".25rem\",\r\n fontWeight: \"bold\",\r\n padding: \"4px\",\r\n };\r\n if (!message) {\r\n return null;\r\n }\r\n // If message is an Error then it will have a message property.\r\n return (\r\n
{message.message || message}
\r\n );\r\n }\r\n}\r\n\r\nErrorWidget.propTypes = {\r\n message: PropTypes.oneOfType([\r\n PropTypes.instanceOf(Error),\r\n PropTypes.string,\r\n ]),\r\n};\r\n\r\nexport default ErrorWidget;\r\n","import React from \"react\";\r\n\r\n// unicode HEAVY CHECK MARK\r\nexport const Tick = () => {\"\\u2713\"};\r\n\r\n// unicode HEAVY BALLOT X\r\nexport const Cross = () => {\"\\u2717\"};\r\n","// https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\r\nexport async function postJSON(input, body, init) {\r\n const defaultInit = {\r\n method: \"POST\",\r\n headers: {\r\n \"Accept\": \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n },\r\n };\r\n if (body) {\r\n defaultInit.body = JSON.stringify(body);\r\n }\r\n return fetch(input, {\r\n ...defaultInit,\r\n ...init,\r\n });\r\n}\r\n\r\nexport async function throwIfBadResponse(response) {\r\n let body = await response.text();\r\n try {\r\n body = JSON.parse(body);\r\n } catch (e) {\r\n // ignore\r\n }\r\n if (response.status < 200 || response.status >= 300) {\r\n throw body;\r\n }\r\n return body;\r\n}\r\n\r\nexport function getErrorMessage(ob) {\r\n const err = ob;\r\n if (typeof err === \"string\") {\r\n return err;\r\n }\r\n if (err instanceof Error) {\r\n return err.message;\r\n }\r\n if (err.error) {\r\n return getErrorMessage(err.error);\r\n }\r\n return String(err);\r\n}\r\n","'use strict';\nconst strictUriEncode = require('strict-uri-encode');\nconst decodeComponent = require('decode-uri-component');\nconst splitOnFirst = require('split-on-first');\n\nfunction encoderForArrayFormat(options) {\n\tswitch (options.arrayFormat) {\n\t\tcase 'index':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tconst index = result.length;\n\t\t\t\tif (value === undefined || (options.skipNull && value === null)) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, [encode(key, options), '[', index, ']'].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\t...result,\n\t\t\t\t\t[encode(key, options), '[', encode(index, options), ']=', encode(value, options)].join('')\n\t\t\t\t];\n\t\t\t};\n\n\t\tcase 'bracket':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (value === undefined || (options.skipNull && value === null)) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, [encode(key, options), '[]'].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [...result, [encode(key, options), '[]=', encode(value, options)].join('')];\n\t\t\t};\n\n\t\tcase 'comma':\n\t\tcase 'separator':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (value === null || value === undefined || value.length === 0) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (result.length === 0) {\n\t\t\t\t\treturn [[encode(key, options), '=', encode(value, options)].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [[result, encode(value, options)].join(options.arrayFormatSeparator)];\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (value === undefined || (options.skipNull && value === null)) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, encode(key, options)];\n\t\t\t\t}\n\n\t\t\t\treturn [...result, [encode(key, options), '=', encode(value, options)].join('')];\n\t\t\t};\n\t}\n}\n\nfunction parserForArrayFormat(options) {\n\tlet result;\n\n\tswitch (options.arrayFormat) {\n\t\tcase 'index':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /\\[(\\d*)\\]$/.exec(key);\n\n\t\t\t\tkey = key.replace(/\\[\\d*\\]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = {};\n\t\t\t\t}\n\n\t\t\t\taccumulator[key][result[1]] = value;\n\t\t\t};\n\n\t\tcase 'bracket':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /(\\[\\])$/.exec(key);\n\t\t\t\tkey = key.replace(/\\[\\]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = [value];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\n\t\tcase 'comma':\n\t\tcase 'separator':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tconst isArray = typeof value === 'string' && value.split('').indexOf(options.arrayFormatSeparator) > -1;\n\t\t\t\tconst newValue = isArray ? value.split(options.arrayFormatSeparator).map(item => decode(item, options)) : value === null ? value : decode(value, options);\n\t\t\t\taccumulator[key] = newValue;\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\t}\n}\n\nfunction validateArrayFormatSeparator(value) {\n\tif (typeof value !== 'string' || value.length !== 1) {\n\t\tthrow new TypeError('arrayFormatSeparator must be single character string');\n\t}\n}\n\nfunction encode(value, options) {\n\tif (options.encode) {\n\t\treturn options.strict ? strictUriEncode(value) : encodeURIComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction decode(value, options) {\n\tif (options.decode) {\n\t\treturn decodeComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction keysSorter(input) {\n\tif (Array.isArray(input)) {\n\t\treturn input.sort();\n\t}\n\n\tif (typeof input === 'object') {\n\t\treturn keysSorter(Object.keys(input))\n\t\t\t.sort((a, b) => Number(a) - Number(b))\n\t\t\t.map(key => input[key]);\n\t}\n\n\treturn input;\n}\n\nfunction removeHash(input) {\n\tconst hashStart = input.indexOf('#');\n\tif (hashStart !== -1) {\n\t\tinput = input.slice(0, hashStart);\n\t}\n\n\treturn input;\n}\n\nfunction getHash(url) {\n\tlet hash = '';\n\tconst hashStart = url.indexOf('#');\n\tif (hashStart !== -1) {\n\t\thash = url.slice(hashStart);\n\t}\n\n\treturn hash;\n}\n\nfunction extract(input) {\n\tinput = removeHash(input);\n\tconst queryStart = input.indexOf('?');\n\tif (queryStart === -1) {\n\t\treturn '';\n\t}\n\n\treturn input.slice(queryStart + 1);\n}\n\nfunction parseValue(value, options) {\n\tif (options.parseNumbers && !Number.isNaN(Number(value)) && (typeof value === 'string' && value.trim() !== '')) {\n\t\tvalue = Number(value);\n\t} else if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) {\n\t\tvalue = value.toLowerCase() === 'true';\n\t}\n\n\treturn value;\n}\n\nfunction parse(input, options) {\n\toptions = Object.assign({\n\t\tdecode: true,\n\t\tsort: true,\n\t\tarrayFormat: 'none',\n\t\tarrayFormatSeparator: ',',\n\t\tparseNumbers: false,\n\t\tparseBooleans: false\n\t}, options);\n\n\tvalidateArrayFormatSeparator(options.arrayFormatSeparator);\n\n\tconst formatter = parserForArrayFormat(options);\n\n\t// Create an object with no prototype\n\tconst ret = Object.create(null);\n\n\tif (typeof input !== 'string') {\n\t\treturn ret;\n\t}\n\n\tinput = input.trim().replace(/^[?#&]/, '');\n\n\tif (!input) {\n\t\treturn ret;\n\t}\n\n\tfor (const param of input.split('&')) {\n\t\tlet [key, value] = splitOnFirst(options.decode ? param.replace(/\\+/g, ' ') : param, '=');\n\n\t\t// Missing `=` should be `null`:\n\t\t// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n\t\tvalue = value === undefined ? null : options.arrayFormat === 'comma' ? value : decode(value, options);\n\t\tformatter(decode(key, options), value, ret);\n\t}\n\n\tfor (const key of Object.keys(ret)) {\n\t\tconst value = ret[key];\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tfor (const k of Object.keys(value)) {\n\t\t\t\tvalue[k] = parseValue(value[k], options);\n\t\t\t}\n\t\t} else {\n\t\t\tret[key] = parseValue(value, options);\n\t\t}\n\t}\n\n\tif (options.sort === false) {\n\t\treturn ret;\n\t}\n\n\treturn (options.sort === true ? Object.keys(ret).sort() : Object.keys(ret).sort(options.sort)).reduce((result, key) => {\n\t\tconst value = ret[key];\n\t\tif (Boolean(value) && typeof value === 'object' && !Array.isArray(value)) {\n\t\t\t// Sort object keys, not values\n\t\t\tresult[key] = keysSorter(value);\n\t\t} else {\n\t\t\tresult[key] = value;\n\t\t}\n\n\t\treturn result;\n\t}, Object.create(null));\n}\n\nexports.extract = extract;\nexports.parse = parse;\n\nexports.stringify = (object, options) => {\n\tif (!object) {\n\t\treturn '';\n\t}\n\n\toptions = Object.assign({\n\t\tencode: true,\n\t\tstrict: true,\n\t\tarrayFormat: 'none',\n\t\tarrayFormatSeparator: ','\n\t}, options);\n\n\tvalidateArrayFormatSeparator(options.arrayFormatSeparator);\n\n\tconst formatter = encoderForArrayFormat(options);\n\n\tconst objectCopy = Object.assign({}, object);\n\tif (options.skipNull) {\n\t\tfor (const key of Object.keys(objectCopy)) {\n\t\t\tif (objectCopy[key] === undefined || objectCopy[key] === null) {\n\t\t\t\tdelete objectCopy[key];\n\t\t\t}\n\t\t}\n\t}\n\n\tconst keys = Object.keys(objectCopy);\n\n\tif (options.sort !== false) {\n\t\tkeys.sort(options.sort);\n\t}\n\n\treturn keys.map(key => {\n\t\tconst value = object[key];\n\n\t\tif (value === undefined) {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (value === null) {\n\t\t\treturn encode(key, options);\n\t\t}\n\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value\n\t\t\t\t.reduce(formatter(key), [])\n\t\t\t\t.join('&');\n\t\t}\n\n\t\treturn encode(key, options) + '=' + encode(value, options);\n\t}).filter(x => x.length > 0).join('&');\n};\n\nexports.parseUrl = (input, options) => {\n\treturn {\n\t\turl: removeHash(input).split('?')[0] || '',\n\t\tquery: parse(extract(input), options)\n\t};\n};\n\nexports.stringifyUrl = (input, options) => {\n\tconst url = removeHash(input.url).split('?')[0] || '';\n\tconst queryFromUrl = exports.extract(input.url);\n\tconst parsedQueryFromUrl = exports.parse(queryFromUrl);\n\tconst hash = getHash(input.url);\n\tconst query = Object.assign(parsedQueryFromUrl, input.query);\n\tlet queryString = exports.stringify(query, options);\n\tif (queryString) {\n\t\tqueryString = `?${queryString}`;\n\t}\n\n\treturn `${url}${queryString}${hash}`;\n};\n","import React from \"react\";\r\n\r\nconst EnvContext = React.createContext({});\r\n\r\nexport const { Consumer, Provider } = EnvContext;\r\n\r\nexport function withEnv(Component) {\r\n const wrapped = function(props) {\r\n return (\r\n \r\n {(env) => }\r\n \r\n );\r\n };\r\n wrapped.displayName = \"Wrapped\" + (Component.displayName || \"UnknownComponent\");\r\n return wrapped;\r\n}\r\n\r\nexport default EnvContext;\r\n","function isBeforeInstallPromptSupported() {\r\n return \"BeforeInstallPromptEvent\" in window;\r\n}\r\n\r\nfunction isOfflineCacheSupported() {\r\n return \"caches\" in window;\r\n}\r\n\r\nfunction isNotificationsSupported() {\r\n return \"Notification\" in window;\r\n}\r\n\r\nfunction isPushMessagesSupported() {\r\n return \"PushManager\" in window;\r\n}\r\n\r\nmodule.exports = {\r\n isBeforeInstallPromptSupported,\r\n isNotificationsSupported,\r\n isOfflineCacheSupported,\r\n isPushMessagesSupported,\r\n};\r\n","'use strict';\nmodule.exports = function (arr, predicate, ctx) {\n\tif (typeof Array.prototype.findIndex === 'function') {\n\t\treturn arr.findIndex(predicate, ctx);\n\t}\n\n\tif (typeof predicate !== 'function') {\n\t\tthrow new TypeError('predicate must be a function');\n\t}\n\n\tvar list = Object(arr);\n\tvar len = list.length;\n\n\tif (len === 0) {\n\t\treturn -1;\n\t}\n\n\tfor (var i = 0; i < len; i++) {\n\t\tif (predicate.call(ctx, list[i], i, list)) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n};\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n/**\r\n * Only works with UPPERCASE strings!\r\n * @param s\r\n */\r\nfunction stripAccents(s) {\r\n return s.replace(/[ÉÈ]/g, \"E\").replace(/Ç/, \"C\").replace(/Ô/, \"O\");\r\n}\r\nexports.default = stripAccents;\r\n//# sourceMappingURL=strip-accents.js.map","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n/**\r\n * @param name Either \"lastName\" only, or \"firstName lastName\" (usually \"initial lastName\").\r\n */\r\nfunction splitLineupPlayerName(name, firstLast = true) {\r\n const parts = name.split(\" \");\r\n if (parts.length > 1) {\r\n const first = firstLast ? parts[0] : parts[1];\r\n const last = firstLast ? parts[1] : parts[0];\r\n return {\r\n last,\r\n first,\r\n };\r\n }\r\n return {\r\n first: \"\",\r\n last: name,\r\n };\r\n}\r\nexports.default = splitLineupPlayerName;\r\n//# sourceMappingURL=split-lineup-player-name.js.map","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n/**\r\n * Returns a function that returns the uppercase'd value that f() returns.\r\n *\r\n * @export\r\n * @param {IFunctionType} f\r\n * @returns {IFunctionType}\r\n */\r\nfunction toUpperCase(f) {\r\n return (...args) => {\r\n const fResult = f(...args);\r\n const result = fResult ? fResult.toUpperCase() : fResult;\r\n return result;\r\n };\r\n}\r\nexports.default = toUpperCase;\r\n//# sourceMappingURL=upper-caser.js.map","/**\r\n * Fetches book-specific data.\r\n * @param {Book[]} books The books array.\r\n * @param {number} bookIdx The index of the book to use.\r\n * @param {object} opts The fetch options - which data to fetch.\r\n * @return {object} The fetched data.\r\n */\r\nexport async function fetch(books, bookIdx, opts = {\r\n fetchMatches: false,\r\n fetchPenPics: false,\r\n fetchPenPicsImgs: false,\r\n fetchKeysToFullNames: false,\r\n}) {\r\n const book = books[bookIdx];\r\n if (!book) {\r\n throw new Error(`book not found for bookIdx=${bookIdx}`);\r\n }\r\n\r\n const fetchMatches = opts.fetchMatches ? fetchJSON(book.matchDataUrl) : null;\r\n const fetchPenPics = opts.fetchPenPics ? fetchJSON(book.penPicsDataUrl) : null;\r\n const fetchPenPicsImgs = opts.fetchPenPicsImgs ? fetchJSON(book.penPicsImgsUrl) : null;\r\n const fetchKeysToFullNames = opts.fetchKeysToFullNames ? fetchJSON(book.keysToFullNamesUrl) : null;\r\n\r\n const results = await Promise.allSettled([\r\n fetchMatches,\r\n fetchPenPics,\r\n fetchPenPicsImgs,\r\n fetchKeysToFullNames,\r\n ]);\r\n\r\n const failedFetches = [\r\n \"matches\",\r\n \"pen pics\",\r\n \"pen pic images\",\r\n \"player names\",\r\n ]\r\n .filter((_, i) => results[i].status === \"rejected\");\r\n if (failedFetches.length > 0) {\r\n const failedNames = failedFetches.map((name) => `\"${name}\"`).join(\", \");\r\n throw new Error(`Failed to fetch data for ${failedNames}`);\r\n }\r\n\r\n const [matches, penPics, penPicsImgs, keysToFullNames] = results.map(({ value }) => value);\r\n\r\n return {\r\n bookIdx,\r\n matches,\r\n penPics,\r\n penPicsImgs,\r\n keysToFullNames,\r\n };\r\n}\r\n","module.exports = ReactDOM;","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst dates_1 = require(\"./dates\");\r\nconst pv = require(\"./parameter-validation\");\r\nconst points_scored_1 = require(\"./points-scored\");\r\nconst NON_BREAKING_SPACE = \"\\u00A0\";\r\n// ----------\r\n// Model\r\n// ----------\r\n/**\r\n * @param teamName The team name to abbreviate.\r\n * @returns Abbreviated team name, if exists, else teamName.\r\n */\r\nfunction getTeamAbbrev(teamName) {\r\n pv.isNonEmptyString(\"teamName\", teamName);\r\n const abbrevs = {\r\n \"australia\": \"A\",\r\n \"british empire\": \"BE\",\r\n \"dominions\": \"D\",\r\n \"england\": \"E\",\r\n \"france\": \"F\",\r\n \"new zealand\": \"NZ\",\r\n \"other nationalities\": \"ON\",\r\n \"wales\": \"W\",\r\n \"rl xiii\": \"RL\",\r\n \"great britain\": \"GB\",\r\n };\r\n return abbrevs[teamName.toLowerCase()] || teamName;\r\n}\r\nexports.getTeamAbbrev = getTeamAbbrev;\r\nfunction getUsAndThem(match, usName) {\r\n let us = match.team1;\r\n let them = match.team2;\r\n if ((typeof usName === \"string\" && us.name !== usName) || (Array.isArray(usName) && usName.indexOf(us.name) < 0)) {\r\n us = match.team2;\r\n them = match.team1;\r\n }\r\n return {\r\n us,\r\n them,\r\n };\r\n}\r\nexports.getUsAndThem = getUsAndThem;\r\n/**\r\n *\r\n *\r\n * @param {any[]} matches\r\n * @param {IFilterByMatchTeamPlayer} [filterByMatchTeamPlayer]\r\n * @param {IPlayerKeyGenerator} [playerKeyGenerator]\r\n * @returns\r\n */\r\nfunction createPlayerAndMatchMap(matches, filterByMatchTeamPlayer, playerKeyGenerator) {\r\n // tslint:disable-next-line:no-shadowed-variable\r\n function addPlayersForMatch(playerKeyGenerator, playerAndMatchesMap, match, team) {\r\n if (!team) {\r\n throw Object.assign(new Error(\"Cannot get players from null team\"), { match });\r\n }\r\n if (!team.lineup) {\r\n throw Object.assign(new Error(\"Cannot get players from null team lineup\"), { match });\r\n }\r\n function maybeAdd(player, sub = false) {\r\n if (filterByMatchTeamPlayer && !filterByMatchTeamPlayer(match, team, player)) {\r\n return;\r\n }\r\n const key = playerKeyGenerator(player, team, match);\r\n const playerAndMatches = playerAndMatchesMap[key] || {\r\n player,\r\n matches: {},\r\n subMatches: {},\r\n nonPlayingSubMatches: {},\r\n };\r\n const year = dates_1.parseDDMMYYYY(match.date).getFullYear();\r\n if (sub) {\r\n if (typeof player.replaced === \"number\" && player.replaced >= 0) {\r\n playerAndMatches.subMatches[year] = playerAndMatches.subMatches[year] || [];\r\n playerAndMatches.subMatches[year].push(match);\r\n }\r\n else {\r\n playerAndMatches.nonPlayingSubMatches[year] = playerAndMatches.nonPlayingSubMatches[year] || [];\r\n playerAndMatches.nonPlayingSubMatches[year].push(match);\r\n }\r\n }\r\n else {\r\n playerAndMatches.matches[year] = playerAndMatches.matches[year] || [];\r\n playerAndMatches.matches[year].push(match);\r\n }\r\n playerAndMatchesMap[key] = playerAndMatches;\r\n }\r\n team.lineup.forEach((player) => maybeAdd(player));\r\n if (Array.isArray(team.subs)) {\r\n team.subs.forEach((player) => maybeAdd(player, true));\r\n }\r\n }\r\n if (!playerKeyGenerator) {\r\n // use both player name and team to group of player stats.\r\n playerKeyGenerator = (player) => player.name + \"/\" + player.team;\r\n }\r\n const playerAndMatchesMap = {};\r\n matches.forEach((match) => {\r\n addPlayersForMatch(playerKeyGenerator, playerAndMatchesMap, match, match.team1);\r\n addPlayersForMatch(playerKeyGenerator, playerAndMatchesMap, match, match.team2);\r\n });\r\n return playerAndMatchesMap;\r\n}\r\nexports.createPlayerAndMatchMap = createPlayerAndMatchMap;\r\nfunction getPlayerStatsForTeamStr(us, them, player, isSub = false) {\r\n const { themAbbrev, tries, goals, drops } = getPlayerStatsForTeam(us, them, player);\r\n const amount = (score) => score ? score.amount : 0;\r\n return getPlayerStatsStr(themAbbrev, amount(tries), amount(goals), amount(drops), isSub);\r\n}\r\nexports.getPlayerStatsForTeamStr = getPlayerStatsForTeamStr;\r\nfunction getPlayerStatsStr(themAbbrev, tries, goals, drops, isSub = false) {\r\n const singleScoreStr = (amount, scoreSuffix) => (amount > 1 ? amount : \"\") + scoreSuffix;\r\n const scores = [];\r\n if (tries) {\r\n scores.push(singleScoreStr(tries, \"t\"));\r\n }\r\n if (goals) {\r\n scores.push(singleScoreStr(goals, \"g\"));\r\n }\r\n if (drops) {\r\n scores.push(singleScoreStr(drops, \"dg\"));\r\n }\r\n if (scores.length > 0) {\r\n const isSubStr = isSub ? \"s,\" : \"\";\r\n return themAbbrev + \"(\" + isSubStr + scores.join(\",\") + \")\";\r\n }\r\n if (isSub) {\r\n return themAbbrev + \"(s)\";\r\n }\r\n return themAbbrev;\r\n}\r\nexports.getPlayerStatsStr = getPlayerStatsStr;\r\nfunction getPlayerStatsForTeam(us, them, player) {\r\n const isTheScorer = (scorer) => {\r\n if (scorer.name !== player.name) {\r\n // player name isn't the same. immediately rule it out.\r\n return false;\r\n }\r\n if (scorer.team) {\r\n // there's a team associated with the scorer, make sure it's the same.\r\n return scorer.team === player.team;\r\n }\r\n return true;\r\n };\r\n const tries = us.scorers.tries.filter(isTheScorer);\r\n const goals = us.scorers.goals.filter(isTheScorer);\r\n const drops = us.scorers.drops.filter(isTheScorer);\r\n const themAbbrev = getTeamAbbrev(them.name);\r\n return {\r\n themAbbrev,\r\n tries: tries[0],\r\n goals: goals[0],\r\n drops: drops[0],\r\n };\r\n}\r\nexports.getPlayerStatsForTeam = getPlayerStatsForTeam;\r\n/**\r\n *\r\n * @param matches Array of matches.\r\n * @param player The player.\r\n * @param teamName The team the player plays for. E.g. \"France\", not \"Albi\".\r\n */\r\nfunction getPlayerStatsForMatches(matches, player, usName) {\r\n const stats = {\r\n matches: 0,\r\n tries: 0,\r\n goals: 0,\r\n drops: 0,\r\n pts: 0,\r\n };\r\n return matches.reduce((allStats, match) => {\r\n const { us, them } = getUsAndThem(match, usName);\r\n const { tries, goals, drops } = getPlayerStatsForTeam(us, them, player);\r\n if (tries) {\r\n // pre-1983, tries = 3 pts.\r\n allStats.tries += tries.amount;\r\n allStats.pts += points_scored_1.pointsScored(tries.amount, 0, 0);\r\n }\r\n if (goals) {\r\n // 1897-present, conversions/penalties = 2 pts.\r\n allStats.goals += goals.amount;\r\n allStats.pts += points_scored_1.pointsScored(0, goals.amount, 0);\r\n }\r\n if (drops) {\r\n // 1897-1971, drop goals = 2 pts.\r\n allStats.drops += drops.amount;\r\n allStats.pts += points_scored_1.pointsScored(0, 0, drops.amount);\r\n }\r\n allStats.matches += 1;\r\n return allStats;\r\n }, stats);\r\n}\r\nexports.getPlayerStatsForMatches = getPlayerStatsForMatches;\r\nfunction filterPlayersAndMatchesByMatches(playerAndMatchesArr, filter) {\r\n var result = [];\r\n playerAndMatchesArr.forEach(playerAndMatches => {\r\n var p2 = {\r\n player: playerAndMatches.player,\r\n matches: {},\r\n };\r\n for (var year in playerAndMatches.matches) {\r\n var matchesForYear = playerAndMatches.matches[year];\r\n var filtered = matchesForYear.filter(match => filter(playerAndMatches, match));\r\n if (filtered.length > 0) {\r\n p2.matches = p2.matches || {};\r\n p2.matches[year] = filtered;\r\n }\r\n }\r\n if (p2.matches) {\r\n result.push(p2);\r\n }\r\n });\r\n return result;\r\n}\r\nexports.filterPlayersAndMatchesByMatches = filterPlayersAndMatchesByMatches;\r\nvar dateParseFormat = \"DD/MM/YYYY\";\r\nvar dateDisplayFormat = \"DD/MM/YYYY\";\r\n;\r\nvar shortTeamNames = {\r\n \"British Empire\": \"Brit. Emp.\",\r\n \"New Zealand\": \"NZ\",\r\n \"Other Nationalities\": \"Other Nat.\"\r\n};\r\nfunction mapScorerToStr(scorer) {\r\n return scorer.name + (scorer.amount > 1 ? (NON_BREAKING_SPACE + \"(\" + scorer.amount + \")\") : \"\");\r\n}\r\nexports.mapScorerToStr = mapScorerToStr;\r\nfunction scorersToStrs(scorers) {\r\n function mapScorersArrToStr(scorers) {\r\n return scorers.map(mapScorerToStr).join(\", \");\r\n }\r\n var arr = [];\r\n if (scorers.tries.length > 0) {\r\n arr.push(\"Tries: \" + mapScorersArrToStr(scorers.tries) + \".\");\r\n }\r\n if (scorers.goals.length > 0) {\r\n arr.push(\"Goals: \" + mapScorersArrToStr(scorers.goals) + \".\");\r\n }\r\n if (scorers.drops.length > 0) {\r\n arr.push(\"D/Goals: \" + mapScorersArrToStr(scorers.drops) + \".\");\r\n }\r\n return arr;\r\n}\r\nexports.scorersToStrs = scorersToStrs;\r\n;\r\nfunction shortTeamName(name) {\r\n return shortTeamNames[name] || name;\r\n}\r\nexports.shortTeamName = shortTeamName;\r\n;\r\nfunction matchCity(venue) {\r\n let split = venue.split(\",\");\r\n if (split.length > 1) {\r\n venue = split.pop().trim();\r\n }\r\n else {\r\n split = venue.split(\" \");\r\n if (split.length > 1) {\r\n venue = split.shift().trim();\r\n }\r\n ;\r\n }\r\n return venue;\r\n}\r\nexports.matchCity = matchCity;\r\n/**\r\n * @param player\r\n * @param scorers\r\n */\r\nfunction playerSummaryStatsForScorers(player, scorers) {\r\n const reducer = (count, scorer) => scorer.name === player ? count + scorer.amount : count;\r\n const stats = {\r\n tries: scorers.tries.reduce(reducer, 0),\r\n goals: scorers.goals.reduce(reducer, 0),\r\n drops: scorers.drops.reduce(reducer, 0),\r\n };\r\n return stats;\r\n}\r\n/**\r\n * Assumes player is a member of team.\r\n * @param player\r\n * @param team\r\n */\r\nfunction playerSummaryStatsForMatches(player, matches, playsForPredicate) {\r\n const summary = {\r\n matches: 0,\r\n tries: 0,\r\n goals: 0,\r\n drops: 0,\r\n };\r\n return matches.reduce((summary, match) => {\r\n let scorers = null;\r\n if (playsForPredicate(player, match.team1)) {\r\n scorers = match.team1.scorers;\r\n }\r\n else if (playsForPredicate(player, match.team2)) {\r\n scorers = match.team2.scorers;\r\n }\r\n else {\r\n throw new Error(`player ${player} plays for neither team1 ${match.team1.name} or ${match.team2.name} in match ${match.date}`);\r\n }\r\n const { tries, goals, drops } = playerSummaryStatsForScorers(player, scorers);\r\n //console.log(m.date, player.name, t, g, dg);\r\n summary.tries += tries;\r\n summary.goals += goals;\r\n summary.drops += drops;\r\n return summary;\r\n }, summary);\r\n}\r\n/**\r\n * The assumption in this function is that the provided player IS a player in each of the matches provided, and\r\n * therefore player.name IS a name that will be found in each of the matches.\r\n * @param player\r\n * @param matches\r\n * @param usName\r\n */\r\nfunction summaryStats(player, matchesByYear, usName = \"France\") {\r\n const summary = {\r\n matches: 0,\r\n tries: 0,\r\n goals: 0,\r\n drops: 0,\r\n };\r\n const usNames = typeof usName !== \"string\" ? usName : [usName];\r\n const playsForPredicate = makePlaysForPredicate(...usNames);\r\n for (var year in matchesByYear) {\r\n const matches = matchesByYear[year];\r\n summary.matches += matches.length;\r\n const { tries, goals, drops } = playerSummaryStatsForMatches(player, matches, playsForPredicate);\r\n summary.tries += tries;\r\n summary.goals += goals;\r\n summary.drops += drops;\r\n }\r\n return summary;\r\n}\r\nexports.summaryStats = summaryStats;\r\nfunction makePlaysForPredicate(...teamNames) {\r\n return (player, team) => teamNames.indexOf(team.name) > -1;\r\n}\r\nfunction flattenMatches(matchesKeyedByYear) {\r\n return Object.keys(matchesKeyedByYear).reduce((arr, year) => arr.concat(matchesKeyedByYear[year]), []);\r\n}\r\nexports.flattenMatches = flattenMatches;\r\n//# sourceMappingURL=MatchUtils.js.map","\"use strict\";\r\n/*\r\nDO NOT USE ANY LARGE LIBS IN CODE THAT COULD BE USED BY THE WEB SITE!\r\n\r\nE.g. moment, date-fns, from npm.\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst strings_1 = require(\"./strings\");\r\nconst INVALID_DATE = new Date(\"\");\r\n/**\r\n * @param dateStr DD/MM/YYYY\r\n * @returns Date\r\n */\r\nfunction parseDDMMYYYY(dateStr, separator = \"/\") {\r\n if (dateStr.length !== 8 + separator.length * 2) {\r\n return INVALID_DATE;\r\n }\r\n let dd = \"\";\r\n let mm = \"\";\r\n let yyyy = \"\";\r\n if (separator) {\r\n [dd, mm, yyyy] = dateStr.split(separator);\r\n }\r\n else {\r\n dd = dateStr.substring(0, 2);\r\n mm = dateStr.substring(2, 4);\r\n yyyy = dateStr.substring(4);\r\n }\r\n if (dd.length !== 2) {\r\n return INVALID_DATE;\r\n }\r\n if (mm.length !== 2) {\r\n return INVALID_DATE;\r\n }\r\n if (yyyy.length !== 4) {\r\n return INVALID_DATE;\r\n }\r\n return new Date(yyyy + \"-\" + mm + \"-\" + dd);\r\n}\r\nexports.parseDDMMYYYY = parseDDMMYYYY;\r\n/**\r\n * @param date The date\r\n * @returns Date string DD/MM/YYYY.\r\n */\r\nfunction formatDDMMYYYY(date, separator = \"/\") {\r\n return strings_1.padStart(date.getDate(), 2, \"0\") + separator +\r\n strings_1.padStart(date.getMonth() + 1, 2, \"0\") + separator +\r\n strings_1.padStart(date.getFullYear(), 4, \"0\");\r\n}\r\nexports.formatDDMMYYYY = formatDDMMYYYY;\r\nfunction isValid(date) {\r\n return !isNaN(date.getTime());\r\n}\r\nexports.isValid = isValid;\r\n//# sourceMappingURL=dates.js.map","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","/* eslint no-extend-native:off */\r\n\r\n// https://stackoverflow.com/a/39031032/319878\r\nif (!Promise.allSettled) {\r\n Promise.allSettled = function allSettled(promises) {\r\n const wrappedPromises = promises.map((it) => Promise.resolve(it)\r\n .then(\r\n (val) => ({ status: \"fulfilled\", value: val }),\r\n (err) => ({ status: \"rejected\", reason: err }),\r\n ),\r\n );\r\n return Promise.all(wrappedPromises);\r\n };\r\n}\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nfunction setBoolean(b, default_) {\r\n if (typeof b === \"boolean\") {\r\n return b;\r\n }\r\n return default_;\r\n}\r\nfunction removeCharsFromEnds(s, chars, opts) {\r\n var fromFront = true;\r\n var fromEnd = true;\r\n if (opts) {\r\n fromFront = setBoolean(opts.fromFront, fromFront);\r\n fromEnd = setBoolean(opts.fromEnd, fromEnd);\r\n }\r\n var len = -1;\r\n while (len !== s.length) {\r\n len = s.length;\r\n if (fromFront) {\r\n if (chars.indexOf(s.charAt(0)) > -1) {\r\n s = s.substring(1);\r\n }\r\n }\r\n if (fromEnd) {\r\n if (chars.indexOf(s.charAt(s.length - 1)) > -1) {\r\n s = s.substring(0, s.length - 1);\r\n }\r\n }\r\n }\r\n return s;\r\n}\r\nexports.removeCharsFromEnds = removeCharsFromEnds;\r\n;\r\nfunction removeCharsFromStart(s, chars) {\r\n return removeCharsFromEnds(s, chars, { fromEnd: false });\r\n}\r\nexports.removeCharsFromStart = removeCharsFromStart;\r\nfunction removeCharsFromEnd(s, chars) {\r\n return removeCharsFromEnds(s, chars, { fromStart: false });\r\n}\r\nexports.removeCharsFromEnd = removeCharsFromEnd;\r\nfunction padStart(str, len, padStr) {\r\n str = String(str);\r\n while (str.length < len) {\r\n str = padStr + str;\r\n }\r\n return str.substring(str.length - len, str.length);\r\n}\r\nexports.padStart = padStart;\r\n//# sourceMappingURL=strings.js.map","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nfunction isNonEmptyString(name, param) {\r\n const type = typeof param;\r\n if (type !== \"string\") {\r\n throw new Error(`${name} should be a string. Is ${type}.`);\r\n }\r\n if (param === \"\") {\r\n throw new Error(`${name} should be non-empty.`);\r\n }\r\n}\r\nexports.isNonEmptyString = isNonEmptyString;\r\n//# sourceMappingURL=parameter-validation.js.map","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n/*\r\nTry, Conversion, Penalty, Drop goal, Field goal, Goal from mark\r\n\r\nTODO - Basically, only 1922-1971 implemented correctly.\r\n\r\nPeriod T C P D F M\r\n1895–1897 3 2 3 4 4 4\r\n1897–1922 3 2 2 2 2 2\r\n1922–1950 3 2 2 2 2 –\r\n1950–1971 3 2 2 2 - –\r\n1971–1983 3 2 2 1 - –\r\n1983–present 4 2 2 1 - –\r\n*/\r\nfunction pointsScored(tries = 0, goals = 0, drops = 0, date) {\r\n return (tries * 3) + (goals * 2) + (drops * 2);\r\n}\r\nexports.pointsScored = pointsScored;\r\nfunction byScorers(scorers, date) {\r\n if (!scorers) {\r\n return 0;\r\n }\r\n const countAmounts = (sum, scorer) => sum + scorer.amount;\r\n const tries = scorers.tries ? scorers.tries.reduce(countAmounts, 0) : 0;\r\n const goals = scorers.goals ? scorers.goals.reduce(countAmounts, 0) : 0;\r\n const drops = scorers.drops ? scorers.drops.reduce(countAmounts, 0) : 0;\r\n return pointsScored(tries, goals, drops);\r\n}\r\nexports.byScorers = byScorers;\r\n//# sourceMappingURL=points-scored.js.map","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst pen_pics_line_handler_1 = require(\"./parse/pen-pics-line-handler\");\r\n// TODO - is this used anywhere?\r\nfunction playerFullName(keysToFullNames, keyGenerators, playerKey, lineupPlayer, penPic) {\r\n if (playerKey) {\r\n if (!keysToFullNames) {\r\n throw new Error(\"keysToFullNames is required when playerKey is provided\");\r\n }\r\n return keysToFullNames[playerKey];\r\n }\r\n if (lineupPlayer) {\r\n if (keysToFullNames && keyGenerators) {\r\n const { lineupPlayerKeyGenerator } = keyGenerators;\r\n return keysToFullNames[playerKey || lineupPlayerKeyGenerator(lineupPlayer)];\r\n }\r\n return lineupPlayerFullName(lineupPlayer);\r\n }\r\n if (penPic) {\r\n if (keysToFullNames && keyGenerators) {\r\n const { penPicsKeyGenerator } = keyGenerators;\r\n return keysToFullNames[playerKey || penPicsKeyGenerator(penPic)];\r\n }\r\n return penPicFullName(penPic);\r\n }\r\n throw new Error(\"expected one of playerKey, lineupPlayer or penPic to be provided\");\r\n}\r\nexports.playerFullName = playerFullName;\r\nfunction fullName(firstName, lastName) {\r\n return {\r\n firstName,\r\n lastName,\r\n };\r\n}\r\nexports.fullName = fullName;\r\nfunction lineupPlayerFullName(lineupPlayer) {\r\n const split = lineupPlayer.name.split(\" \");\r\n if (split.length > 1) {\r\n const [lastName, firstName] = split;\r\n return fullName(firstName, lastName);\r\n }\r\n return fullName(\"\", lineupPlayer.name);\r\n}\r\nexports.lineupPlayerFullName = lineupPlayerFullName;\r\nfunction penPicFullName(penPic) {\r\n return pen_pics_line_handler_1.parsePenPicName(penPic.name);\r\n}\r\nexports.penPicFullName = penPicFullName;\r\nfunction fullNameStr(fullName, { template } = {}) {\r\n if (!fullName) {\r\n return null;\r\n }\r\n if (template) {\r\n return template(fullName);\r\n }\r\n const { firstName, lastName } = fullName;\r\n return lastName + \", \" + firstName;\r\n}\r\nexports.fullNameStr = fullNameStr;\r\n//# sourceMappingURL=PlayerUtils.js.map","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst strip_accents_1 = require(\"./strip-accents\");\r\nfunction removeUndefinedProperties(obj) {\r\n Object.keys(obj).forEach((key) => {\r\n if (obj[key] === undefined) {\r\n delete obj[key];\r\n }\r\n });\r\n return obj;\r\n}\r\nfunction parsePenPicName(name) {\r\n // Regular pen pic is:\r\n // WTCC \"Last_name, First_name\"\r\n // Still Crowing \"LAST_NAME, First_name\"\r\n const split1 = name.split(/,\\s+/);\r\n if (split1.length > 1) {\r\n const [lastName, firstName] = split1;\r\n return {\r\n firstName,\r\n lastName,\r\n };\r\n }\r\n // 'Other Players' in Still Crowing is \"First_name Last_name\"\r\n const split2 = name.split(/\\s+/);\r\n if (split2.length > 1) {\r\n const [firstName, lastName] = split2;\r\n return {\r\n firstName,\r\n lastName,\r\n };\r\n }\r\n return {\r\n firstName: \"\",\r\n lastName: name,\r\n };\r\n}\r\nexports.parsePenPicName = parsePenPicName;\r\n/**\r\n * Tries to parse a single line of (hopefully) pen-pic text into a player name, or a line from the pen-pic text.\r\n *\r\n * So lines like this will be interpreted as names:\r\n *\r\n * \"Amila, Gaston\" (lastName, firstName)\r\n * \"Barbazanges, Antonin (P)\" (1934 pioneer)\r\n * \"Puig-Aubert\" (single last-name)\r\n * \"PUIG-AUBERT\" (single last-name)\r\n * \"CARRERE, André (Bordeaux)\" (with team name to disambiguate)\r\n * \"DE NADAI, Francis\" (lastName-containing-space, firstName)\r\n *\r\n * @param line Input line.\r\n */\r\nfunction getNameTextTeam(line) {\r\n if (line === null) {\r\n throw new Error(\"getNameTextTeam cannot be passed null line\");\r\n }\r\n // tslint:disable-next-line:no-shadowed-variable\r\n function main(line) {\r\n // always trim.\r\n line = line.trim();\r\n if (!line) {\r\n return {};\r\n }\r\n // remember original (trimmed)\r\n const originalLine = line;\r\n let pioneer = false;\r\n // WTCC: (\"P\" indicates 1934 \"Pioneer\")\r\n if (line.endsWith(\"(P)\")) {\r\n pioneer = true;\r\n line = line.substring(0, line.length - 3).trim();\r\n }\r\n // See if the line ends with something in brackets.\r\n // This *could* indicate a team, if we decide the line is a name.\r\n const extractPossibleTeam = () => {\r\n const match = /\\([^)]+\\)$/.exec(line);\r\n if (!match) {\r\n return undefined;\r\n }\r\n line = line.substring(0, match.index).trim();\r\n // remove brackets\r\n return match[0].substring(1, match[0].length - 1);\r\n };\r\n const possibleTeam = extractPossibleTeam();\r\n // After stripping possible Pioneers and teams, check the rest is valid for a name.\r\n // Names only include a-b, A-B, COMMA, HYPHEN.\r\n if (!strip_accents_1.default(line.toUpperCase()).match(/^[A-Z\\,\\-\\s]+$/)) {\r\n return { text: originalLine };\r\n }\r\n const commaParts = line.split(\", \");\r\n if (commaParts.length > 2) {\r\n // Not a name if there are more than 2 comma parts, add as pen pic text\r\n // E.g. \"This, is, some, text\"\r\n return { text: originalLine };\r\n }\r\n if (commaParts.length === 1) {\r\n const spaceParts = line.split(\" \");\r\n if (spaceParts.length > 2) {\r\n // Not a name if there are 0 commas (1 comma part), and more than 2 space parts.\r\n // E.g. \"This is some text\"\r\n return { text: originalLine };\r\n }\r\n }\r\n const [possibleLastName, possibleFirstName] = commaParts;\r\n if (possibleLastName.split(\" \").length > 2) {\r\n // Last name cannot have more than one space in it.\r\n return { text: originalLine };\r\n }\r\n if (!possibleFirstName) {\r\n return removeUndefinedProperties({\r\n name: possibleLastName,\r\n pioneer,\r\n team: possibleTeam,\r\n });\r\n }\r\n // We have both a possible last-name and possible first-name here.\r\n const spacesInPossibleLastName = possibleLastName.split(\" \").length;\r\n if (spacesInPossibleLastName > 2) {\r\n // Surname (if present) should not have more than one space in it.\r\n // Not a name, add as pen pic text\r\n return { text: originalLine };\r\n }\r\n if (possibleFirstName.split(\" \").length > 1) {\r\n // Forename (if present) should not have a space in it.\r\n // Not a name, add as pen pic text\r\n return { text: originalLine };\r\n }\r\n return removeUndefinedProperties({\r\n name: line,\r\n pioneer,\r\n team: possibleTeam,\r\n });\r\n }\r\n return main(line);\r\n}\r\nexports.getNameTextTeam = getNameTextTeam;\r\nfunction penPicsLineHandler() {\r\n const penPics = [];\r\n let currentPenPicText = [];\r\n return {\r\n onLine(line) {\r\n const { name, team, text, pioneer } = getNameTextTeam(line);\r\n if (text) {\r\n currentPenPicText.push(text);\r\n return;\r\n }\r\n if (name) {\r\n // found name?!\r\n currentPenPicText = [];\r\n const { firstName, lastName } = parsePenPicName(name);\r\n const penPic = {\r\n firstName,\r\n lastName,\r\n name,\r\n pioneer,\r\n team: team || null,\r\n text: currentPenPicText,\r\n };\r\n penPics.push(penPic);\r\n return;\r\n }\r\n },\r\n penPics,\r\n };\r\n}\r\nexports.penPicsLineHandler = penPicsLineHandler;\r\n//# sourceMappingURL=pen-pics-line-handler.js.map","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst MatchUtils = require(\"./MatchUtils\");\r\n/**\r\n * @export\r\n * @param matches Array of matches.\r\n * @param opts The options.\r\n * @returns\r\n */\r\nfunction careerRecordsLists(matches, { listSize = -1, filterByMatchTeamPlayer = (match, team, player) => true, lineupPlayerKeyGenerator, includeZeroEntries = false, }) {\r\n if (!lineupPlayerKeyGenerator) {\r\n throw new Error(`opts.lineupPlayerKeyGenerator is required`);\r\n }\r\n const playerAndMatchMap = MatchUtils.createPlayerAndMatchMap(matches, filterByMatchTeamPlayer, lineupPlayerKeyGenerator);\r\n const playerList = [];\r\n Object.keys(playerAndMatchMap).forEach((key) => {\r\n playerList.push(Object.assign(Object.assign({}, playerAndMatchMap[key]), { key }));\r\n });\r\n addStats(playerList);\r\n // combine stats as substitute with stats as starting player.\r\n playerList.forEach(({ key, stats, subStats }) => {\r\n stats.tries += subStats.tries;\r\n stats.goals += subStats.goals;\r\n stats.drops += subStats.drops;\r\n stats.pts += subStats.pts;\r\n stats.matches += subStats.matches;\r\n });\r\n const sortBy = (valueMapper) => (playerMatchesStats1, playerMatchesStats2) => {\r\n const diff = valueMapper(playerMatchesStats1) - valueMapper(playerMatchesStats2);\r\n if (diff !== 0) {\r\n return diff;\r\n }\r\n return playerMatchesStats2.player.name.localeCompare(playerMatchesStats1.player.name);\r\n };\r\n const sortByTries = sortBy((playerMatchesStats) => playerMatchesStats.stats.tries);\r\n const sortByGoals = sortBy((playerMatchesStats) => playerMatchesStats.stats.goals);\r\n const sortByDrops = sortBy((playerMatchesStats) => playerMatchesStats.stats.drops);\r\n const sortByPts = sortBy((playerMatchesStats) => playerMatchesStats.stats.pts);\r\n const sortByApps = sortBy((playerMatchesStats) => playerMatchesStats.stats.matches);\r\n const tries = copyAndSort(playerList, reverseSort(sortByTries))\r\n .filter((playerMatchesStats) => playerMatchesStats.stats.tries > 0);\r\n const goals = copyAndSort(playerList, reverseSort(sortByGoals))\r\n .filter((playerMatchesStats) => playerMatchesStats.stats.goals > 0);\r\n const drops = copyAndSort(playerList, reverseSort(sortByDrops))\r\n .filter((playerMatchesStats) => playerMatchesStats.stats.drops > 0);\r\n const pts = copyAndSort(playerList, reverseSort(sortByPts))\r\n .filter((playerMatchesStats) => playerMatchesStats.stats.pts > 0);\r\n const apps = copyAndSort(playerList, reverseSort(sortByApps))\r\n .filter((playerMatchesStats) => playerMatchesStats.stats.matches > 0);\r\n if (listSize > 0) {\r\n apps.splice(listSize);\r\n tries.splice(listSize);\r\n goals.splice(listSize);\r\n drops.splice(listSize);\r\n pts.splice(listSize);\r\n }\r\n const result = {\r\n goals: addRank(goals, (playerMatchesStats) => playerMatchesStats.stats.goals),\r\n drops: addRank(drops, (playerMatchesStats) => playerMatchesStats.stats.drops),\r\n matches: addRank(apps, (playerMatchesStats) => playerMatchesStats.stats.matches),\r\n pts: addRank(pts, (playerMatchesStats) => playerMatchesStats.stats.pts),\r\n tries: addRank(tries, (playerMatchesStats) => playerMatchesStats.stats.tries),\r\n };\r\n return result;\r\n}\r\nexports.careerRecordsLists = careerRecordsLists;\r\nfunction addRank(playerList, valueMapper) {\r\n return playerList.reduce((arr, playerMatchesStats, i) => {\r\n const value = valueMapper(playerMatchesStats);\r\n const prev = arr[i - 1];\r\n let rank = String(i + 1);\r\n if (prev && valueMapper(prev) === value) {\r\n if (!prev.rank.startsWith(\"=\")) {\r\n prev.rank = \"=\" + prev.rank;\r\n }\r\n rank = prev.rank;\r\n }\r\n arr.push(Object.assign(Object.assign({}, playerMatchesStats), { rank }));\r\n return arr;\r\n }, []);\r\n}\r\nfunction copyAndSort(arr, sortBy) {\r\n arr = arr.slice();\r\n arr.sort(sortBy);\r\n return arr;\r\n}\r\nfunction reverseSort(fn) {\r\n return (a, b) => -fn(a, b);\r\n}\r\nfunction addStats(playerList) {\r\n playerList.forEach((playerAndMatches) => {\r\n const { player, matches, subMatches } = playerAndMatches;\r\n const matchesArr = MatchUtils.flattenMatches(matches);\r\n const stats = MatchUtils.getPlayerStatsForMatches(matchesArr, player, \"France\");\r\n playerAndMatches.stats = stats;\r\n const subMatchesArr = MatchUtils.flattenMatches(subMatches);\r\n const subStats = MatchUtils.getPlayerStatsForMatches(subMatchesArr, player, \"France\");\r\n playerAndMatches.subStats = subStats;\r\n });\r\n}\r\n//# sourceMappingURL=career-records.js.map","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst split_lineup_player_name_1 = require(\"../split-lineup-player-name\");\r\nconst strip_accents_1 = require(\"../strip-accents\");\r\nconst upper_caser_1 = require(\"../upper-caser\");\r\nfunction basicLineupPlayerKeyGenerator(player) {\r\n const { last } = split_lineup_player_name_1.default(player.name);\r\n const lastNameUpper = strip_accents_1.default(last.toUpperCase());\r\n if (player.name === \"Carrère\") {\r\n if (player.team === \"Roanne\") {\r\n // Joseph\r\n return lastNameUpper + \"_J\";\r\n }\r\n if (player.team === \"XIII Catalan\") {\r\n // ?\r\n return lastNameUpper + \"__XIII_Catalan\";\r\n }\r\n }\r\n return lastNameUpper;\r\n}\r\nfunction basicFirstNameLastNamePlayerKeyGenerator(first, last) {\r\n // In WTCC book:\r\n // - stats table names have accents.\r\n // - There are no team names.\r\n const lastNameUpper = strip_accents_1.default(last.toUpperCase());\r\n if (lastNameUpper === \"CARRERE\") {\r\n if (first === \"?\") {\r\n return lastNameUpper + \"__XIII_Catalan\";\r\n }\r\n else if (first === \"Joseph\") {\r\n return lastNameUpper + \"_J\";\r\n }\r\n }\r\n return lastNameUpper;\r\n}\r\nfunction basicCareerStatisticsPlayerKeyGenerator(stat) {\r\n return firstNameLastNamePlayerKeyGenerator(stat.firstName, stat.lastName);\r\n}\r\nfunction basicPenPicsPlayerKeyGenerator(penPic) {\r\n // Use existing firstName, lastName if present\r\n const { firstName, lastName } = penPic;\r\n if (firstName || lastName) {\r\n return firstNameLastNamePlayerKeyGenerator(firstName, lastName);\r\n }\r\n // In WTCC book:\r\n // - Pen pic names have accents\r\n // - There are no team names.\r\n const [last, first] = penPic.name.split(\", \");\r\n return firstNameLastNamePlayerKeyGenerator(first, last);\r\n}\r\n/**\r\n * WTCC lineup key generation. Use the team name to disambiguate players with same name.\r\n */\r\nconst lineupPlayerKeyGenerator = upper_caser_1.default(basicLineupPlayerKeyGenerator);\r\nexports.lineupPlayerKeyGenerator = lineupPlayerKeyGenerator;\r\nconst firstNameLastNamePlayerKeyGenerator = upper_caser_1.default(basicFirstNameLastNamePlayerKeyGenerator);\r\n/**\r\n * Add a key to stat entries that need to match the key generated for the player in the lineups.\r\n * @param stat\r\n */\r\nconst careerStatisticsPlayerKeyGenerator = upper_caser_1.default(basicCareerStatisticsPlayerKeyGenerator);\r\nexports.careerStatisticsPlayerKeyGenerator = careerStatisticsPlayerKeyGenerator;\r\nconst penPicsPlayerKeyGenerator = upper_caser_1.default(basicPenPicsPlayerKeyGenerator);\r\nexports.penPicsPlayerKeyGenerator = penPicsPlayerKeyGenerator;\r\n//# sourceMappingURL=key-generators.js.map","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst split_lineup_player_name_1 = require(\"../split-lineup-player-name\");\r\nconst strip_accents_1 = require(\"../strip-accents\");\r\nconst upper_caser_1 = require(\"../upper-caser\");\r\n/***/\r\nfunction basicLineupPlayerKeyGenerator(player) {\r\n const { first, last } = split_lineup_player_name_1.default(player.name);\r\n const lastNameUpper = strip_accents_1.default(last.toUpperCase());\r\n if (last === \"Carrère\") {\r\n // 2 x \"Carrère\" players have the same initial, but different teams, so key on that.\r\n // The 3rd \"Carrère\" is not handled here, and defaults to lastNameUpper as key.\r\n if ([\"Bordeaux\", \"Lézignan\"].indexOf(player.team) > -1) {\r\n return lastNameUpper + \"_A__Bordeaux\";\r\n }\r\n if (player.team === \"Villeneuve\") {\r\n return lastNameUpper + \"_A__Villeneuve\";\r\n }\r\n // Irénée\r\n return lastNameUpper + \"_I\";\r\n }\r\n if (last === \"Fabre\") {\r\n // The 3 x \"Fabre\" players aren't given an initial in the lineups, so we have to use team instead.\r\n if ([\"Albi\", \"Army\"].indexOf(player.team) > -1) {\r\n return lastNameUpper + \"_B\";\r\n }\r\n if (player.team === \"Avignon\") {\r\n return lastNameUpper + \"_J\";\r\n }\r\n }\r\n if (last === \"Benausse\") {\r\n // The 2 x \"Benausse\" players have initials in the lineups, so use them.\r\n if (first === \"G\") {\r\n return lastNameUpper + \"_G\";\r\n }\r\n else if (first === \"R\") {\r\n return lastNameUpper + \"_R\";\r\n }\r\n }\r\n if (last === \"Lacaze\") {\r\n // The 2 x \"Lacaze\" players have initials in the lineups, so use them.\r\n if (first === \"A\") {\r\n return lastNameUpper + \"_A\";\r\n }\r\n else if (first === \"P\") {\r\n return lastNameUpper + \"_P\";\r\n }\r\n }\r\n return lastNameUpper;\r\n}\r\nfunction firstNameLastNameTeamPlayerKeyGenerator(firstName, lastName, team) {\r\n // In Still Crowing book:\r\n // - stats table lastNames do not have accents, firstNames do.\r\n // - CARERRE is particularly nasty as there are 2 x \"André CARRERE\".\r\n // - So we have to tell those apart by a team name in the player's stats object.\r\n const lastNameUpper = strip_accents_1.default(lastName.toUpperCase());\r\n switch (lastNameUpper) {\r\n // 2 x CARRERE, check team.\r\n // 3rd CARRERE, Irenee -> \"CARRERE_I\"\r\n case \"CARRERE\": {\r\n switch (team) {\r\n // career stats team names\r\n case \"B'x\": return lastNameUpper + \"_A__Bordeaux\";\r\n case \"Vill\": return lastNameUpper + \"_A__Villeneuve\";\r\n // pen pics team names\r\n case \"Bordeaux\": return lastNameUpper + \"_A__Bordeaux\";\r\n case \"Villeneuve\": return lastNameUpper + \"_A__Villeneuve\";\r\n }\r\n // only one other CARRERE\r\n return lastNameUpper + \"_I\";\r\n }\r\n case \"FABRE\": {\r\n switch (firstName) {\r\n case \"Bernard\": return lastNameUpper + \"_B\";\r\n case \"Jacques\": return lastNameUpper + \"_J\";\r\n }\r\n break;\r\n }\r\n // Both these can be uniquely identified by lastName and initial.\r\n case \"BENAUSSE\":\r\n case \"LACAZE\": {\r\n return lastNameUpper + \"_\" + firstName.charAt(0).toUpperCase();\r\n }\r\n }\r\n // default to key as uppercase last name.\r\n return lastNameUpper;\r\n}\r\nfunction basicCareerStatisticsPlayerKeyGenerator(stat) {\r\n return firstNameLastNameTeamPlayerKeyGenerator(stat.firstName, stat.lastName, stat.team);\r\n}\r\nfunction basicPenPicsPlayerKeyGenerator(penPic) {\r\n // Use existing firstName, lastName if present\r\n const { firstName, lastName } = penPic;\r\n if (firstName || lastName) {\r\n return firstNameLastNameTeamPlayerKeyGenerator(firstName, lastName, penPic.team);\r\n }\r\n // penPic has a single name, so split first.\r\n const [lastName2, firstName2] = penPic.name.split(\", \");\r\n return firstNameLastNameTeamPlayerKeyGenerator(firstName2, lastName2, penPic.team);\r\n}\r\nconst lineupPlayerKeyGenerator = upper_caser_1.default(basicLineupPlayerKeyGenerator);\r\nexports.lineupPlayerKeyGenerator = lineupPlayerKeyGenerator;\r\nconst careerStatisticsPlayerKeyGenerator = upper_caser_1.default(basicCareerStatisticsPlayerKeyGenerator);\r\nexports.careerStatisticsPlayerKeyGenerator = careerStatisticsPlayerKeyGenerator;\r\nconst penPicsPlayerKeyGenerator = upper_caser_1.default(basicPenPicsPlayerKeyGenerator);\r\nexports.penPicsPlayerKeyGenerator = penPicsPlayerKeyGenerator;\r\n//# sourceMappingURL=key-generators.js.map","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst split_lineup_player_name_1 = require(\"../split-lineup-player-name\");\r\nconst strip_accents_1 = require(\"../strip-accents\");\r\nconst upper_caser_1 = require(\"../upper-caser\");\r\nconst DUPLICATE_LAST_NAMES_UPPER = [\"LACAZE\", \"GRUPPI\", \"SAVONNE\"];\r\nfunction keyWithFirstInitial(key, first) {\r\n const firstInitial = first.substring(0, 1);\r\n return key + \"_\" + firstInitial.toUpperCase();\r\n}\r\n/***/\r\nfunction basicLineupPlayerKeyGenerator(player) {\r\n const fullNameUpper = player.name.toUpperCase();\r\n if (fullNameUpper === \"DE NADAI\") {\r\n return \"DE_NADAI\";\r\n }\r\n const { first, last } = split_lineup_player_name_1.default(player.name, true);\r\n const lastNameUpper = strip_accents_1.default(last.toUpperCase());\r\n let key = strip_accents_1.default(lastNameUpper);\r\n if (DUPLICATE_LAST_NAMES_UPPER.includes(key)) {\r\n // `first` is probably only a single character anyway from a lineup.\r\n key = keyWithFirstInitial(key, first);\r\n }\r\n // console.log(\"lineup\", \"*\", key, \"*\", player.name, \"*\", first, \"*\", last);\r\n if (key.length < 2) {\r\n throw new Error(`lineup key \"${key}\" cannot be length 0 or 1. player=${player.name}`);\r\n }\r\n return key;\r\n}\r\nconst firstNameLastNameTeamPlayerKeyGenerator = upper_caser_1.default(function (firstName, lastName, team) {\r\n const lastNameUpper = strip_accents_1.default(lastName.toUpperCase());\r\n if (lastNameUpper === \"DE NADAI\") {\r\n return \"DE_NADAI\";\r\n }\r\n let key = lastNameUpper;\r\n if (DUPLICATE_LAST_NAMES_UPPER.includes(lastNameUpper)) {\r\n key = keyWithFirstInitial(key, firstName);\r\n }\r\n if (key.length < 2) {\r\n throw new Error(`lineup key \"${key}\" cannot be length 0 or 1. player=${firstName} ${lastName}`);\r\n }\r\n // default to key as uppercase last name.\r\n return key;\r\n});\r\n/***/\r\nconst basicCareerStatisticsPlayerKeyGenerator = upper_caser_1.default(function (stat) {\r\n const key = firstNameLastNameTeamPlayerKeyGenerator(stat.firstName, stat.lastName, stat.team);\r\n if (!key) {\r\n throw new Error(`key for ${JSON.stringify(stat)} is blank`);\r\n }\r\n // console.log(\"stat\", \"*\", key, \"*\", stat.firstName, stat.lastName);\r\n return key;\r\n});\r\nfunction basicPenPicsPlayerKeyGenerator(penPic) {\r\n // Use existing firstName, lastName if present\r\n let { firstName, lastName } = penPic;\r\n if (!firstName && !lastName) {\r\n // penPic has a single name, so split first.\r\n const parts = penPic.name.split(\", \");\r\n lastName = (lastName || parts[0] || \"\").trim();\r\n firstName = (firstName || parts[1] || \"\").trim();\r\n }\r\n lastName = lastName;\r\n const key = firstNameLastNameTeamPlayerKeyGenerator(firstName, lastName, penPic.team);\r\n if (!key) {\r\n throw new Error(`key for ${JSON.stringify(penPic)} is blank`);\r\n }\r\n return key;\r\n}\r\nconst lineupPlayerKeyGenerator = upper_caser_1.default(basicLineupPlayerKeyGenerator);\r\nexports.lineupPlayerKeyGenerator = lineupPlayerKeyGenerator;\r\nconst careerStatisticsPlayerKeyGenerator = upper_caser_1.default(basicCareerStatisticsPlayerKeyGenerator);\r\nexports.careerStatisticsPlayerKeyGenerator = careerStatisticsPlayerKeyGenerator;\r\nconst penPicsPlayerKeyGenerator = upper_caser_1.default(basicPenPicsPlayerKeyGenerator);\r\nexports.penPicsPlayerKeyGenerator = penPicsPlayerKeyGenerator;\r\n//# sourceMappingURL=key-generators.js.map","'use strict';\nmodule.exports = str => encodeURIComponent(str).replace(/[!'()*]/g, x => `%${x.charCodeAt(0).toString(16).toUpperCase()}`);\n","'use strict';\nvar token = '%[a-f0-9]{2}';\nvar singleMatcher = new RegExp(token, 'gi');\nvar multiMatcher = new RegExp('(' + token + ')+', 'gi');\n\nfunction decodeComponents(components, split) {\n\ttry {\n\t\t// Try to decode the entire string first\n\t\treturn decodeURIComponent(components.join(''));\n\t} catch (err) {\n\t\t// Do nothing\n\t}\n\n\tif (components.length === 1) {\n\t\treturn components;\n\t}\n\n\tsplit = split || 1;\n\n\t// Split the array in 2 parts\n\tvar left = components.slice(0, split);\n\tvar right = components.slice(split);\n\n\treturn Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));\n}\n\nfunction decode(input) {\n\ttry {\n\t\treturn decodeURIComponent(input);\n\t} catch (err) {\n\t\tvar tokens = input.match(singleMatcher);\n\n\t\tfor (var i = 1; i < tokens.length; i++) {\n\t\t\tinput = decodeComponents(tokens, i).join('');\n\n\t\t\ttokens = input.match(singleMatcher);\n\t\t}\n\n\t\treturn input;\n\t}\n}\n\nfunction customDecodeURIComponent(input) {\n\t// Keep track of all the replacements and prefill the map with the `BOM`\n\tvar replaceMap = {\n\t\t'%FE%FF': '\\uFFFD\\uFFFD',\n\t\t'%FF%FE': '\\uFFFD\\uFFFD'\n\t};\n\n\tvar match = multiMatcher.exec(input);\n\twhile (match) {\n\t\ttry {\n\t\t\t// Decode as big chunks as possible\n\t\t\treplaceMap[match[0]] = decodeURIComponent(match[0]);\n\t\t} catch (err) {\n\t\t\tvar result = decode(match[0]);\n\n\t\t\tif (result !== match[0]) {\n\t\t\t\treplaceMap[match[0]] = result;\n\t\t\t}\n\t\t}\n\n\t\tmatch = multiMatcher.exec(input);\n\t}\n\n\t// Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else\n\treplaceMap['%C2'] = '\\uFFFD';\n\n\tvar entries = Object.keys(replaceMap);\n\n\tfor (var i = 0; i < entries.length; i++) {\n\t\t// Replace all decoded components\n\t\tvar key = entries[i];\n\t\tinput = input.replace(new RegExp(key, 'g'), replaceMap[key]);\n\t}\n\n\treturn input;\n}\n\nmodule.exports = function (encodedURI) {\n\tif (typeof encodedURI !== 'string') {\n\t\tthrow new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');\n\t}\n\n\ttry {\n\t\tencodedURI = encodedURI.replace(/\\+/g, ' ');\n\n\t\t// Try the built in decoder first\n\t\treturn decodeURIComponent(encodedURI);\n\t} catch (err) {\n\t\t// Fallback to a more advanced decoder\n\t\treturn customDecodeURIComponent(encodedURI);\n\t}\n};\n","'use strict';\n\nmodule.exports = (string, separator) => {\n\tif (!(typeof string === 'string' && typeof separator === 'string')) {\n\t\tthrow new TypeError('Expected the arguments to be of type `string`');\n\t}\n\n\tif (separator === '') {\n\t\treturn [string];\n\t}\n\n\tconst separatorIndex = string.indexOf(separator);\n\n\tif (separatorIndex === -1) {\n\t\treturn [string];\n\t}\n\n\treturn [\n\t\tstring.slice(0, separatorIndex),\n\t\tstring.slice(separatorIndex + separator.length)\n\t];\n};\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","var isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","/**\r\n * Attempts to return a Promise of a service worker.\r\n *\r\n * If the passed-in `sw` is not falsy then resolve it as a Promise.\r\n *\r\n * Else resolve `navigator.serviceWorker.controller` if it is valid.\r\n *\r\n * Else resolve the `active` service worker from the `navigator.serviceWorker.ready` registration.\r\n *\r\n * Else reject the promise.\r\n *\r\n * @param {ServiceWorker} sw The optional service worker.\r\n * @return {Promise} A service worker resolved as a Promise, else a rejection.\r\n */\r\nexport function getServiceWorker(sw) {\r\n if (sw) {\r\n return Promise.resolve(sw);\r\n }\r\n\r\n if (!(\"serviceWorker\" in navigator)) {\r\n return Promise.reject(new Error(\"navigator.serviceWorker is not supported\"));\r\n }\r\n\r\n // see if a service worker is controlling the page\r\n if (navigator.serviceWorker.controller) {\r\n return Promise.resolve(navigator.serviceWorker.controller);\r\n }\r\n\r\n // see if there is an active service worker\r\n return navigator.serviceWorker.ready\r\n .then((registration) => {\r\n if (!registration.active) {\r\n throw new Error(\"No service worker. Both navigator.serviceWorker.controller and registration.active are null\");\r\n }\r\n return registration.active;\r\n });\r\n}\r\n\r\n/**\r\n * Attempts to return a Promise of a service worker registration.\r\n *\r\n * @return {Promise}\r\n * A service worker registration resolved as a Promise, else a rejection.\r\n */\r\nexport function getServiceWorkerRegistration() {\r\n return navigator.serviceWorker.ready;\r\n}\r\n","import { getServiceWorker } from \"./service-worker\";\r\n\r\n/**\r\n * Post a message to a service worker.\r\n * @param {object|string} msg The message to send.\r\n * @param {ServiceWorker} sw Optional service worker.\r\n * @return {Promise} The response from the service worker.\r\n */\r\nexport function postMessage(msg, sw) {\r\n function postMessage(sw) {\r\n return new Promise((resolve, reject) => {\r\n const chan = new MessageChannel();\r\n chan.port1.onmessage = function(event) {\r\n if (event.data && event.data.error) {\r\n // Error objects cannot be serialised over postMessage\r\n // So check if we have something that might be stringified first\r\n if (typeof event.data.error === \"string\") {\r\n reject(JSON.parse(event.data.error));\r\n return;\r\n }\r\n reject(event.data.error);\r\n } else {\r\n resolve(event.data);\r\n }\r\n };\r\n sw.postMessage(msg, [chan.port2]);\r\n });\r\n }\r\n return getServiceWorker(sw)\r\n .then(postMessage);\r\n}\r\n","export default class AddToHomeScreenElement {\r\n logger = null;\r\n addToHomeScreenImgClass = \"\";\r\n $parent = null;\r\n beforeinstallprompt = null;\r\n element = null;\r\n\r\n constructor({\r\n logger,\r\n addToHomeScreenImgClass,\r\n $parent,\r\n }) {\r\n this.logger = logger;\r\n this.addToHomeScreenImgClass = addToHomeScreenImgClass;\r\n this.$parent = $parent;\r\n this.onClickAddToHome = this.onClickAddToHome.bind(this);\r\n }\r\n\r\n setBeforeInstallPromptEvent(e) {\r\n this.beforeinstallprompt = e;\r\n }\r\n\r\n async onClickAddToHome(e) {\r\n this.logger.log(\"click\", e);\r\n\r\n e.preventDefault();\r\n\r\n // Show the prompt\r\n this.beforeinstallprompt.prompt();\r\n\r\n // Wait for the user to respond to the prompt\r\n const choiceResult = await this.beforeinstallprompt.userChoice;\r\n this.logger.log(\"choiceResult\", choiceResult);\r\n if (choiceResult.outcome === \"accepted\") {\r\n this.logger.log(\"User accepted the A2HS prompt\");\r\n } else {\r\n this.logger.log(\"User dismissed the A2HS prompt\");\r\n }\r\n this.beforeinstallprompt = null;\r\n }\r\n\r\n icon() {\r\n return this.element.find(`.${this.addToHomeScreenImgClass}`);\r\n }\r\n\r\n addElement() {\r\n const html = `\r\n
\r\n\"Add\r\n
`;\r\n this.element = $(html);\r\n this.$parent.prepend(this.element);\r\n this.icon().on(\"click\", this.onClickAddToHome);\r\n }\r\n\r\n maybeAddElement() {\r\n if (!this.element) {\r\n this.addElement();\r\n }\r\n }\r\n}\r\n","import { postMessage } from \"./services/post-message\";\r\nimport AddToHomeScreenElement from \"./AddToHomeScreenElement\";\r\n\r\nconst logger = [\"log\", \"error\", \"warn\"].reduce((logger, name) => {\r\n logger[name] = (...args) => {\r\n console[name](\"sw-api\", performance.now(), ...args);\r\n };\r\n return logger;\r\n}, {});\r\n\r\nfunction waitForGlobal(name, timeout = 5000, pollInterval = 250) {\r\n return new Promise((resolve, reject) => {\r\n const start = Date.now();\r\n const check = () => {\r\n if (typeof window[name] !== \"undefined\") {\r\n return resolve();\r\n }\r\n if (Date.now() - start >= timeout) {\r\n reject(new Error(`Timed out waiting for \"window.${name}\": ${timeout}ms`));\r\n }\r\n setTimeout(check, pollInterval);\r\n };\r\n check();\r\n });\r\n}\r\n\r\nconst jQueryPromise = waitForGlobal(\"$\", 10000);\r\n\r\n// -----\r\n// Service Worker registration and update\r\n// -----\r\n\r\n/**\r\n * Call when a change in service worker is detected. This will add a menu item that lets the user\r\n * refresh the app.\r\n * @param {*} registration\r\n */\r\nasync function showUpdateUI(registration) {\r\n let updateAppMenuItem = document.getElementById(\"update-app-menu-item\");\r\n if (updateAppMenuItem) {\r\n // Already a menu item. Abort.\r\n return;\r\n }\r\n\r\n // jQuery required for next functionality\r\n await jQueryPromise;\r\n\r\n updateAppMenuItem = $(`
  • Update App
  • `)[0];\r\n\r\n const onClick = (e) => {\r\n e.preventDefault();\r\n\r\n if (!registration.waiting) {\r\n // Just to ensure registration.waiting is available before calling postMessage()\r\n return;\r\n }\r\n\r\n updateAppMenuItem.removeEventListener(\"click\", onClick);\r\n\r\n postMessage(\"skipWaiting\", registration.waiting);\r\n };\r\n\r\n updateAppMenuItem.addEventListener(\"click\", onClick);\r\n\r\n const sbMenu = document.querySelector(\".sb-slidebar .sb-menu\");\r\n const appConfigMenuItem = document.getElementById(\"app-config-menu-item\");\r\n sbMenu.insertBefore(updateAppMenuItem, appConfigMenuItem);\r\n};\r\n\r\nfunction onNewServiceWorker(registration, callback) {\r\n if (registration.waiting) {\r\n // SW is waiting to activate. Can occur if multiple clients open and one of the clients is refreshed.\r\n return callback(registration);\r\n }\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n function listenForInstallingWorkerStateChange(e) {\r\n registration.installing.addEventListener(\"statechange\", (e) => {\r\n if (e.target.state === \"installed\") {\r\n // A new service worker is available, inform the user\r\n callback(registration);\r\n }\r\n });\r\n }\r\n\r\n if (registration.installing) {\r\n return listenForInstallingWorkerStateChange();\r\n }\r\n\r\n // We are currently controlled so a new SW may be found...\r\n // Add a listener in case a new SW is found,\r\n registration.addEventListener(\"updatefound\", listenForInstallingWorkerStateChange);\r\n}\r\n\r\nfunction setServiceWorkerVersionInMenu(githash, timestamp) {\r\n const el = document.getElementById(\"service-worker-version\");\r\n if (el) {\r\n el.querySelector(\"[data-hash]\").innerText = githash;\r\n el.querySelector(\"[data-timestamp]\").innerText = timestamp;\r\n }\r\n}\r\n\r\nasync function showAppConfigMenu() {\r\n logger.log(\"showAppConfigMenu\");\r\n // jQuery required for next functionality\r\n await jQueryPromise;\r\n $(\".js-app-config\").css(\"display\", \"\");\r\n}\r\n\r\nasync function serviceWorkerRegisterSuccess(registration) {\r\n logger.log(\"registration successful with scope\", registration.scope);\r\n logger.log(\"registration\", registration);\r\n\r\n try {\r\n const { githash, timestamp } = await postMessage(\"version\");\r\n setServiceWorkerVersionInMenu(githash, timestamp);\r\n } catch (err) {\r\n logger.error(\"Failed to get sw version\");\r\n }\r\n\r\n // When the user asks to refresh the UI, we'll need to reload the window\r\n let preventDevToolsReloadLoop;\r\n // eslint-disable-next-line no-unused-vars\r\n navigator.serviceWorker.addEventListener(\"controllerchange\", (e) => {\r\n logger.log(\"navigator.serviceWorker.controllerchange\", e);\r\n // Ensure refresh is only called once.\r\n // This works around a bug in \"force update on reload\".\r\n if (preventDevToolsReloadLoop) return;\r\n preventDevToolsReloadLoop = true;\r\n logger.log(\"Controller loaded\");\r\n window.location.reload();\r\n });\r\n\r\n await showAppConfigMenu();\r\n await onNewServiceWorker(registration, showUpdateUI);\r\n}\r\n\r\nasync function registerServiceWorker() {\r\n if (\"serviceWorker\" in navigator) {\r\n try {\r\n const registration = await navigator.serviceWorker.register(\"./sw.js\");\r\n return await serviceWorkerRegisterSuccess(registration);\r\n } catch (err) {\r\n logger.error(\"service worker failed to register\", err);\r\n }\r\n }\r\n logger.log(\"navigator.serviceWorker not available\");\r\n}\r\n\r\n\r\n// -----\r\n// Add to Home Screen\r\n// -----\r\n\r\n\r\nconst beforeInstallPrompt = (function() {\r\n let addToHomeScreenElement = null;\r\n\r\n return async (e) => {\r\n logger.log(\"beforeinstallprompt\", e);\r\n\r\n // Prevent Chrome 67 and earlier from automatically showing the prompt\r\n e.preventDefault();\r\n\r\n await jQueryPromise;\r\n\r\n if (!addToHomeScreenElement) {\r\n addToHomeScreenElement = new AddToHomeScreenElement({\r\n logger,\r\n addToHomeScreenImgClass: \"add-to-home-screen\",\r\n $parent: $(\"nav.navbar\"),\r\n });\r\n }\r\n\r\n // Stash the event so it can be triggered later.\r\n addToHomeScreenElement.setBeforeInstallPromptEvent(e);\r\n\r\n // Add \"Add to Home\" icon to the navbar.\r\n addToHomeScreenElement.maybeAddElement();\r\n };\r\n}());\r\n\r\nfunction registerBeforeInstallPrompt() {\r\n window.addEventListener(\"beforeinstallprompt\", beforeInstallPrompt);\r\n}\r\n\r\nexport default {\r\n registerServiceWorker,\r\n registerBeforeInstallPrompt,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport default function iconFactory(network, iconConfig) {\r\n const Icon = (props) => {\r\n const {\r\n className,\r\n iconBgStyle,\r\n logoFillColor,\r\n round,\r\n size,\r\n } = props;\r\n\r\n const baseStyle = {\r\n width: size,\r\n height: size,\r\n };\r\n\r\n const classes = `social-icon social-icon--${network} ${className}`;\r\n\r\n return (\r\n
    \r\n \r\n \r\n {(!round ? (\r\n \r\n ) : (\r\n \r\n ))}\r\n \r\n\r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n };\r\n\r\n Icon.propTypes = {\r\n className: PropTypes.string,\r\n iconBgStyle: PropTypes.object,\r\n logoFillColor: PropTypes.string,\r\n round: PropTypes.bool,\r\n size: PropTypes.number,\r\n };\r\n\r\n Icon.defaultProps = {\r\n className: '',\r\n iconBgStyle: {},\r\n logoFillColor: 'white',\r\n size: 64,\r\n };\r\n\r\n return Icon;\r\n}\r\n","import iconFactory from './utils/iconFactory';\r\n\r\nconst FacebookIcon = iconFactory('facebook', {\r\n icon: 'M34.1,47V33.3h4.6l0.7-5.3h-5.3v-3.4c0-1.5,0.4-2.6,2.6-2.6l2.8,0v-4.8c-0.5-0.1-2.2-0.2-4.1-0.2 c-4.1,0-6.9,2.5-6.9,7V28H24v5.3h4.6V47H34.1z',\r\n mask: 'M0,0v64h64V0H0z M39.6,22l-2.8,0c-2.2,0-2.6,1.1-2.6,2.6V28h5.3l-0.7,5.3h-4.6V47h-5.5V33.3H24V28h4.6V24 c0-4.6,2.8-7,6.9-7c2,0,3.6,0.1,4.1,0.2V22z',\r\n color: '#3b5998',\r\n});\r\n\r\nexport default FacebookIcon;\r\n","import iconFactory from './utils/iconFactory';\r\n\r\nconst TwitterIcon = iconFactory('twitter', {\r\n icon: 'M48,22.1c-1.2,0.5-2.4,0.9-3.8,1c1.4-0.8,2.4-2.1,2.9-3.6c-1.3,0.8-2.7,1.3-4.2,1.6 C41.7,19.8,40,19,38.2,19c-3.6,0-6.6,2.9-6.6,6.6c0,0.5,0.1,1,0.2,1.5c-5.5-0.3-10.3-2.9-13.5-6.9c-0.6,1-0.9,2.1-0.9,3.3 c0,2.3,1.2,4.3,2.9,5.5c-1.1,0-2.1-0.3-3-0.8c0,0,0,0.1,0,0.1c0,3.2,2.3,5.8,5.3,6.4c-0.6,0.1-1.1,0.2-1.7,0.2c-0.4,0-0.8,0-1.2-0.1 c0.8,2.6,3.3,4.5,6.1,4.6c-2.2,1.8-5.1,2.8-8.2,2.8c-0.5,0-1.1,0-1.6-0.1c2.9,1.9,6.4,2.9,10.1,2.9c12.1,0,18.7-10,18.7-18.7 c0-0.3,0-0.6,0-0.8C46,24.5,47.1,23.4,48,22.1z',\r\n mask: 'M0,0v64h64V0H0z M44.7,25.5c0,0.3,0,0.6,0,0.8C44.7,35,38.1,45,26.1,45c-3.7,0-7.2-1.1-10.1-2.9 c0.5,0.1,1,0.1,1.6,0.1c3.1,0,5.9-1,8.2-2.8c-2.9-0.1-5.3-2-6.1-4.6c0.4,0.1,0.8,0.1,1.2,0.1c0.6,0,1.2-0.1,1.7-0.2 c-3-0.6-5.3-3.3-5.3-6.4c0,0,0-0.1,0-0.1c0.9,0.5,1.9,0.8,3,0.8c-1.8-1.2-2.9-3.2-2.9-5.5c0-1.2,0.3-2.3,0.9-3.3 c3.2,4,8.1,6.6,13.5,6.9c-0.1-0.5-0.2-1-0.2-1.5c0-3.6,2.9-6.6,6.6-6.6c1.9,0,3.6,0.8,4.8,2.1c1.5-0.3,2.9-0.8,4.2-1.6 c-0.5,1.5-1.5,2.8-2.9,3.6c1.3-0.2,2.6-0.5,3.8-1C47.1,23.4,46,24.5,44.7,25.5z',\r\n color: '#00aced',\r\n});\r\n\r\nexport default TwitterIcon;\r\n","import iconFactory from './utils/iconFactory';\r\n\r\nconst EmailIcon = iconFactory('email', {\r\n icon: 'M17,22v20h30V22H17z M41.1,25L32,32.1L22.9,25H41.1z M20,39V26.6l12,9.3l12-9.3V39H20z',\r\n mask: 'M41.1,25H22.9l9.1,7.1L41.1,25z M44,26.6l-12,9.3l-12-9.3V39h24V26.6z M0,0v64h64V0H0z M47,42H17V22h30V42z',\r\n color: '#7f7f7f',\r\n});\r\n\r\nexport default EmailIcon;\r\n","import React from \"react\";\r\n// Import icons directly for tree-shaking\r\n// I.e. don't use\r\n// import { FacebookIcon } from \"react-share/src/\";\r\nimport FacebookIcon from \"react-share/src/FacebookIcon\";\r\nimport TwitterIcon from \"react-share/src/TwitterIcon\";\r\nimport EmailIcon from \"react-share/src/EmailIcon\";\r\n\r\nfunction inlineIcon(Component, href) {\r\n const linkStyle = {\r\n paddingLeft: 0,\r\n paddingRight: 0,\r\n };\r\n const style = {\r\n display: \"table-cell\",\r\n textAlign: \"center\",\r\n width: \"33%\",\r\n };\r\n // we need the
    \"display:inline-block\" because the icons are rendered in a\r\n //
    \"display:block\" which won't respect the text-align center.\r\n // so the inline-block div 'constrains' to an inline element, which WILL center.\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default function SocialIcons() {\r\n const wrapperStyle = {\r\n display: \"table\",\r\n width: \"100%\",\r\n tableLayout: \"fixed\",\r\n };\r\n return (\r\n
    \r\n {inlineIcon(FacebookIcon, \"https://www.facebook.com/WhenTheCockCrowedBook/\")}\r\n {inlineIcon(TwitterIcon, \"https://twitter.com/WhenCockCrowed\")}\r\n {inlineIcon(EmailIcon, \"mailto:whenthecockcrowed@gmail.com\")}\r\n
    \r\n );\r\n}\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport qs from \"query-string\";\r\n\r\nimport { getPlayerKeyGenerators } from \"../../books\";\r\n\r\nexport default function PlayerLink({ player, playerKey, book, children }) {\r\n if (!playerKey && player) {\r\n const keyGenerators = getPlayerKeyGenerators(book);\r\n const { lineupPlayerKeyGenerator } = keyGenerators;\r\n playerKey = lineupPlayerKeyGenerator(player);\r\n }\r\n const params = {\r\n playerKey: playerKey,\r\n book: (book && book.key) || undefined,\r\n };\r\n const href = \"./player-stats.html?\" + qs.stringify(params);\r\n return {children};\r\n};\r\n\r\nPlayerLink.propTypes = {\r\n player: PropTypes.object,\r\n playerKey: PropTypes.string,\r\n book: PropTypes.object,\r\n children: PropTypes.node,\r\n};\r\n","export function intersperse(arr, item, opts) {\r\n opts = opts || {};\r\n\r\n function getItem(existingItem, i) {\r\n return typeof item === \"function\" ? item(arr, existingItem, i) : item;\r\n }\r\n\r\n const interspersed = arr.reduce((arr, existingItem, i) => {\r\n if (arr.length > 0) {\r\n arr.push(getItem(existingItem, i));\r\n }\r\n arr.push(existingItem);\r\n return arr;\r\n }, []);\r\n\r\n let arr2 = [];\r\n\r\n if (opts.addBefore === true) {\r\n arr2.push(getItem(null, -1));\r\n }\r\n\r\n arr2 = arr2.concat(interspersed);\r\n\r\n if (opts.addAfter === true) {\r\n arr2.push(getItem(null, arr.length));\r\n }\r\n\r\n return arr2;\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport PlayerLink from \"../PlayerStats/PlayerLink\";\r\n\r\nimport { intersperse } from \"../../array\";\r\n\r\nclass MatchLineupRowWidget extends Component {\r\n constructor() {\r\n super();\r\n this.onClickPlayer1 = this.onClickPlayer1.bind(this);\r\n this.onClickPlayer2 = this.onClickPlayer2.bind(this);\r\n }\r\n\r\n onClickPlayer1() {\r\n if (this.props.onClick) {\r\n this.props.onClick.call(null, this.props.player1, this.props.number);\r\n }\r\n }\r\n\r\n onClickPlayer2() {\r\n if (this.props.onClick) {\r\n this.props.onClick.call(null, this.props.player2, this.props.number);\r\n }\r\n }\r\n\r\n reservesCell(reserves, home) {\r\n const cellClassName = home ? \"right\" : \"left\";\r\n return (\r\n \r\n {reserves}\r\n \r\n );\r\n }\r\n\r\n subsCell(subs, home, renderPlayerLinkPredicate, book) {\r\n const cellClassName = home ? \"right\" : \"left\";\r\n return (\r\n \r\n {intersperse(subs.map((sub, i) => {\r\n const renderPlayerLink = renderPlayerLinkPredicate && renderPlayerLinkPredicate(sub, home);\r\n const span = {sub.name};\r\n return renderPlayerLink ? {span} : span;\r\n }), \", \")}\r\n \r\n );\r\n }\r\n\r\n playerCell(player, home, renderPlayerLinkPredicate, book) {\r\n function playerToDom(p, useBreak) {\r\n const line1 = p.name + (p.capt ? \" (c)\" : \"\");\r\n const line2 = (p.team ? \"(\" + p.team + \")\" : \"\");\r\n if (useBreak) {\r\n return line2 ? [line1,
    , line2] : line1;\r\n }\r\n return line2 ? line1 + \" \" + line2 : line1;\r\n }\r\n\r\n const cellClassName = home ? \"right\" : \"left\";\r\n\r\n const span = (\r\n \r\n {playerToDom(player, this.props.narrowMode)}\r\n \r\n );\r\n const renderPlayerLink = renderPlayerLinkPredicate && renderPlayerLinkPredicate(player, home);\r\n return (\r\n \r\n {renderPlayerLink ? {span} : span}\r\n \r\n );\r\n }\r\n\r\n centreCell(value) {\r\n return (\r\n {value}\r\n );\r\n }\r\n\r\n render() {\r\n const {\r\n book,\r\n player1, player2,\r\n reserves1, reserves2,\r\n subs1, subs2,\r\n number,\r\n renderPlayerLinkPredicate,\r\n } = this.props;\r\n\r\n const centreCellValue = (typeof number === \"number\") ? number : \"Res\";\r\n const className = player1 ? \"player\" : \"\";\r\n\r\n return (\r\n \r\n {player1 ?\r\n this.playerCell(player1, true, renderPlayerLinkPredicate, book) :\r\n subs1 ?\r\n this.subsCell(subs1, true, renderPlayerLinkPredicate, book) :\r\n this.reservesCell(reserves1, true)\r\n }\r\n {this.centreCell(centreCellValue)}\r\n {player2 ?\r\n this.playerCell(player2, false, renderPlayerLinkPredicate, book) :\r\n subs2 ?\r\n this.subsCell(subs2, false, renderPlayerLinkPredicate, book) :\r\n this.reservesCell(reserves2, false)\r\n }\r\n \r\n );\r\n }\r\n}\r\n\r\nMatchLineupRowWidget.propTypes = {\r\n book: PropTypes.object,\r\n narrowMode: PropTypes.bool,\r\n number: PropTypes.number,\r\n onClick: PropTypes.func,\r\n player1: PropTypes.object,\r\n player2: PropTypes.object,\r\n reserves1: PropTypes.string,\r\n reserves2: PropTypes.string,\r\n subs1: PropTypes.array,\r\n subs2: PropTypes.array,\r\n renderPlayerLinkPredicate: PropTypes.func,\r\n};\r\n\r\nexport default MatchLineupRowWidget;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport MatchLineupRowWidget from \"./MatchLineupRowWidget\";\r\nimport PlayerLink from \"../PlayerStats/PlayerLink\";\r\n\r\nimport { intersperse } from \"../../array\";\r\n\r\nclass MatchLineupWidget extends Component {\r\n renderPlayerRows(match, renderPlayerLinkPredicate, book) {\r\n const rows = [];\r\n\r\n // Should both be 13!\r\n const numPlayers = Math.max(match.team1.lineup.length, match.team2.lineup.length);\r\n\r\n const lineup1 = match.team1.lineup;\r\n const lineup2 = match.team2.lineup;\r\n for (let i = 0; i < numPlayers; i++) {\r\n const p1 = lineup1[i];\r\n const p2 = lineup2[i];\r\n const row = ;\r\n rows.push(row);\r\n }\r\n\r\n return rows;\r\n }\r\n\r\n renderScorerRows(match, renderPlayerLinkPredicate, book) {\r\n function amountStr(scorer) {\r\n const NON_BREAKING_SPACE = \"\\u00A0\";\r\n return (scorer.amount > 1) ? (NON_BREAKING_SPACE + \"(\" + scorer.amount + \")\") : \"\";\r\n }\r\n function mapScorersToElements(scorers, type, home) {\r\n const HA = home ? \"H\" : \"A\";\r\n return scorers[type].map((scorer, i) => {\r\n const name = renderPlayerLinkPredicate(scorer, home)\r\n ? {scorer.name}\r\n : scorer.name;\r\n return {name}{amountStr(scorer)};\r\n });\r\n }\r\n return [\"tries\", \"goals\", \"drops\"].map((type, i) => {\r\n const displayType = [\"T\", \"G\", \"DG\"][i];\r\n const scorerElements1 = intersperse(mapScorersToElements(match.team1.scorers, type, true), \", \");\r\n const scorerElements2 = intersperse(mapScorersToElements(match.team2.scorers, type, false), \", \");\r\n return (\r\n \r\n {scorerElements1}\r\n {displayType}\r\n {scorerElements2}\r\n \r\n );\r\n });\r\n }\r\n\r\n render() {\r\n const { book, match, narrowMode } = this.props;\r\n\r\n // Only render links to French players\r\n const franceAtHome = (match.team1.name === \"France\");\r\n const renderPlayerLinkPredicate = (player, home) => franceAtHome === home;\r\n\r\n const reservesOrSubsRow = (match.team1.subs || match.team2.subs) ?\r\n :\r\n ;\r\n\r\n return (\r\n
    \r\n \r\n \r\n {this.renderPlayerRows(match, renderPlayerLinkPredicate, book)}\r\n {reservesOrSubsRow}\r\n {this.renderScorerRows(match, renderPlayerLinkPredicate, book)}\r\n \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nMatchLineupWidget.propTypes = {\r\n book: PropTypes.object,\r\n match: PropTypes.object,\r\n onLineupRowClicked: PropTypes.func,\r\n narrowMode: PropTypes.bool,\r\n};\r\n\r\nexport default MatchLineupWidget;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { dates } from \"../../utils\";\r\nimport MatchLineupWidget from \"./MatchLineupWidget\";\r\n\r\n\r\nconst MatchImage = ({ bookKey, matchDate }) => {\r\n const date = dates.parseDDMMYYYY(matchDate);\r\n\r\n // NOTE - This assumes there will be an appropriately named image in the timeline's img folder.\r\n // Move these images to a 'common' place as required.\r\n // But they are ok here for now.\r\n const filename = date.toISOString().substring(0, 10) + \".1.jpeg\";\r\n\r\n const imgSrc = `timeline/img/${bookKey}/${filename}`;\r\n\r\n // Make the image centred, with a maxWidth of the image's container,\r\n // and a maxHeight of half of the viewport height.\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n};\r\n\r\nMatchImage.propTypes = {\r\n bookKey: PropTypes.string,\r\n matchDate: PropTypes.string,\r\n};\r\n\r\n\r\nclass MatchWidget extends Component {\r\n render() {\r\n const { book, match, prevLink, nextLink, onLineupRowClicked, narrowMode, playerKeyGenerator } = this.props;\r\n // console.log(\"MatchWidget\", book);\r\n\r\n const dateStr = match.date;\r\n const competitionStr = match.competition ? match.competition : \"\\u00A0\";\r\n const noop = function() { };\r\n const prevLinkClick = prevLink ? prevLink.onClick : noop;\r\n const nextLinkClick = nextLink ? nextLink.onClick : noop;\r\n\r\n const { team1, team2 } = match;\r\n const nameAndScore = `${team1.name} ${team1.score} - ${team2.score} ${team2.name}`;\r\n\r\n let misc = (\r\n
    \r\n Misc: {match.misc}\r\n
    \r\n );\r\n\r\n // clear misc until we're sure we want it.\r\n misc = \"\";\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    {prevLink ? prevLink.text : \"\"}

    {dateStr}

    {nextLink ? nextLink.text : \"\"}
    \r\n \r\n

    {nameAndScore}

    \r\n

    {match.venue}

    \r\n

    {competitionStr}

    \r\n
    \r\n \r\n
    \r\n {misc}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nMatchWidget.propTypes = {\r\n book: PropTypes.object,\r\n match: PropTypes.object,\r\n prevLink: PropTypes.object,\r\n nextLink: PropTypes.object,\r\n onLineupRowClicked: PropTypes.func,\r\n narrowMode: PropTypes.bool,\r\n playerKeyGenerator: PropTypes.func,\r\n};\r\n\r\nexport default MatchWidget;\r\n","export default async function loadIntoState(\r\n component,\r\n stateSupplier,\r\n loadingFlagName = \"loading\",\r\n errorStateName = \"loadingError\"\r\n) {\r\n try {\r\n component.setState({\r\n [loadingFlagName]: true,\r\n });\r\n const newState = await stateSupplier();\r\n console.log(\"loadIntoState\", newState);\r\n component.setState({\r\n ...newState,\r\n [loadingFlagName]: false,\r\n });\r\n } catch (err) {\r\n console.log(\"loadIntoState\", err);\r\n component.setState({\r\n [loadingFlagName]: false,\r\n [errorStateName]: err,\r\n });\r\n }\r\n};\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n/**\r\n * LoadingImage uses a data url so that the image is visible even for a slow network where the\r\n * loading image is not yet loaded/in cache.\r\n *\r\n * @param {object} component props.\r\n *\r\n * @return {function} Functional react component.\r\n */\r\nconst LoadingImage = ({ children, width = 20 }) => {\r\n // \"/img/loading.circles.gif\"\r\n // eslint-disable-next-line max-len\r\n const dataUrl = \"data:image/gif;base64,R0lGODlhEgASAMQaAHl5d66urMXFw3l5dpSUk5WVlKOjoq+vrsbGw6Sko7u7uaWlpbm5t3h4doiIhtLSz4aGhJaWlsbGxNHRzrCwr5SUkqKiobq6uNHRz4eHhf///wAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAaACwAAAAAEgASAAAFaqAmjmRplstyrkmbrCNFaUZtaFF0HvyhWRZNYVgwBY4BEmFJOB1NlYpJoYBpHI7RZXtZZb4ZEbd7AodFDIYVAjFJJCYA4ISoI0hyuUnAF2geDxoDgwMnfBoYiRgaDQ1WiIqPJBMTkpYaIQAAIfkEBQoAGgAsAQABABAAEAAABWSgJo4aRZEoeaxHOiqKFsyBtizopV9ynfwJ0o43MhgNKAYjZbGQJBLXKBLRIK4IaWFbEHgFUoKYoPFKRZUK6fFIORwojBxDytgzpDkdANDc8SQTExp8fBoQEGcDiwNnJA0NLiEAACH5BAUKABoALAEAAQAQABAAAAVloCaOmqKQKHmtVzpKksa2FIUiOKIxjHb8B5JgKCAFjgHUMHUkPR6u0WKhwVgx0YQ2ccW6DGCDZjKJiiwWEgCQikRQ6zWpQC+QBviBxuHQEP4EKA0NGhmGGRoVFWaHiGYjEBAuIQAAIfkEBQoAGgAsAQABABAAEAAABWSgJo6aJJEoiaxIOj6PJsyCpigopmNyff0X0o43AgZJk0mKwSABAK4RhaJ5PqOH7GHAHUQD4ICm0YiKwCSHI7VYoDLwDClBT5Di8khEY+gbUBAQGgWEBRoWFmYEiwRmJBUVLiEAACH5BAUKABoALAEAAQAQABAAAAVloCaO2vOQKImtWDoCgMa2koTCsDZNGuIjpIFwQBIYBahGI2UkORyukUKhyVgz0Yv2csW6thcNBBIVMRikSCRFoaAK8ALpQD+QCHiCZrHQBP4BKBUVGgmGCX6BUQaMBmUkFhYuIQAAIfkEBQoAGgAsAQABABAAEAAABWagJo4aAJAoaZrp6DjaIA/a86BZnmlNo2FADEm3GwWFJAgkNZmQIpHWSCLRFK4FKWKLIHgJUoFYoKlUpCIxabFIKRSohDxButgvJIPeoKFQNHd4JBYWGgeHBxoMDGgBjgFoJI4tIQAAIfkEBQoAGgAsAQABABAAEAAABWSgJo6a45Aoma1ZOkaRxrYAgBZ4oUGQVtckgpBAGhgHqEol1WiQFgvX6PHQJK4JKWaLMXgNWq7GYpGKJhMShZKSSFCH+IGEqCNIgXxAo1BoBIACKHkaF4YXf4JSh4hmIwwMLiEAACH5BAUKABoALAEAAQAQABAAAAVloCaOWhSRKFmsRToui0bMhOY4aKInWlVpmWCGZCgaSMIhyWJJQSAkCsU1AgA0h+yBarUGvgHqYDzQfKmiRoOkUKQeD9RlfiFh7hgSvS6RaPB5JAwMGgiGCBoTE2gCjQJoJI0uIQAAOw==\";\r\n return (\r\n <>\r\n {children}\r\n \r\n );\r\n};\r\n\r\nLoadingImage.propTypes = {\r\n children: PropTypes.node,\r\n width: PropTypes.string,\r\n};\r\n\r\nexport default LoadingImage;\r\n","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","function isAbsolute(pathname) {\n return pathname.charAt(0) === '/';\n}\n\n// About 1.5x faster than the two-arg version of Array#splice()\nfunction spliceOne(list, index) {\n for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) {\n list[i] = list[k];\n }\n\n list.pop();\n}\n\n// This implementation is based heavily on node's url.parse\nfunction resolvePathname(to, from) {\n if (from === undefined) from = '';\n\n var toParts = (to && to.split('/')) || [];\n var fromParts = (from && from.split('/')) || [];\n\n var isToAbs = to && isAbsolute(to);\n var isFromAbs = from && isAbsolute(from);\n var mustEndAbs = isToAbs || isFromAbs;\n\n if (to && isAbsolute(to)) {\n // to is absolute\n fromParts = toParts;\n } else if (toParts.length) {\n // to is relative, drop the filename\n fromParts.pop();\n fromParts = fromParts.concat(toParts);\n }\n\n if (!fromParts.length) return '/';\n\n var hasTrailingSlash;\n if (fromParts.length) {\n var last = fromParts[fromParts.length - 1];\n hasTrailingSlash = last === '.' || last === '..' || last === '';\n } else {\n hasTrailingSlash = false;\n }\n\n var up = 0;\n for (var i = fromParts.length; i >= 0; i--) {\n var part = fromParts[i];\n\n if (part === '.') {\n spliceOne(fromParts, i);\n } else if (part === '..') {\n spliceOne(fromParts, i);\n up++;\n } else if (up) {\n spliceOne(fromParts, i);\n up--;\n }\n }\n\n if (!mustEndAbs) for (; up--; up) fromParts.unshift('..');\n\n if (\n mustEndAbs &&\n fromParts[0] !== '' &&\n (!fromParts[0] || !isAbsolute(fromParts[0]))\n )\n fromParts.unshift('');\n\n var result = fromParts.join('/');\n\n if (hasTrailingSlash && result.substr(-1) !== '/') result += '/';\n\n return result;\n}\n\nexport default resolvePathname;\n","var isProduction = process.env.NODE_ENV === 'production';\nvar prefix = 'Invariant failed';\nfunction invariant(condition, message) {\n if (condition) {\n return;\n }\n\n if (isProduction) {\n throw new Error(prefix);\n } else {\n throw new Error(prefix + \": \" + (message || ''));\n }\n}\n\nexport default invariant;\n","import _extends from '@babel/runtime/helpers/esm/extends';\nimport resolvePathname from 'resolve-pathname';\nimport valueEqual from 'value-equal';\nimport warning from 'tiny-warning';\nimport invariant from 'tiny-invariant';\n\nfunction addLeadingSlash(path) {\n return path.charAt(0) === '/' ? path : '/' + path;\n}\nfunction stripLeadingSlash(path) {\n return path.charAt(0) === '/' ? path.substr(1) : path;\n}\nfunction hasBasename(path, prefix) {\n return path.toLowerCase().indexOf(prefix.toLowerCase()) === 0 && '/?#'.indexOf(path.charAt(prefix.length)) !== -1;\n}\nfunction stripBasename(path, prefix) {\n return hasBasename(path, prefix) ? path.substr(prefix.length) : path;\n}\nfunction stripTrailingSlash(path) {\n return path.charAt(path.length - 1) === '/' ? path.slice(0, -1) : path;\n}\nfunction parsePath(path) {\n var pathname = path || '/';\n var search = '';\n var hash = '';\n var hashIndex = pathname.indexOf('#');\n\n if (hashIndex !== -1) {\n hash = pathname.substr(hashIndex);\n pathname = pathname.substr(0, hashIndex);\n }\n\n var searchIndex = pathname.indexOf('?');\n\n if (searchIndex !== -1) {\n search = pathname.substr(searchIndex);\n pathname = pathname.substr(0, searchIndex);\n }\n\n return {\n pathname: pathname,\n search: search === '?' ? '' : search,\n hash: hash === '#' ? '' : hash\n };\n}\nfunction createPath(location) {\n var pathname = location.pathname,\n search = location.search,\n hash = location.hash;\n var path = pathname || '/';\n if (search && search !== '?') path += search.charAt(0) === '?' ? search : \"?\" + search;\n if (hash && hash !== '#') path += hash.charAt(0) === '#' ? hash : \"#\" + hash;\n return path;\n}\n\nfunction createLocation(path, state, key, currentLocation) {\n var location;\n\n if (typeof path === 'string') {\n // Two-arg form: push(path, state)\n location = parsePath(path);\n location.state = state;\n } else {\n // One-arg form: push(location)\n location = _extends({}, path);\n if (location.pathname === undefined) location.pathname = '';\n\n if (location.search) {\n if (location.search.charAt(0) !== '?') location.search = '?' + location.search;\n } else {\n location.search = '';\n }\n\n if (location.hash) {\n if (location.hash.charAt(0) !== '#') location.hash = '#' + location.hash;\n } else {\n location.hash = '';\n }\n\n if (state !== undefined && location.state === undefined) location.state = state;\n }\n\n try {\n location.pathname = decodeURI(location.pathname);\n } catch (e) {\n if (e instanceof URIError) {\n throw new URIError('Pathname \"' + location.pathname + '\" could not be decoded. ' + 'This is likely caused by an invalid percent-encoding.');\n } else {\n throw e;\n }\n }\n\n if (key) location.key = key;\n\n if (currentLocation) {\n // Resolve incomplete/relative pathname relative to current location.\n if (!location.pathname) {\n location.pathname = currentLocation.pathname;\n } else if (location.pathname.charAt(0) !== '/') {\n location.pathname = resolvePathname(location.pathname, currentLocation.pathname);\n }\n } else {\n // When there is no prior location and pathname is empty, set it to /\n if (!location.pathname) {\n location.pathname = '/';\n }\n }\n\n return location;\n}\nfunction locationsAreEqual(a, b) {\n return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash && a.key === b.key && valueEqual(a.state, b.state);\n}\n\nfunction createTransitionManager() {\n var prompt = null;\n\n function setPrompt(nextPrompt) {\n process.env.NODE_ENV !== \"production\" ? warning(prompt == null, 'A history supports only one prompt at a time') : void 0;\n prompt = nextPrompt;\n return function () {\n if (prompt === nextPrompt) prompt = null;\n };\n }\n\n function confirmTransitionTo(location, action, getUserConfirmation, callback) {\n // TODO: If another transition starts while we're still confirming\n // the previous one, we may end up in a weird state. Figure out the\n // best way to handle this.\n if (prompt != null) {\n var result = typeof prompt === 'function' ? prompt(location, action) : prompt;\n\n if (typeof result === 'string') {\n if (typeof getUserConfirmation === 'function') {\n getUserConfirmation(result, callback);\n } else {\n process.env.NODE_ENV !== \"production\" ? warning(false, 'A history needs a getUserConfirmation function in order to use a prompt message') : void 0;\n callback(true);\n }\n } else {\n // Return false from a transition hook to cancel the transition.\n callback(result !== false);\n }\n } else {\n callback(true);\n }\n }\n\n var listeners = [];\n\n function appendListener(fn) {\n var isActive = true;\n\n function listener() {\n if (isActive) fn.apply(void 0, arguments);\n }\n\n listeners.push(listener);\n return function () {\n isActive = false;\n listeners = listeners.filter(function (item) {\n return item !== listener;\n });\n };\n }\n\n function notifyListeners() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n listeners.forEach(function (listener) {\n return listener.apply(void 0, args);\n });\n }\n\n return {\n setPrompt: setPrompt,\n confirmTransitionTo: confirmTransitionTo,\n appendListener: appendListener,\n notifyListeners: notifyListeners\n };\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\nfunction getConfirmation(message, callback) {\n callback(window.confirm(message)); // eslint-disable-line no-alert\n}\n/**\n * Returns true if the HTML5 history API is supported. Taken from Modernizr.\n *\n * https://github.com/Modernizr/Modernizr/blob/master/LICENSE\n * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js\n * changed to avoid false negatives for Windows Phones: https://github.com/reactjs/react-router/issues/586\n */\n\nfunction supportsHistory() {\n var ua = window.navigator.userAgent;\n if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) return false;\n return window.history && 'pushState' in window.history;\n}\n/**\n * Returns true if browser fires popstate on hash change.\n * IE10 and IE11 do not.\n */\n\nfunction supportsPopStateOnHashChange() {\n return window.navigator.userAgent.indexOf('Trident') === -1;\n}\n/**\n * Returns false if using go(n) with hash history causes a full page reload.\n */\n\nfunction supportsGoWithoutReloadUsingHash() {\n return window.navigator.userAgent.indexOf('Firefox') === -1;\n}\n/**\n * Returns true if a given popstate event is an extraneous WebKit event.\n * Accounts for the fact that Chrome on iOS fires real popstate events\n * containing undefined state when pressing the back button.\n */\n\nfunction isExtraneousPopstateEvent(event) {\n return event.state === undefined && navigator.userAgent.indexOf('CriOS') === -1;\n}\n\nvar PopStateEvent = 'popstate';\nvar HashChangeEvent = 'hashchange';\n\nfunction getHistoryState() {\n try {\n return window.history.state || {};\n } catch (e) {\n // IE 11 sometimes throws when accessing window.history.state\n // See https://github.com/ReactTraining/history/pull/289\n return {};\n }\n}\n/**\n * Creates a history object that uses the HTML5 history API including\n * pushState, replaceState, and the popstate event.\n */\n\n\nfunction createBrowserHistory(props) {\n if (props === void 0) {\n props = {};\n }\n\n !canUseDOM ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Browser history needs a DOM') : invariant(false) : void 0;\n var globalHistory = window.history;\n var canUseHistory = supportsHistory();\n var needsHashChangeListener = !supportsPopStateOnHashChange();\n var _props = props,\n _props$forceRefresh = _props.forceRefresh,\n forceRefresh = _props$forceRefresh === void 0 ? false : _props$forceRefresh,\n _props$getUserConfirm = _props.getUserConfirmation,\n getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,\n _props$keyLength = _props.keyLength,\n keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;\n var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';\n\n function getDOMLocation(historyState) {\n var _ref = historyState || {},\n key = _ref.key,\n state = _ref.state;\n\n var _window$location = window.location,\n pathname = _window$location.pathname,\n search = _window$location.search,\n hash = _window$location.hash;\n var path = pathname + search + hash;\n process.env.NODE_ENV !== \"production\" ? warning(!basename || hasBasename(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path \"' + path + '\" to begin with \"' + basename + '\".') : void 0;\n if (basename) path = stripBasename(path, basename);\n return createLocation(path, state, key);\n }\n\n function createKey() {\n return Math.random().toString(36).substr(2, keyLength);\n }\n\n var transitionManager = createTransitionManager();\n\n function setState(nextState) {\n _extends(history, nextState);\n\n history.length = globalHistory.length;\n transitionManager.notifyListeners(history.location, history.action);\n }\n\n function handlePopState(event) {\n // Ignore extraneous popstate events in WebKit.\n if (isExtraneousPopstateEvent(event)) return;\n handlePop(getDOMLocation(event.state));\n }\n\n function handleHashChange() {\n handlePop(getDOMLocation(getHistoryState()));\n }\n\n var forceNextPop = false;\n\n function handlePop(location) {\n if (forceNextPop) {\n forceNextPop = false;\n setState();\n } else {\n var action = 'POP';\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (ok) {\n setState({\n action: action,\n location: location\n });\n } else {\n revertPop(location);\n }\n });\n }\n }\n\n function revertPop(fromLocation) {\n var toLocation = history.location; // TODO: We could probably make this more reliable by\n // keeping a list of keys we've seen in sessionStorage.\n // Instead, we just default to 0 for keys we don't know.\n\n var toIndex = allKeys.indexOf(toLocation.key);\n if (toIndex === -1) toIndex = 0;\n var fromIndex = allKeys.indexOf(fromLocation.key);\n if (fromIndex === -1) fromIndex = 0;\n var delta = toIndex - fromIndex;\n\n if (delta) {\n forceNextPop = true;\n go(delta);\n }\n }\n\n var initialLocation = getDOMLocation(getHistoryState());\n var allKeys = [initialLocation.key]; // Public interface\n\n function createHref(location) {\n return basename + createPath(location);\n }\n\n function push(path, state) {\n process.env.NODE_ENV !== \"production\" ? warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : void 0;\n var action = 'PUSH';\n var location = createLocation(path, state, createKey(), history.location);\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (!ok) return;\n var href = createHref(location);\n var key = location.key,\n state = location.state;\n\n if (canUseHistory) {\n globalHistory.pushState({\n key: key,\n state: state\n }, null, href);\n\n if (forceRefresh) {\n window.location.href = href;\n } else {\n var prevIndex = allKeys.indexOf(history.location.key);\n var nextKeys = allKeys.slice(0, prevIndex + 1);\n nextKeys.push(location.key);\n allKeys = nextKeys;\n setState({\n action: action,\n location: location\n });\n }\n } else {\n process.env.NODE_ENV !== \"production\" ? warning(state === undefined, 'Browser history cannot push state in browsers that do not support HTML5 history') : void 0;\n window.location.href = href;\n }\n });\n }\n\n function replace(path, state) {\n process.env.NODE_ENV !== \"production\" ? warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : void 0;\n var action = 'REPLACE';\n var location = createLocation(path, state, createKey(), history.location);\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (!ok) return;\n var href = createHref(location);\n var key = location.key,\n state = location.state;\n\n if (canUseHistory) {\n globalHistory.replaceState({\n key: key,\n state: state\n }, null, href);\n\n if (forceRefresh) {\n window.location.replace(href);\n } else {\n var prevIndex = allKeys.indexOf(history.location.key);\n if (prevIndex !== -1) allKeys[prevIndex] = location.key;\n setState({\n action: action,\n location: location\n });\n }\n } else {\n process.env.NODE_ENV !== \"production\" ? warning(state === undefined, 'Browser history cannot replace state in browsers that do not support HTML5 history') : void 0;\n window.location.replace(href);\n }\n });\n }\n\n function go(n) {\n globalHistory.go(n);\n }\n\n function goBack() {\n go(-1);\n }\n\n function goForward() {\n go(1);\n }\n\n var listenerCount = 0;\n\n function checkDOMListeners(delta) {\n listenerCount += delta;\n\n if (listenerCount === 1 && delta === 1) {\n window.addEventListener(PopStateEvent, handlePopState);\n if (needsHashChangeListener) window.addEventListener(HashChangeEvent, handleHashChange);\n } else if (listenerCount === 0) {\n window.removeEventListener(PopStateEvent, handlePopState);\n if (needsHashChangeListener) window.removeEventListener(HashChangeEvent, handleHashChange);\n }\n }\n\n var isBlocked = false;\n\n function block(prompt) {\n if (prompt === void 0) {\n prompt = false;\n }\n\n var unblock = transitionManager.setPrompt(prompt);\n\n if (!isBlocked) {\n checkDOMListeners(1);\n isBlocked = true;\n }\n\n return function () {\n if (isBlocked) {\n isBlocked = false;\n checkDOMListeners(-1);\n }\n\n return unblock();\n };\n }\n\n function listen(listener) {\n var unlisten = transitionManager.appendListener(listener);\n checkDOMListeners(1);\n return function () {\n checkDOMListeners(-1);\n unlisten();\n };\n }\n\n var history = {\n length: globalHistory.length,\n action: 'POP',\n location: initialLocation,\n createHref: createHref,\n push: push,\n replace: replace,\n go: go,\n goBack: goBack,\n goForward: goForward,\n block: block,\n listen: listen\n };\n return history;\n}\n\nvar HashChangeEvent$1 = 'hashchange';\nvar HashPathCoders = {\n hashbang: {\n encodePath: function encodePath(path) {\n return path.charAt(0) === '!' ? path : '!/' + stripLeadingSlash(path);\n },\n decodePath: function decodePath(path) {\n return path.charAt(0) === '!' ? path.substr(1) : path;\n }\n },\n noslash: {\n encodePath: stripLeadingSlash,\n decodePath: addLeadingSlash\n },\n slash: {\n encodePath: addLeadingSlash,\n decodePath: addLeadingSlash\n }\n};\n\nfunction stripHash(url) {\n var hashIndex = url.indexOf('#');\n return hashIndex === -1 ? url : url.slice(0, hashIndex);\n}\n\nfunction getHashPath() {\n // We can't use window.location.hash here because it's not\n // consistent across browsers - Firefox will pre-decode it!\n var href = window.location.href;\n var hashIndex = href.indexOf('#');\n return hashIndex === -1 ? '' : href.substring(hashIndex + 1);\n}\n\nfunction pushHashPath(path) {\n window.location.hash = path;\n}\n\nfunction replaceHashPath(path) {\n window.location.replace(stripHash(window.location.href) + '#' + path);\n}\n\nfunction createHashHistory(props) {\n if (props === void 0) {\n props = {};\n }\n\n !canUseDOM ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Hash history needs a DOM') : invariant(false) : void 0;\n var globalHistory = window.history;\n var canGoWithoutReload = supportsGoWithoutReloadUsingHash();\n var _props = props,\n _props$getUserConfirm = _props.getUserConfirmation,\n getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,\n _props$hashType = _props.hashType,\n hashType = _props$hashType === void 0 ? 'slash' : _props$hashType;\n var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';\n var _HashPathCoders$hashT = HashPathCoders[hashType],\n encodePath = _HashPathCoders$hashT.encodePath,\n decodePath = _HashPathCoders$hashT.decodePath;\n\n function getDOMLocation() {\n var path = decodePath(getHashPath());\n process.env.NODE_ENV !== \"production\" ? warning(!basename || hasBasename(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path \"' + path + '\" to begin with \"' + basename + '\".') : void 0;\n if (basename) path = stripBasename(path, basename);\n return createLocation(path);\n }\n\n var transitionManager = createTransitionManager();\n\n function setState(nextState) {\n _extends(history, nextState);\n\n history.length = globalHistory.length;\n transitionManager.notifyListeners(history.location, history.action);\n }\n\n var forceNextPop = false;\n var ignorePath = null;\n\n function locationsAreEqual$$1(a, b) {\n return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash;\n }\n\n function handleHashChange() {\n var path = getHashPath();\n var encodedPath = encodePath(path);\n\n if (path !== encodedPath) {\n // Ensure we always have a properly-encoded hash.\n replaceHashPath(encodedPath);\n } else {\n var location = getDOMLocation();\n var prevLocation = history.location;\n if (!forceNextPop && locationsAreEqual$$1(prevLocation, location)) return; // A hashchange doesn't always == location change.\n\n if (ignorePath === createPath(location)) return; // Ignore this change; we already setState in push/replace.\n\n ignorePath = null;\n handlePop(location);\n }\n }\n\n function handlePop(location) {\n if (forceNextPop) {\n forceNextPop = false;\n setState();\n } else {\n var action = 'POP';\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (ok) {\n setState({\n action: action,\n location: location\n });\n } else {\n revertPop(location);\n }\n });\n }\n }\n\n function revertPop(fromLocation) {\n var toLocation = history.location; // TODO: We could probably make this more reliable by\n // keeping a list of paths we've seen in sessionStorage.\n // Instead, we just default to 0 for paths we don't know.\n\n var toIndex = allPaths.lastIndexOf(createPath(toLocation));\n if (toIndex === -1) toIndex = 0;\n var fromIndex = allPaths.lastIndexOf(createPath(fromLocation));\n if (fromIndex === -1) fromIndex = 0;\n var delta = toIndex - fromIndex;\n\n if (delta) {\n forceNextPop = true;\n go(delta);\n }\n } // Ensure the hash is encoded properly before doing anything else.\n\n\n var path = getHashPath();\n var encodedPath = encodePath(path);\n if (path !== encodedPath) replaceHashPath(encodedPath);\n var initialLocation = getDOMLocation();\n var allPaths = [createPath(initialLocation)]; // Public interface\n\n function createHref(location) {\n var baseTag = document.querySelector('base');\n var href = '';\n\n if (baseTag && baseTag.getAttribute('href')) {\n href = stripHash(window.location.href);\n }\n\n return href + '#' + encodePath(basename + createPath(location));\n }\n\n function push(path, state) {\n process.env.NODE_ENV !== \"production\" ? warning(state === undefined, 'Hash history cannot push state; it is ignored') : void 0;\n var action = 'PUSH';\n var location = createLocation(path, undefined, undefined, history.location);\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (!ok) return;\n var path = createPath(location);\n var encodedPath = encodePath(basename + path);\n var hashChanged = getHashPath() !== encodedPath;\n\n if (hashChanged) {\n // We cannot tell if a hashchange was caused by a PUSH, so we'd\n // rather setState here and ignore the hashchange. The caveat here\n // is that other hash histories in the page will consider it a POP.\n ignorePath = path;\n pushHashPath(encodedPath);\n var prevIndex = allPaths.lastIndexOf(createPath(history.location));\n var nextPaths = allPaths.slice(0, prevIndex + 1);\n nextPaths.push(path);\n allPaths = nextPaths;\n setState({\n action: action,\n location: location\n });\n } else {\n process.env.NODE_ENV !== \"production\" ? warning(false, 'Hash history cannot PUSH the same path; a new entry will not be added to the history stack') : void 0;\n setState();\n }\n });\n }\n\n function replace(path, state) {\n process.env.NODE_ENV !== \"production\" ? warning(state === undefined, 'Hash history cannot replace state; it is ignored') : void 0;\n var action = 'REPLACE';\n var location = createLocation(path, undefined, undefined, history.location);\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (!ok) return;\n var path = createPath(location);\n var encodedPath = encodePath(basename + path);\n var hashChanged = getHashPath() !== encodedPath;\n\n if (hashChanged) {\n // We cannot tell if a hashchange was caused by a REPLACE, so we'd\n // rather setState here and ignore the hashchange. The caveat here\n // is that other hash histories in the page will consider it a POP.\n ignorePath = path;\n replaceHashPath(encodedPath);\n }\n\n var prevIndex = allPaths.indexOf(createPath(history.location));\n if (prevIndex !== -1) allPaths[prevIndex] = path;\n setState({\n action: action,\n location: location\n });\n });\n }\n\n function go(n) {\n process.env.NODE_ENV !== \"production\" ? warning(canGoWithoutReload, 'Hash history go(n) causes a full page reload in this browser') : void 0;\n globalHistory.go(n);\n }\n\n function goBack() {\n go(-1);\n }\n\n function goForward() {\n go(1);\n }\n\n var listenerCount = 0;\n\n function checkDOMListeners(delta) {\n listenerCount += delta;\n\n if (listenerCount === 1 && delta === 1) {\n window.addEventListener(HashChangeEvent$1, handleHashChange);\n } else if (listenerCount === 0) {\n window.removeEventListener(HashChangeEvent$1, handleHashChange);\n }\n }\n\n var isBlocked = false;\n\n function block(prompt) {\n if (prompt === void 0) {\n prompt = false;\n }\n\n var unblock = transitionManager.setPrompt(prompt);\n\n if (!isBlocked) {\n checkDOMListeners(1);\n isBlocked = true;\n }\n\n return function () {\n if (isBlocked) {\n isBlocked = false;\n checkDOMListeners(-1);\n }\n\n return unblock();\n };\n }\n\n function listen(listener) {\n var unlisten = transitionManager.appendListener(listener);\n checkDOMListeners(1);\n return function () {\n checkDOMListeners(-1);\n unlisten();\n };\n }\n\n var history = {\n length: globalHistory.length,\n action: 'POP',\n location: initialLocation,\n createHref: createHref,\n push: push,\n replace: replace,\n go: go,\n goBack: goBack,\n goForward: goForward,\n block: block,\n listen: listen\n };\n return history;\n}\n\nfunction clamp(n, lowerBound, upperBound) {\n return Math.min(Math.max(n, lowerBound), upperBound);\n}\n/**\n * Creates a history object that stores locations in memory.\n */\n\n\nfunction createMemoryHistory(props) {\n if (props === void 0) {\n props = {};\n }\n\n var _props = props,\n getUserConfirmation = _props.getUserConfirmation,\n _props$initialEntries = _props.initialEntries,\n initialEntries = _props$initialEntries === void 0 ? ['/'] : _props$initialEntries,\n _props$initialIndex = _props.initialIndex,\n initialIndex = _props$initialIndex === void 0 ? 0 : _props$initialIndex,\n _props$keyLength = _props.keyLength,\n keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;\n var transitionManager = createTransitionManager();\n\n function setState(nextState) {\n _extends(history, nextState);\n\n history.length = history.entries.length;\n transitionManager.notifyListeners(history.location, history.action);\n }\n\n function createKey() {\n return Math.random().toString(36).substr(2, keyLength);\n }\n\n var index = clamp(initialIndex, 0, initialEntries.length - 1);\n var entries = initialEntries.map(function (entry) {\n return typeof entry === 'string' ? createLocation(entry, undefined, createKey()) : createLocation(entry, undefined, entry.key || createKey());\n }); // Public interface\n\n var createHref = createPath;\n\n function push(path, state) {\n process.env.NODE_ENV !== \"production\" ? warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : void 0;\n var action = 'PUSH';\n var location = createLocation(path, state, createKey(), history.location);\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (!ok) return;\n var prevIndex = history.index;\n var nextIndex = prevIndex + 1;\n var nextEntries = history.entries.slice(0);\n\n if (nextEntries.length > nextIndex) {\n nextEntries.splice(nextIndex, nextEntries.length - nextIndex, location);\n } else {\n nextEntries.push(location);\n }\n\n setState({\n action: action,\n location: location,\n index: nextIndex,\n entries: nextEntries\n });\n });\n }\n\n function replace(path, state) {\n process.env.NODE_ENV !== \"production\" ? warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : void 0;\n var action = 'REPLACE';\n var location = createLocation(path, state, createKey(), history.location);\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (!ok) return;\n history.entries[history.index] = location;\n setState({\n action: action,\n location: location\n });\n });\n }\n\n function go(n) {\n var nextIndex = clamp(history.index + n, 0, history.entries.length - 1);\n var action = 'POP';\n var location = history.entries[nextIndex];\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (ok) {\n setState({\n action: action,\n location: location,\n index: nextIndex\n });\n } else {\n // Mimic the behavior of DOM histories by\n // causing a render after a cancelled POP.\n setState();\n }\n });\n }\n\n function goBack() {\n go(-1);\n }\n\n function goForward() {\n go(1);\n }\n\n function canGo(n) {\n var nextIndex = history.index + n;\n return nextIndex >= 0 && nextIndex < history.entries.length;\n }\n\n function block(prompt) {\n if (prompt === void 0) {\n prompt = false;\n }\n\n return transitionManager.setPrompt(prompt);\n }\n\n function listen(listener) {\n return transitionManager.appendListener(listener);\n }\n\n var history = {\n length: entries.length,\n action: 'POP',\n location: entries[index],\n index: index,\n entries: entries,\n createHref: createHref,\n push: push,\n replace: replace,\n go: go,\n goBack: goBack,\n goForward: goForward,\n canGo: canGo,\n block: block,\n listen: listen\n };\n return history;\n}\n\nexport { createBrowserHistory, createHashHistory, createMemoryHistory, createLocation, locationsAreEqual, parsePath, createPath };\n","import { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport qs from \"query-string\";\r\nimport { createBrowserHistory as createHistory } from \"history\";\r\n\r\nclass History extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.handleHistory = this.handleHistory.bind(this);\r\n\r\n this.history = createHistory();\r\n\r\n this.state = {};\r\n }\r\n\r\n componentDidMount() {\r\n this.unlisten = this.history.listen(this.handleHistory);\r\n this.handleHistory(window.location, null, true);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.unlisten();\r\n }\r\n\r\n handleHistory(location, action, initial) {\r\n // console.log(\"History\", \"handleHistory\", location, action);\r\n // location is an object like window.location\r\n this.setState({\r\n location,\r\n action: action || null,\r\n params: qs.parse(location.search),\r\n initial: initial || false,\r\n });\r\n }\r\n\r\n componentDidUpdate(prevProps, prevState) {\r\n const { onHistoryChange } = this.props;\r\n const stateChanged = this.state !== prevState;\r\n // console.log(\"History\", \"componentDidUpdate\", \"stateChanged\", stateChanged);\r\n if (stateChanged) {\r\n // console.log(\"History\", \"componentDidUpdate\", \"stateChanged\", this.state, prevState);\r\n }\r\n stateChanged && onHistoryChange && onHistoryChange(this.state);\r\n }\r\n\r\n render() {\r\n const { location, params } = this.state;\r\n const { history } = this;\r\n return this.props.children({\r\n history,\r\n location,\r\n params,\r\n pushParams(newParams, merge = true) {\r\n if (merge) {\r\n newParams = { ...params, ...newParams };\r\n }\r\n history.push(location.pathname + \"?\" + qs.stringify(newParams));\r\n },\r\n });\r\n }\r\n}\r\n\r\nHistory.propTypes = {\r\n children: PropTypes.func,\r\n onHistoryChange: PropTypes.func,\r\n};\r\n\r\nexport default History;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nexport default function MatchLink({ date, children }) {\r\n date = date.replace(/\\//g, \"\");\r\n return {children};\r\n};\r\n\r\nMatchLink.propTypes = {\r\n date: PropTypes.string,\r\n children: PropTypes.node,\r\n};\r\n","import {\r\n findBookIdx,\r\n findBookForDate,\r\n findPlayerIdxForPenPic,\r\n} from \"./books\";\r\n\r\nimport {\r\n fetch,\r\n} from \"./fetch\";\r\n\r\nexport function setBook(books, bookKey) {\r\n // console.log(\"setBook\", bookKey);\r\n\r\n const makeState = (bookIdx, matches, keysToFullNames) => {\r\n // console.log(\"makeState\", bookIdx, matches);\r\n return {\r\n bookIdx,\r\n matches,\r\n keysToFullNames,\r\n };\r\n };\r\n\r\n const _fetch = async (books, bookIdx) => {\r\n const { matches, keysToFullNames } = await fetch(books, bookIdx, {\r\n fetchMatches: true,\r\n fetchKeysToFullNames: true,\r\n });\r\n return makeState(bookIdx, matches, keysToFullNames);\r\n };\r\n\r\n if (bookKey === null) {\r\n const bookIdx = 0;\r\n return _fetch(books, bookIdx);\r\n }\r\n\r\n // book !== null\r\n const newBookIdx = findBookIdx(books, bookKey);\r\n if (newBookIdx < 0) {\r\n throw new Error(`Book with name \"${bookKey}\" not found.`);\r\n }\r\n\r\n return _fetch(books, newBookIdx);\r\n}\r\n\r\nexport function setBookForDate(books, date) {\r\n const bookIdx = date ? findBookForDate(books, date) : -1;\r\n const bookKey = (bookIdx > -1) ? books[bookIdx] : null;\r\n return setBook(books, bookKey)\r\n .then(({ ...result }) => {\r\n // let the caller know if the date was valid by setting it in the result.\r\n const matchDate = (bookIdx > -1) ? date : null;\r\n return ({ matchDate, ...result });\r\n });\r\n}\r\n\r\nexport async function setBookAndPlayer(books, bookKey, playerKey) {\r\n // console.log(\"setBookAndPlayer\", bookKey, playerKey);\r\n\r\n const makeState = (bookIdx, playerKey, playerIdx, penPicsData, penPicsImgs, matches, keysToFullNames) => {\r\n // console.log(\"makeState\", bookIdx, playerKey, playerIdx, penPicsData, penPicsImgs, matches);\r\n return {\r\n bookIdx,\r\n playerKey,\r\n playerIdx,\r\n penPicsData,\r\n penPicsImgs,\r\n matches,\r\n keysToFullNames,\r\n };\r\n };\r\n\r\n function sortPenPics(penPics) {\r\n // Sort by name. A name in the pen pic data is \"Surname, Firstname\",\r\n // so this is effectively a \"Surname, Firstname\" sort.\r\n penPics.sort((a, b) => {\r\n if (a.lastName && b.lastName) {\r\n const result = a.lastName.localeCompare(b.lastName);\r\n if (result !== 0) {\r\n return result;\r\n }\r\n if (a.firstName && b.firstName) {\r\n return a.firstName.localeCompare(b.firstName);\r\n }\r\n }\r\n return a.name.localeCompare(b.name);\r\n });\r\n }\r\n\r\n const _fetch = async (books, bookIdx) => {\r\n const { matches, keysToFullNames, penPics, penPicsImgs } = await fetch(books, bookIdx, {\r\n fetchMatches: true,\r\n fetchKeysToFullNames: true,\r\n fetchPenPics: true,\r\n fetchPenPicsImgs: true,\r\n });\r\n\r\n sortPenPics(penPics);\r\n\r\n const playerIdx = findPlayerIdxForPenPic(penPics, playerKey, books[bookIdx]);\r\n return makeState(bookIdx, playerKey, playerIdx, penPics, penPicsImgs, matches, keysToFullNames);\r\n };\r\n\r\n if (bookKey === null) {\r\n const bookIdx = 0;\r\n return _fetch(books, bookIdx);\r\n }\r\n\r\n // book !== null\r\n const newBookIdx = findBookIdx(books, bookKey);\r\n if (newBookIdx < 0) {\r\n throw new Error(`Book with name \"${bookKey}\" not found.`);\r\n }\r\n\r\n return _fetch(books, newBookIdx);\r\n}\r\n","/* global $ */\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport debounce from \"lodash/debounce\";\r\n\r\n/**\r\n * A Component that monitors the width of a container element.\r\n */\r\nclass WindowResizeWidget extends Component {\r\n constructor() {\r\n super();\r\n\r\n this.handleResize = debounce(this.handleResize.bind(this), 100);\r\n }\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n handleResize(e) {\r\n const { resizeCategoryCallback } = this.props;\r\n resizeCategoryCallback($(this.container).width());\r\n }\r\n\r\n componentDidMount() {\r\n $(window).on(\"resize\", this.handleResize);\r\n this.handleResize();\r\n }\r\n\r\n componentWillUnmount() {\r\n $(window).off(window, \"resize\", this.handleResize);\r\n }\r\n\r\n render() {\r\n return (\r\n
    this.container = r}>\r\n {this.props.children}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nWindowResizeWidget.propTypes = {\r\n children: PropTypes.node,\r\n resizeCategoryCallback: PropTypes.func,\r\n};\r\n\r\nexport default WindowResizeWidget;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport findIndex from \"array-find-index\";\r\n\r\nimport MatchWidget from \"./MatchWidget\";\r\n\r\nimport loadIntoState from \"../loadIntoState\";\r\nimport LoadingImage from \"../LoadingImage\";\r\nimport History from \"../History\";\r\nimport MatchLink from \"../MatchStats/MatchLink\";\r\nimport { setBookForDate } from \"../../State\";\r\nimport WindowResizeWidget from \"../../WindowResizeWidget\";\r\nimport { wtcc, stillCrowing, dates } from \"../../utils\";\r\nimport ErrorWidget from \"../ErrorWidget\";\r\n\r\nclass MatchStatsPageWidget extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.resizeCategory = this.resizeCategory.bind(this);\r\n this.onHistoryChange = this.onHistoryChange.bind(this);\r\n\r\n this.state = {\r\n bookIdx: null,\r\n matchDate: null,\r\n narrowMode: null,\r\n matches: null,\r\n };\r\n }\r\n\r\n async onHistoryChange({ params }) {\r\n // console.log(\"MatchStatsPageWidget\", \"onHistoryChange\", location, params);\r\n const { books } = this.props;\r\n const matchDate = params.date ? this.queryDateToMatchDate(params.date) : null;\r\n console.log(matchDate);\r\n\r\n loadIntoState(this, async () => {\r\n const result = await setBookForDate(books, matchDate);\r\n return {\r\n ...result,\r\n matchDate: result.matchDate || result.matches[0].date,\r\n };\r\n });\r\n }\r\n\r\n queryDateToMatchDate(queryDate) {\r\n return dates.formatDDMMYYYY(dates.parseDDMMYYYY(queryDate, \"\"), \"/\");\r\n }\r\n\r\n matchDateToQueryDate(date) {\r\n return date.replace(/\\//g, \"\");\r\n }\r\n\r\n onClickNextPrev(e, delta, pushParams) {\r\n e.preventDefault();\r\n const { matches, matchDate } = this.state;\r\n const matchIdx = this.findMatch(matches, matchDate);\r\n if (matchIdx >= 0) {\r\n const newMatchIdx = matchIdx + delta;\r\n if (newMatchIdx !== matchIdx && newMatchIdx >= 0 && newMatchIdx < matches.length) {\r\n const matchDate = matches[newMatchIdx].date;\r\n const queryDate = this.matchDateToQueryDate(matchDate);\r\n pushParams({ date: queryDate });\r\n }\r\n }\r\n }\r\n\r\n findMatch(matches, date) {\r\n // [].find not supported by IE.\r\n return findIndex(matches, (match) => match.date === date);\r\n }\r\n\r\n resizeCategory(width) {\r\n const NARROW_MODE_LIMIT = 450;\r\n const newNarrowMode = (width < NARROW_MODE_LIMIT);\r\n if (newNarrowMode !== this.state.narrowMode) {\r\n this.setState({\r\n narrowMode: newNarrowMode,\r\n });\r\n }\r\n }\r\n\r\n renderWithHistory({ pushParams }) {\r\n const { bookIdx, matches, matchDate, loading, loadingError } = this.state;\r\n const { books } = this.props;\r\n\r\n if (loadingError) {\r\n return ;\r\n }\r\n\r\n if (!matches) {\r\n return loading\r\n ? Loading match data...\r\n : \"Match data not loaded.\";\r\n }\r\n\r\n const book = books[bookIdx];\r\n\r\n let playerKeyGenerator = wtcc.keyGenerators.lineupPlayerKeyGenerator;\r\n if (book === \"still-crowing\") {\r\n playerKeyGenerator = stillCrowing.keyGenerators.lineupPlayerKeyGenerator;\r\n }\r\n\r\n const matchIdx = matchDate ? this.findMatch(matches, matchDate) : 0;\r\n const match = matches[matchIdx];\r\n\r\n if (!match) {\r\n const match0 = matches[0];\r\n return (\r\n
    \r\n

    Match with date {`\"${matchDate}\"`} not found.

    \r\n

    The following link will take you to the first match - {match0.date}.

    \r\n
    \r\n );\r\n }\r\n\r\n const prevLink = (matchIdx > 0) ? {\r\n text: \"Prev\",\r\n onClick: (e) => this.onClickNextPrev(e, -1, pushParams),\r\n } : null;\r\n\r\n const nextLink = (matchIdx < matches.length - 1) ? {\r\n text: \"Next\",\r\n onClick: (e) => this.onClickNextPrev(e, 1, pushParams),\r\n } : null;\r\n\r\n return (\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n {(...args) => this.renderWithHistory(...args)}\r\n \r\n );\r\n }\r\n}\r\n\r\nMatchStatsPageWidget.propTypes = {\r\n books: PropTypes.array,\r\n};\r\n\r\nexport default MatchStatsPageWidget;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nconst MatchListDateHeaderWidget = ({ date }) => {\r\n return (\r\n \r\n \r\n

    {date}

    \r\n \r\n \r\n );\r\n};\r\n\r\nMatchListDateHeaderWidget.propTypes = {\r\n date: PropTypes.string,\r\n};\r\n\r\nexport default MatchListDateHeaderWidget;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport MatchListDateHeaderWidget from \"./MatchListDateHeaderWidget\";\r\n\r\nimport MatchLink from \"../MatchStats/MatchLink\";\r\n\r\nclass MatchListWidget extends Component {\r\n renderMatchListItem(match, first, last) {\r\n const { renderMatchLinks } = this.props;\r\n const { date, team1, team2, venue } = match;\r\n const [dd, MM] = date.split(\"/\");\r\n const displayDate = dd + \"/\" + MM;\r\n const dateClass = first ? \"\" : \"top-cell\";\r\n const venueClass = last ? \"\" : \"bottom-cell\";\r\n\r\n return (\r\n [\r\n \r\n \r\n {renderMatchLinks ? {displayDate} : displayDate}\r\n \r\n ,\r\n \r\n {team1.name} {team1.score} - {team2.score} {team2.name}\r\n ,\r\n \r\n {venue}\r\n ,\r\n ]\r\n );\r\n }\r\n\r\n renderMatchListItems(matches) {\r\n let oldYear;\r\n return matches.map((match, i) => {\r\n const items = [];\r\n\r\n // only need yyyy\r\n const [, , yyyy] = match.date.split(\"/\");\r\n\r\n if (yyyy !== oldYear) {\r\n items.push();\r\n oldYear = yyyy;\r\n }\r\n\r\n const first = (i === 0);\r\n const last = (i === matches.length - 1);\r\n\r\n items.push(this.renderMatchListItem(match, first, last));\r\n\r\n return items;\r\n });\r\n }\r\n\r\n render() {\r\n const { matches } = this.props;\r\n return (\r\n \r\n \r\n {this.renderMatchListItems(matches)}\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nMatchListWidget.propTypes = {\r\n matches: PropTypes.array,\r\n renderMatchLinks: PropTypes.bool,\r\n};\r\n\r\nexport default MatchListWidget;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nconst books = {\r\n \"wtcc\": {\r\n iconSrc: \"./icons/144.png\",\r\n },\r\n \"still-crowing\": {\r\n iconSrc: \"./icons/SC.144.png\",\r\n },\r\n \"stormy-sixties\": {\r\n iconSrc: \"./icons/StormySixties.144.png\",\r\n },\r\n};\r\n\r\n/**\r\n * @param {object} component props.\r\n *\r\n * @return {function} Functional react component.\r\n */\r\nconst BookIcon = ({\r\n book,\r\n height,\r\n title,\r\n}) => {\r\n const style = {\r\n height: height || \"1em\",\r\n verticalAlign: \"text-top\",\r\n };\r\n const { key, name } = book;\r\n const { iconSrc } = books[key] || books[\"wtcc\"];\r\n title = title || `${name} Icon`;\r\n return (\r\n {title}\r\n );\r\n};\r\n\r\nBookIcon.propTypes = {\r\n book: PropTypes.object,\r\n height: PropTypes.string,\r\n title: PropTypes.string,\r\n};\r\n\r\nexport default BookIcon;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport BookIcon from \"./BookIcon\";\r\nimport { isUndefinedOrNull } from \"../is\";\r\n\r\nfunction BookIconLinks({\r\n books,\r\n selectedBookKey,\r\n onClick,\r\n height,\r\n}) {\r\n height = isUndefinedOrNull(height) ? \"\" : height;\r\n return (\r\n
    \r\n {books.map((book, i) => (\r\n {\r\n e.preventDefault();\r\n onClick && onClick(book.key, i);\r\n }}\r\n >\r\n ))}\r\n
    \r\n );\r\n}\r\n\r\nBookIconLinks.propTypes = {\r\n books: PropTypes.array,\r\n selectedBookKey: PropTypes.string,\r\n onClick: PropTypes.func,\r\n height: PropTypes.string,\r\n};\r\n\r\nexport default BookIconLinks;\r\n","export function isUndefined(it) {\r\n return typeof it === \"undefined\";\r\n}\r\n\r\nexport function isNull(it) {\r\n return it === null;\r\n}\r\n\r\nexport function isUndefinedOrNull(it) {\r\n return isUndefined(it) || isNull(it);\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport MatchListWidget from \"./MatchListWidget\";\r\n\r\nimport loadIntoState from \"../loadIntoState\";\r\nimport ErrorWidget from \"../ErrorWidget\";\r\nimport LoadingImage from \"../LoadingImage\";\r\nimport History from \"../History\";\r\nimport { setBook } from \"../../State\";\r\nimport BookIconLinks from \"../BookIconLinks\";\r\n\r\n/**\r\n * This component is responsible for switching between match lists.\r\n *\r\n * It is given a books array which is formed of { key, name, matchDataUrl }.\r\n *\r\n * The name is what is used as the link text for switching between match lists.\r\n *\r\n * The matchDataUrl is used to get the match list data.\r\n */\r\nclass MatchListsPageWidget extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.onHistoryChange = this.onHistoryChange.bind(this);\r\n\r\n this.state = {\r\n bookIdx: null,\r\n bookKey: null,\r\n matches: null,\r\n };\r\n }\r\n\r\n async onHistoryChange({ params }) {\r\n // console.log(\"MatchListsPageWidget\", \"onHistoryChange\", location, params);\r\n const { books } = this.props;\r\n const bookKey = params.book || books[0].key;\r\n\r\n loadIntoState(this, async () => {\r\n const result = await setBook(books, bookKey);\r\n this.setState({\r\n ...result,\r\n bookKey,\r\n });\r\n });\r\n }\r\n\r\n onBookClick(newBookKey, pushParams) {\r\n const { bookKey } = this.state;\r\n if (newBookKey !== bookKey) {\r\n pushParams({ book: newBookKey });\r\n }\r\n }\r\n\r\n renderWithHistory({ pushParams }) {\r\n const { bookIdx, matches, loading, loadingError } = this.state;\r\n const { books } = this.props;\r\n const book = books[bookIdx];\r\n\r\n let mainComponent = \"\";\r\n if (loadingError) {\r\n mainComponent = ;\r\n } else if (!matches) {\r\n mainComponent = loading ? Loading match data... : \"Match data not loaded.\";\r\n } else {\r\n mainComponent = (\r\n <>\r\n

    {book.name}

    \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n this.onBookClick(key, pushParams)} />\r\n {mainComponent}\r\n
    \r\n );\r\n }\r\n\r\n render() {\r\n // console.log(\"MatchListsPageWidget\", \"render\", \"props\", this.props, \"state\", this.state);\r\n return (\r\n \r\n {(...args) => this.renderWithHistory(...args)}\r\n \r\n );\r\n }\r\n}\r\n\r\nMatchListsPageWidget.propTypes = {\r\n books: PropTypes.array,\r\n};\r\n\r\nexport default MatchListsPageWidget;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport qs from \"query-string\";\r\n\r\nimport { getPlayerKeyGenerators } from \"../../books\";\r\n\r\nexport default function PenPicLink({ player, playerKey, book, children }) {\r\n if (!playerKey && player) {\r\n const keyGenerators = getPlayerKeyGenerators(book);\r\n const { lineupPlayerKeyGenerator } = keyGenerators;\r\n playerKey = lineupPlayerKeyGenerator(player);\r\n }\r\n const params = {\r\n playerKey: playerKey,\r\n book: (book && book.key) || undefined,\r\n };\r\n const href = \"./pen-pics.html?\" + qs.stringify(params);\r\n return {children};\r\n};\r\n\r\nPenPicLink.propTypes = {\r\n player: PropTypes.object,\r\n playerKey: PropTypes.string,\r\n book: PropTypes.object,\r\n children: PropTypes.node,\r\n};\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nclass PenPicImg extends Component {\r\n onImgLoaded() {\r\n sendTiming(\"pen-pic-img-loaded\", now());\r\n }\r\n\r\n render() {\r\n const { penPicImgUrl, width, height } = this.props;\r\n return penPicImgUrl ?\r\n :\r\n null;\r\n }\r\n}\r\n\r\nPenPicImg.propTypes = {\r\n penPicImgUrl: PropTypes.string,\r\n width: PropTypes.number,\r\n height: PropTypes.number,\r\n};\r\n\r\nexport default PenPicImg;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport PenPicLink from \"../PenPics/PenPicLink\";\r\nimport PenPicImg from \"../PenPics/PenPicImg\";\r\nimport MatchLink from \"../MatchStats/MatchLink\";\r\n\r\nimport { MatchUtils } from \"../../utils\";\r\nimport { getPlayerKeyGenerators } from \"../../books\";\r\n\r\nfunction scoreDom(value, className, showZero = false) {\r\n return (value || showZero) ? (\r\n {value}\r\n ) : \"\";\r\n}\r\n\r\nclass AppearanceRow1 extends Component {\r\n render() {\r\n const { idx, appearance, renderMatchLink } = this.props;\r\n return (\r\n \r\n {idx}\r\n \r\n {renderMatchLink ?\r\n {appearance.displayDate} :\r\n appearance.displayDate}\r\n \r\n {appearance.versus}\r\n {scoreDom(appearance.scores.tries, \"num-tries\")}\r\n {scoreDom(appearance.scores.goals, \"num-goals\")}\r\n {scoreDom(appearance.scores.drops, \"num-drops\")}\r\n \r\n );\r\n }\r\n}\r\n\r\nAppearanceRow1.propTypes = {\r\n idx: PropTypes.number,\r\n appearance: PropTypes.object,\r\n renderMatchLink: PropTypes.bool,\r\n};\r\n\r\n\r\nclass AppearanceRow2 extends Component {\r\n render() {\r\n return (\r\n \r\n \r\n {this.props.appearance.venue}\r\n \r\n );\r\n }\r\n}\r\n\r\nAppearanceRow2.propTypes = {\r\n appearance: PropTypes.object,\r\n};\r\n\r\n\r\nclass YearRow extends Component {\r\n render() {\r\n return (\r\n \r\n

    {this.props.year}

    \r\n \r\n );\r\n }\r\n}\r\n\r\nYearRow.propTypes = {\r\n year: PropTypes.string,\r\n};\r\n\r\n\r\nclass PlayerStatsWidget extends Component {\r\n makeAppearances(stats, renderMatchLinks) {\r\n let year;\r\n return stats.reduce((arr, appearance, idx) => {\r\n const [dd, mm, yyyy] = appearance.date.split(\"/\");\r\n\r\n if (year !== yyyy) {\r\n year = yyyy;\r\n arr.push();\r\n }\r\n\r\n const appearanceWithDisplayDate = { ...appearance, displayDate: dd + \"/\" + mm };\r\n // eslint-disable-next-line\r\n arr.push();\r\n arr.push();\r\n\r\n return arr;\r\n }, []);\r\n }\r\n\r\n renderPlayerStats(stats) {\r\n function sum(appearances, type) {\r\n return appearances.reduce((sum, appearance) => sum + appearance.scores[type], 0);\r\n }\r\n const { renderMatchLinks } = this.props;\r\n const appearances = this.makeAppearances(stats, renderMatchLinks);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {appearances}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    DateVersus/VenueTGDG
    Totals{scoreDom(sum(stats, \"tries\"), \"num-tries\", true)}{scoreDom(sum(stats, \"goals\"), \"num-goals\", true)}{scoreDom(sum(stats, \"drops\"), \"num-drops\", true)}
    \r\n );\r\n }\r\n\r\n getPlayerInfo(matches, playerKey, book) {\r\n const usName = \"France\";\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n const playerFilter = (match, team, player) => {\r\n return team.name === usName;\r\n };\r\n\r\n const { lineupPlayerKeyGenerator } = getPlayerKeyGenerators(book);\r\n const playerAndMatchesMap = MatchUtils.createPlayerAndMatchMap(matches, playerFilter, lineupPlayerKeyGenerator);\r\n\r\n const playerAndMatches = playerAndMatchesMap[playerKey];\r\n if (!playerAndMatches) {\r\n return {\r\n name: \"Unknown\",\r\n stats: [],\r\n };\r\n }\r\n\r\n const matchArr = MatchUtils.flattenMatches(playerAndMatches.matches);\r\n\r\n const stats = matchArr.map((match) => {\r\n const { them } = MatchUtils.getUsAndThem(match, usName);\r\n const scores = MatchUtils.getPlayerStatsForMatches([match], playerAndMatches.player, usName);\r\n return {\r\n date: match.date,\r\n venue: match.venue,\r\n versus: them.name,\r\n scores,\r\n };\r\n });\r\n\r\n return {\r\n player: playerAndMatches.player,\r\n stats,\r\n };\r\n }\r\n\r\n render() {\r\n const { book, penPicImgUrl, playerKey, playerName, matches } = this.props;\r\n\r\n const { player, stats } = this.getPlayerInfo(matches, playerKey, book);\r\n if (!player) {\r\n return `Player not found for key \"${playerKey}\"`;\r\n }\r\n\r\n return (\r\n
    \r\n

    {playerName || player.name}

    \r\n
    \r\n
    Pen Pic
    \r\n {this.renderPlayerStats(stats)}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nPlayerStatsWidget.propTypes = {\r\n book: PropTypes.object,\r\n renderMatchLinks: PropTypes.bool,\r\n penPicImgUrl: PropTypes.object,\r\n matches: PropTypes.array,\r\n playerKey: PropTypes.string,\r\n playerName: PropTypes.string,\r\n};\r\n\r\nexport default PlayerStatsWidget;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport PlayerStatsWidget from \"./PlayerStatsWidget\";\r\n\r\nimport loadIntoState from \"../loadIntoState\";\r\nimport LoadingImage from \"../LoadingImage\";\r\nimport History from \"../History\";\r\nimport { setBookAndPlayer } from \"../../State\";\r\nimport { getPlayerKeyGenerators } from \"../../books\";\r\nimport { PlayerUtils } from \"../../utils\";\r\nimport ErrorWidget from \"../ErrorWidget\";\r\n\r\nclass PlayerStatsPageWidget extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.onHistoryChange = this.onHistoryChange.bind(this);\r\n\r\n this.state = {\r\n bookIdx: null,\r\n bookKey: null,\r\n keysToFullNames: null,\r\n matches: null,\r\n penPicsData: null,\r\n penPicsImgs: null,\r\n playerKey: null,\r\n };\r\n }\r\n\r\n async onHistoryChange({ params }) {\r\n // console.log(\"PlayerStatsPageWidget\", \"onHistoryChange\", location, params);\r\n const { books } = this.props;\r\n const bookKey = params.book || books[0].key;\r\n const playerKey = params.playerKey || null;\r\n\r\n loadIntoState(this, async () => {\r\n const result = await setBookAndPlayer(books, bookKey, playerKey);\r\n const generatePlayerKey = () => {\r\n const { penPicsPlayerKeyGenerator } = getPlayerKeyGenerators(books[result.bookIdx]);\r\n return penPicsPlayerKeyGenerator(result.penPicsData[0]);\r\n };\r\n this.setState({\r\n ...result,\r\n playerKey: result.playerKey || generatePlayerKey(),\r\n playerIdx: (result.playerKey && result.playerIdx) || 0,\r\n });\r\n });\r\n }\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n renderWithHistory({ pushParams }) {\r\n const { books } = this.props;\r\n const {\r\n bookIdx, keysToFullNames, matches, penPicsData, penPicsImgs, playerKey,\r\n loading, loadingError,\r\n } = this.state;\r\n\r\n let mainComponent = \"\";\r\n if (loadingError) {\r\n mainComponent = ;\r\n } else if (!penPicsData) {\r\n mainComponent = loading\r\n ? Loading Player data...\r\n : \"Player data not loaded.\";\r\n } else if (!playerKey) {\r\n mainComponent = `Player key not provided.`;\r\n } else {\r\n const penPicImgUrl = penPicsImgs[playerKey];\r\n const book = books[bookIdx];\r\n const playerKeyGenerators = getPlayerKeyGenerators(book);\r\n const fullName = PlayerUtils.playerFullName(keysToFullNames, playerKeyGenerators, playerKey);\r\n\r\n if (!fullName) {\r\n mainComponent = `Player not found for key=\"${playerKey}\".`;\r\n } else {\r\n const playerName = `${fullName.firstName} ${fullName.lastName}`;\r\n mainComponent = ;\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n {mainComponent}\r\n
    \r\n );\r\n }\r\n\r\n render() {\r\n // console.log(\"PlayerStatsPageWidget\", \"render\", \"props\", this.props, \"state\", this.state);\r\n return (\r\n \r\n {(...args) => this.renderWithHistory(...args)}\r\n \r\n );\r\n }\r\n}\r\n\r\nPlayerStatsPageWidget.propTypes = {\r\n books: PropTypes.array,\r\n};\r\n\r\nexport default PlayerStatsPageWidget;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport PenPicImg from \"./PenPicImg\";\r\n\r\nimport PlayerLink from \"../PlayerStats/PlayerLink\";\r\nimport { getPlayerKeyGenerators } from \"../../books\";\r\n\r\nclass PenPicWidget extends Component {\r\n render() {\r\n const {\r\n book,\r\n onPrevClick, onNextClick,\r\n penPicData, penPicImg, playerName,\r\n showPrevLink, showNextLink,\r\n } = this.props;\r\n\r\n if (!penPicData) {\r\n return \"No Pen-Picture data loaded\";\r\n }\r\n\r\n const { penPicsPlayerKeyGenerator } = getPlayerKeyGenerators(book);\r\n const playerKey = penPicsPlayerKeyGenerator(penPicData);\r\n const displayName = playerName || penPicData.name;\r\n\r\n return (\r\n
    \r\n
    \r\n

    {displayName}

    \r\n
    \r\n
    \r\n {showPrevLink ?\r\n onPrevClick(e, -1, null)}>prev :\r\n null}\r\n {showPrevLink && showNextLink ? \" | \" : null}\r\n {showNextLink ?\r\n onNextClick(e, 1, null)}>next :\r\n null}\r\n
    \r\n
    \r\n
    \r\n
    \r\n {penPicData.text.map((line, i) =>
    {line}
    )}\r\n
    \r\n
    \r\n
    \r\n Match Stats\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nPenPicWidget.propTypes = {\r\n book: PropTypes.object,\r\n onPrevClick: PropTypes.func,\r\n onNextClick: PropTypes.func,\r\n penPicData: PropTypes.object,\r\n penPicImg: PropTypes.string,\r\n playerName: PropTypes.string,\r\n showPrevLink: PropTypes.bool,\r\n showNextLink: PropTypes.bool,\r\n};\r\n\r\nexport default PenPicWidget;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport PenPicWidget from \"./PenPicWidget\";\r\n\r\nimport LoadingImage from \"../LoadingImage\";\r\nimport History from \"../History\";\r\nimport { getPlayerKeyGenerators } from \"../../books\";\r\nimport { setBookAndPlayer } from \"../../State\";\r\nimport { PlayerUtils } from \"../../utils\";\r\nimport ErrorWidget from \"../ErrorWidget\";\r\nimport loadIntoState from \"../loadIntoState\";\r\nimport BookIconLinks from \"../BookIconLinks\";\r\n\r\n/**\r\n * This component is responsible for switching between the Pen Pics of each book.\r\n *\r\n * It is given a books array which is formed of { key, name, penPicsDataUrl, penPicsImgsUrl }.\r\n *\r\n * The name is what is used as the link text for switching between pen pic data.\r\n *\r\n * The penPicsDataUrl and penPicsImgsUrl are used to get the pen pic data.\r\n *\r\n * The state is driven by the browser history (URL). We use history.push() which causes the\r\n * history listener to fire, and we drive the component state from that.\r\n */\r\nclass PenPicsPageWidget extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.onHistoryChange = this.onHistoryChange.bind(this);\r\n\r\n this.state = {\r\n bookIdx: null,\r\n bookKey: null,\r\n keysToFullNames: null,\r\n playerKey: null,\r\n playerIdx: null,\r\n penPicsData: null,\r\n penPicsImgs: null,\r\n };\r\n }\r\n\r\n async onHistoryChange({ params }) {\r\n // console.log(\"PlayerStatsPageWidget\", \"onHistoryChange\", location, params);\r\n const { books } = this.props;\r\n const bookKey = params.book || books[0].key;\r\n const playerKey = params.playerKey || null;\r\n\r\n loadIntoState(this, async () => {\r\n const result = await setBookAndPlayer(books, bookKey, playerKey);\r\n const generatePlayerKey = () => {\r\n const { penPicsPlayerKeyGenerator } = getPlayerKeyGenerators(books[result.bookIdx]);\r\n return penPicsPlayerKeyGenerator(result.penPicsData[0]);\r\n };\r\n this.setState({\r\n ...result,\r\n playerKey: result.playerKey || generatePlayerKey(),\r\n playerIdx: (result.playerKey && result.playerIdx) || 0,\r\n });\r\n });\r\n }\r\n\r\n nextPrevClick(e, delta, pushParams) {\r\n e.preventDefault();\r\n\r\n const { bookIdx, playerIdx, penPicsData } = this.state;\r\n\r\n const newPlayerIdx = playerIdx + delta;\r\n if (newPlayerIdx < 0 || newPlayerIdx >= penPicsData.length) {\r\n // Should never happen\r\n console.error(`nextPrevClick called with newPlayerIdx=${newPlayerIdx} < 0 or >= ${penPicsData.length}`);\r\n return;\r\n }\r\n\r\n const { books } = this.props;\r\n const book = books[bookIdx];\r\n\r\n const playerKeyGenerator = getPlayerKeyGenerators(book).penPicsPlayerKeyGenerator;\r\n const playerKey = playerKeyGenerator(penPicsData[newPlayerIdx]);\r\n pushParams({ playerKey });\r\n }\r\n\r\n onPrevClick(e, pushParams) {\r\n this.nextPrevClick(e, -1, pushParams);\r\n }\r\n\r\n onNextClick(e, pushParams) {\r\n this.nextPrevClick(e, 1, pushParams);\r\n }\r\n\r\n onBookClick(newBookKey, pushParams) {\r\n const { bookKey } = this.state;\r\n if (newBookKey !== bookKey) {\r\n pushParams({ book: newBookKey, playerKey: undefined });\r\n }\r\n }\r\n\r\n renderWithHistory({ pushParams }) {\r\n // console.log(\"PenPicsPageWidget\", \"renderWithHistory\", this.state);\r\n const { bookIdx, keysToFullNames, playerIdx, penPicsData, penPicsImgs, loading, loadingError } = this.state;\r\n const { books } = this.props;\r\n const book = books[bookIdx];\r\n\r\n let mainComponent = \"\";\r\n if (loadingError) {\r\n mainComponent = ;\r\n } else if (!penPicsData) {\r\n mainComponent = loading\r\n ? Loading Pen-Picture data...\r\n : \"Pen-Picture data not loaded.\";\r\n } else if (playerIdx < 0) {\r\n mainComponent = `There is no Pen-Pic for player with key=\"${this.state.playerKey}\".`;\r\n } else {\r\n const playerKeyGenerators = getPlayerKeyGenerators(book);\r\n const { penPicsPlayerKeyGenerator } = playerKeyGenerators;\r\n const penPicData = penPicsData[playerIdx];\r\n const playerKey = penPicsPlayerKeyGenerator(penPicData);\r\n\r\n // eslint-disable-next-line max-len\r\n const fullName = PlayerUtils.playerFullName(keysToFullNames, playerKeyGenerators, playerKey, undefined, penPicData);\r\n const playerName = `${fullName.firstName} ${fullName.lastName}`;\r\n const penPicImg = penPicsImgs[playerKey];\r\n const showPrevLink = playerIdx > 0;\r\n const showNextLink = playerIdx < penPicsData.length - 1;\r\n\r\n mainComponent = (\r\n <>\r\n

    {book.name}

    \r\n this.onPrevClick(e, pushParams)}\r\n onNextClick={(e) => this.onNextClick(e, pushParams)} />\r\n \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n this.onBookClick(key, pushParams)} />\r\n {mainComponent}\r\n
    \r\n );\r\n }\r\n\r\n render() {\r\n // console.log(\"PenPicsPageWidget\", \"render\", \"props\", this.props, \"state\", this.state);\r\n return (\r\n \r\n {(...args) => this.renderWithHistory(...args)}\r\n \r\n );\r\n }\r\n}\r\n\r\nPenPicsPageWidget.propTypes = {\r\n books: PropTypes.array,\r\n};\r\n\r\nexport default PenPicsPageWidget;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport MatchLink from \"../MatchStats/MatchLink\";\r\nimport PlayerLink from \"../PlayerStats/PlayerLink\";\r\n\r\nimport { intersperse } from \"../../array\";\r\nimport { MatchUtils, PlayerUtils } from \"../../utils\";\r\nimport { getPlayerKeyGenerators } from \"../../books\";\r\n\r\nconst FRANCE_TEAM_NAMES = [\r\n \"France\",\r\n // Don't include France XIII\r\n // \"France XIII\",\r\n];\r\n\r\nfunction isFrance(teamName) {\r\n return FRANCE_TEAM_NAMES.indexOf(teamName) > -1;\r\n}\r\n\r\nconst CareerDetailsLineWidget = (props) => (\r\n \r\n {props.year}: \r\n {props.details}.\r\n \r\n);\r\n\r\nCareerDetailsLineWidget.propTypes = {\r\n details: PropTypes.node,\r\n year: PropTypes.string,\r\n};\r\n\r\nfunction statsPerYear(player, matches) {\r\n return Object.keys(matches)\r\n .map((year) => {\r\n const stats = matches[year].map((match) => {\r\n const usAndThem = MatchUtils.getUsAndThem(match, FRANCE_TEAM_NAMES);\r\n const statsStr = MatchUtils.getPlayerStatsForTeamStr(usAndThem.us, usAndThem.them, player);\r\n return {\r\n match,\r\n statsStr,\r\n };\r\n });\r\n return {\r\n year,\r\n stats,\r\n };\r\n });\r\n}\r\n\r\nclass CareerStatisticsWidget extends Component {\r\n playerContent(player, matches) {\r\n const lines = statsPerYear(player, matches);\r\n const twoDigitYear = (yearStr) => yearStr.length > 2 ? yearStr.substring(2) : yearStr;\r\n const widgets = lines.map((line, i) => {\r\n const YY = twoDigitYear(line.year);\r\n const details = line.stats.map((stat, i) =>\r\n {stat.statsStr});\r\n const detailsAndCommas = intersperse(details, \", \");\r\n return ;\r\n });\r\n const brSupplier = (arr, existingItem, i) =>
    ;\r\n return intersperse(widgets, brSupplier);\r\n }\r\n\r\n players(playerList, book) {\r\n return playerList.map((playerAndMatches, i) => {\r\n const { player, matches } = playerAndMatches;\r\n\r\n const yearKeys = Object.keys(matches);\r\n const matchArr = yearKeys.reduce((arr, year) => arr.concat(matches[year]), []);\r\n\r\n // Don't return an element for a player with zero matches.\r\n // This may occur when a player only features as a non-playing sub (Stormy Sixties).\r\n if (matchArr.length === 0) {\r\n return null;\r\n }\r\n\r\n const allStats = MatchUtils.getPlayerStatsForMatches(matchArr, player, FRANCE_TEAM_NAMES);\r\n // Use book.key in the component key so React doesn't try to reconcile wtcc rows with\r\n // still-crowing rows.\r\n // Instead, we want React to treat the nodes as completely different, and replace old TR\r\n // nodes with new TR nodes.\r\n return [\r\n \r\n {player.displayName || player.name}\r\n {allStats.matches || \"\"}\r\n {allStats.tries || \"\"}\r\n {allStats.goals || \"\"}\r\n {allStats.drops || \"\"}\r\n {allStats.pts || \"\"}\r\n ,\r\n \r\n
    {this.playerContent(player, matches)}
    \r\n ,\r\n ];\r\n });\r\n }\r\n\r\n getPlayerList(book, matches, keysToFullNames) {\r\n // eslint-disable-next-line no-unused-vars\r\n const filterByMatchTeamPlayer = (match, team, player) => isFrance(team.name);\r\n const playerKeyGenerators = getPlayerKeyGenerators(book);\r\n const { lineupPlayerKeyGenerator } = playerKeyGenerators;\r\n\r\n // eslint-disable-next-line max-len\r\n const playerAndMatchMap = MatchUtils.createPlayerAndMatchMap(matches, filterByMatchTeamPlayer, lineupPlayerKeyGenerator);\r\n\r\n const playerList = Object.keys(playerAndMatchMap).map((key) => {\r\n // set new displayName property, if different to name.\r\n // displayName will be lastName first, then any initial (if present).\r\n const { player } = playerAndMatchMap[key];\r\n\r\n const fullName = PlayerUtils.playerFullName(keysToFullNames, playerKeyGenerators, key, player);\r\n const displayName = PlayerUtils.fullNameStr(fullName);\r\n\r\n player.displayName = displayName;\r\n\r\n return playerAndMatchMap[key];\r\n });\r\n\r\n playerList.sort((playerAndMatches1, playerAndMatches2) => {\r\n const p1 = playerAndMatches1.player;\r\n const p2 = playerAndMatches2.player;\r\n return (p1.displayName || p1.name).localeCompare(p2.displayName || p2.name);\r\n });\r\n\r\n return playerList;\r\n }\r\n\r\n shouldComponentUpdate(nextProps) {\r\n const shouldUpdate = (this.props.book != nextProps.book) || (this.props.matches !== nextProps.matches);\r\n // console.log(\"CareerStatisticsWidget\", \"shouldComponentUpdate\", shouldUpdate);\r\n return shouldUpdate;\r\n }\r\n\r\n render() {\r\n const { book, matches, keysToFullNames } = this.props;\r\n // console.log(\"CareerStatisticsWidget\", \"render\", \"props\", this.props, \"state\", this.state);\r\n\r\n const playerList = this.getPlayerList(book, matches, keysToFullNames);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.players(playerList, book)}\r\n \r\n
    NAMEPTGDgPts
    \r\n );\r\n }\r\n}\r\n\r\nCareerStatisticsWidget.propTypes = {\r\n book: PropTypes.object,\r\n matches: PropTypes.array,\r\n keysToFullNames: PropTypes.object,\r\n};\r\n\r\nexport default CareerStatisticsWidget;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport CareerStatisticsWidget from \"./CareerStatisticsWidget\";\r\n\r\nimport loadIntoState from \"../loadIntoState\";\r\nimport LoadingImage from \"../LoadingImage\";\r\nimport History from \"../History\";\r\nimport ErrorWidget from \"../ErrorWidget\";\r\nimport { setBook } from \"../../State\";\r\nimport BookIconLinks from \"../BookIconLinks\";\r\n\r\n/**\r\n * This component is responsible for switching between the Career Statistics of each book.\r\n *\r\n * It is given a books array which is formed of { key, name, matchDataUrl }.\r\n *\r\n * The name is what is used as the link text for switching between career statistic data.\r\n *\r\n * The matchDataUrl is used to get the match list data.\r\n */\r\nclass CareerStatisticsPageWidget extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.onHistoryChange = this.onHistoryChange.bind(this);\r\n\r\n this.state = {\r\n bookIdx: null,\r\n bookKey: null,\r\n matches: null,\r\n keysToFullNames: null,\r\n };\r\n }\r\n\r\n async onHistoryChange({ params }) {\r\n // console.log(\"CareerStatisticsPageWidget\", \"onHistoryChange\", location, params);\r\n const { books } = this.props;\r\n const bookKey = params.book || books[0].key;\r\n\r\n loadIntoState(this, async () => {\r\n const result = await setBook(books, bookKey);\r\n this.setState({\r\n ...result,\r\n bookKey,\r\n });\r\n });\r\n }\r\n\r\n onBookClick(newBookKey, pushParams) {\r\n const { bookKey } = this.state;\r\n if (newBookKey !== bookKey) {\r\n pushParams({ book: newBookKey });\r\n }\r\n }\r\n\r\n renderWithHistory({ pushParams }) {\r\n const { bookIdx, matches, keysToFullNames, loading, loadingError } = this.state;\r\n const { books } = this.props;\r\n const book = books[bookIdx];\r\n\r\n let mainComponent = \"\";\r\n if (loadingError) {\r\n mainComponent = ;\r\n } else if (!matches) {\r\n mainComponent = loading ? Loading match data... : \"Match data not loaded.\";\r\n } else {\r\n mainComponent = (\r\n <>\r\n

    {book.name}

    \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n this.onBookClick(key, pushParams)} />\r\n {mainComponent}\r\n
    \r\n );\r\n }\r\n\r\n render() {\r\n // console.log(\"CareerStatisticsPageWidget\", \"render\", \"props\", this.props, \"state\", this.state);\r\n return (\r\n \r\n {(...args) => this.renderWithHistory(...args)}\r\n \r\n );\r\n }\r\n}\r\n\r\nCareerStatisticsPageWidget.propTypes = {\r\n books: PropTypes.array,\r\n};\r\n\r\nexport default CareerStatisticsPageWidget;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nclass CareerRecordsTableWidget extends Component {\r\n renderRow(key, rank, player, value) {\r\n const { renderPlayerLink } = this.props;\r\n return (\r\n \r\n {rank}\r\n \r\n {renderPlayerLink(player)}\r\n \r\n {value}\r\n \r\n );\r\n }\r\n\r\n render() {\r\n const { playerList, statName } = this.props;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {playerList.map(({ player, stats, rank }, i) => {\r\n const value = stats[statName];\r\n if (!value) {\r\n return null;\r\n }\r\n const prevRank = playerList[i - 1] && playerList[i - 1].rank;\r\n return this.renderRow(i, rank === prevRank ? \"\" : rank, player, value);\r\n })}\r\n \r\n
    NAME
    \r\n );\r\n }\r\n}\r\n\r\nCareerRecordsTableWidget.propTypes = {\r\n playerList: PropTypes.array,\r\n statName: PropTypes.string,\r\n renderPlayerLink: PropTypes.func,\r\n};\r\n\r\nexport default CareerRecordsTableWidget;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport CareerRecordsTableWidget from \"./CareerRecordsTableWidget\";\r\n\r\nimport { careerRecordsLists } from \"../../utils\";\r\n\r\nconst FRANCE_TEAM_NAMES = [\r\n \"France\",\r\n // Don't include France XIII\r\n // \"France XIII\",\r\n];\r\n\r\nfunction isFrance(teamName) {\r\n return FRANCE_TEAM_NAMES.indexOf(teamName) > -1;\r\n}\r\n\r\nconst StatTypeLink = ({ children, onClick }) => (\r\n
    \r\n {children}\r\n
    \r\n);\r\n\r\nStatTypeLink.propTypes = {\r\n children: PropTypes.node,\r\n onClick: PropTypes.func,\r\n};\r\n\r\nclass CareerRecordsWidget extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n onStatTypeLinkClick(e, statType) {\r\n e.preventDefault();\r\n this.setState({ statType });\r\n }\r\n\r\n render() {\r\n const {\r\n matches,\r\n heading,\r\n filterByMatchTeamPlayer,\r\n listSize = 15,\r\n renderPlayerLink,\r\n lineupPlayerKeyGenerator,\r\n } = this.props;\r\n\r\n const lists = careerRecordsLists(matches, {\r\n listSize,\r\n filterByMatchTeamPlayer(match, team, player) {\r\n return isFrance(team.name) && filterByMatchTeamPlayer(match, team, player);\r\n },\r\n lineupPlayerKeyGenerator,\r\n });\r\n\r\n const statType = this.state.statType || \"matches\";\r\n const playerList = lists[statType];\r\n\r\n return (\r\n
    \r\n

    {heading}

    \r\n\r\n
    \r\n this.onStatTypeLinkClick(e, \"matches\")}>Apps\r\n this.onStatTypeLinkClick(e, \"tries\")}>Tries\r\n this.onStatTypeLinkClick(e, \"goals\")}>Goals\r\n this.onStatTypeLinkClick(e, \"pts\")}>Points\r\n
    \r\n\r\n
    \r\n\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nCareerRecordsWidget.propTypes = {\r\n matches: PropTypes.array,\r\n heading: PropTypes.node,\r\n filterByMatchTeamPlayer: PropTypes.func,\r\n listSize: PropTypes.number,\r\n renderPlayerLink: PropTypes.func,\r\n lineupPlayerKeyGenerator: PropTypes.func,\r\n};\r\n\r\nexport default CareerRecordsWidget;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport CareerRecordsWidget from \"./CareerRecordsWidget2\";\r\n\r\nimport loadIntoState from \"../loadIntoState\";\r\nimport ErrorWidget from \"../ErrorWidget\";\r\nimport LoadingImage from \"../LoadingImage\";\r\nimport History from \"../History\";\r\nimport PlayerLink from \"../PlayerStats/PlayerLink\";\r\nimport { intersperse } from \"../../array\";\r\nimport { setBook } from \"../../State\";\r\nimport { getPlayerKeyGenerators } from \"../../books\";\r\nimport { PlayerUtils } from \"../../utils\";\r\nimport BookIconLinks from \"../BookIconLinks\";\r\n\r\nconst views = {\r\n \"wtcc\": [\r\n {\r\n heading: \"1934-39\",\r\n // eslint-disable-next-line no-unused-vars\r\n filterByMatchTeamPlayer: function(match, team, player) {\r\n // DD/MM/YYYY\r\n const year = parseInt(match.date.split(\"/\")[2]);\r\n return year >= 1934 && year <= 1939;\r\n },\r\n lineupPlayerKeyGenerator: getPlayerKeyGenerators(\"wtcc\").lineupPlayerKeyGenerator,\r\n },\r\n {\r\n heading: \"1946-51\",\r\n // eslint-disable-next-line no-unused-vars\r\n filterByMatchTeamPlayer: function(match, team, player) {\r\n // DD/MM/YYYY\r\n const year = parseInt(match.date.split(\"/\")[2]);\r\n return year >= 1946 && year <= 1951;\r\n },\r\n lineupPlayerKeyGenerator: getPlayerKeyGenerators(\"wtcc\").lineupPlayerKeyGenerator,\r\n },\r\n {\r\n heading: \"ALL (1934-51)\",\r\n filterByMatchTeamPlayer: () => true,\r\n lineupPlayerKeyGenerator: getPlayerKeyGenerators(\"wtcc\").lineupPlayerKeyGenerator,\r\n },\r\n ],\r\n // null here implies no heading and all data should be used.\r\n \"still-crowing\": [\r\n {\r\n heading: \"ALL (1951-60)\",\r\n filterByMatchTeamPlayer: () => true,\r\n lineupPlayerKeyGenerator: getPlayerKeyGenerators(\"still-crowing\").lineupPlayerKeyGenerator,\r\n },\r\n ],\r\n // null here implies no heading and all data should be used.\r\n \"stormy-sixties\": [\r\n {\r\n heading: \"ALL (1960-69)\",\r\n filterByMatchTeamPlayer: () => true,\r\n lineupPlayerKeyGenerator: getPlayerKeyGenerators(\"stormy-sixties\").lineupPlayerKeyGenerator,\r\n },\r\n ],\r\n};\r\n\r\nfunction ViewLink(props) {\r\n const { view, onClick } = props;\r\n return {view.heading};\r\n}\r\n\r\nViewLink.propTypes = {\r\n view: PropTypes.object,\r\n onClick: PropTypes.func,\r\n};\r\n\r\nclass CareerRecordsPageWidget extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.onHistoryChange = this.onHistoryChange.bind(this);\r\n\r\n this.state = {\r\n bookIdx: null,\r\n bookKey: null,\r\n keysToFullNames: null,\r\n matches: null,\r\n viewIdx: null,\r\n };\r\n }\r\n\r\n async onHistoryChange({ params }) {\r\n // console.log(\"CareerRecordsPageWidget\", \"onHistoryChange\", location, params);\r\n const { books } = this.props;\r\n const bookKey = params.book || books[0].key;\r\n\r\n loadIntoState(this, async () => {\r\n const result = await setBook(books, bookKey);\r\n this.setState({\r\n ...result,\r\n bookKey,\r\n });\r\n });\r\n }\r\n\r\n onViewLinkClick(e, viewIdx) {\r\n e.preventDefault();\r\n this.setState({ viewIdx });\r\n }\r\n\r\n onBookClick(newBookKey, pushParams) {\r\n const { bookKey } = this.state;\r\n if (newBookKey !== bookKey) {\r\n pushParams({ book: newBookKey });\r\n }\r\n }\r\n\r\n renderWithHistory({ pushParams }) {\r\n const { bookIdx, matches, viewIdx, keysToFullNames, loading, loadingError } = this.state;\r\n const { books } = this.props;\r\n const book = books[bookIdx];\r\n\r\n let mainComponent = \"\";\r\n if (loadingError) {\r\n mainComponent = ;\r\n } else if (!matches) {\r\n mainComponent = loading ? Loading match data... : \"Match data not loaded.\";\r\n } else {\r\n const viewsForBook = views[book.key];\r\n let linkDiv = null;\r\n\r\n if (viewsForBook) {\r\n const links = viewsForBook.map((view, viewIdx) =>\r\n this.onViewLinkClick(e, viewIdx)} />);\r\n linkDiv =
    {intersperse(links, \" | \")}
    ;\r\n }\r\n\r\n // Use view of viewIdx (if it exists) or default view.\r\n const view = viewsForBook[viewIdx] || viewsForBook[0];\r\n\r\n const playerKeyGenerators = getPlayerKeyGenerators(book);\r\n const renderPlayerLink = (player) => {\r\n const playerKey = playerKeyGenerators.lineupPlayerKeyGenerator(player);\r\n const fullName = PlayerUtils.playerFullName(keysToFullNames, playerKeyGenerators, playerKey);\r\n const playerName = `${fullName.firstName} ${fullName.lastName}`;\r\n return {playerName};\r\n };\r\n\r\n mainComponent = (\r\n <>\r\n

    {book.name}

    \r\n {linkDiv}\r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n this.onBookClick(key, pushParams)} />\r\n {mainComponent}\r\n
    \r\n );\r\n }\r\n\r\n render() {\r\n // console.log(\"CareerRecordsPageWidget\", \"render\", \"props\", this.props, \"state\", this.state);\r\n return (\r\n \r\n {(...args) => this.renderWithHistory(...args)}\r\n \r\n );\r\n }\r\n}\r\n\r\nCareerRecordsPageWidget.propTypes = {\r\n books: PropTypes.array,\r\n};\r\n\r\nexport default CareerRecordsPageWidget;\r\n","import React, { Component } from \"react\";\r\n\r\nconst HomeScreenIcon = () =>\r\n ;\r\n\r\nclass AddToHomeScreenWidget extends Component {\r\n render() {\r\n return (\r\n <>\r\n

    Add to Home Screen

    \r\n

    \r\n In supported browsers/devices, this site can be added to your Home Screen. If we can\r\n determine that you can add this site to your home screen, we will add an Add to\r\n Home Screen icon in the right hand side of the title bar. This icon looks like:\r\n

    \r\n

    \r\n \r\n

    \r\n

    \r\n Clicking on this icon will ask for your permission to add the site to your home screen. If permission\r\n is granted, an icon for the site will be added to your home screen.\r\n

    \r\n

    This feature is only widely supported on Android, by the Chrome, Firefox and Opera browsers.

    \r\n \r\n );\r\n }\r\n}\r\n\r\nAddToHomeScreenWidget.propTypes = {\r\n};\r\n\r\nexport default AddToHomeScreenWidget;\r\n","import React, { Component } from \"react\";\r\n\r\nimport ErrorWidget from \"../ErrorWidget\";\r\nimport { clearOfflineCaches, isOfflineCacheBeingUsed, populateOfflineCache } from \"../../services/offline-cache\";\r\nimport { isOfflineCacheSupported } from \"../../feature-test\";\r\nimport { Cross, Tick } from \"../Checks\";\r\n\r\nclass OfflineCacheWidget extends Component {\r\n constructor() {\r\n super();\r\n this.state = {\r\n offlineCacheSupported: false,\r\n offlineCacheInUse: null,\r\n populateCacheResult: null,\r\n };\r\n }\r\n\r\n async componentDidMount() {\r\n const offlineCacheSupported = isOfflineCacheSupported();\r\n\r\n if (!offlineCacheSupported) {\r\n return this.setState({\r\n offlineCacheSupported,\r\n });\r\n }\r\n\r\n try {\r\n const offlineCacheInUse = await isOfflineCacheBeingUsed();\r\n this.setState({\r\n offlineCacheInUse,\r\n offlineCacheSupported: true,\r\n });\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n\r\n populateAppCache() {\r\n return populateOfflineCache()\r\n .then((response) => {\r\n const populateCacheResult = `Success! Cached ${response.cachedResources.length} resources.`\r\n + ` Now the site can work offline.`;\r\n this.setState({\r\n populateCacheResult,\r\n offlineCacheInUse: true,\r\n });\r\n });\r\n }\r\n\r\n clearAppCache() {\r\n const plural = (s, num, postfix = \"s\") => s + (num > 1 ? postfix : \"\");\r\n return clearOfflineCaches()\r\n .then((response) => this.setState({\r\n populateCacheResult: `Success! Cleared ${response.length} ${plural(\"cache\", response.length)}.\r\n You will no longer be able to use the site offline.`,\r\n offlineCacheInUse: false,\r\n }));\r\n }\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n toggleUseOfflineCache(e) {\r\n const { offlineCacheInUse } = this.state;\r\n const toggle = () => {\r\n const promise = offlineCacheInUse ? this.clearAppCache() : this.populateAppCache();\r\n return promise\r\n .catch((err) => this.setState({\r\n populateCacheResult: `Error! ${err.message}. A possible reason for this is that you are currently offline.`,\r\n }));\r\n };\r\n this.setState({\r\n populateCacheResult: \"Updating cache...\",\r\n }, toggle);\r\n }\r\n\r\n renderSupported() {\r\n const { offlineCacheInUse } = this.state;\r\n return (\r\n <>\r\n

    {offlineCacheInUse ? : } Offline cache is {offlineCacheInUse ? \"\" : \"not \"}being used.

    \r\n

    Use the following button to set your preference.

    \r\n

    \r\n \r\n

    \r\n \r\n );\r\n }\r\n\r\n renderNotSupported() {\r\n return (\r\n
    \r\n Offline Cache is not supported by this browser.\r\n
    \r\n );\r\n }\r\n\r\n render() {\r\n const { populateCacheResult } = this.state;\r\n return (\r\n <>\r\n

    Offline Cache

    \r\n

    \r\n The site can cache its resources so you can browse the site's information even when\r\n you are offline. Some resources (like Pen Pic images, the sample chapter and the\r\n timeline) may still be unavailable though.\r\n

    \r\n {isOfflineCacheSupported() ? this.renderSupported() : this.renderNotSupported()}\r\n

    \r\n {\r\n populateCacheResult instanceof Error\r\n ? \r\n : populateCacheResult\r\n }\r\n

    \r\n \r\n );\r\n }\r\n}\r\n\r\nOfflineCacheWidget.propTypes = {\r\n};\r\n\r\nexport default OfflineCacheWidget;\r\n","import { postMessage } from \"./post-message\";\r\n\r\nexport const isOfflineCacheBeingUsed = () => postMessage(\"isOfflineCacheBeingUsed\");\r\n\r\nexport const clearOfflineCaches = () => postMessage(\"clearOfflineCaches\");\r\n\r\nexport const populateOfflineCache = () => postMessage(\"populateOfflineCache\");\r\n","// https://github.com/web-push-libs/web-push/blob/f271d0f0c3974674506db7ff13896b7da963495c/README.md#L68\r\nexport default function urlBase64ToUint8Array(base64String) {\r\n const padding = \"=\".repeat((4 - base64String.length % 4) % 4);\r\n const base64 = (base64String + padding)\r\n .replace(/\\-/g, \"+\")\r\n .replace(/_/g, \"/\");\r\n\r\n const rawData = window.atob(base64);\r\n const outputArray = new Uint8Array(rawData.length);\r\n\r\n for (let i = 0; i < rawData.length; ++i) {\r\n outputArray[i] = rawData.charCodeAt(i);\r\n }\r\n return outputArray;\r\n}\r\n","import { getServiceWorkerRegistration } from \"./service-worker\";\r\nimport urlBase64ToUint8Array from \"./urlBase64ToUint8Array\";\r\nimport { postJSON, throwIfBadResponse } from \"../request/json\";\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/API/Notification/requestPermission\r\n// requestPermission() used to be callback based, but is now Promise based.\r\n// this function handles both.\r\nexport function requestPermission() {\r\n return new Promise((resolve, reject) => {\r\n const permissionResult = Notification.requestPermission((permission) => {\r\n resolve(permission);\r\n });\r\n if (permissionResult) {\r\n permissionResult.then(resolve, reject);\r\n }\r\n });\r\n}\r\n\r\nexport function showNotification(title, options) {\r\n return navigator.serviceWorker.ready.then((registration) =>\r\n registration.showNotification(title, options)\r\n );\r\n}\r\n\r\n/**\r\n * POSTs subscription information to the server.\r\n *\r\n * @param {PushSubscription} subscription\r\n * @param {string} [subscribeEndpoint=\"/subscribe\"]\r\n *\r\n * @return {Promise} fetch Promise.\r\n */\r\nexport async function serverSubscribe(subscription, subscribeEndpoint = \"/subscribe\") {\r\n const response = await postJSON(subscribeEndpoint, subscription);\r\n return await throwIfBadResponse(response);\r\n};\r\n\r\n/**\r\n * POSTs subscription information to the server.\r\n *\r\n * @param {PushSubscription} subscription\r\n * @param {string} [unsubscribeEndpoint=\"/subscribe\"]\r\n *\r\n * @return {Promise} fetch Promise.\r\n */\r\nexport async function serverUnsubscribe(subscription, unsubscribeEndpoint = \"/unsubscribe\") {\r\n const response = await postJSON(unsubscribeEndpoint, {\r\n subscription,\r\n });\r\n return await throwIfBadResponse(response);\r\n};\r\n\r\n/**\r\n * Subscribes to push notifications. If `registration` is not provided, it will be retrieved from\r\n * the active service worker registration.\r\n *\r\n * @param {ServiceWorkerRegistration} registration Optional registration.\r\n *\r\n * @return {PushSubscription}\r\n */\r\nexport async function subscribe(registration) {\r\n // \"userVisibleOnly\" is a symbolic agreement that the web app will display a notification as a\r\n // result of a web push message\r\n // https://docs.google.com/document/d/13VxFdLJbMwxHrvnpDm8RXnU41W2ZlcP0mdWWe9zXQT8/edit\r\n registration = await Promise.resolve(registration || getServiceWorkerRegistration());\r\n return registration.pushManager.subscribe({\r\n userVisibleOnly: true,\r\n // grabbed from https://console.firebase.google.com/u/0/project/whenthecockcrowed-1102/settings/cloudmessaging/\r\n applicationServerKey: urlBase64ToUint8Array(\r\n \"BD69GHFBK4frzXe_yCyHVF5uv9oZSjbMBF63Pt2PshokctxD2l52VW8rOfVKXL-Y_vzqEyLl1K5hxav99pUZ7a4\",\r\n ),\r\n });\r\n}\r\n\r\n/**\r\n * Unsubscribes to push notifications. If `subscription` is not provided, it will be retrieved from\r\n * the active service worker registration.\r\n *\r\n * @param {PushSubscription} subscription Optional subscription.\r\n *\r\n * @return {boolean}\r\n */\r\nexport async function unsubscribe(subscription) {\r\n subscription = await Promise.resolve(subscription || getSubscription());\r\n if (subscription) {\r\n // https://developer.mozilla.org/en-US/docs/Web/API/PushSubscription/unsubscribe\r\n // A Promise that resolves to a Boolean when the current subscription is successfully unsubscribed.\r\n const unsubscribed = await subscription.unsubscribe();\r\n return unsubscribed ? subscription : null;\r\n }\r\n return null;\r\n}\r\n\r\nexport function getSubscription(registration) {\r\n return Promise.resolve(registration || getServiceWorkerRegistration())\r\n .then((registration) => registration.pushManager.getSubscription());\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport {\r\n Cross,\r\n Tick,\r\n} from \"../Checks\";\r\n\r\nimport { withEnv } from \"../../context/env\";\r\n\r\nimport {\r\n isNotificationsSupported,\r\n isPushMessagesSupported,\r\n} from \"../../feature-test\";\r\n\r\nimport {\r\n requestPermission,\r\n showNotification,\r\n getSubscription,\r\n serverSubscribe,\r\n serverUnsubscribe,\r\n subscribe,\r\n unsubscribe,\r\n} from \"../../services/notifications\";\r\n\r\nimport { getErrorMessage } from \"../../request/json\";\r\nimport ErrorWidget from \"../ErrorWidget\";\r\n\r\nclass WithDefaultPermission extends Component {\r\n state = {\r\n requestingPermission: false,\r\n };\r\n\r\n requestPermission() {\r\n const { onPermissionChange } = this.props;\r\n\r\n const doRequestPermission = async () => {\r\n try {\r\n const permission = await requestPermission();\r\n console.log(\"WithDefaultPermission\", \"requestPermission\", permission);\r\n onPermissionChange(permission);\r\n } finally {\r\n this.setState({\r\n requestingPermission: false,\r\n });\r\n }\r\n };\r\n\r\n this.setState({\r\n requestingPermission: true,\r\n }, doRequestPermission);\r\n }\r\n\r\n render() {\r\n const { requestingPermission } = this.state;\r\n\r\n const onClick = (e) => {\r\n e.preventDefault();\r\n console.log(\"WithDefaultPermission\", \"onClick\", e);\r\n this.requestPermission();\r\n };\r\n\r\n return (\r\n <>\r\n

    \r\n \r\n

    \r\n \r\n );\r\n }\r\n}\r\n\r\nWithDefaultPermission.propTypes = {\r\n onPermissionChange: PropTypes.func,\r\n};\r\n\r\nconst WithDeniedPermission = () => {\r\n return (\r\n <>\r\n

    Your permission to use notifications has been denied.

    \r\n

    If you want to enable notifications for this site, you will have to use your\r\n browser's settings to reset this permission. The following instructions may help:

    \r\n \r\n \r\n );\r\n};\r\n\r\nclass WithGrantedPermission extends Component {\r\n constructor() {\r\n super();\r\n this.state = {\r\n testNotificationError: null,\r\n subscribed: null,\r\n subscriptionChanging: null,\r\n subscribeError: null,\r\n unsubscribeError: null,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.setSubscriptionState();\r\n }\r\n\r\n async setSubscriptionState(additionalState) {\r\n const subscription = await getSubscription();\r\n const newState = {\r\n subscribed: Boolean(subscription),\r\n subscriptionChanging: false,\r\n subscribeError: null,\r\n unsubscribeError: null,\r\n ...additionalState,\r\n };\r\n console.log(\"setSubscriptionState\", newState);\r\n this.setState(newState);\r\n }\r\n\r\n onClickSubscribe(e) {\r\n console.log(e);\r\n\r\n const { subscribeUrl } = this.props;\r\n\r\n const doSubscribe = async () => {\r\n let subscription;\r\n try {\r\n subscription = await subscribe();\r\n // DANGER - Cannot use Object.assign or object spread with PushSubscription object.\r\n // E.g.:\r\n // Object.assign({}, subscription) === {}\r\n // {...subscription} === {}\r\n // So convert to plain object first.\r\n const plainSubscription = JSON.parse(JSON.stringify(subscription));\r\n await serverSubscribe({\r\n ...plainSubscription,\r\n userAgent: navigator.userAgent,\r\n }, subscribeUrl);\r\n await this.setSubscriptionState();\r\n } catch (err) {\r\n console.error(typeof err, err);\r\n try {\r\n if (subscription) {\r\n await unsubscribe(subscription);\r\n }\r\n } finally {\r\n await this.setSubscriptionState({\r\n subscribeError: getErrorMessage(err),\r\n });\r\n }\r\n }\r\n };\r\n\r\n this.setState({\r\n subscriptionChanging: true,\r\n }, doSubscribe);\r\n }\r\n\r\n onClickUnsubscribe(e) {\r\n console.log(e);\r\n\r\n const { unsubscribeUrl } = this.props;\r\n\r\n const doUnsubscribe = async () => {\r\n try {\r\n const subscription = await unsubscribe();\r\n if (subscription) {\r\n await serverUnsubscribe(subscription, unsubscribeUrl);\r\n }\r\n await this.setSubscriptionState();\r\n } catch (err) {\r\n console.error(typeof err, err);\r\n await this.setSubscriptionState({\r\n unsubscribeError: getErrorMessage(err),\r\n });\r\n }\r\n };\r\n\r\n this.setState({\r\n subscriptionChanging: true,\r\n }, doUnsubscribe);\r\n }\r\n\r\n render() {\r\n console.log(\"render\", this.state);\r\n\r\n const onClickTestNotification = async (e) => {\r\n console.log(e);\r\n const body = \"Test notification from When The Cock Crowed\";\r\n const icon = \"/favicon.ico\";\r\n try {\r\n await showNotification(\"Test notification\", { body, icon });\r\n } catch (err) {\r\n console.error(typeof err, err);\r\n this.setState({\r\n testNotificationError: err,\r\n });\r\n }\r\n };\r\n\r\n const { testNotificationError, subscribed, subscriptionChanging, subscribeError, unsubscribeError } = this.state;\r\n\r\n const onClick = (subscribed ? this.onClickUnsubscribe : this.onClickSubscribe).bind(this);\r\n\r\n return (\r\n <>\r\n

    You have granted permission for this site to use notifications.

    \r\n

    \r\n

    Real notifications will only be sent to you if you also subscribe.

    \r\n {\r\n subscribed === null\r\n ?

    Waiting for subscription status...

    \r\n : <>\r\n

    \r\n {subscribed ? : }\r\n {\" \"}\r\n {subscribed ? \"You have successfully subscribed.\" : \"You do not have a subscription.\"}\r\n

    \r\n {\r\n (subscribeError || unsubscribeError)\r\n ?

    \r\n : null\r\n }\r\n

    \r\n \r\n {\r\n subscriptionChanging === true\r\n ? \"Waiting for subscription status...\"\r\n : `Click here to ${subscribed ? \"un\" : \"\"}subscribe to notifications`\r\n }\r\n \r\n

    \r\n \r\n }\r\n {\r\n testNotificationError\r\n ?

    {testNotificationError.message || String(testNotificationError)}

    \r\n : null\r\n }\r\n \r\n );\r\n }\r\n}\r\n\r\nWithGrantedPermission.propTypes = {\r\n // to override the default notifications [un]subscribe URL\r\n subscribeUrl: PropTypes.string,\r\n unsubscribeUrl: PropTypes.string,\r\n};\r\n\r\nclass NotificationsWidget extends Component {\r\n renderSupported() {\r\n const { env } = this.props;\r\n\r\n let body = null;\r\n\r\n if (Notification.permission === \"default\") {\r\n // eslint-disable-next-line no-unused-vars\r\n body = this.setState({})} />;\r\n }\r\n\r\n if (Notification.permission === \"granted\") {\r\n body = ;\r\n }\r\n\r\n if (Notification.permission === \"denied\") {\r\n body = ;\r\n }\r\n\r\n if (body) {\r\n return (\r\n <>\r\n

    \r\n The site can currently send notifications\r\n

      \r\n
    • on the date that a player was born
    • \r\n
    • on the date a match was played
    • \r\n
    \r\n

    \r\n

    These notifications are clickable, and clicking will open the respective page on the website for further info.

    \r\n

    The notifications appear as standard device notifications, like the following Android and Windows notifications:

    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n

    \r\n In order to receive notifications from this site, you first need to grant permission\r\n for this site to use notifications, and secondly subscribe to the notifications.\r\n

    \r\n {body}\r\n \r\n );\r\n }\r\n\r\n return \"We could not determine your notification permission status.\";\r\n }\r\n\r\n renderUnsupported() {\r\n return (\r\n
    \r\n Notifications are not supported by this browser.\r\n
    \r\n );\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n

    Notifications

    \r\n {\r\n isNotificationsSupported() && isPushMessagesSupported()\r\n ? this.renderSupported()\r\n : this.renderUnsupported()\r\n }\r\n \r\n );\r\n }\r\n}\r\n\r\nNotificationsWidget.propTypes = {\r\n env: PropTypes.object,\r\n};\r\n\r\nexport default withEnv(NotificationsWidget);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport AddToHomeScreenWidget from \"./AddToHomeScreenWidget\";\r\nimport OfflineCacheWidget from \"./OfflineCacheWidget\";\r\nimport NotificationsWidget from \"./NotificationsWidget\";\r\n\r\nimport { withEnv } from \"../../context/env\";\r\n\r\nclass AppConfigPageWidget extends Component {\r\n render() {\r\n const { env } = this.props;\r\n console.log(\"AppConfigPageWidget\", \"env\", env);\r\n return (\r\n <>\r\n

    \r\n Welcome to the When The Cock Crowed App Config page. If your browser supports the necessary\r\n features, this page can be used to configure an enhanced experience of the When The Cock Crowed web\r\n site.\r\n

    \r\n

    Older browsers, such as IE 11, are not capable of supporting these features.

    \r\n

    \r\n Sometimes the app needs updating. If this happens, you will see an \"Update App\" menu item appear in the menu\r\n - click this menu item to update.\r\n

    \r\n \r\n \r\n \r\n
    \r\n

    {location.host}

    \r\n

    {navigator.userAgent}

    \r\n \r\n );\r\n }\r\n}\r\n\r\nAppConfigPageWidget.propTypes = {\r\n env: PropTypes.object,\r\n};\r\n\r\nexport default withEnv(AppConfigPageWidget);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nclass AdminPageWidget extends Component {\r\n state = {};\r\n\r\n async componentDidMount() {\r\n try {\r\n const it = await import(/* webpackChunkName: \"AdminWidget\" */ \"./AdminWidget\");\r\n console.log(it);\r\n const { default: AdminWidget } = it;\r\n this.setState({ AdminWidget });\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n\r\n render() {\r\n const { AdminWidget } = this.state;\r\n if (!AdminWidget) {\r\n return \"AdminWidget not loaded\";\r\n }\r\n return ;\r\n }\r\n}\r\n\r\nAdminPageWidget.propTypes = {\r\n books: PropTypes.array,\r\n};\r\n\r\nexport default AdminPageWidget;\r\n","import React from \"react\";\r\n\r\n// TODO fixme\r\nconst fetchJSON = window.fetchJSON;\r\n\r\nexport default function useJSONData(url) {\r\n const [data, setData] = React.useState(null);\r\n const [error, setError] = React.useState(null);\r\n const [loading, setLoading] = React.useState(null);\r\n\r\n async function effect() {\r\n setData(null);\r\n setError(null);\r\n setLoading(true);\r\n try {\r\n const json = await fetchJSON(url);\r\n const data = (\"string\" === typeof json) ? JSON.parse(json) : json;\r\n setData(data);\r\n } catch (err) {\r\n console.log(err, url);\r\n setError(err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n\r\n React.useEffect(() => void effect(), [url]);\r\n\r\n return {\r\n data,\r\n error,\r\n loading,\r\n };\r\n}\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport History from \"../History\";\r\nimport useJSONData from \"./useJSONData\";\r\n\r\nfunction asJson(ob, prop, keys) {\r\n if (!ob[prop]) {\r\n return null;\r\n }\r\n\r\n let s = null;\r\n\r\n if (!keys) {\r\n try {\r\n s = JSON.stringify(ob[prop]);\r\n } catch (e) {\r\n // ignore\r\n console.error(e);\r\n }\r\n } else if (null === s || \"{}\" === s) {\r\n const ob2 = {};\r\n // eslint-disable-next-line guard-for-in\r\n for (const k in ob[prop]) {\r\n console.log(k);\r\n try {\r\n ob2[k] = JSON.parse(JSON.stringify(ob[prop][k]));\r\n } catch (e) {\r\n // ignore\r\n console.error(e);\r\n }\r\n }\r\n s = JSON.stringify(ob2);\r\n }\r\n\r\n return JSON.parse(s);\r\n}\r\n\r\nconst WTCCTiming = {\r\n HtmlStartMs: +new Date(),\r\n\r\n record(name) {\r\n return (this[name] = (+new Date() - this.HtmlStartMs));\r\n },\r\n\r\n submit() {\r\n this._navigation = null;\r\n this._timing = null;\r\n if (window.performance) {\r\n this._navigation = asJson(window.performance, \"navigation\");\r\n this._timing = asJson(window.performance, \"timing\");\r\n }\r\n fetch(\"/performance\", {\r\n method: \"POST\",\r\n body: JSON.stringify(this),\r\n headers: {\r\n \"Content-Type\": \"application/json; charset=utf-8\",\r\n },\r\n });\r\n },\r\n};\r\n\r\n// WIDGET\r\n\r\nclass Timeline {\r\n constructor() {\r\n // TODO fix globals\r\n\r\n // eslint-disable-next-line no-undef\r\n this.TL = TL;\r\n\r\n this.timeline = null;\r\n }\r\n\r\n initialize(timelineContainerElement, timelineData) {\r\n this.timelineContainerElement = timelineContainerElement;\r\n this.timelineData = timelineData;\r\n\r\n const TL = this.TL;\r\n\r\n console.log(\"initialize\", this.timelineData, this.timelineContainerElement);\r\n\r\n this.addFlags(timelineData);\r\n\r\n // TL.Timeline modifies the data passed to it. We make a clone so that we can use devtools to\r\n // copy the unmodified value if we want to.\r\n const timelineDataCopy = JSON.parse(JSON.stringify(timelineData));\r\n\r\n this.setHeight();\r\n\r\n const timelineOptions = {\r\n hash_bookmark: window.history && window.history.replaceState,\r\n scale_factor: 10,\r\n };\r\n\r\n this.patchTimeMarkerData();\r\n\r\n const events = timelineDataCopy.events;\r\n\r\n WTCCTiming.record(\"beforeCreateTLTimeline\");\r\n this.timeline = new TL.Timeline(timelineContainerElement, timelineDataCopy, timelineOptions);\r\n WTCCTiming.record(\"afterCreateTLTimeline\");\r\n\r\n // export globals\r\n window.timeline = this.timeline;\r\n window.timelineData = timelineData;\r\n\r\n // Set up a 'race' between the timeout and \"loaded\" event.\r\n // The timeout will only cause WTCCTiming.submit() to be called if the \"loaded\" event hasn't fired.\r\n setTimeout(function() {\r\n if (!WTCCTiming.TLTimelineLoaded) {\r\n WTCCTiming.record(\"TLTimelineLoadedTimeout\");\r\n WTCCTiming.submit();\r\n }\r\n }, 5 * 1000);\r\n\r\n this.timeline.on(\"loaded\", function() {\r\n WTCCTiming.record(\"TLTimelineLoaded\");\r\n WTCCTiming.submit();\r\n });\r\n\r\n this.timeline.addEventListener(\"added\", () => {\r\n // +2 for the empty slide and the title slide\r\n if (this.timeline._storyslider._slides.length === events.length + 2) {\r\n WTCCTiming.record(\"TLTimelineLoaded\");\r\n WTCCTiming.submit();\r\n }\r\n });\r\n }\r\n\r\n parseMatchSummary(summary) {\r\n // E.g. \"France 10<>brAustralia 29\"\r\n const exec = /([^\\d]+)(\\d+)
    ([^\\d]+)(\\d+)/.exec(summary);\r\n if (!exec) {\r\n return null;\r\n }\r\n return {\r\n team1: exec[1].trim(),\r\n score1: exec[2].trim(),\r\n team2: exec[3].trim(),\r\n score2: exec[4].trim(),\r\n };\r\n }\r\n\r\n getMarkerHeadline(team1, score1, team2, score2) {\r\n const match = {\r\n team1: { name: team1, score: score1 },\r\n team2: { name: team2, score: score2 },\r\n };\r\n let france = match.team1;\r\n let oppo = match.team2;\r\n if (match.team2.name === \"France\") {\r\n france = match.team2;\r\n oppo = match.team1;\r\n }\r\n let result = \"D\";\r\n if (oppo.score !== france.score) {\r\n result = (oppo.score > france.score) ? \"L\" : \"W\";\r\n }\r\n const maxScore = Math.max(france.score, oppo.score);\r\n const minScore = Math.min(france.score, oppo.score);\r\n const score = maxScore + \"-\" + minScore;\r\n const headline = result + \" \" + score + \" v \" + oppo.name;\r\n return headline;\r\n }\r\n\r\n addFlags() {\r\n this.timelineData.events.forEach((e) => {\r\n const flags = {\r\n \"Australia\": \"https://upload.wikimedia.org/wikipedia/en/b/b9/Flag_of_Australia.svg\",\r\n \"England\": \"https://upload.wikimedia.org/wikipedia/en/b/be/Flag_of_England.svg\",\r\n \"New Zealand\": \"https://upload.wikimedia.org/wikipedia/commons/3/3e/Flag_of_New_Zealand.svg\",\r\n \"Wales\": \"https://upload.wikimedia.org/wikipedia/commons/d/dc/Flag_of_Wales.svg\",\r\n };\r\n const match = this.parseMatchSummary(e.text.headline);\r\n const oppo = (\"France\" === match.team1) ? match.team2 : match.team1;\r\n const flag = flags[oppo];\r\n e.media.thumbnail = flag;\r\n });\r\n }\r\n\r\n /*\r\n * Horrible hack to have different marker header to slide header.\r\n */\r\n _patchTimeMarkerData(callback) {\r\n const TL = this.TL;\r\n const init = TL.TimeMarker.prototype.initialize;\r\n TL.TimeMarker.prototype.initialize = function(...args) {\r\n // Replace original data with whatever the callback returns.\r\n const [data] = args;\r\n const data2 = callback.call(this, data);\r\n args[0] = data2;\r\n return init.apply(this, args);\r\n };\r\n }\r\n\r\n patchTimeMarkerData() {\r\n this._patchTimeMarkerData((data) => {\r\n const match = this.parseMatchSummary(data.text.headline);\r\n if (!match) {\r\n return data;\r\n }\r\n const headline = this.getMarkerHeadline(match.team1, match.score1, match.team2, match.score2);\r\n\r\n const TL = this.TL;\r\n const data2 = TL.Util.mergeData({}, data);\r\n data2.text = TL.Util.mergeData({}, data2.text);\r\n data2.text.headline = headline;\r\n return data2;\r\n });\r\n }\r\n\r\n setHeight() {\r\n const embed = this.timelineContainerElement;\r\n // #sb-site padding-top=50, padding-bottom=30\r\n // .content-inner padding-top=8, padding-bottom=8\r\n const heightAdjustment = 50 + 30 + 8 + 8;\r\n embed.style.height = (parseInt(getComputedStyle(document.body).height, 10)) - heightAdjustment + \"px\";\r\n }\r\n\r\n onWindowResize(e) {\r\n this.setHeight();\r\n this.timeline.updateDisplay();\r\n }\r\n}\r\n\r\nfunction TimelineWidget({ book, githash }) {\r\n const timelineContainerRef = React.useRef(null);\r\n const timelineRef = React.useRef(null);\r\n\r\n const {\r\n data,\r\n error,\r\n loading,\r\n } = useJSONData(\"./timeline/\" + book + \".timeline.json?hash=\" + githash);\r\n\r\n React.useEffect(() => {\r\n console.log(\"useEffect\", data);\r\n\r\n if (data && !loading) {\r\n timelineRef.current = new Timeline();\r\n timelineRef.current.initialize(timelineContainerRef.current, data);\r\n }\r\n }, [data, loading, timelineContainerRef.current]);\r\n\r\n React.useEffect(() => {\r\n const listener = (e) => timelineRef.current && timelineRef.current.onWindowResize(e);\r\n window.addEventListener(\"resize\", listener);\r\n return () => window.removeEventListener(\"resize\", listener);\r\n }, [timelineRef.current]);\r\n\r\n if (loading) {\r\n return
    Loading timeline...
    ;\r\n }\r\n\r\n if (error) {\r\n return `Cannot load Timeline for book=\"${book}\".`;\r\n }\r\n\r\n return (\r\n
    \r\n );\r\n}\r\n\r\nTimelineWidget.propTypes = {\r\n book: PropTypes.string,\r\n githash: PropTypes.string,\r\n};\r\n\r\nfunction TimelineSelectionWidget() {\r\n return (\r\n
    \r\n

    \r\n
    When The Cock Crowed
    \r\n

    \r\n

    \r\n
    Still Crowing
    \r\n

    \r\n

    \r\n
    Stormy Sixties
    \r\n

    \r\n
    \r\n );\r\n}\r\n\r\nfunction TimelinePageWidget() {\r\n console.log(\"TimelinePageWidget\");\r\n\r\n const onHistoryChange = (...args) => {\r\n console.log(args);\r\n };\r\n\r\n const renderWithHistory = (props) => {\r\n const { params = {} } = props;\r\n\r\n if (!params.book) {\r\n return ;\r\n }\r\n\r\n if ([\"wtcc\", \"still-crowing\", \"stormy-sixties\"].indexOf(params.book) < 0) {\r\n return `Cannot load Timeline. book=\"${params.book}\" not found.`;\r\n }\r\n return (\r\n <>\r\n
    Sorry, IE9 and lower is not supported.
    \r\n \r\n \r\n );\r\n };\r\n\r\n return (\r\n \r\n {(...args) => renderWithHistory(...args)}\r\n \r\n );\r\n}\r\n\r\nTimelinePageWidget.propTypes = {\r\n params: PropTypes.object,\r\n};\r\n\r\nexport default TimelinePageWidget;\r\n","// https://github.com/MatAtBread/fast-async#runtimepattern\r\n// Note: At least one of the file(s) matching the \"runtimePattern\" must use either await or async\r\n// as the runtime function (or require('nodent-runtime') if you set \"useRuntimeModule\":true) is\r\n// only included for files that reference it.\r\n\"use runtime-nodent\";\r\n// fake async function to trigger inclusion of fast-async runtime.\r\n(async () => { });\r\n\r\nimport React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\n\r\nimport \"./polyfills.modern\";\r\nimport utils from \"./utils\";\r\nimport swAPI from \"./sw-api\";\r\n\r\nimport EnvContext from \"./context/env\";\r\n\r\nimport SocialIcons from \"./widgets/SocialIcons\";\r\nimport MatchStatsPageWidget from \"./widgets/MatchStats/MatchStatsPageWidget\";\r\nimport MatchListsPageWidget from \"./widgets/MatchList/MatchListsPageWidget\";\r\nimport PlayerStatsPageWidget from \"./widgets/PlayerStats/PlayerStatsPageWidget\";\r\nimport PenPicsPageWidget from \"./widgets/PenPics/PenPicsPageWidget\";\r\nimport CareerStatisticsPageWidget from \"./widgets/CareerStatistics/CareerStatisticsPageWidget\";\r\nimport CareerRecordsPageWidget from \"./widgets/CareerRecords/CareerRecordsPageWidget\";\r\nimport AppConfigPageWidget from \"./widgets/AppConfig/AppConfigPageWidget\";\r\nimport AdminPageWidget from \"./widgets/Admin/AdminPageWidget\";\r\nimport TimelinePageWidget from \"./widgets/Timeline/TimelinePageWidget\";\r\n\r\n// EXPORTS\r\n\r\nconst pages = {\r\n PlayerStatsPage: PlayerStatsPageWidget,\r\n MatchStatsPage: MatchStatsPageWidget,\r\n MatchListsPage: MatchListsPageWidget,\r\n PenPicsPage: PenPicsPageWidget,\r\n CareerStatisticsPage: CareerStatisticsPageWidget,\r\n CareerRecordsPage: CareerRecordsPageWidget,\r\n AdminPage: AdminPageWidget,\r\n TimelinePage: TimelinePageWidget,\r\n};\r\n\r\n// webpack will compile this in/out\r\nif (WTCC_FLAG_APP_CONFIG_FEATURE) {\r\n pages.AppConfigPage = AppConfigPageWidget;\r\n}\r\n\r\nfunction main(env) {\r\n Object.keys(pages).forEach((page) => {\r\n const Component = pages[page];\r\n pages[page] = {\r\n start(props, dom) {\r\n const component = (\r\n \r\n \r\n \r\n );\r\n ReactDOM.render(component, dom);\r\n },\r\n };\r\n });\r\n\r\n window.wtccGlobal = {\r\n utils,\r\n pages,\r\n };\r\n\r\n // webpack will compile this in/out\r\n if (WTCC_FLAG_APP_CONFIG_FEATURE) {\r\n swAPI.registerServiceWorker();\r\n swAPI.registerBeforeInstallPrompt();\r\n }\r\n}\r\n\r\n// __APP_CONFIG__ from webpack\r\nmain(__APP_CONFIG__);\r\n\r\nReactDOM.render(, document.getElementById(\"social\"));\r\n"],"sourceRoot":""}