From bccc69f1bd20d35a8baf40a2ad7488a85ad0dd7f Mon Sep 17 00:00:00 2001 From: Steve23 Date: Wed, 2 Sep 2026 23:32:16 +0700 Subject: [PATCH 01/10] refactor(PortalStatistics): refactor PortalStatistics to Table2 and Widget3 --- lua/wikis/commons/PortalStatistics.lua | 640 ++++++++++++------------- 1 file changed, 309 insertions(+), 331 deletions(-) diff --git a/lua/wikis/commons/PortalStatistics.lua b/lua/wikis/commons/PortalStatistics.lua index ca70c4d6318..0ae2c604f79 100644 --- a/lua/wikis/commons/PortalStatistics.lua +++ b/lua/wikis/commons/PortalStatistics.lua @@ -28,6 +28,10 @@ local Tier = Lua.import('Module:Tier/Custom') local Opponent = Lua.import('Module:Opponent/Custom') local OpponentDisplay = Lua.import('Module:OpponentDisplay/Custom') +local Html = Lua.import('Module:Widget/Html') +local TableWidgets = Lua.import('Module:Widget/Table2/All') +local WidgetUtil = Lua.import('Module:Widget/Util') + local Condition = Lua.import('Module:Condition') local ConditionTree = Condition.Tree local ConditionNode = Condition.Node @@ -170,113 +174,87 @@ Section: Coverage Breakdown ---@param args table? ----@return Html +---@return Widget function StatisticsPortal.coverageStatistics(args) args = args or {} args.alignSide = Logic.readBool(args.alignSide) - local wrapper = mw.html.create('div') - local tournamentTable = wrapper:tag('div') - local matchTable = wrapper:tag('div') - - if args.alignSide then - tournamentTable - :addClass('template-box') - :css('padding-right', '2em') - matchTable - :addClass('template-box') - :css('padding-right', '2em') - end + local boxClasses = args.alignSide and {'template-box'} or nil + local boxCss = args.alignSide and {['padding-right'] = '2em'} or nil - tournamentTable:node(StatisticsPortal.coverageTournamentTable(args)) - matchTable:node(StatisticsPortal.coverageMatchTable(args)) - - return wrapper + return Html.Div{ + children = WidgetUtil.collect( + Html.Div{classes = boxClasses, css = boxCss, children = StatisticsPortal.coverageTournamentTable(args)}, + Html.Div{classes = boxClasses, css = boxCss, children = StatisticsPortal.coverageMatchTable(args)} + ) + } end ---@param args table? ----@return Html +---@return Widget function StatisticsPortal.coverageMatchTable(args) args = args or {} args.multiGame = Logic.readBool(args.multiGame) args.customGames = StatisticsPortal._isTableOrSplitOrDefault(args.customGames, GAMES) - local matchTable = mw.html.create('table') - :addClass('wikitable wikitable-striped') - - matchTable:tag('caption') - :wikitext(args.matchTableTitle or (Logic.readBool(args.alignSide) and '
' or '')) - :css('text-align', 'center') - - local matchHeader = matchTable:tag('tr') - - if Logic.readBool(args.multiGame) then - matchHeader:tag('th') - :wikitext('Game') - end - - matchHeader - :tag('th'):wikitext(args.matchesTitle or 'Matches'):done() - :tag('th'):wikitext(args.gamesTitle or 'Games') - - if Logic.readBool(args.multiGame) then - for _, game in Table.iter.spairs(args.customGames) do - matchTable:node(StatisticsPortal._coverageMatchTableRow(args, { - game = game, - year = args.year - } - ) - ) - end - end - - matchTable:node(StatisticsPortal._coverageMatchTableRow(args, { - year = args.year - } + local TableHeader = TableWidgets.Row{ + children = WidgetUtil.collect( + args.multiGame and TableWidgets.CellHeader{children = 'Game'} or nil, + TableWidgets.CellHeader{children = args.matchesTitle or 'Matches'}, + TableWidgets.CellHeader{children = args.gamesTitle or 'Games'} ) + } + + local TableRow = WidgetUtil.collect( + args.multiGame and Array.map(args.customGames, function(game) + return StatisticsPortal._coverageMatchTableRow(args, {game = game, year = args.year}) + end) or nil, + StatisticsPortal._coverageMatchTableRow(args, {year = args.year}) ) - return matchTable + return TableWidgets.Table{ + caption = args.matchTableTitle or (args.alignSide and Html.Br{} or ''), + children = WidgetUtil.collect( + TableWidgets.TableHeader{children = TableHeader}, + TableWidgets.TableBody{children = TableRow} + ) + } end ---@param args table ---@param parameters table ----@return Html +---@return Widget function StatisticsPortal._coverageMatchTableRow(args, parameters) - local resultsRow = mw.html.create('tr') - local tagType = (Logic.readBool(args.multiGame) and not parameters.game) and 'th' or 'td' - - if Logic.readBool(args.multiGame) then - resultsRow:node(StatisticsPortal._returnGameCell(args, parameters, tagType)) - end + local isHeaderRow = Logic.readBool(args.multiGame) and not parameters.game + local CellComponent = isHeaderRow and TableWidgets.CellHeader or TableWidgets.Cell local matchCountValue local gameCountValue - if Info.config.match2.status == 2 then - matchCountValue = Count.match2game(parameters) - gameCountValue = Count.match2(parameters) - else + if Info.config.match2.status == 0 then + ---@diagnostic disable-next-line: deprecated matchCountValue = Count.matches(parameters) + ---@diagnostic disable-next-line: deprecated gameCountValue = Count.games(parameters) + else + matchCountValue = Count.match2game(parameters) + gameCountValue = Count.match2(parameters) end - resultsRow:tag(tagType) - :wikitext(LANG:formatNum(matchCountValue)) - :css('text-align', 'right') - - resultsRow:tag(tagType) - :wikitext(LANG:formatNum(gameCountValue)) - :css('text-align', 'right') - - return resultsRow + return TableWidgets.Row{ + children = WidgetUtil.collect( + Logic.readBool(args.multiGame) and StatisticsPortal._returnGameCell(args, parameters, isHeaderRow) or nil, + CellComponent{align = 'right', children = LANG:formatNum(matchCountValue)}, + CellComponent{align = 'right', children = LANG:formatNum(gameCountValue)} + ) + } end ---@param args table? ----@return Html +---@return Widget function StatisticsPortal.coverageTournamentTable(args) args = args or {} args.multiGame = Logic.readBool(args.multiGame) @@ -287,51 +265,45 @@ function StatisticsPortal.coverageTournamentTable(args) args.showTierTypes = StatisticsPortal._isTableOrSplitOrDefault(args.showTierTypes, {}) args.filterByStatus = Logic.readBool(args.filterByStatus) or false - local tournamentTable = mw.html.create('table') - :addClass('wikitable wikitable-striped') - - tournamentTable:tag('caption') - :wikitext(args.tournamentTableTitle or 'Tournaments Covered') - :css('text-align', 'center') - - tournamentTable:node(StatisticsPortal._coverageTournamentTableHeader(args)) - - if Logic.readBool(args.multiGame) then - for _, game in Table.iter.spairs(args.customGames) do - tournamentTable:node(StatisticsPortal._coverageTournamentTableRow(args, { - game = game, - year = args.year, - filterByStatus = args.filterByStatus - } - ) - ) - end - end - - tournamentTable:node(StatisticsPortal._coverageTournamentTableRow(args, { + local TableRow = WidgetUtil.collect( + args.multiGame and Array.map(args.customGames, function(game) + return StatisticsPortal._coverageTournamentTableRow(args, { + game = game, year = args.year, filterByStatus = args.filterByStatus - } - ) + }) + end) or nil, + StatisticsPortal._coverageTournamentTableRow(args, { + year = args.year, + filterByStatus = args.filterByStatus + }) ) - return tournamentTable + return TableWidgets.Table{ + caption = args.tournamentTableTitle or 'Tournaments Covered', + children = WidgetUtil.collect( + TableWidgets.TableHeader{children = StatisticsPortal._coverageTournamentTableHeader(args)}, + TableWidgets.TableBody{children = TableRow} + ) + } end ---@param args table ---@param parameters table ----@return Html +---@return Widget function StatisticsPortal._coverageTournamentTableRow(args, parameters) - local resultsRow = mw.html.create('tr') - local tagType = (Logic.readBool(args.multiGame) and not parameters.game) and 'th' or 'td' + local isHeaderRow = Logic.readBool(args.multiGame) and not parameters.game + local CellComponent = isHeaderRow and TableWidgets.CellHeader or TableWidgets.Cell local runningTally = 0 - if Logic.readBool(args.multiGame) then - resultsRow:node(StatisticsPortal._returnGameCell(args, parameters, tagType)) - end + local gameCell = Logic.readBool(args.multiGame) + and StatisticsPortal._returnGameCell(args, parameters, isHeaderRow) + or nil local countData = Count.tournamentsByTier(parameters) + + local tierCells = {} for rowIndex, rowValue in Tier.iterate('tiers') do if String.isNotEmpty(rowValue.value) and tonumber(rowValue.value) > 0 then if not args.customTiers or Array.any(Array.extractValues(args.customTiers), function(value) @@ -346,13 +318,12 @@ function StatisticsPortal._coverageTournamentTableRow(args, parameters) end ) runningTally = runningTally + tournamentCount - resultsRow:tag(tagType) - :wikitext(LANG:formatNum(tournamentCount)) - :css('text-align', 'right') + table.insert(tierCells, CellComponent{align = 'right', children = LANG:formatNum(tournamentCount)}) end end end + local tierTypeCells = {} if #args.showTierTypes then for _, tierTypeValue in ipairs(args.showTierTypes) do local _, tierTypeData = Tier.raw(nil, tierTypeValue) @@ -366,13 +337,12 @@ function StatisticsPortal._coverageTournamentTableRow(args, parameters) Operator.add, 0 ) runningTally = runningTally + count - resultsRow:tag(tagType) - :wikitext(LANG:formatNum(count)) - :css('text-align', 'right') + table.insert(tierTypeCells, CellComponent{align = 'right', children = LANG:formatNum(count)}) end end end + local otherCell if String.isNotEmpty(args.showOther) then local countOther = Array.reduce( Array.flatten(Array.map(Array.extractValues(countData), @@ -381,60 +351,61 @@ function StatisticsPortal._coverageTournamentTableRow(args, parameters) end )), Operator.add, 0) --[[@as number]] runningTally = runningTally + countOther - resultsRow:tag(tagType) - :wikitext(LANG:formatNum(countOther)) - :css('text-align', 'right') + otherCell = CellComponent{align = 'right', children = LANG:formatNum(countOther)} end - resultsRow:tag(tagType) - :wikitext(LANG:formatNum(runningTally)) - :css('text-align', 'right') - - return resultsRow:allDone() + return TableWidgets.Row{ + children = WidgetUtil.collect( + gameCell, + tierCells, + tierTypeCells, + otherCell, + CellComponent{align = 'right', children = LANG:formatNum(runningTally)} + ) + } end ---@param args table ----@return Html +---@return Widget function StatisticsPortal._coverageTournamentTableHeader(args) - local headerRow = mw.html.create('tr') - - if Logic.readBool(args.multiGame) then - headerRow:tag('th') - :wikitext('Game') - end - + local tierHeaderCells = {} for headerIndex, headerValue in Tier.iterate('tiers') do if String.isNotEmpty(headerValue.value) and tonumber(headerValue.value) > 0 then if not args.customTiers or Array.any(Array.extractValues(args.customTiers), function(value) return value == headerIndex end) then - headerRow:tag('th') - :wikitext(Tier.displaySingle(headerValue, {link = true})) + table.insert(tierHeaderCells, TableWidgets.CellHeader{ + children = Tier.displaySingle(headerValue, {link = true}) + }) end end end + local tierTypeHeaderCells = {} if #args.showTierTypes then for _, tierTypeValue in ipairs(args.showTierTypes) do local _, tierTypeData = Tier.raw(nil, tierTypeValue) if tierTypeData then - headerRow:tag('th') - :wikitext(Tier.displaySingle(tierTypeData, {link = true, short = true})) + table.insert(tierTypeHeaderCells, TableWidgets.CellHeader{ + children = Tier.displaySingle(tierTypeData, {link = true, short = true}) + }) end end end - if String.isNotEmpty(args.showOther) then - headerRow:tag('th') - :wikitext(Abbreviation.make{text = 'Other', - title = 'Includes otherwise unlisted tournaments (e.g. with tiertypes, misc.)'}) - end - - headerRow:tag('th') - :wikitext('Total') - - return headerRow + return TableWidgets.Row{ + children = WidgetUtil.collect( + Logic.readBool(args.multiGame) and TableWidgets.CellHeader{children = 'Game'} or nil, + tierHeaderCells, + tierTypeHeaderCells, + String.isNotEmpty(args.showOther) and TableWidgets.CellHeader{ + children = Abbreviation.make{text = 'Other', + title = 'Includes otherwise unlisted tournaments (e.g. with tiertypes, misc.)'} + } or nil, + TableWidgets.CellHeader{children = 'Total'} + ) + } end --[[ @@ -443,7 +414,7 @@ Section: Prizepool Breakdown ---@param args table? ----@return Html +---@return Widget function StatisticsPortal.prizepoolBreakdown(args) args = args or {} args.showAverage = Logic.readBool(args.showAverage) @@ -452,21 +423,21 @@ function StatisticsPortal.prizepoolBreakdown(args) local yearTable, defaultYearTable = StatisticsPortal._returnCustomYears(args) local rowLimit = Math.round(((Logic.readBool(args.showAverage) and 1 or 0) + 1 + Table.size(yearTable)) / 2) - local wrapper = mw.html.create('div') + local tables = {} + local headerCells = {} + local resultCells = {} - local prizepoolTable = wrapper:tag('div') - :addClass('table-responsive') - :tag('table') - :addClass('wikitable wikitable-striped') - :css('width', '100%') - :css('text-align', 'center') - - prizepoolTable:tag('caption') - :wikitext('Prize Money Awarded') - :css('text-align', 'center') - - local headerRow = prizepoolTable:tag('tr') - local resultsRow = prizepoolTable:tag('tr') + local function finalizeTable() + table.insert(tables, TableWidgets.Table{ + caption = 'Prize Money Awarded', + children = WidgetUtil.collect( + TableWidgets.TableHeader{children = TableWidgets.Row{children = headerCells}}, + TableWidgets.TableBody{children = TableWidgets.Row{children = resultCells}} + ) + }) + headerCells = {} + resultCells = {} + end local prizepoolSum = 0 local prevYear = args.startYear @@ -496,10 +467,12 @@ function StatisticsPortal.prizepoolBreakdown(args) prizepoolSum = prizepoolSum + (tonumber(data[1].sum_prizepool) or 0) if Array.any(Array.extractValues(yearTable), function(value) return value == yearValue end) then - headerRow:tag('th') - :wikitext(StatisticsPortal._returnCustomYearText(prevYear, yearValue)) - resultsRow:tag('td') - :wikitext(Currency.display(US_DOLLAR, prizepoolSum or 0, CURRENCY_FORMAT_OPTIONS)) + table.insert(headerCells, TableWidgets.CellHeader{ + children = StatisticsPortal._returnCustomYearText(prevYear, yearValue) + }) + table.insert(resultCells, TableWidgets.Cell{ + children = Currency.display(US_DOLLAR, prizepoolSum or 0, CURRENCY_FORMAT_OPTIONS) + }) prizepoolSum = 0 prevYear = yearValue + 1 colIndex = colIndex + 1 @@ -507,17 +480,7 @@ function StatisticsPortal.prizepoolBreakdown(args) if colIndex > rowLimit and rowLimit > 8 then colIndex = 1 - wrapper:tag('span'):wikitext('
') - - prizepoolTable = wrapper:tag('div') - :addClass('table-responsive') - :tag('table') - :addClass('wikitable wikitable-striped') - :css('width', '100%') - :css('text-align', 'center') - - headerRow = prizepoolTable:tag('tr') - resultsRow = prizepoolTable:tag('tr') + finalizeTable() end end @@ -541,28 +504,39 @@ function StatisticsPortal.prizepoolBreakdown(args) } ) local totalPrizePool = tonumber(totalData[1].sum_prizepool) or 0 - headerRow:tag('th') - :wikitext('Total') - resultsRow:tag('td') - :wikitext(Currency.display(US_DOLLAR, totalPrizePool, CURRENCY_FORMAT_OPTIONS)) - :css('font-weight', 'bold') + + table.insert(headerCells, TableWidgets.CellHeader{children = 'Total'}) + table.insert(resultCells, TableWidgets.Cell{ + children = Html.B{children = Currency.display(US_DOLLAR, totalPrizePool, CURRENCY_FORMAT_OPTIONS)} + }) if Logic.readBool(args.showAverage) then - headerRow:tag('th') - :tag('abbr') - :attr('title', 'Average Prizepool per Tournament') - :wikitext('AVG PPT') - resultsRow:tag('td') - :wikitext(Currency.display(US_DOLLAR, totalPrizePool / (Count.tournaments() or 1), CURRENCY_FORMAT_OPTIONS)) - :css('font-weight', 'bold') + table.insert(headerCells, TableWidgets.CellHeader{ + children = Html.Abbr{title = 'Average Prizepool per Tournament', children = 'AVG PPT'} + }) + table.insert(resultCells, TableWidgets.Cell{ + children = Html.B{children = Currency.display( + US_DOLLAR, totalPrizePool / (Count.tournaments() or 1), CURRENCY_FORMAT_OPTIONS + )} + }) + end + + finalizeTable() + + local wrapperChildren = {} + for index, tableWidget in ipairs(tables) do + if index > 1 then + table.insert(wrapperChildren, Html.Br{}) + end + table.insert(wrapperChildren, tableWidget) end - return wrapper + return Html.Div{children = wrapperChildren} end ---@param args table? ----@return Html +---@return VNode function StatisticsPortal.pieChartBreakdown(args) args = args or {} args.height = args.height or 300 @@ -572,58 +546,68 @@ function StatisticsPortal.pieChartBreakdown(args) args.multiGame = Logic.readBool(args.multiGame) args.multiMode = Logic.readBool(args.multiMode) - local wrapper = mw.html.create('div') - - wrapper:node(mw.html.create('div') - :addClass('template-box') - :css('padding-right', '5em') - :css('font-size', '85%') - :css('text-align', 'center') - :wikitext('Tournament Type') - :node(StatisticsPortal._getPieChartData( - args, 'type', 'Mixed', TYPES - )) - ) + local WrapperChildren = { + Html.Div{ + classes = {'template-box'}, + css = { + ['padding-right'] = '5em', + ['font-size'] = '85%', + ['text-align'] = 'center', + }, + children = { + 'Tournament Type', + StatisticsPortal._getPieChartData( + args, 'type', 'Mixed', TYPES + ), + }, + }, + } if args.multiGame then local games = Array.map(StatisticsPortal._isTableOrSplitOrDefault(args.customGames, GAMES), function(game) return Game.toIdentifier{game = game, useDefault = false} or game end) - wrapper:node(mw.html.create('div') - :addClass('template-box') - :css('padding-right', '5em') - :css('font-size', '85%') - :css('text-align', 'center') - :wikitext('Game Breakdown') - :node(StatisticsPortal._getPieChartData( - args, 'game', 'Other', games - )) - ) + table.insert(WrapperChildren, Html.Div{ + classes = {'template-box'}, + css = { + ['padding-right'] = '5em', + ['font-size'] = '85%', + ['text-align'] = 'center', + }, + children = { + 'Game Breakdown', + StatisticsPortal._getPieChartData(args, 'game', 'Other', games), + }, + }) end if args.multiMode then - wrapper:node(mw.html.create('div') - :addClass('template-box') - :css('padding-right', '5em') - :css('font-size', '85%') - :css('text-align', 'center') - :wikitext('Mode Breakdown') - :node(StatisticsPortal._getPieChartData( - args, 'mode', 'Other', StatisticsPortal._isTableOrSplitOrDefault(args.customModes, {'Team'}) - )) - ) + table.insert(WrapperChildren, Html.Div{ + classes = {'template-box'}, + css = { + ['padding-right'] = '5em', + ['font-size'] = '85%', + ['text-align'] = 'center', + }, + children = { + 'Mode Breakdown', + StatisticsPortal._getPieChartData( + args, 'mode', 'Other', StatisticsPortal._isTableOrSplitOrDefault(args.customModes, {'Team'}) + ), + }, + }) end - if Logic.readBool(args.hideKey) then - return wrapper + if args.hideKey then + return Html.Div{children = WrapperChildren} end - if Logic.readBool(args.detailedKey) then - wrapper:node(mw.html.create('div') - :addClass('template-box') - :node(StatisticsPortal.prizepoolBreakdown(args)) - ) - return wrapper + if args.detailedKey then + table.insert(WrapperChildren, Html.Div{ + classes = {'template-box'}, + children = StatisticsPortal.prizepoolBreakdown(args), + }) + return Html.Div{children = WrapperChildren} end local conditions = StatisticsPortal._returnBaseConditions() @@ -652,32 +636,33 @@ function StatisticsPortal.pieChartBreakdown(args) order = 'sortdate desc', }) - local summaryTable = mw.html.create('table') - :addClass('wikitable') - :css('text-align', 'center') - :css('font-weight', 'bold') - - summaryTable:tag('tr') - :tag('th'):wikitext('Total prize money awarded') - - summaryTable:tag('tr') - :tag('td') - :wikitext(Currency.display(US_DOLLAR, data[1].sum_prizepool or 0, CURRENCY_FORMAT_OPTIONS)) - :attr('data-sort-type', 'currency') - :css('font-weight', 'bold') + local summaryTable = TableWidgets.Table{ + children = WidgetUtil.collect( + TableWidgets.TableHeader{children = TableWidgets.Row{ + children = TableWidgets.CellHeader{children = 'Total prize money awarded'} + }}, + TableWidgets.TableBody{children = TableWidgets.Row{ + children = TableWidgets.Cell{ + attributes = {['data-sort-type'] = 'currency'}, + children = Html.B{children = Currency.display( + US_DOLLAR, data[1].sum_prizepool or 0, CURRENCY_FORMAT_OPTIONS + )} + } + }} + ) + } - wrapper:node(mw.html.create('div') - :addClass('template-box') - :css('padding-right', '1em') - :node(summaryTable) - ) + table.insert(WrapperChildren, Html.Div{ + classes = {'template-box'}, + css = {['padding-right'] = '1em'}, + children = summaryTable, + }) - return wrapper + return Html.Div{children = WrapperChildren} end - ---@param args table? ----@return Html +---@return Widget function StatisticsPortal.earningsTable(args) args = args or {} args.limit = tonumber(args.limit) or 20 @@ -717,20 +702,13 @@ function StatisticsPortal.earningsTable(args) local opponentPlacements = StatisticsPortal._cacheOpponentPlacementData(args) - local tbl = mw.html.create('table') - :addClass('wikitable wikitable-striped wikitable-bordered sortable') - :css('margin-left', '0px') - :css('margin-right', 'auto') - :css('width', '100%') - - tbl:node(StatisticsPortal._earningsTableHeader(args)) - + local TableRow = {} for opponentIndex, opponent in ipairs(opponentData) do - local opponentDisplay local earnings = earningsFunction(opponent) if opponentIndex > args.limit or earnings < args.minimumEarnings then break end + local opponentDisplay if args.opponentType == Opponent.team then opponentDisplay = OpponentDisplay.BlockOpponent{ opponent = Opponent.readOpponentArgs{template = opponent.template, type = Opponent.team}, @@ -742,10 +720,18 @@ function StatisticsPortal.earningsTable(args) } end local placements = opponentPlacements[opponent.pagename] or {} - tbl:node(StatisticsPortal._earningsTableRow(args, placements, earnings, opponentIndex, opponentDisplay)) + table.insert(TableRow, + StatisticsPortal._earningsTableRow(args, placements, earnings, opponentIndex, opponentDisplay)) end - return mw.html.create('div'):addClass('table-responsive'):node(tbl) + return TableWidgets.Table{ + sortable = true, + css = {['margin-left'] = '0px', ['margin-right'] = 'auto', width = '100%'}, + children = WidgetUtil.collect( + TableWidgets.TableHeader{children = StatisticsPortal._earningsTableHeader(args)}, + TableWidgets.TableBody{children = TableRow} + ) + } end @@ -755,7 +741,7 @@ Section: Player Age Table Breakdown ---@param args table? ----@return Html +---@return Widget function StatisticsPortal.playerAgeTable(args) args = args or {} args.earnings = tonumber(args.earnings) or 500 @@ -790,32 +776,38 @@ function StatisticsPortal.playerAgeTable(args) local playerData = StatisticsPortal._getPlayers(args.limit, conditions:toString(), args.order) - local tbl = mw.html.create('table') - :addClass('wikitable wikitable-striped sortable') - :css('margin-left', '0px') - :css('margin-right', 'auto') - - tbl:tag('tr') - :tag('th'):wikitext('ID'):addClass('unsortable'):done() - :tag('th'):wikitext('Age') + local TableHeader = TableWidgets.Row{ + children = WidgetUtil.collect( + TableWidgets.CellHeader{unsortable = true, children = 'ID'}, + TableWidgets.CellHeader{children = 'Age'} + ) + } - for _, player in ipairs(playerData) do + local TableRow = Array.map(playerData, function(player) local birthdate = DateExt.readTimestamp(player.birthdate) --[[@as integer]] local age = os.date('*t', os.difftime(TIMESTAMP, birthdate)) local yearAge = age.year - 1970 local dayAge = age.yday - 1 - tbl:tag('tr') - :tag('td') - :node(OpponentDisplay.BlockOpponent{ + return TableWidgets.Row{ + children = WidgetUtil.collect( + TableWidgets.Cell{children = OpponentDisplay.BlockOpponent{ opponent = StatisticsPortal._toOpponent(player), showPlayerTeam = true, - }):done() - :tag('td') - :wikitext(yearAge .. ' years, ' .. dayAge .. ' days') - end + }}, + TableWidgets.Cell{children = yearAge .. ' years, ' .. dayAge .. ' days'} + ) + } + end) - return mw.html.create('div'):addClass('table-responsive'):node(tbl) + return TableWidgets.Table{ + sortable = true, + css = {['margin-left'] = '0px', ['margin-right'] = 'auto'}, + children = WidgetUtil.collect( + TableWidgets.TableHeader{children = TableHeader}, + TableWidgets.TableBody{children = TableRow} + ) + } end @@ -1117,42 +1109,34 @@ Section: Display Functions ---@param args table ---@param parameters table ----@param tagType string ----@return Html -function StatisticsPortal._returnGameCell(args, parameters, tagType) - local gameCell = mw.html.create(tagType) - if Logic.readBool(args.multiGame) and not parameters.game then - gameCell:wikitext('Total') - elseif Logic.readBool(args.multiGame) then - gameCell:wikitext(parameters.game) - end - return gameCell +---@param isHeaderRow boolean +---@return Widget +function StatisticsPortal._returnGameCell(args, parameters, isHeaderRow) + local CellComponent = isHeaderRow and TableWidgets.CellHeader or TableWidgets.Cell + local text = (Logic.readBool(args.multiGame) and not parameters.game) and 'Total' or parameters.game + return CellComponent{children = text} end ---@param args table ----@return Html +---@return Widget function StatisticsPortal._earningsTableHeader(args) local columnText = args.opponentType == Opponent.team and 'Organization' or 'Player' - local row = mw.html.create('tr') - :tag('th'):wikitext('#'):addClass('unsortable'):done() - :tag('th'):wikitext(columnText):addClass('unsortable'):done() - :tag('th'):wikitext('Achievements'):css('width', '200px'):addClass('unsortable'):done() - :tag('th'):node(Medals.display{medal = 1}):done() - :tag('th'):node(Medals.display{medal = 2}):done() - :tag('th'):node(Medals.display{medal = 3}):done() - - if Logic.readBool(args.displayShowMatches) then - row:tag('th'):wikitext('Show
Match') - end - - row:tag('th') - :tag('abbr') - :attr('title', 'Total earnings across all games') - :wikitext('Earnings') - - return row + return TableWidgets.Row{ + children = WidgetUtil.collect( + TableWidgets.CellHeader{unsortable = true, children = '#'}, + TableWidgets.CellHeader{unsortable = true, children = columnText}, + TableWidgets.CellHeader{unsortable = true, width = '200px', children = 'Achievements'}, + TableWidgets.CellHeader{children = Medals.display{medal = 1}}, + TableWidgets.CellHeader{children = Medals.display{medal = 2}}, + TableWidgets.CellHeader{children = Medals.display{medal = 3}}, + Logic.readBool(args.displayShowMatches) and TableWidgets.CellHeader{children = 'Show
Match'} or nil, + TableWidgets.CellHeader{ + children = Html.Abbr{title = 'Total earnings across all games', children = 'Earnings'} + } + ) + } end @@ -1160,28 +1144,22 @@ end ---@param placements table ---@param earnings number ---@param opponentIndex number ----@param opponentDisplay Widget|Html ----@return Html +---@param opponentDisplay Renderable +---@return Widget function StatisticsPortal._earningsTableRow(args, placements, earnings, opponentIndex, opponentDisplay) - local row = mw.html.create('tr') - :css('line-height', '25px') - :css('text-align', 'center') - :tag('td'):wikitext(opponentIndex):done() - :tag('td'):css('text-align', 'left'):node(opponentDisplay):done() - :tag('td'):wikitext(StatisticsPortal._achievementsDisplay(placements.sWinData or {})):done() - :tag('td'):wikitext(placements['1'] or '0'):done() - :tag('td'):wikitext(placements['2'] or '0'):done() - :tag('td'):wikitext(placements['3'] or '0'):done() - - if Logic.readBool(args.displayShowMatches) then - row:tag('td'):wikitext(placements.showWins or 0) - end - - row:tag('td') - :css('text-align', 'right') - :wikitext(Currency.display(US_DOLLAR, earnings, CURRENCY_FORMAT_OPTIONS)) - - return row + return TableWidgets.Row{ + css = {['line-height'] = '25px', ['text-align'] = 'center'}, + children = WidgetUtil.collect( + TableWidgets.Cell{children = opponentIndex}, + TableWidgets.Cell{align = 'left', children = opponentDisplay}, + TableWidgets.Cell{children = StatisticsPortal._achievementsDisplay(placements.sWinData or {})}, + TableWidgets.Cell{children = placements['1'] or '0'}, + TableWidgets.Cell{children = placements['2'] or '0'}, + TableWidgets.Cell{children = placements['3'] or '0'}, + Logic.readBool(args.displayShowMatches) and TableWidgets.Cell{children = placements.showWins or 0} or nil, + TableWidgets.Cell{align = 'right', children = Currency.display(US_DOLLAR, earnings, CURRENCY_FORMAT_OPTIONS)} + ) + } end @@ -1212,9 +1190,9 @@ end ---@param chartData table ---@return Html function StatisticsPortal._drawChart(config, chartData) - return mw.html.create('div') - :addClass('table-responsive') - :node(mw.ext.Charts.chart({ + return Html.Div{ + class = 'table-responsive', + children = mw.ext.Charts.chart({ grid = { left = '15%', right = '12%', @@ -1234,7 +1212,7 @@ function StatisticsPortal._drawChart(config, chartData) series = chartData, labels = config.labels, }) - ) + } end @@ -1242,16 +1220,16 @@ end ---@param chartData table ---@return Html function StatisticsPortal._drawPieChart(args, chartData) - return mw.html.create('div') - :addClass('table-responsive') - :node(mw.ext.Charts.piechart{ + return Html.Div{ + class = 'table-responsive', + children = mw.ext.Charts.piechart{ size = { height = args.height, width = args.width }, data = chartData } - ) + } end From cb1c804ec7e32fa55e5d70b08d09fd05837bded0 Mon Sep 17 00:00:00 2001 From: steve020607 <172269042+steve020607@users.noreply.github.com> Date: Wed, 2 Sep 2026 16:37:30 +0000 Subject: [PATCH 02/10] chore: update visual snapshots --- lua/spec/snapshots/dota2 rankings.png | Bin 80930 -> 80920 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lua/spec/snapshots/dota2 rankings.png b/lua/spec/snapshots/dota2 rankings.png index ffc28bace40482ae2445fca4bbbc8484cc6c5018..438dbaeaf9dac59c386bb24bcdf820f753908319 100644 GIT binary patch delta 33448 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 delta 33416 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 From fd31176f303f6485c3c4aefd39fc9b4823c8b37e Mon Sep 17 00:00:00 2001 From: Steve23 Date: Thu, 3 Sep 2026 17:37:41 +0700 Subject: [PATCH 03/10] apply some suggestion --- lua/wikis/commons/PortalStatistics.lua | 32 +++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/lua/wikis/commons/PortalStatistics.lua b/lua/wikis/commons/PortalStatistics.lua index 0ae2c604f79..6c1240c0fd8 100644 --- a/lua/wikis/commons/PortalStatistics.lua +++ b/lua/wikis/commons/PortalStatistics.lua @@ -183,10 +183,10 @@ function StatisticsPortal.coverageStatistics(args) local boxCss = args.alignSide and {['padding-right'] = '2em'} or nil return Html.Div{ - children = WidgetUtil.collect( + children = { Html.Div{classes = boxClasses, css = boxCss, children = StatisticsPortal.coverageTournamentTable(args)}, Html.Div{classes = boxClasses, css = boxCss, children = StatisticsPortal.coverageMatchTable(args)} - ) + } } end @@ -198,7 +198,7 @@ function StatisticsPortal.coverageMatchTable(args) args.multiGame = Logic.readBool(args.multiGame) args.customGames = StatisticsPortal._isTableOrSplitOrDefault(args.customGames, GAMES) - local TableHeader = TableWidgets.Row{ + local tableHeader = TableWidgets.Row{ children = WidgetUtil.collect( args.multiGame and TableWidgets.CellHeader{children = 'Game'} or nil, TableWidgets.CellHeader{children = args.matchesTitle or 'Matches'}, @@ -206,7 +206,7 @@ function StatisticsPortal.coverageMatchTable(args) ) } - local TableRow = WidgetUtil.collect( + local tableRow = WidgetUtil.collect( args.multiGame and Array.map(args.customGames, function(game) return StatisticsPortal._coverageMatchTableRow(args, {game = game, year = args.year}) end) or nil, @@ -216,8 +216,8 @@ function StatisticsPortal.coverageMatchTable(args) return TableWidgets.Table{ caption = args.matchTableTitle or (args.alignSide and Html.Br{} or ''), children = WidgetUtil.collect( - TableWidgets.TableHeader{children = TableHeader}, - TableWidgets.TableBody{children = TableRow} + TableWidgets.TableHeader{children = tableHeader}, + TableWidgets.TableBody{children = tableRow} ) } end @@ -265,7 +265,7 @@ function StatisticsPortal.coverageTournamentTable(args) args.showTierTypes = StatisticsPortal._isTableOrSplitOrDefault(args.showTierTypes, {}) args.filterByStatus = Logic.readBool(args.filterByStatus) or false - local TableRow = WidgetUtil.collect( + local tableRow = WidgetUtil.collect( args.multiGame and Array.map(args.customGames, function(game) return StatisticsPortal._coverageTournamentTableRow(args, { game = game, @@ -283,7 +283,7 @@ function StatisticsPortal.coverageTournamentTable(args) caption = args.tournamentTableTitle or 'Tournaments Covered', children = WidgetUtil.collect( TableWidgets.TableHeader{children = StatisticsPortal._coverageTournamentTableHeader(args)}, - TableWidgets.TableBody{children = TableRow} + TableWidgets.TableBody{children = tableRow} ) } end @@ -653,7 +653,7 @@ function StatisticsPortal.pieChartBreakdown(args) } table.insert(WrapperChildren, Html.Div{ - classes = {'template-box'}, + classes = {'template-box'}, css = {['padding-right'] = '1em'}, children = summaryTable, }) @@ -702,7 +702,7 @@ function StatisticsPortal.earningsTable(args) local opponentPlacements = StatisticsPortal._cacheOpponentPlacementData(args) - local TableRow = {} + local tableRow = {} for opponentIndex, opponent in ipairs(opponentData) do local earnings = earningsFunction(opponent) @@ -720,7 +720,7 @@ function StatisticsPortal.earningsTable(args) } end local placements = opponentPlacements[opponent.pagename] or {} - table.insert(TableRow, + table.insert(tableRow, StatisticsPortal._earningsTableRow(args, placements, earnings, opponentIndex, opponentDisplay)) end @@ -729,7 +729,7 @@ function StatisticsPortal.earningsTable(args) css = {['margin-left'] = '0px', ['margin-right'] = 'auto', width = '100%'}, children = WidgetUtil.collect( TableWidgets.TableHeader{children = StatisticsPortal._earningsTableHeader(args)}, - TableWidgets.TableBody{children = TableRow} + TableWidgets.TableBody{children = tableRow} ) } end @@ -776,14 +776,14 @@ function StatisticsPortal.playerAgeTable(args) local playerData = StatisticsPortal._getPlayers(args.limit, conditions:toString(), args.order) - local TableHeader = TableWidgets.Row{ + local tableHeader = TableWidgets.Row{ children = WidgetUtil.collect( TableWidgets.CellHeader{unsortable = true, children = 'ID'}, TableWidgets.CellHeader{children = 'Age'} ) } - local TableRow = Array.map(playerData, function(player) + local tableRow = Array.map(playerData, function(player) local birthdate = DateExt.readTimestamp(player.birthdate) --[[@as integer]] local age = os.date('*t', os.difftime(TIMESTAMP, birthdate)) local yearAge = age.year - 1970 @@ -804,8 +804,8 @@ function StatisticsPortal.playerAgeTable(args) sortable = true, css = {['margin-left'] = '0px', ['margin-right'] = 'auto'}, children = WidgetUtil.collect( - TableWidgets.TableHeader{children = TableHeader}, - TableWidgets.TableBody{children = TableRow} + TableWidgets.TableHeader{children = tableHeader}, + TableWidgets.TableBody{children = tableRow} ) } end From 31803d74659a7efc645f0bfad2f611718b96ccb0 Mon Sep 17 00:00:00 2001 From: Steve23 Date: Thu, 3 Sep 2026 17:51:46 +0700 Subject: [PATCH 04/10] update anno, fixed some of the indent for Array --- lua/wikis/commons/PortalStatistics.lua | 51 +++++++++++++------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/lua/wikis/commons/PortalStatistics.lua b/lua/wikis/commons/PortalStatistics.lua index 6c1240c0fd8..604c9dcd16f 100644 --- a/lua/wikis/commons/PortalStatistics.lua +++ b/lua/wikis/commons/PortalStatistics.lua @@ -174,7 +174,7 @@ Section: Coverage Breakdown ---@param args table? ----@return Widget +---@return VNode function StatisticsPortal.coverageStatistics(args) args = args or {} args.alignSide = Logic.readBool(args.alignSide) @@ -192,7 +192,7 @@ end ---@param args table? ----@return Widget +---@return Renderable function StatisticsPortal.coverageMatchTable(args) args = args or {} args.multiGame = Logic.readBool(args.multiGame) @@ -225,7 +225,7 @@ end ---@param args table ---@param parameters table ----@return Widget +---@return Renderable function StatisticsPortal._coverageMatchTableRow(args, parameters) local isHeaderRow = Logic.readBool(args.multiGame) and not parameters.game local CellComponent = isHeaderRow and TableWidgets.CellHeader or TableWidgets.Cell @@ -254,7 +254,7 @@ end ---@param args table? ----@return Widget +---@return Renderable function StatisticsPortal.coverageTournamentTable(args) args = args or {} args.multiGame = Logic.readBool(args.multiGame) @@ -291,7 +291,7 @@ end ---@param args table ---@param parameters table ----@return Widget +---@return Renderable function StatisticsPortal._coverageTournamentTableRow(args, parameters) local isHeaderRow = Logic.readBool(args.multiGame) and not parameters.game local CellComponent = isHeaderRow and TableWidgets.CellHeader or TableWidgets.Cell @@ -367,7 +367,7 @@ end ---@param args table ----@return Widget +---@return Renderable function StatisticsPortal._coverageTournamentTableHeader(args) local tierHeaderCells = {} for headerIndex, headerValue in Tier.iterate('tiers') do @@ -414,7 +414,7 @@ Section: Prizepool Breakdown ---@param args table? ----@return Widget +---@return Renderable function StatisticsPortal.prizepoolBreakdown(args) args = args or {} args.showAverage = Logic.readBool(args.showAverage) @@ -662,7 +662,7 @@ function StatisticsPortal.pieChartBreakdown(args) end ---@param args table? ----@return Widget +---@return Renderable function StatisticsPortal.earningsTable(args) args = args or {} args.limit = tonumber(args.limit) or 20 @@ -741,7 +741,7 @@ Section: Player Age Table Breakdown ---@param args table? ----@return Widget +---@return Renderable function StatisticsPortal.playerAgeTable(args) args = args or {} args.earnings = tonumber(args.earnings) or 500 @@ -998,10 +998,10 @@ function StatisticsPortal._cacheModeEarningsData(config) end local earningsData = Table.map(Array.range(config.startYear, CURRENT_YEAR), function(_, year) - return year, Table.map(config.customInputs, function(_, mode) - return mode, 0 - end) + return year, Table.map(config.customInputs, function(_, mode) + return mode, 0 end) + end) local processData = function(item) local year = tonumber(item.date:sub(1, 4)) @@ -1022,10 +1022,10 @@ function StatisticsPortal._cacheModeEarningsData(config) Lpdb.executeMassQuery('placement', queryParameters, processData) return Array.map(Array.extractValues(earningsData, Table.iter.spairs), function(value) - return Array.map(config.customInputs, function(key) - return value[key] - end) - end) + return Array.map(config.customInputs, function(key) + return value[key] + end) + end) end @@ -1119,7 +1119,7 @@ end ---@param args table ----@return Widget +---@return Renderable function StatisticsPortal._earningsTableHeader(args) local columnText = args.opponentType == Opponent.team and 'Organization' or 'Player' @@ -1145,7 +1145,7 @@ end ---@param earnings number ---@param opponentIndex number ---@param opponentDisplay Renderable ----@return Widget +---@return Renderable function StatisticsPortal._earningsTableRow(args, placements, earnings, opponentIndex, opponentDisplay) return TableWidgets.Row{ css = {['line-height'] = '25px', ['text-align'] = 'center'}, @@ -1338,9 +1338,9 @@ function StatisticsPortal._removeCategories(categoryNames, seriesData) local lastNotEmpty = 1 local isEmptyCategory = Array.map(Array.map(categoryNames, function(_, catIndex) - local truthValue = Array.all(Array.map(seriesData, function(_, index) - return seriesData[index][catIndex] end), function(value) - return value == 0 + local truthValue = Array.all(Array.map(seriesData, function(_, index) + return seriesData[index][catIndex] end), function(value) + return value == 0 end) if not truthValue then lastNotEmpty = catIndex @@ -1359,11 +1359,12 @@ function StatisticsPortal._removeCategories(categoryNames, seriesData) end) categoryNames = Array.filter(categoryNames, function(_, catIndex) - return Logic.readBool(isEmptyCategory[catIndex]) end) + return Logic.readBool(isEmptyCategory[catIndex]) end) seriesData = Array.map(seriesData, function(_, index) - return Array.filter(seriesData[index], function(_, catIndex) - return Logic.readBool(isEmptyCategory[catIndex]) end) + return Array.filter(seriesData[index], function(_, catIndex) + return Logic.readBool(isEmptyCategory[catIndex]) + end) end) return categoryNames, seriesData end @@ -1460,7 +1461,7 @@ function StatisticsPortal._returnCustomYears(args) local defaultYearTable = Array.range(args.startYear, CURRENT_YEAR) if String.isNotEmpty(args.customYears) then yearTable = Array.map( - StatisticsPortal._isTableOrSplitOrDefault(args.customYears), + StatisticsPortal._isTableOrSplitOrDefault(args.customYears), function(tier) return tonumber(tier) end From 01f25a60a6f07d4807897c997e6b0eb4a951fbbd Mon Sep 17 00:00:00 2001 From: steve020607 <172269042+steve020607@users.noreply.github.com> Date: Thu, 3 Sep 2026 10:55:20 +0000 Subject: [PATCH 05/10] chore: update visual snapshots --- lua/spec/snapshots/dota2 rankings.png | Bin 80920 -> 80930 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lua/spec/snapshots/dota2 rankings.png b/lua/spec/snapshots/dota2 rankings.png index 438dbaeaf9dac59c386bb24bcdf820f753908319..ffc28bace40482ae2445fca4bbbc8484cc6c5018 100644 GIT binary patch delta 33416 zcmbrlbyOTtxAqAkjs>>>Aq01KNN^{(OK^9Wt|YhzZ2|#;25%f15AIGk?(WuDBSYSM z@2u~eHM7>tn$!REs%oiIwQJXYp8Y#1S5LFAo|dyz0e{4X3pn-+8*TUVnGAyv-`5AS;|QWgicPUv z9l|OUHcMviER)5)pUO;PEWpoJJQ}&G{=GVyHt&9t{1HC;O06?l7tL!#+?pm?8r}Ec z_QP@l(4u5y+a21c6>0oI9&Xev+lqp6yiA5bO(9I1latf3QECj;AbXOC;BiQgN)mND ziUDo^$(&9^yg7L2iUW-EKzueTH|kh-<3}n>{$=;41Ih#n8cPLY#UE7eVtibmK>rX& zUc=hQBia+>MT&`Aboajs$j#{JF~Gf2%-TnR_dANQ9yh79OC>j2HSro))9E_%?YTBt z8kxKH4jb||v%b06h1K_se>0CK7JRkM2Zt;$X?Qco&M=I$sI(`<$9hQxZ3WX9^$CVe z9V8rm)YIafp(pw39}>$O>HBK62x0WdB=^wF%)evr(a^H;EA!=cSf*;X%;)xY=fbA} zj}IfcPE7W}+kro!5T66Fhx>mljS-oC&fWag^L^TA(APwg5+Nv!_!$v%LCS5Ea3qS=7e5zYX-u%sb9oW`ydLXB zk1h*>#H3(oBgDhT)ij>FePrw_chbgwA3d!?-Jff{sFKblqvSV9xcHTm*;Sk(tr;nh zs);|yPABPpa@#E;ORz4Iw3rE~XP@Q?zMdFU`wtA`S z#>-)x(K;VY_RvKy2{ zxniTgB}&0xvZM3Wjf~H1wlIr>aY^;V5|e&b2#|(;{Y+_PCT;XHU3He#y&9Lx@Df65 zt^Oq_u7*8RhDyAFHFS61A^w$hp|KKrDc>@Gq%|+hh04Yg%px zPUlO|WivTGiwDL_muLk!qbl>*zh`XT*UvZ^;*!v?wwp#7#RSAy3qU&=3sjMH`-EFt zZ{>6o<|q4z^=Gc_UyU1qc;jEQ)3_g>ybIto6#1Ux1&uex zH(SBOTm1P8=i*77b+DEZDu~PL@NL;0kHcyOYc&HalzkYe`|Thct-Q%9v=~qr zV%0)e@;U5>rz4bLX`^qVb!|Z8`l$y_KX+do3f?#^4O zeCujzlz#EYpX@P|8b-$0(xjnG?$7M7)?nS^ASZd9kswEDdgnUiZRHQ*<_X~a)>SVYIo>A>Ou-FiPB?!V!jDe)|!d{OE-`>os8m6imnB}pLXo^>=L zmRjUCmcePee{l93)Q}d`c2|;fVtiH$a`|+;-iU+67JhSaU2)qcQ$`@Bh`eixHBJ|< zEuNbiK8*;W);!o4DuRGWxf~*_GXi(^xVqGP+z~JhO2HL9mT3YJc+OFQV2cs>Di$|k z31~8XZF39WgR$*8rbf$+0KyL^nHi~yD9dFgX_2Pib6(@~zVh)S^f<~7T}-F~7rnlq z5cDi+_{36Ko!Mx9?FzPnJjCeg_SKFSbku|Z{UZhz(s++^`#Q(Bi&oz2Iu*mrr*!0} zrJ8}`CF{WW<)tvO2GLonkTLF#;n8?juib6d(L3!~wjg_mV7C80khi3Q?&WR&1bQ>I zReJRH9(k`WeNmCyC1pQ{n3vQzKdJkWLHMn$uvlFs>s8TD)9x1{vxx5V1- z8Y_^W{akBTK9BC!r73}*2DLJNPNbYCA)IXAwD(9Dy}c4$ytZ7=(o235@$VAMSByQp zHTf2ocYp}(D;mxRKJbJY#DnKvzMK~kyE~uQ7y$P~lkr&&61!qYlk<6Y2iaw68Qks) zG-v3sLZ|1oK-V0RE@Gaotv3tb&@w4@t`52pXRx2=Z=cR7yVYI8SJRDy*7q_EsM7tJ z+(e8<+H;)-?|m1(&~V%?@DhzZeS+fkZFl}}^Heid6YQ8-5V6&aVlsQ3U>|?N+$Ypk8>ebHrwzo{1qjF;Ovv{Y!TgiJ{ZOW$S~cmX<4<Mh2$pB#8S`k0T$cgUrOLvj|S zi7KlRTCbo=b_#vhT4`I{UHX|(gHyxUuEkgeg!xS;QC;3o02Hs_HglidM%-5{1LUsdEq<dL)o}j?BL*VaB$Gw-HnBX1%ttu2Qozb zk`=npVkDUfMKr-G97I-2%bBY!@npE!@-Zie^ieyNnk9+SD*UCYj^k z4Y5zy2Z%5yFN%|e{f_j+jCbnQfUGkeouP<>B}A@XttpZO!q+OM4!PGNo9R{t(&MkM zZyOA_GN0iM(TOmp92b~yQ$R#cI`Irt!3wov54Ub^Zd{kO#mKHmBB+j#$L=JDS@-QG zUn>V6U#siJYjAQXF#%slLxW&IKtS9!tHvswV#@lLQ&~ezr1osF8yjz3fV?C{h;K7` zg@g;DKgaCPD+-eBs#qo8bG=YN-Yqz)E$L!2Y~J&9-z}VrvS+Fl_?u0#yy#2~f2Gl`i)8{1MZ>`PkTDKcfNBPQA6L?-*qQIK#-SA&{%WxSd zs6p^vf5liWdJu%989_mLgCZySNkhi0C|>r%V`{+D-oM)|hSZk`xvX}Uak3G4QTpvy zEdK3|rCgdi+2jy@yo(IkT5eAjSkcl_Qhqd=4%UC zolO8!e5~RxyCxyS8&2rC)+iBAPQ|P94s0=dbMr|U>;eG?jQ?f5T)NR1a-oY*%CaR_ z=pLfpWsSmTJ+1{a3kshnt|wXo9z=+;pyDp@xkl5cm{oKHoBga?GEc4s{sp)yrFt3-Kx~6c**u_WS)r zDAai#Spz8bk&cTA6BrT|CE@`hhqgKd3dE>^`6FJG;BR$@a?4!Dq?yyWx^QvrL^>p7 z(J!V}=H?j+ilOt;Q_`2`h$|A+P_*s#LPYV@NwAcBgJ`ZvJHWM(imZX1{umjaO9IP;+bVwm=-$I9A^x zLZ|f8{&pLCBQpS)@Cl~e8)jsUK^_QGM~w7kSIplA_(7K{Tia>Y2Z9uO4MWGtqqksp zfRX^>61Fn3gM(7P^>`w*o$p#R3~uNapI@hzVjMZBR;kpxD1TdfGVVh zhG@d?|N4=UATeLW$AM5$J`&Bdd3|e{{A^TA$ijD1b9nz4_WZ0{V+=xqC4qm2e)&tN zTpS6t6ck?Vu-%*4MX)9?BxDjs4bQ#@w5tLRp)({(=WaB{tmj7c&fgT;jjcT}?VX%d4!^q)^4=uu&0T6+TjQyxy$UjD zS#&D7PgtbQY*p2&dVq??ei|3;;w#(@?Hdu<%Prkd=1CQf=3dtXjznsoffp$$2UjLH{h}hn*%d#h;Hg$s(DFigKjGKITM3KN&tN-t{nZX57vW)r8Dc z^F1YV^;mXkqugX_uh|zi^0h_u1HOGZBgcqybQBc971391CE0mWQVJhhEz{~N66l_F zsgV9gPSU|zJ#3_O_EIOXRelNp9IPI*^QuIUU%!4e7)6o64Gq$BrK&NrfXl`u5)u*@ zj;k>l$^-q`fYUxYDDj{Nr5H#U>;Yw+sP1Jm`5re38YDXM7x4^6DyeLcbNyYIXz)jh znbl=nP44_8*o=*)NrmjPeMs{6bBP#hJY2Bx+)uQDr17<0tjNJ1h)aRT$H96gh#w)> z@r`gOis+!}`ukn%22kv~B^KLszG{A2({#Hhx<)yYbVZpNwf7D6Fh$<8fx^>jojP?iee8}R5m!R0Baw7Z0(JP(&wWWojESV?wPt*#Px z#M$c_=`l5Z!_s_uX;Z*9r00B|iWRNrh}K-m9LJ8bnQjJehX@75z55RLt8Q?}XM7&P zSfB0`q@E@+9yy~^s(%E!jD9FZR(+?olA=)W#$+eEQ8|bpglgX+KXyUk@@4KnI3_Tp z4hJ?%elfIwsEav#Deli`e+i~(oJ;lUwtQ6TzJtw8h`KDAivp^~Q``Y})Kp@?@d_QK z|1_{4t2~PULl^5m5HBkil3qM3<7YhbNh7PF1;6RvEWNz+_S~33yL{3klbI% zEzg->UWM+(ccjyv225{$r_XeV7D1zkG#r96DZ!h;RsHy{u9QzmuEKVTOK>u7{)NXz zmYvw0Q`jQo;{*Qr^XE^cn_;ziB0RxH4&>8HC3oc#TQ4HB32Uxc`oxE_e}lZ)ABqd9M>l% zp}I`5)r(F8NUWCAW1Z`zgg}w{(vzg>Zlte-`37YvFm}^bzIF#vIc=3`u@|AcY94DD zpNj6%B@5JU7zS2APcDWd;gaTre2YVf(vq-%8AlgA@(Uj7o?1dD1N#vNsh$nKb5%YH zl~(~9QbK9aGN$%gLOVXrdw73oC)xcB(wwhip4V4+`Y^ zALDS$q71c>Hq1fXP^L+b!oPC6Z3}U*9J7T5*loGe^^Sm5*j_{FA=dbuA-lbu=Vy&( z_{EjL`_tmAt{5t+VWu^;iT)D2hB`{AuD|P?HHNai;s;&{l-THk*S9bhiV!awym}%0 zB>fH`yK;}g&Wp_$zJW1kq^+x!dXn!o+!wZxMyPPq-?S@7o_v!=wijE(2BI|C=$aG9 zL*GC{*!IPos@SEiY!IzUq()#{c1w>vZwyq-T|7DB_q@Q$SLNHF`@l^UEcbX>E8D7^elrOH4!_Lm>W#V-Bf?5n2oQKo_#c2_9_U#+|~>7K^8*!l@HBc_*8 zKN{|3wW6m1zYl#c6_1u8=Nc;06vaL1ypQ$a=$^36JS7Z?lgQc5o12jz4ubJUe=5)o z99Y&DtrMBOD2CgI9iJ=zQ@(A6E&wI>w|sh5dTYnt*S;@X7l;dMI970v5SAscS+VT~ zOQZd;h>^ z?0*cdw977OI&HfV6CA9pL3X4@&mmNB03unSjlvw{c)_`Hh9pL6Dk){szxXR^-;H1S^)%=NyOA(y}oS zWFIXKay+!=u-Q7oTLN5%?J4yW0lr^l`1nd;}t%t zJpndk&t^c;c81CBDwHDJN5)j!H7#f%l8L&~ZvC`>av4m1wOIp^T=#H52Bd!U0&jlZQ;^mjMFzOdqd9@yJ;j>Gv^ z5=#f5?vzqyse_Qi`WZ?q8W=q zahSv?$Wqm)&%;K9wSEv<%P=OqS7Rgy^gN0bdvZ`Rq5{FcaTL24tMJl7-y4q~x4rtd zp2whSlQh_VmE$Aiuei$@@0Q9v&tdn#BdH%`e&`ARgCXn*o_u@Ev2vO+M?ivQmlkOR;1|=?lb6}2$i)SZXH?yeG zGMtRHb@9FVNJacwBbwr@+j}!~{Ts^0if92GRiQm=p`~Lb{hYg!sjgS5LQIp?shNAm z?W1CvGF11r$i+G|zjX8w$eaEf>K%(H zJ8#9`=>&RZmy5l3qTg9-eVDeD2lJoNt-X`t)FWGB&x6eo2Ih%iYV1#3PjQ)9%d7%G` z?*RI>{G(%se#4!&>L=f?HJsFp^f`{(XztNXMrC7F&fKlg!GW-pjOZALzBS$*`Dm!0 z`K>YD6Y_$7hd72V5r_BOrNJ+lf(9<%3IVB2iAAzL3tmbg^HhS3+s;n_R+G7tG|0iG zSiH-xdfFC!cYh$v#SUaDPa?)EWnnv6YYJoCJRTeTSbR~EJJ_I{Jz*1#6ZxWKs zXGV#Q7teZjWK;eXM#aktLf(xfZgVR;i!?pKrMZRSASY#tga-r>AaMIp+{$ZjupnQW zMo8Ul(>q#vm!f=Dwf{|_*Gn5iXst&*tl3^2WNGoo$He;wb!Oe>(~xQyWN@(XJbh<2 zX`aN6(%8z3b-iiX5v=Q}woSS$l0c@myW)6nB(Gkadf3`#xy zL{sfrUlOejo2A=cDGNo=vd zsA9%eC}950w)xsuyOkDwc^0Ljgg5j2;nKSV6uTUQJcSZUsTD@e$O5mUd3{wxl3bou zqT!sF!nq|gLf`uD(7USXncwV@{5RKwE85?yLN&F_0rlp14}7@=GtapNe|81*XvhoM z3W?8O)3ptLjtjq=S@0f(Zm95Y3xtHa8-hk)n1XYYEW>G=ik_Y#E-z!xH}u;gh@J=W zPCX^q^lz9n4O7UON>8_aKS_ku{NgvJ;ab%JcT~L{zmSbzw3CZP@vQEk6$9p2X6tNE z+?+i|Ibn%3op z%r0C}tHa54T6qsJDzIK%*0dSxJlbT=3orQo+OkBwQYgY3zQnBKqAeu|4i1)cG2OX% zcN=_2#hK|e)JYDp*Qe*vf@PNE3{sZ_xlatC?aCcQ{Y((Rv70q^PCv4?a-ia^UB>=C z4SZ@?3d1E$JLlHTy)M3dOo}WDdP$@rW_C80H*ZMheu`yii=8u9o#x+YnZ7l*8s!qa zBiX#!u`uAAdTt`GVq3PvBOdX^TArR~oAvO-iKo<-b)4fal)73r)6XX)jcmN`X2`QP z*&=sK6IK%dPv}Pw*bbGB#CnfnMr&5r01OO;9!G}l)>*+&QHJ$Xft4rhN;_m^*nVgg zS#(21Y0CMQ_%QAo20u&PqWug%$6K|vGKl=nD-wAX6~=u-OAIjn^-2l|u8k$GtF7C! z6jV@HneR~;-nWdSvozh{hbu8udr~??Hm9ealgs?J#CJ2+X?SFvZ>p|%E9|);uzkyu zlY6u=(H}9L^eOm2#A!(4;fUOc^_`8L-D6Ww1IAZ#Id3GVGU&uRJETC*bGT?vEFGI) ztsirt;LIgsGik8>o{#w{NMUcLlR-Lj?qX`*#MYuwPsR323HTGU<)Hfz6lnhrvZHVDB_lyv&-C^USx!LP&^bK0bf{_WeS5W#PW}{a=LL ztm%c59=-H)3W09#lWy`4y!;$=%wgvvZ4s%HYmI=CFsQKonhR0%g>$nQh1g>y&n@olz zou9F4H|LwOK7_cP)C7E8u|8>6`nlRpt^0y2LD|yP&EZzf-2X~^=l6osTU4n9f0NE& z6CSWv!6KVVc+gn1DUXh)&lm8*QXi3}Iwx>fF z|2#2rNvncz;2s|=a{|t{Sb~iFv{nbUL&oY7)!O4sjOy?Z3tm-EsyV!W7SZxIz8f@W zzqI(5(GW^4wdaI4lP4{qN|(JIv1;?TO`u)jY`U9!$>N2R zBj)d|at5bjfD3pnXOx_(CjIO2N$j56g&_D#(iiMmNYPQp(OgOc12FLGHnw$}--lzt%-h2o!P zy%v1(Xim+h+={)h;dMY{on|i%I*wPN&%|w8ME&!quv=6qzh3*s<`;$wmF$|B0Ib|F^tJMAmF7C0Jy) zmF)JF*g~n7RQJ3A?6c_^iO9&Z1%WFM%X&<-j4PU&l9jqeal3AbLobWds!Fn~Q;QiE z&AwxH|Nj$kLd#y;T-K5vW|&7E_EADfPY$?x&9z`?Vy>?sRxlB@4^=uJg`-rR#*VAW zhf73d)^g<5sQj?Au-5B$*<|9nee6G`mF_G+nh%n1bDf28eWCLJ+?k~8s zW@xq5)!YIMECXb$ciOKGK6pAPuB1hxLoZ{g@1CH1#Uep?eIwMXZ%i##p{29Xu4W`S zO}$iGjj7&kU3L`7CO%#^i%LI8$p`v<``c%{NAp+g?Y_+3@O;sah4&HkcSqb-KN2V{ zN&gFhl7Ac3l&V!0;`V_iM_K}NIy4)_p$VwjY|hQS41*@Bxdm%n zI1XZ)t!y~tF(}P==1P}YvxvMQNH$Q>Z4|=L7t13KK}X56$nz+bw;h#p+ain#PUkt= z(5~%GW8_@J?LTKeXQ(j{`0n=fmP@PDYW{rWyK!SllfBic94FU@-&^70?LR@N!-GF3 z6U)+UCh#Q$=lTJ8COc9mUtt`#ExXU=TL+8|LlH`we8N6vHlCfSVmI9cbr@%e6cW%% z%jWKCfyI5r45j9zzn;3T>aX%9cn>aTG@Xj7T9-TbG#6K;`c zwX&9hSg$c7(9*rCFKkIaX+G%D_?h&T{8P9Q%`;Cb&;g_qj5~{!rS_}X+3sFdnFaB> zAiPW-1=@Hd(*sDD={_>&kx!6$R-BrE=oPw(7g_$;6T{?OG4p^YiG^<~8{B zh$IuxLB>uy>^bfqjqpGF%N9-8`i6o{B|;(6k0p&QQn@OFGUJeIDJWm*`JuAoj;Cn# zB*(i>9#$Hkp?Hz!BdyCDM7_C^T3GzQ&%}#w*Kg~8-{kpuhB7Z!>i^1g`(UBus!nHS zZ?RQHBkOlPBg^^v|B9pl(q0{)I$2ZZ+Z+j@y1X7%Ay#fLcVh~?_YSKuf7X((y$)5p zn)9wnUYqSVd$fX#w2W3O*K3ut`Gz>&3AZPWv`TD#)U)5(rH^7#zHv+6Gv?wG#NxH- z=3uA&%_U%WuqupZCv*AR+bW-vhI3et*4Z%7*od6 zxmc5*&Qw9sSI>5GRd^N-KINZKXJ77sD7ap zYSxy4a!GP|aex>qH_&YH$a`6W_wFd_l)DYk8q0dEWw)YLo%mlY|P2uD(>Zr za+Vngn=;Azr}1{M+Jn>D;8>Ldhv%o0y-C$MT)6*_-c~+mtfguSBJ0N=Ly6M+4-NCW z*xJ^XY~52cu_gQ&MGZQ;;D5s~`2V3{f(c3Vmsw^0ec@Q4jR*W&2=y~KQwS9wM_6$G z&00?^-M?Lr<5D2u^8sZt87e(-hu90^L-bOIA@lP%QsPH1=W%=;LnTOHU*Z6qjh~um zN_>hs5}&gg9LlJ0J5>^-GJ7?DRK^Vm&K)f*VO+6Q-)g*o5|w#U%(%Lr>Sw|XTMD&% z;7&o7Bg3i&RCOD+R*Q2on7E{=Ws8%0mG3u8_jg{jwD1|@EN7UdMZPyE9n3JkYuOJG zEjoK9_w5iXc|K#FiT_0M3}FaBi>@{LZ}QF_KjWsePI(Cm+`Z|Quf2x4QgZP5E&AA) z|Mek2eLUj&fSd;oS^JKxkC36MY~6tzV=jx4=GIGR$;3|Qkzz~kZ^-FshWtiYq|lYW z_ra=_)zVcD54MWk5go+}G8z~(eR7=?O;q2QGOOZa&kSWTqhI?u0t6WoC{akDxW8l) zst{l=`^ftlvKjbAbWYFSIDp#ajRpMY|Hy0t0pn^XCkix+@!??ZhZP{~sR3@gEXW@cF%Eq|3V(E_b{rvbu3_r|+AK{nBIkY*DAW(HY?j=9* zaOl=}C=}2DUW03!=JG6t0ox`u3fawJZ2|UC8NuNh7gIHmL`*ZvX3im5d#Cf4BsATM zDSSr)u1I?HIV+@qCt_RGaCwQAFyMF|?nEOY#u zfAKNL@rW8pFJ`~PC8Fy%GH181UT@v%=+v)@i=8_YCLScCZQ{@ z;{c*hQY<-)=GMKp!o!LuO!Mh$HT{tUK7)(h@4GF;4MCdYR!eS9>2EU@HmTBm_Yl)D zkfkstNYzikwa}Uw3OkqEAiFjOif(+y@opd^NC%(A;0g-1roG?V;LA9>F0;mLa-;F& z5{N(Ir`>9BArs*~5aWD?=jwCQ$F9BxaOCDdzbt%nqrBak)#zY=Gzy2)-X8zPO<`6E z(0-p~0p+`ZYUpd^@t#)2xz{b=5D&R=jkl=r5Cy!)8}Z;gSj?HgMIQPWtMT@7zfaR` z4v4b1{~&}e>iC&Ce);KkZ$-ozCS!Qs*k?dcv$Be%b5QL&t=8ks+txr?h6?)(1ku7D zNVyD-HGA=GpVTeyP8AOg4N(HO9GAwdHH-Z+=A1KpOa2|rR}k3Owa13=k?+FntnWs@ zgAtuj3R46d+yT;0cY|D=CtIov*s-1KH`Ls?rKw77P=D|~km!19Hem>=@`Q#>@2V{I zCY%LyA3wA>G?W|DED+qCGN=G!+7DNM>`W~(mc5Sdx@wNGzoT35$RWhy=f=mbX6!=e zblm1*>l%m}(EA@?pWCB%#`IaWy!^=%jMO>1mlyc!+AVH~B8E5bwyd5Uf5esjfY!~V zr8<{w(&^qY_VPXiORKi5I6~iUmi(#e6e1wMl<}RzSZ33=0!1FSsWMt6MxtW5}oYdj|3)GX;r0wuhB{zr-N{q-tP#*ukT?p!zJ`-V>y=Wm zn?Ckw-8&8PJ(p}Ba!*k?%Zqray_M8>DrVjsScP9`{)2W%5lX+GNh`CZk^A~t?NiBJ z;p%@kyK>{m?rX(HoEWN5&ScTDbg8DxpLyA;@aHhLt1ZuU=f73c*jUXz!co z_G$*qE5m!Q#&9NO1Y7R2%zl}K{MhvsS_$tX{NC;Q?`&sgX6fH1AEE~wV4{gEGBXrl zrm(KAmGp|5$~0Yw8}s=|z(lSRE{h429ph&ld4<+4x(>O4`TBmN_iXa>TDkA=%O0AQ zo=oJO_{mQ0PD}i~H<$6Pzw2BydL)Q`Px+0E@sfG|VUfB0kIA#$ieBAzIyEWsf!7xN z&|dcnN3UhSvhCO!`ZcRp#WhuKrKE}P9g*mIZn^_8foS6Np=>0+6()|;H>|1< zpivpuR*==}mpmK#^-UcacnE;s)~WXx7mK>LBhL0ZqG&W)-QJi{MC9Y0(aw7^c*YRaB2a%oQnop|5#ZWAB=0`k7H<5p!nAFsANhl7N>^#ty zobZDPrd#ir_x*C*OuLhf60XZlsGrWQIYhqvqG&Kb&rBc{6-MRkSC7%;f!z%9SkK}S z-M@%(rUO+l^(Wi~UhFVX~a6hPbOBMN>uq zx&`F!$R)>=C9k)bTUvJCT~_o^qzQU3fI!l$DW*e-!C zc_wA(m*0_W@Hn!RVqCG?(uBq%^O9b{lsYqpHY zFf=v53884W!2aCK%#0P|kw9HDbb_9;T`n!wc}=9abgOqqJNSB6#!a_0PMy?5Mo{)B z6Z0jv&P{dT(Yk|GAk}pMrA?DOXy?U2OcrfqK}>g~2UzKk^60Q)PWBERr{-M3rsZbQ zX1^vY#hDVM)j`|vvE+Y6~?Pq?ZFqWhv&n*pJz7jNA<5H-~NI8{iMW^pSV$1>-5h{6^Yuc?d9Q# zPSC`Y+q{+@;>`>m!CXuJl-bNX=GEh%&fw=0WuS*oebC$y5a>?j3?@QVo^pI9WD!l% zO*o;k)O1#7$q8(5-0V@dZuD1C+a%5}@m!o@Peq@`>?tKu{yY!ry}ChJvz%7U&|4sk zyJu(~bl(L?-zx`<#Fy9(pHAm#4aZ6hqo5~TO}e5pyVroKlIc+?QSOb zO+Drd1~QO;)}tNkU-bvt?`up1>`@B2?urk>Ms``%38fR@*J8*99Bt9`CdXhzU8tDx zH5gVHV(J9eFvV$l)1MR&FtTW zFUBJ$v~SOC?loPXaS&5*7lj0TV~XkbTilc`?c2DR<#lRq?U@K89Ex0wtGCm4olb2I z!u>gjDNyd{qn%7J9kf49HCrn{dsQBSOFG+>+;9@@a~lY<30H7;ebgc?e1TXlPQknY z#6kX?Tk0&cF>s_!M$y?uQ-1c5{5yq!C&c6=@PJeC~&@9ZJ`*q_&+L@ z|BU%9un8Ti%;PRDK&FrWkujnxiDlBz>uPE=%c^&}>~Gq?U9(6kEorIADGrTAzGaa3 zXjp|vf>+H^dM%zhX6KX}XGVO0)Lb7tSKz`9()rO)%4Eb=GacVN=9sIX1QMQRDs)3M z9(gO+xKgSv-D^`&Fg^I`sp;K|>E{i^?qhR9A%ugN^@u$H=ThZyrGiL+8G2)|0@!a5 zKX%)0q4Z>4b2p;X;?wm3+C{?6{s2aGoANpl=XAy|eTL{Bu5q^rrc`cmH#-@~*LPNq zBkldMp@=yUe>=FAVv%2lTaxV&c|ma&l2$^o{BM$o?@|?>TV|ZLaNPtpu4bFk_?1*4 zTF(P`Jaqr$M_K)EM(Pofx)d1JctoU{K+7uO(G(IgDYAVm&aCNSU0exi#lwYcJWk3YB({lj%NxnPv~cpt|8MsUFeXl1{hqq2 zWNLQpo>Bf@{QUg?2MFc$`IAN+Y+y=KLK;%=a{>6Sq8(~ z-MvS4L@Td*Ii}}K0Wj?(w}D+i<5PImv2DSF*Q^R(dfg{ZXJBr4y39>9Fem@6jxqrYYWRDz+$-JE%P zMiaSXb+vmoXNqo+u2fj677qyz=>9Z^O{?*CViKq~t)08}l82P9Q<&z$x`Py&P8SOq z>xD}=>JC|43ioPRYrUdNCs{cx42|L+R-vA}wOD{R4SPj-nV$gGyy0W4e}VN=mzLD7 zURM6Ur=xBfvzPoUJs5yRHm5R;+Kp0|N~5@`-T<`)cVW-Gy|?-xdqAhErn<(@zH~;^ z%_ydKKtboOGTl?WFt7A9b$_(W?V5@xl)OOIwpBa&!q0*-%)iTrkS`uuR;+%{+Um1X zbvj-WHU;dHc2o23c<1;^o=tdZu*@)#!$G5EHUmaG=6CXXaNy7XLP-680i-%u-2AK# zvbXij4A;b*g;{>8nsSd1VN`*Y){Fwd9i@xxEn8u4Ag(5td?D@96I-9TlKyyS(oPk(=G&tn7hrN}B* zEJ5zG*|`4PutfQ;-wVi9?T=OgAm6-EFJwh*Ommf<4mdec>(O>$Qwo-$xf?V_o1wbCe5a?5k=#1X-Vu%#(c8_Ul(tn!#Bx456#s z>x%~$pHlIjw(ZiB6{GIc%k0&~iRa!2R}VkabNs)ot*nJg4C=eR*DeF1nDK6oM7vpD z+vtN#pSM1r>E>o56V+cl9?3GMJ!&VvCj4_WXq(hXx64uZ^i=eVt}YpOsh;oIsex!ud*lL;vqUcn!g=~=4REVC0Y0$JMh7cm?= z-YwbnKD!4LhDQR;e~1XwF+rR(Id9z6@4Ke}_wouaowvXAW@{$K3xs%r2(j>8L${w% zch#KNZEXFx+~3$)W%cxv~Kv_@JYNHLRJO5GPfj_FA0 zY%C_m>$~2tkXVfk33dIV=Gjb3ckAt0os&brDfAT(lyTabp^`a@Rif2Q$7V)JFh8f2 zEbgZ5Mtfnd)L2YK#JA4VWfdkBR#VRKkWVF~&onnVe!Y0;d0U#+`K?cDSV>+a#2tn) zpME|7%zvV%@xVMzdki*r&${6#TU(7vE*`5GxOMI!YB4#Kvw2b|sJhHxPH=wrOWG+H zlMpb3))DyjI*OZ)J+}sAVX2&VqzErtAJ#!$36i-%Po8--4pt_J!%>cY&i_!u_By*% zOVyjQ_ezk>N{1BJP+jV+lWx16P9$P8LN`X~ZYO9J5+0mHaU!H76n!oJ4D6kR<|6t8svC%Wp)>v$EMpC zahS8%?B*mjrA?cZq3Ua=Pg*7E)UDPUOgN9h8JUjxx+*Lu6B_{d3;%;3{a@&#YYV0= z1$!b+uz|Ks{euOS4gEKs*>p9Y*cc~iId=;fW9ZUh zyzZFTrLUBMK|QigM>))z#uIs4kA-gtyNTg9dq13w=c%wBm7GbAC<@*|+%UwW;zMzR z>-_-b>zrNI!i<@-?xzmVVYhDZR&A&IPj??Yc6>`uww&%Ehk1zf-9Ho$b~lqt(KMHd zz5XpccwSAF4v*{FbsrIE&e(F?aV0+N0=gP5OXW>Kvcv}X>(P>vUK2d6lO{X;KM>J8 z47>?hoN(@`X139^J&!8&BQ1=KIvAuJDW>#I*7Z>jVB)~4&jyr z{}m!SO*@KWt6NW_Y#goGE>QD$8!$W)gXI}dE-{*VXF-%QZoNLM0kq9A)kZ2 z-=MCH$xEgz@TGN8o~jz@6D`s7_2d~I;6m|qcT4b+{^_@Xf@@djnY1?p{B0XEiP#Xf zZN0{FTN)R1iWvPF9O;N>OP;~G&7`kRL;JqpDjoNf)D z${WfZi%m8DDXhvL_iRAC#z#@V_eK%BZD*lA(pM(prO|JvN5QyCy_nc^*F3*6m;gRI zu!X4kvog^s?8CdeyH%zr+K7i&zuK`m+OT(13k{)D;2`3sDwU}D5wy^@H7CpQc)g&D zM_4NYd9(|Z_^dzT+^|dmYi<15p(da&(xNc&au47=J+{=J=*Tz#;zOKn|c zX~NKG)_E~2<{lOOF^=V=3>F4>2N?0zbl<)0<_p&&A)>VAWymmRm_J+Ma zkFbeeX0n9qoLQvvP`WgJQXKKtx<^}mj=c#vW-|o~SpF#Zu+#lLtPm^kocv!b5aRx~ z;~cyb8E$I6>esnq^1;ToIMpY-Eu2mIvpCX{Jm(10?V~`0g~raSjfek+`2hdmd|`p84g2^LX+26(3(~lz7bdTm?f)=#=D? zzn!uqDhv1d(Ohl`8qekBTg6rXkGPu+-UWJ7EE6xrqAOF;oET}6Te za|j!I@lT3v>uswBuNkp}Ulo(nAL=V*A~PzpIhc9q#c8!{e$RA#rLI91QDLfvQ7h_j z_MEsZIK+t9b)_whOjr0X`t~o05qx3K!~72zC?C)&C!Q5Yt@WNQzV^L0J`tpb+L_Le z;7J7i0}IAqma5(=GNp#n8@cAVo=vA^P*NZ-a&5*ZOEWfmh)FW z>8h7~Zd1+4`u8^k?Yd{SL6kU))A?qWYVf47@-r0sNOYFWQ@kT`MRGpT!Q+Ql z15k*Ko%P2>>)VE<%^hGL#J|S9tUpm zHLMyr7W|*c9{&zMbQC!9^cr1f%Y>7ouwVmb6%&`9r@o~ttPgKtelx5rUdp;nJAE4p z(BC%5UE2?*o#aqupY&C0-ySN>Sl(W37R7xSAT?%ER`QZ_9M}i7>-1KWLbZs~G`4ix z4*EVrRV16Owx<rYyrJTd=^`gl zOFyNa-3-;N>KY>k?)ihSS-_D-5BAVNhEE$)TZ_Y4y&z7sh#RMvtQ!UZdw7DUB_k+( zTfti`CT@(u1-Fd)&7T^|4c3_XZV!#4h)dW+)_`*Dk9e!yhpSsGQ`2RE34n) zg5i*VSzjzgHel#gl`lYL*@Ns1O*2Y`_H0T6_QM;G-X%8I#^}@W0?l7Sx&}JSA3Ks( zk>yy9TIHe_0Kx{V;X^FjAw6s??AQ=D@>6z%(Y&}ykstQnh<>ShyQ$N6- zx^Fe)R65l{`@2uBJWLzZeL(@9koRHv>suZM290eOUL0m~QU?EHCFbN}iGb|7&J;E4XcqEN#Q{9Xiww;6x_RlZYyB?ob{ z@3Pos9Vs8o(Oad5-4_z=YPr9DKtEfki`4T??ax+fL4(FB%ru! zA9S(OR@Ao~@v4ZQYHIO)r_OmtAi$oXRu*%U*k_z3B+fnO&|Y#-os`Dl<-Pp*2+WK1 z&)YZ*IW!OQTw69@nP^LRH6we>H-6mrs3aT}D)<)9+?Lf=-_9kw$h&>9xG8q5XfJN$*C%4sKVMkrMg(kZ>Vp&~H~IzQ_K7}&{wrQ17c3W~ zzcvpOpFM@HS+azcBF3*T-F4lAd!plW(b1`eH(pKtB=2ZS_}srzSQ&bZQ}}GwZz(mg zJGL`c-1C9VzB8kne?SGKToryDK}eCHA83bnT1M&$s&CqjN56+o3bggFwdp>h_uH00 zIJi;Si}1X4Gt)D(T&v$Cm?)C@9NSz`K~M@& zDI=38h|dPhG*358>*)5mx@xSYw`q2BI81bk^#^#~8dY?8cK_@_&A>u6-r_?2Lc}5Y zr^Zq;_R1zqRLpvi5%^anG5M7f9r{zOf;AhnFrA-@p@mnUCd(dVDX;m^#2BCC${AL> zwryvT>X!*j|M-ZG=2&7_>(bTK^!cthqP=&~mVdAi70*;`fby+ic5JVNjEC%i^WsuX zQ3)1e)N9btOkBvXQSnMu<*T>vesgnj3hq^ksNI0fcc`B&`&n8yaYYo#9~vc&2stX> zpT9=>{UX1swY@gJgHsUfT5~${Vx6nwVUzHuefVfTZ|=U0hM?E@jK1K*w#Z8MxevixTATF?@TZysA=pY4_h^#tB%zS~N zSNnj{UsmI?MV?;M*-1d-XLpRPHfR4Rq&{|jkxX-Xs0hSZCPU)IEi0er?PR{Ql%D`w z?jQT#qEULe6$u$f5^wC8T!f{@Xge+i&xwZS!_4%9;>$tR6CQK!s)JQTefit;>{Dy& z-QHjKD|yQnu1YEl?;?5kO*QTw>`hR$n`vb&V5#+y&OXm=RFM_$@ekN7YY%ollE#wF zMmZMfDZ!(6@;D7&#m2GbHVw9%YUB7xIOL zS301VF3!kQ*hqnI$+Z05uokA<7=E2?)dgUZpuA&kdMmvI6$jz-QH5d2+b#g!@pAk~ zjQs*8exJi+e$GUte1!kQ#v;-Cf4Z^$czr>PaVyapa0#@?cP!DlY0}@jk9y=?&)6{P zko(Kicr7?(s=SP);acrIaRjyi|0Wy}?b97C=dX zRj2+ERCa1$E^i;$G}_h?3kMa}{&XkcSoxTzXJc-YLE9*n zlxWXtFIajUnbTKmDRbhlBP9{~g^$i{R#INT^KkPhV_IHGiKs-mIO}JwZ$h!Y$tzXU z%X}JNRqLSH$_$ZZ6+i29Uo+(!pmpe;CuPq__`Lv6)&kB~AhO1kGzxM3R@`;&nRoRp z`L(~L_+~T?o!-FS{$}u2KC$yzb}1z;(y2wLbQSQ2N)PxvK&|>cuFSl9y*kA+sc{Py zA6ryw{&KEZ_v9#3wPB=(&YNF&+r2paIbwV>^JWj^`y-t7E}kh}7!ROKGD_8aySfqA z)A!l?*V;jDmCKY3{fL85(5o3k1@aotbf!TA*ud1d?M$$rsyyIe-j2IQouXR2k;I~% z-1At^3Yh|1y&@ra)FVE(4Zc89_9WYZhw0WEW7+kcwR?Gwr+WmbwfKJ1Z0?@?78I|# zU?-HXosn=J8_F6G1_D>s+RugbZJ1*XhB*p^h&OCH@HQz@RI{E{=IbHrpO_aS60WHP z2!)yFf2x-yZ$}jtnmGjR|0#Y?dfriA0uq|NygGTNdHiPow)!%`V8nUQ)549&N>if$ zRN4JOwhN%3g)f3c6qGAbVL7=uVzJeZ0t}6KH!7UBFGic;0IRHiKZVz@9YobM67gjn zW^T`?U&m5At}}7YgH?5L80wESl4YhaTZd$l9@=);L`uEHm#cWbz{hhj6#K>37IuH& zbH0e_%~C9+I{+M-?rndH%%&@j6#Ry>%QCeV9rk=z$fN(g@BU@j z(c+o{uXj{EAgSqE=zyC5W)T{CtzX;6opGU9T7c;?kgXQE(-`R>icC2ko)l9w)2tNS zuFI)ov6?x>;64e^R%r$ImK!ctkh~k4^4qQq9fcnuu&>Xc#&7Gkf8aLMts&%XGBNl? z<2-$bLQrbxwidso?yk~)GLJA~-uG9>|sot%r#35;Ze!{A=<%hhF zYC(ldUf|;wr;xZEyCR%qK@<+tDXor{%`C@oKkoa3`)<^H#a9AjjeFli(vG$nT%!8! z$=9AqI^?TpkfqW?A)XOTNKwkzmdf4BZ)3W-aHs3JLXhc~@SzIl zq5KnI2_U9p6?yID`tudeo`rYep9dRPRXJFB+$b>5E^ukJ5>3Zj^(Hq??+}- zF%z}e(iUUpaBuBAxdp2$tkkRV1ypzE44Li4_MX{2d~gr5pc z@XOC8IkLAgwL1bqTy0he@K`1Q1>G3g_K@(=vHf@i|E_i_7pp_|g$evtJ9}2+Bemu$ zsYYY1BpQbjw#k&qO3Ytn2-Ib@#~SIH94$~>ra|`gvi*?ReDa5Yh}1=Yy=JsI<+5=( zv11O~_@zTJDQF&&zmr*rPubT00@&^LZ^o^vvmmJiVM!|pP=z0?_GffE=jPPH z1G+tRQCqDc6^)|rxS)$rex2Qcl!k_3@~F?bBv>Sb)19S#ux9ysGGva1F@+tzCRpph zlxu&1*KQ5P7@<)rDt?#AjM!JZrrb8{z1c!0V@}kegiu>^my+l48WOg}+mjves%g#~ z65BNwFL@sfI{E5N1zm#}Mi{oqXsT?`mDe zxlV%P_F9+E(QTOP)~TMQMT*v;muJ-|nDo>1j^X^^cN5F3GfVAyU#4*eU?79kn{1EI z;}({z>jWwmQ@*$+S=BHsey+dF4pyThvY#??V7T3)RASB;{-`y>JgK}R3}4`J49)S> zahE6xEA?8|-1VZkU{FXmoOv5imv3OQg@Tb(+Jga`#L%zCW%=zHBcOXo&FL%8#mG?j7I~Nxj_VE6;Gg$0t@-2dp;OKik6+l4=Y2=%_ST@QJBKmXyN|G zkMoaWB`VGAU3%Fl?THDi#ie*PkR(+3diH|Kk|tmONxQM8z>PwktOcDm2Im$?wg6EX z(;Xy8QFCmr^$Th6%tIf;a#INc)k@w@9b_?X1W+^-G@7}%<%@g*ULk#^S}%kG-GIJ` zlY^T^mp?i4VGDe$W33hv73r(FVw*UqZjj8u)1S14|4GYL0k&YTNwt{k+9En6vc!s`TE2hA8bBMdbcugS5^~8zrXi{-S*Xlf`Z|Wr+uGP zD42uMPTtiGDU$TEf*8Bjn46c8n|DjefEWSQ%&U{YZv${A)EzUV2wzGNgF-0fnzo?P zhCisM>pI0g+}vu>#MzF9P~v?LOiq8(;GY4LdP6>~u-^r#=!_0^4+$XM-5H8)?RA-? z48j$))|yp`rK-@G@tJ}5(iTeQX|awP&PQgq24ov9`jQ4c4I!Wmu7zSSE-2gPUMyM# zCl-b8Dgw7@d|SY0_C(63CYhYm9}n8Q2UK_**{u#;C?#BF;S`ON_50d<#-n)VEqbmv2W%X%ZXvMTc8Fz#SyeKwx4rRBfAle%)|g6UP0_nIEbyBheoTe< z_Wh|>@z$@1cK``W8Y$PKEt2VflX|J3Qx8w(E$zazgDpo&71N8J59}IUPXc86{pWid z8ls|3h-OOzrkJ5OX0WCJOc0yH#}5=CHmp5X@&x1?PO25HVEKq74}O%K^6%tz&BDT* zx974Lyyw|Y@^7kgK98s&RPK@jy$#N*ru9QBssWV78ujjV)capHand6R6@x-~4%+Q1 zL+W$O?UQatyyTx^y+nY98>fKrU)L?583TNhnv0Z8+vGA4a4*BXDt_y{{ms8qmmEF* zU_FK!v7G7W-8MSIaroo}JXfWc_%RmxPcRqXFwCQ=a%NT zRo-d!RvJoZMISF90?}Tv7p^iX=sR^Uc;@lY-nWUH_c}-yXr2qJcaWj>PR9SyS6kFo z@Gzw8dR@l!HecH^>Q*UZ(CrUPv6ds3SsOkZ@R91#0f8 zj;?K@iAzaf6_U*oBSkp@!bb$NR1B){ZWQ7LX%>{oXcVu=4jJ6r9WhqbcaGrGB_v!p zvC}4!+xx7~^XG#6N`BD5JAQR$?5tH0S`cvrD`571;z?)HDO+BaG1Aw{WI7u?H623$ zp9Dy3xasU#sa1hPU+LLXDUnkg3?3mMa<&t(&$JV;1yZvZ0maL%)WQEhU zCYlw6XE8*9AG5&v=~fBxOS~wP^mM0BRA2F9d(2nlX)N0BQjDmFd$fvlvRCVbc+D(jq7iKE%XYD7vOFY?ru?pyKchw7h28O{@d&+N>0{v`*) z6ML|r|Kj6xY#;2~pjbLh;l$wD<)gCRwKMrf?Z)Emngc1zNAeoRuA^SS+w8>Z)|bq`c8HGghOx zt9@8xm^89Fx~ThN5RL<2@1hXukv(K!q*C;}H)ze$5kAaKY~5WzNh~Hk{jsd@ca@fO zD;H(Nb2?l;Ym7zqUQrCCs*96Sy}r)08Oix>z9!KJ{3RIE@sc|ty=PPy<<%nhy%t7U zJdUzMjL9g(ZXo2fKcNS>!PdU5!)*hR*2TE?xp8?Zk}c0{j`1D>~g#IpIL0oZUH znOHzdI-5>Wc0YfypRu)-G+0XtIeQc!Bd?(7FUk3$qLOcS4od?oF@R#WdWEvmDtMKH zzN`dgog97V$uH$poUaS|wOY@FE-)#;Xb`)LhT4+~)ZG2#MFY18=ZS)N$BI}(5dFdCEby4Q_mj~g>0lA6qX>%T9? zKt^5So3S$S}A-VY(VGkV3h>-0*6{swIf4BsM)lcR(EdotEY= z9t2gXOXBSQl6m{!J4p(xCs5wbqymWPZM1wgrP{1pRQ>SmVoxW5nN0Oj-gEx=awwUk)h=Heay zjsEY4HI^nhpEaRdTSw5nhs_dwX!A>Y^z2-0c{Y)yVXbO!^^_p@^L5&$zEsDAoKvC{ zfuD5K2r8$!wgx+JL*#+7X@uJ@TU4k5*nw5*2=9Rf1)jZd(F+$;#iGm)(tN^rl^=}# zWJ=#L|L1cMf8KZBr?O9*i%P793Rmp|`aCl$8nLG?q9te>u;Zmk`IaBHN<8&)Q@q1P zUsej=Mt{t>(rBKG98;B&Yr&AWVaSmo4G;ZM`(wNOsu7qzo-R@taprhwr)Wi3 zO&D56=O^(k9~93~Dy32fF?bj;pSnP|HsZkh7h@Z(s)4ShkyB)(KdN33y^mcm*Kuv_ z<20iG#Sjo;+b3reuuP)qdjKqhe)R_gu&}4rLuk#)V&xQ_zn{E74NI=>(XI&RdjPbg_-R z>Ay}<>4^<~4&b!smx+mJ*fg%=VCV6&-a?n%TlAAoI8f?f zys-sYoT~GN&&k5Z^_z00gSZh5Uw_Ud?<-dLljj>MA*!ZaYdpq4Q-lOk3$EO zGE$#C3blWbl2K_|(cH>QXIqX@_0CfLd>+8h#r(6eG)P>~)T4(oZDA^MRuC$~^Q0ce zlJ6g+$gz7HTf0ZS|8bA!j+q76AI=ztu1W2`gI9tC?fQ%wF#o_K?{7mPx>{p8Gv67y zM`WA5x%zWB1gN_7?Ae@xmF%B{!VwmOw113W-%MvqDytXz{s$e)!Km{SMG{L;*Pe~s z25iiZk6W0SyhaQ7lW&HFOTTF|(%n6Wr$?3f3B>FfH^t?l0c7PXo)|gVTt*;>c2w(7 zQNM}5-GKBW4>9)=3K{x6)3%eIHe^{HcLeh1cx6B*XTJZ_JdSPu1;b6D?77!=R%he$U_Ma+T&4&0~2`pFfYNXMQgQC#h3?gGTgcz5OLD?*g49Bq$J>tlnKSm*sX z#;3tqtVwui@JIjnwRhEQqvd@?(TonkzY5xL+?t0dskm;8N-Y-ASDCcSZjU>ad zO$|{d6G~CA1pX21e}wKq+zu3mvu72G+{*;zW)JUNRs8x`1|YGB0zNC5oWww%ip?_j zIVXca2`{3ykLYjhmqteT2a;I^&)#c314?X#^^Quod{Qpb)>kmSs@X{Z(X*T_umt^OKxj^SC}TNBq&qq)aj1m@?A%y=2<2qTEX@= zv$3G-YMJP;rjrIy9e3UL{vJvDd!RR@UQ4e0WS1qqETSWO;6L99zhhJX=m5g2Jv_=T z&ff&$i--;N+c_&oq>8NHDyAm7d#qX-UwO}&3D91g!C~TYUdrN@afpyN%B~360bTWH z2xy70&spy1oU+HVuWQG}fIuvZRjB2+^OFY->=KRcM;oI6W8=IT*{fNPgGBT}SCm(- zOb_&D#898;3pVmpRl~wU07(40qja!P(7-jRn;g&oGVBZ?(3y@_b!uk8TItv$Jbd-* z0pnj`TXoda@wCtBpM|!?itGnaSNuRiMIPbO?-e74-+B{BtjIx|ijZeB4%SI&FMRQW zje+aa)?gyw>ab(K5#^)Yk5Lx8NWZ;WN99C4P?^vgBRuh5V}SeyB}Qh6>pooWxQn6~ z#P`H=0f<>Qc%(tetGn)5z9N)_P681>8X z$d0SERsVLGYHyzd<9V(qr9I;Z4bE%5ZCo_h;Nd@c*WLa1oN@kjKj2_i$ncDe=hM_*_&3rcYU)qA&{H|29VMc%Ed_s84UFAgc1aCyXJs|t6$)-7B z%ZXOb(UUbVAJ2LEtN9VL5D>;Y;m`%@O_ULrE`^W`#!3}DVuOfgOp z{5DQ4jtx$ulO zfg_MAH90j;VkhsDu-|R&Yt0wZ{7`k`nQmjRo4JlhY7%N)i{wg=DgFw`VNp~R&f_=U z1A`bG10US;jfzs;*DtQ^(foWD^n)x`6&Lpp4<89MUf@n#|MAB*_PJPH>573(7`(e# zOLnjrNK;gG+xGZf&`}oh&3tw;j(@}39SFZZlV18)R|ff*W_>6w4g8cYztLdWCZjtEr zU-&FSRxU-nbT!{=jUnzY8#`VCPMn6g$u!jNryB%cHn0!m7rN_FFj~9Y>|pc1j8qCT z1ir@9AAWyYenLo@l0ZZ%d1+}PrD!ub-RsdUWae2$_79PHJX&FHS4i0ORBodPwUhip zukpIh=AsO%y)`c3XBzL5A=R6At9j}q5 zC0;q_Drd(dRWTR2a0K_lOAoDw%TsLbZEZPeK4tSVLVEg7y4tx)Q^QPfUYN!X>b$$7 zo$B4m@c1wJ2HUZh-C}YpUtR!DhV7=eBvz&B6K8)~l9d7ULp@Lb&iQ5jw(C-#$m-a& z<2H&vu+5%FQjwW^Ci6mEO_H)MR}ekEWzbqdt}KI2<4fG?olC(V#-~<>9U9J~(3*mVOd-Oo)}SKm z{f5K1vWD!Un4yUdqTM|{z1kN(p1oez<9`ImZVw0ka=YkD_d!0dhAZycWLP_>+3;!@ zDrWfzOJQfVtBJZF_9OKCBlb*PQ4o$O;AiWJ=``w6Q1fdVSzAEMOJ)VbfzOmyN3xTK z))|G-h&Swm%GzyR>wOGD;q()eG+gNyOBq`M8QZTe$-5kw;3DTw*V@PwpN(u0hBPEz zgrIBZr@rXp7|;7)-bFsK&lw;jc5zZ8Gf5*Hktzge@UQtx4K!S?ph@Losx9kKleKj( zyJA-x8t}>6fj*tjV9%Rrcq3O6=G%))6IkP;8PQdNXG`1%?YmzK!v(vh{rBIUyuS10 zr@oZC_v`NwK4)pw?oPJHHE&bK0_cUQ^lkNo`Q}NOiawAEQ`dTzRz}|l&9YGMRm%>baLbfgv8v*8y1tc;5tcSK z0x0hyP;L3H<|Grf@neg0ugm1jEKrA-NcFMI4gJTe0lPHBsKO%s1GI-Zxw3dS5GPAS z-C3c4ZP{aje&ttGw_o1leWpQ! zJMQaQQ5fF*MSn+^!r+-^u_ors{Eym6I_>v{A}L{)T$&j$`H6Z9ISRQ5YDGN|GwKGY zV14h3TLns{(UW4pFj0r%Lx9+S@FBRRtq1&2vJYFN_)U5td&3!8V@xFx>LtSXAK0H~ zHiP@{W*lACf7l!y1!xSwq^s*pCf6iMqUKf`3pV+?u<^oqah|x(=&9Jy3(oQb=L2-Uvg2S}yyN>pFs~JoKsH$y~p6 z$u!}QGOuK71N0WoY~DfMNQ7UJusda&k{d1?+97 zi3ToF>h6@jaQ!_S%Zo7Bt`}b8O3^37(G9 z?rsvgT3TrY6@zDjke&;6x+hTJ_r%N*Vq5vtA-->%3FLeu4=ZDIYg6DUsYkiHHCvET zhKe?@;No{2oA%aynlkZX`&7|DGUf8NU0$k+vut_cmdbaOYv8A?qjcQI(R`a-givhh zoSy^rEeeow7-pU73y($(uA0N2_cv_eIQZt-_=YdzVpBMO&2R43;q)aed-Xe_caLc> zKOkj0{phj6=1oH3^G|2{+Lo!Wh?n*jh&5dDZr}OPT>UV(d7tYCQ&-~y#0C76lfayE zI7dbYze(l~bpFq5h|_&diDqWd=*ee%f%1k%VZE~FCaFXt&P!IOj6M&$A>DCw@dEce zh8++p()O7CBsq~jKT6&pR^W;Baj0Q90{bvsMmK6XGoAv=Z&H*~lfb*l>2H+85~p8g zn%Md$`0+-*8Ze@QIxSLn({P?s@=c&&Gep1Nwr11SR7EXBy>^SJaI=$Gl+L+2z+3ap zS5^INJy(P2+Pu@_C(d}mcBDGPmCW6q5xT@<7H)Ea=-ty8Hxr8w$Wsj zlryh7{g7Raf4DnG1_1DUF*n{Kg9^6#bDFkC_arM>OJ^!nHMF9Mp=$jc)0fpmo<=;P z)$E5R_uYPawg_TPbBnAu5xz9vaR0vKb;ib1T>P|B=!iFw?6w++t&d-joHK6ZFa5n; z1I^HJ@0!EgWE55+p?MrNx`*py?ygp8eqML`s$nK3Z>`Fg4bYt6u>PCW_@96p*E2K) z(tkzHhER9->0@q0o~8_2|9T0}2g)*;_#&Q zUKCou7B|)Lp0=@!H(DZQ%u0e>+mY@fcMJl{r4b5g`R;m3W&rjR)ydm zyg2trMJ$r;#eK5>w3RJ|*eYxJPi%zuTDFDqtbY3A+h`lBKG)Qy^DKR&Vxo!IMNUSD zLxlIAkB*EBm@7aUfo`p$WrkQ`G>qISR7%S`BSa@)CWsj#G zJZq{pMf(LD-F&QRR<`k~<1_<@%>VbxZw}2YdJER&Zr&1pUsC(D8jbrXJc_X$xe4*< z(;bJGDznXNmes2kt)yYo&W0{QM2(#5MKgnH+o?{!-~+&15jzaq&PczqDHhuhTV$6< ziA>Q2IpXYT|1L8tZ3GfSkvvui8adsyEOIViWKxi{r!5dGloL98`M16LWNh>;8C|qX z+)q0x5Y3}8t;$>rghP`^>lMz>xSH$UV6)8&U z@_-Vcfn-szw_RxTCk8)yVn;j#GVe-W1v1p9)>g~XDJ}{s{aR{x(@y837M2tGzFBOE z_+VPZhq30<^d2twRgOt269uR2E0dB2>x|e=GrAcTbz7@ov+wf1$%DVr;$ry+KY5s^bSMCRHRgK)BrF4clL_ZuK$=^7zbx zjQ$qyNSoXBecHGC_6L+l3mSKA zwnaXsT!eM>F^dl$ZfcV=`y`oOf4wksRu1Mcv`Y;5;wvi1PuKPZKeZ}HT4=uZJt`nG!W3x)CP z{=u@G1<6nb(*PDd`x@Vu0sv#(ThR))DDU>G+afWxiChu^>eqMz;(lJ(QjpLu+!cv) zM6}jXjASw-xS;8&OxEDU&0hlelpezI z2ID7ihR>HfagI2$Ox_0Yi~Tk6t76m5ZQ8l@u9f_KmWu>1xp_60hFq`c1Z#brn64KV z*Nxmd>M{0ubvNK_PjhL?#csrsy%SQWEq>Mp}wg4%{G0Ui-uQp}RFjb_hg@FMrYxai5{SXAKn`L7wCKR~7S*?(gO z8hvDH2i{m2g-{YVtaPNP9BBRuMr7c>_?Xmu1`q7ubm*MbI95YH1=k0Nh+e$j zkk0XkG zbp}4>Q)x9_&a1j&govL5`Y`PoRNTs3DknJ@P;9MbEU#pyuPJ38HItkS0LzP>@xez^ z6YEy}Ms*G9^ z#2CC$M4xA#-)MEkdhqZx12`sleMgp9EF?hVW)T-;&`h|Yly|LXhidu zP0p%}=%X)m{!L824y3{+J%(+-MYMCG*`5e$5G8lgF6_-8e$=75SgPpxDk^aWy-Qq~ zvHTbVdG&k%LyV;)WQ(G4rrE0QB3H4=JvMqGvsI|bl>w`oRB%lU1--ROfvP~P0J{Oh zRaJ90g&wh_*(XTm2fb0A@U^2aHW=?whZMhMDD=lWb)(tu2QP=2fVaEgte|uA76Or3 zw_I8F$HwpXSa-_$a=wk(NT0!(Jc4XL2ftpZYUOr2?vK4UgBrZHM7olfIwLoV((qWN z-{&aP-7?d0anU~t-VDaR-w@HJk7br zoQ0o9UEh=6WhIr;1PH2y%c|GQC-LhSo(xKdR_!sVq6iEBdY3RyuDcW>+B0sOwEG;w z^Ut-9$)*1>nXKLT+}eVn%w_po1N}AMSQ_UU;c#RfNZWn`HncV;_Rx7p!^xmOQ~jfh z&LidIsawMN2(AX?mHrv7uvqjDa6lwQTLi+a9?*a`pwkKFJSQ zsDB^2y6V7TY{HhIqcx=F?BZb0S881C>PwLCH27gqRFK|8qcU*mt!Dmb4C#9rxvOU@ z+%2m^SF)tKJ*BO=HX{&9=*(bQw1n`tJdgm#=JX}6AL5JfAM=It*{_Ac9HzTKCW66} z?oNu`|CAA3XY3c3W82VNdn`=V))__@*QdX~f5=-lA6eS*0=z#&B>VmmA1VoLF&2UA zdq&SvI?MQhSs5#YX5nZKv%I&5D>246xoOlK`kvFa&g60-URs{i4$c-DE*I>v`n>v+ zKT{QUM!6O&VW?uNY1X0WB{u+GAuekMIYWj+#CLd8Di_8C-X`?@SiO&HwXtLY;oaOw zzNzdf<8F!1rjA^p7E7q0D^&%(C@nRvq?f#tCbKogTJ71&ca=W=)7i)6+2SmB>@miSgKLSOl{)WcXckkSpi^rHeN?w8aygQJX zXOG{b5>*rtsLt_%k4qz}1up$kS2hJ9GQsx}#mh+jH$Ctk@8hQoPwN@5|5O`=gvo_? zFvbJ&iJVihzpw^|QI!akc}n%6;&;^FWYYSN7B{bNOjL*PKj&z(F5aTzJGZwUTvu19 gS3kTvk={p(dW*aL_U!QY-4BqJQj#owYx3p)12L+7y#N3J delta 33448 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 From 62f910ff3ea1c924705314a28cc623a4571dc5d5 Mon Sep 17 00:00:00 2001 From: Steve23 Date: Thu, 3 Sep 2026 18:09:00 +0700 Subject: [PATCH 06/10] standardized some things --- lua/wikis/commons/PortalStatistics.lua | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lua/wikis/commons/PortalStatistics.lua b/lua/wikis/commons/PortalStatistics.lua index 604c9dcd16f..329190f91bf 100644 --- a/lua/wikis/commons/PortalStatistics.lua +++ b/lua/wikis/commons/PortalStatistics.lua @@ -43,9 +43,9 @@ local ConditionUtil = Condition.Util local Count = Lua.import('Module:Count') local CURRENCY_FORMAT_OPTIONS = {dashIfZero = true, displayCurrencyCode = false, formatValue = true} -local CURRENT_YEAR = tonumber(os.date('%Y')) --[[@as integer]] -local DATE = os.date('%F') --[[@as string]] -local TIMESTAMP = DateExt.readTimestamp(DATE) --[[@as integer]] +local TIMESTAMP = DateExt.getCurrentTimestamp() +local CURRENT_YEAR = DateExt.getYearOf(TIMESTAMP) +local DATE = DateExt.toYmdInUtc(TIMESTAMP) local DEFAULT_ALLOWED_PLACES = {'1', '2', '3', '1-2', '1-3', '2-3', '2-4', '3-4'} local DEFAULT_ROUND_PRECISION = Info.defaultRoundPrecision or 2 local LANG = mw.getContentLanguage() @@ -1004,7 +1004,7 @@ function StatisticsPortal._cacheModeEarningsData(config) end) local processData = function(item) - local year = tonumber(item.date:sub(1, 4)) + local year = DateExt.getYearOf(item.date) if String.isNotEmpty(item[config.variable]) then local arg = item[config.variable] if earningsData[year][arg] then @@ -1448,8 +1448,7 @@ function StatisticsPortal._isTableOrSplitOrDefault(input, default) elseif String.isEmpty(input) then return default or {} end - ---@cast input -nil - return Array.map(mw.text.split(input, ',', true), String.trim) + return Array.parseCommaSeparatedString(input, ',') end From 7c503b9ee3edf92bc1b0e54683182dbabd86d507 Mon Sep 17 00:00:00 2001 From: hjpalpha Date: Thu, 3 Sep 2026 15:32:50 +0200 Subject: [PATCH 07/10] fix some more annos --- lua/wikis/commons/PortalStatistics.lua | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lua/wikis/commons/PortalStatistics.lua b/lua/wikis/commons/PortalStatistics.lua index 329190f91bf..87fc41dc728 100644 --- a/lua/wikis/commons/PortalStatistics.lua +++ b/lua/wikis/commons/PortalStatistics.lua @@ -72,7 +72,7 @@ Section: Chart Entry Functions ---@param args table? ----@return Html +---@return Renderable function StatisticsPortal.gameEarningsChart(args) args = args or {} @@ -95,7 +95,7 @@ end ---@param args table? ----@return Html +---@return Renderable function StatisticsPortal.modeEarningsChart(args) args = args or {} @@ -114,7 +114,7 @@ end ---@param args table? ----@return Html +---@return Renderable function StatisticsPortal.topEarningsChart(args) args = args or {} args.limit = tonumber(args.limit) or 10 @@ -904,7 +904,7 @@ end ---@param groupBy string ---@param defaultValue string ---@param groupValues table ----@return table +---@return Renderable function StatisticsPortal._getPieChartData(args, groupBy, defaultValue, groupValues) table.insert(groupValues, defaultValue) defaultValue = string.lower(defaultValue or '') @@ -1110,7 +1110,7 @@ Section: Display Functions ---@param args table ---@param parameters table ---@param isHeaderRow boolean ----@return Widget +---@return Renderable function StatisticsPortal._returnGameCell(args, parameters, isHeaderRow) local CellComponent = isHeaderRow and TableWidgets.CellHeader or TableWidgets.Cell local text = (Logic.readBool(args.multiGame) and not parameters.game) and 'Total' or parameters.game @@ -1188,7 +1188,7 @@ end ---@param config table ---@param chartData table ----@return Html +---@return Renderable function StatisticsPortal._drawChart(config, chartData) return Html.Div{ class = 'table-responsive', @@ -1218,7 +1218,7 @@ end ---@param args table ---@param chartData table ----@return Html +---@return Renderable function StatisticsPortal._drawPieChart(args, chartData) return Html.Div{ class = 'table-responsive', @@ -1253,7 +1253,7 @@ end ---@param yearSeriesData table ---@param nonYearCategories table ---@param transpose boolean? ----@return Html +---@return Renderable function StatisticsPortal._buildChartData(config, yearSeriesData, nonYearCategories, transpose) local yearTable, defaultYearTable = StatisticsPortal._returnCustomYears(config) local prevYear = config.startYear From 58f492b03794363147d7e4a0580e1b8930aa07b2 Mon Sep 17 00:00:00 2001 From: Steve23 Date: Thu, 3 Sep 2026 22:52:24 +0700 Subject: [PATCH 08/10] Suggestion --- lua/wikis/commons/PortalStatistics.lua | 37 ++++++++++++-------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/lua/wikis/commons/PortalStatistics.lua b/lua/wikis/commons/PortalStatistics.lua index 87fc41dc728..d2a83b268f5 100644 --- a/lua/wikis/commons/PortalStatistics.lua +++ b/lua/wikis/commons/PortalStatistics.lua @@ -323,24 +323,21 @@ function StatisticsPortal._coverageTournamentTableRow(args, parameters) end end - local tierTypeCells = {} - if #args.showTierTypes then - for _, tierTypeValue in ipairs(args.showTierTypes) do - local _, tierTypeData = Tier.raw(nil, tierTypeValue) + local tierTypeCells = Array.map(args.showTierTypes, function(tierTypeValue) + local _, tierTypeData = Tier.raw(nil, tierTypeValue) if tierTypeData then local count = Array.reduce( Array.map(Array.extractValues(countData), - function(typeCounts, index) + function(typeCounts) return Table.extract(typeCounts, tierTypeValue) or 0 end ), Operator.add, 0 ) runningTally = runningTally + count - table.insert(tierTypeCells, CellComponent{align = 'right', children = LANG:formatNum(count)}) + return CellComponent{align = 'right', children = LANG:formatNum(count)} end - end - end + end) local otherCell if String.isNotEmpty(args.showOther) then @@ -430,10 +427,10 @@ function StatisticsPortal.prizepoolBreakdown(args) local function finalizeTable() table.insert(tables, TableWidgets.Table{ caption = 'Prize Money Awarded', - children = WidgetUtil.collect( + children = { TableWidgets.TableHeader{children = TableWidgets.Row{children = headerCells}}, TableWidgets.TableBody{children = TableWidgets.Row{children = resultCells}} - ) + } }) headerCells = {} resultCells = {} @@ -637,7 +634,7 @@ function StatisticsPortal.pieChartBreakdown(args) }) local summaryTable = TableWidgets.Table{ - children = WidgetUtil.collect( + children = { TableWidgets.TableHeader{children = TableWidgets.Row{ children = TableWidgets.CellHeader{children = 'Total prize money awarded'} }}, @@ -649,7 +646,7 @@ function StatisticsPortal.pieChartBreakdown(args) )} } }} - ) + } } table.insert(WrapperChildren, Html.Div{ @@ -727,10 +724,10 @@ function StatisticsPortal.earningsTable(args) return TableWidgets.Table{ sortable = true, css = {['margin-left'] = '0px', ['margin-right'] = 'auto', width = '100%'}, - children = WidgetUtil.collect( + children = { TableWidgets.TableHeader{children = StatisticsPortal._earningsTableHeader(args)}, TableWidgets.TableBody{children = tableRow} - ) + } } end @@ -777,10 +774,10 @@ function StatisticsPortal.playerAgeTable(args) local playerData = StatisticsPortal._getPlayers(args.limit, conditions:toString(), args.order) local tableHeader = TableWidgets.Row{ - children = WidgetUtil.collect( + children = { TableWidgets.CellHeader{unsortable = true, children = 'ID'}, TableWidgets.CellHeader{children = 'Age'} - ) + } } local tableRow = Array.map(playerData, function(player) @@ -790,23 +787,23 @@ function StatisticsPortal.playerAgeTable(args) local dayAge = age.yday - 1 return TableWidgets.Row{ - children = WidgetUtil.collect( + children = { TableWidgets.Cell{children = OpponentDisplay.BlockOpponent{ opponent = StatisticsPortal._toOpponent(player), showPlayerTeam = true, }}, TableWidgets.Cell{children = yearAge .. ' years, ' .. dayAge .. ' days'} - ) + } } end) return TableWidgets.Table{ sortable = true, css = {['margin-left'] = '0px', ['margin-right'] = 'auto'}, - children = WidgetUtil.collect( + children = { TableWidgets.TableHeader{children = tableHeader}, TableWidgets.TableBody{children = tableRow} - ) + } } end From 2fd4936edf2c5fc025e5f5f95d2730c50ce116a9 Mon Sep 17 00:00:00 2001 From: Steve23 Date: Fri, 4 Sep 2026 16:47:13 +0700 Subject: [PATCH 09/10] Suggestion --- lua/wikis/commons/PortalStatistics.lua | 83 +++++++++++--------------- 1 file changed, 36 insertions(+), 47 deletions(-) diff --git a/lua/wikis/commons/PortalStatistics.lua b/lua/wikis/commons/PortalStatistics.lua index d2a83b268f5..d0e53f483c9 100644 --- a/lua/wikis/commons/PortalStatistics.lua +++ b/lua/wikis/commons/PortalStatistics.lua @@ -28,6 +28,7 @@ local Tier = Lua.import('Module:Tier/Custom') local Opponent = Lua.import('Module:Opponent/Custom') local OpponentDisplay = Lua.import('Module:OpponentDisplay/Custom') +local Box = Lua.import('Module:Widget/Basic/Box') local Html = Lua.import('Module:Widget/Html') local TableWidgets = Lua.import('Module:Widget/Table2/All') local WidgetUtil = Lua.import('Module:Widget/Util') @@ -44,7 +45,7 @@ local Count = Lua.import('Module:Count') local CURRENCY_FORMAT_OPTIONS = {dashIfZero = true, displayCurrencyCode = false, formatValue = true} local TIMESTAMP = DateExt.getCurrentTimestamp() -local CURRENT_YEAR = DateExt.getYearOf(TIMESTAMP) +local CURRENT_YEAR = DateExt.getYearOf() local DATE = DateExt.toYmdInUtc(TIMESTAMP) local DEFAULT_ALLOWED_PLACES = {'1', '2', '3', '1-2', '1-3', '2-3', '2-4', '3-4'} local DEFAULT_ROUND_PRECISION = Info.defaultRoundPrecision or 2 @@ -179,13 +180,11 @@ function StatisticsPortal.coverageStatistics(args) args = args or {} args.alignSide = Logic.readBool(args.alignSide) - local boxClasses = args.alignSide and {'template-box'} or nil - local boxCss = args.alignSide and {['padding-right'] = '2em'} or nil - - return Html.Div{ + return Box{ + paddingRight = args.alignSide and '2em' or nil, children = { - Html.Div{classes = boxClasses, css = boxCss, children = StatisticsPortal.coverageTournamentTable(args)}, - Html.Div{classes = boxClasses, css = boxCss, children = StatisticsPortal.coverageMatchTable(args)} + StatisticsPortal.coverageTournamentTable(args), + StatisticsPortal.coverageMatchTable(args) } } end @@ -215,10 +214,10 @@ function StatisticsPortal.coverageMatchTable(args) return TableWidgets.Table{ caption = args.matchTableTitle or (args.alignSide and Html.Br{} or ''), - children = WidgetUtil.collect( + children = { TableWidgets.TableHeader{children = tableHeader}, TableWidgets.TableBody{children = tableRow} - ) + } } end @@ -281,10 +280,10 @@ function StatisticsPortal.coverageTournamentTable(args) return TableWidgets.Table{ caption = args.tournamentTableTitle or 'Tournaments Covered', - children = WidgetUtil.collect( + children = { TableWidgets.TableHeader{children = StatisticsPortal._coverageTournamentTableHeader(args)}, TableWidgets.TableBody{children = tableRow} - ) + } } end @@ -325,16 +324,14 @@ function StatisticsPortal._coverageTournamentTableRow(args, parameters) local tierTypeCells = Array.map(args.showTierTypes, function(tierTypeValue) local _, tierTypeData = Tier.raw(nil, tierTypeValue) - if tierTypeData then - local count = Array.reduce( - Array.map(Array.extractValues(countData), - function(typeCounts) - return Table.extract(typeCounts, tierTypeValue) or 0 - end - ), - Operator.add, 0 - ) - runningTally = runningTally + count + if tierTypeData then + local count = Array.reduce( + Array.map(Array.extractValues(countData), function(typeCounts) + return Table.extract(typeCounts, tierTypeValue) or 0 + end), + Operator.add, 0 + ) + runningTally = runningTally + count return CellComponent{align = 'right', children = LANG:formatNum(count)} end end) @@ -342,11 +339,10 @@ function StatisticsPortal._coverageTournamentTableRow(args, parameters) local otherCell if String.isNotEmpty(args.showOther) then local countOther = Array.reduce( - Array.flatten(Array.map(Array.extractValues(countData), - function(typeCounts, index) - return Table.isNotEmpty(typeCounts) and Array.extractValues(typeCounts) or 0 - end - )), Operator.add, 0) --[[@as number]] + Array.flatMap(Array.extractValues(countData), function(typeCounts) + return Table.isNotEmpty(typeCounts) and Array.extractValues(typeCounts) or 0 + end + ), Operator.add, 0) --[[@as number]] runningTally = runningTally + countOther otherCell = CellComponent{align = 'right', children = LANG:formatNum(countOther)} end @@ -543,7 +539,7 @@ function StatisticsPortal.pieChartBreakdown(args) args.multiGame = Logic.readBool(args.multiGame) args.multiMode = Logic.readBool(args.multiMode) - local WrapperChildren = { + local wrapperChildren = { Html.Div{ classes = {'template-box'}, css = { @@ -564,7 +560,7 @@ function StatisticsPortal.pieChartBreakdown(args) local games = Array.map(StatisticsPortal._isTableOrSplitOrDefault(args.customGames, GAMES), function(game) return Game.toIdentifier{game = game, useDefault = false} or game end) - table.insert(WrapperChildren, Html.Div{ + table.insert(wrapperChildren, Html.Div{ classes = {'template-box'}, css = { ['padding-right'] = '5em', @@ -579,13 +575,8 @@ function StatisticsPortal.pieChartBreakdown(args) end if args.multiMode then - table.insert(WrapperChildren, Html.Div{ - classes = {'template-box'}, - css = { - ['padding-right'] = '5em', - ['font-size'] = '85%', - ['text-align'] = 'center', - }, + table.insert(wrapperChildren, Box{ + paddingRight = '5em', children = { 'Mode Breakdown', StatisticsPortal._getPieChartData( @@ -596,15 +587,14 @@ function StatisticsPortal.pieChartBreakdown(args) end if args.hideKey then - return Html.Div{children = WrapperChildren} + return Html.Div{children = wrapperChildren} end if args.detailedKey then - table.insert(WrapperChildren, Html.Div{ - classes = {'template-box'}, + table.insert(wrapperChildren, Box{ children = StatisticsPortal.prizepoolBreakdown(args), }) - return Html.Div{children = WrapperChildren} + return Html.Div{children = wrapperChildren} end local conditions = StatisticsPortal._returnBaseConditions() @@ -649,13 +639,12 @@ function StatisticsPortal.pieChartBreakdown(args) } } - table.insert(WrapperChildren, Html.Div{ - classes = {'template-box'}, - css = {['padding-right'] = '1em'}, + table.insert(wrapperChildren, Box{ + paddingRight = '1em', children = summaryTable, }) - return Html.Div{children = WrapperChildren} + return Html.Div{children = wrapperChildren} end ---@param args table? @@ -1338,7 +1327,7 @@ function StatisticsPortal._removeCategories(categoryNames, seriesData) local truthValue = Array.all(Array.map(seriesData, function(_, index) return seriesData[index][catIndex] end), function(value) return value == 0 - end) + end) if not truthValue then lastNotEmpty = catIndex end @@ -1361,8 +1350,8 @@ function StatisticsPortal._removeCategories(categoryNames, seriesData) seriesData = Array.map(seriesData, function(_, index) return Array.filter(seriesData[index], function(_, catIndex) return Logic.readBool(isEmptyCategory[catIndex]) - end) end) + end) return categoryNames, seriesData end @@ -1445,7 +1434,7 @@ function StatisticsPortal._isTableOrSplitOrDefault(input, default) elseif String.isEmpty(input) then return default or {} end - return Array.parseCommaSeparatedString(input, ',') + return Array.parseCommaSeparatedString(input) end @@ -1457,7 +1446,7 @@ function StatisticsPortal._returnCustomYears(args) local defaultYearTable = Array.range(args.startYear, CURRENT_YEAR) if String.isNotEmpty(args.customYears) then yearTable = Array.map( - StatisticsPortal._isTableOrSplitOrDefault(args.customYears), + StatisticsPortal._isTableOrSplitOrDefault(args.customYears), function(tier) return tonumber(tier) end From 520f8c13752f3837de8a06ae59d078c550568502 Mon Sep 17 00:00:00 2001 From: Steve23 Date: Fri, 4 Sep 2026 16:55:42 +0700 Subject: [PATCH 10/10] keep the args.alignside --- lua/wikis/commons/PortalStatistics.lua | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/lua/wikis/commons/PortalStatistics.lua b/lua/wikis/commons/PortalStatistics.lua index d0e53f483c9..3668a18df5f 100644 --- a/lua/wikis/commons/PortalStatistics.lua +++ b/lua/wikis/commons/PortalStatistics.lua @@ -180,13 +180,21 @@ function StatisticsPortal.coverageStatistics(args) args = args or {} args.alignSide = Logic.readBool(args.alignSide) - return Box{ - paddingRight = args.alignSide and '2em' or nil, - children = { - StatisticsPortal.coverageTournamentTable(args), - StatisticsPortal.coverageMatchTable(args) - } + local statsChildren = { + StatisticsPortal.coverageTournamentTable(args), + StatisticsPortal.coverageMatchTable(args) } + + if args.alignSide then + return Box{ + paddingRight = '2em', + children = statsChildren, + } + else + return Html.Div{ + children = statsChildren, + } + end end