text:
function New-ConsoleTable {
    param(
            [int]$columns = 0,
            [int]$rows = 0,
            [int]$defaultCellWidth = 10,
            [int]$defaultCellVerticalPadding = 0,
            [switch]$NoSave = $false,
            [switch]$NoBorders = $false,
            [switch]$NoHeader = $false
        )

        if($rows -lt 0){
            throw("rows must be a positive number")
        }
        if($columns -lt 0){
            throw("columns must be a positive number")
        }
        if($defaultCellWidth -lt 1){
            throw("max cell width must be greater than 0")
        }
        if($defaultCellVerticalPadding -lt 0){
            throw("cell height padding must be greater than or equal to 0")
        }

        #theobject this function will return
        $tableObj = New-Object System.Management.Automation.PSObject

        ###### START PROPERTIES #######

        $rowsObj = New-Object System.Collections.ArrayList
        $tableObj | Add-Member -MemberType NoteProperty -Name Rows -Value $rowsObj

        $columnsObj = New-Object System.Collections.ArrayList
        $tableObj | Add-Member -MemberType NoteProperty -Name Columns -Value $columnsObj

        $tableObj | Add-Member -MemberType NoteProperty -Name defaultCellWidth -Value $defaultCellWidth
        $tableObj | Add-Member -MemberType NoteProperty -Name defaultCellVerticalPadding -Value $defaultCellVerticalPadding
        $tableObj | Add-Member -MemberType NoteProperty -Name SaveData -Value (!($NoSave))
        $tableObj | Add-Member -MemberType NoteProperty -Name Borders -Value (!($NoBorders))
        $tableObj | Add-Member -MemberType NoteProperty -Name Header -Value (!($NoHeader))

        #we only want 1 table for each table object
        #this will increment when create() method is called
        #an exception will be thrown on subsequent calls to create()
        $tableObj | Add-Member -MemberType NoteProperty -Name Instances -Value 0

        $cellsObj = New-Object System.Collections.ArrayList
        $tableObj | Add-Member -MemberType NoteProperty -Name Cells -Value $cellsObj

        #create Position object. This is the position of the table when it is created
        #This is used to remember the cursor position when the table is updated
        $positionObj = New-Object System.Management.Automation.PSObject
        $positionObj | Add-Member -MemberType NoteProperty -Name X -Value $null
        $positionObj | Add-Member -MemberType NoteProperty -Name Y -Value $null

        $tableObj | Add-Member -MemberType NoteProperty -Name Position -Value $positionObj

        $tableObj | Add-Member -MemberType NoteProperty -Name BottomOfTable -Value $null

        #create cursorPosition object.
        #This is used to remember the last cursor position when the table is updated
        $cursorPosition = New-Object System.Management.Automation.PSObject
        $cursorPosition | Add-Member -MemberType NoteProperty -Name X -Value $null
        $cursorPosition | Add-Member -MemberType NoteProperty -Name Y -Value $null

        $tableObj | Add-Member -MemberType NoteProperty -Name CursorPosition -Value $cursorPosition

        ###### END PROPERTIES #######

        ###### START METHODS #######

        $tableObj | Add-Member -MemberType ScriptMethod -Name AddRow -Value {
            param ($verticalpadding = $null)

            if($Host.Version.ToString() -match "^1"){
                $verticalpadding = $args[0]
            }

            #msgbox "DEBUG" "validating..."

            #validation
            if($this.Instances -gt 0){
                #throw "cannot add rows after the table is written"
            }
            if($verticalpadding -eq $null){
                [int]$verticalpadding = $this.defaultCellVerticalPadding
            }
            elseif([int]$verticalpadding -lt 0){
                throw "verticalpadding must be a positive number (including 0)"
            }

            #msgbox "DEBUG" "creating row obj..."

            [int]$verticalpadding = $verticalpadding

            $singleRowObj = New-Object System.Management.Automation.PSObject
            $singleRowObj | Add-Member -MemberType NoteProperty -Name VerticalPadding -Value $verticalpadding

            $rowNum = $this.rows.Add($singleRowObj)

            $userFriendRowNum = $rowNum + 1
            #msgBox "DEBUG" "adding array list row num: $rowNum"
            #msgBox "DEBUG" "real row number should be: $userFriendRowNum"

            #if the table was already written, we need to write the row to the console
            if($this.Instances -gt 0){
                #throw "cannot add rows after the table is written"

                #msgbox "DEBUG" "adding row after table written"

                #msgbox "DEBUG" "getting bottom of table..."

                $BottomOfTable = $this.BottomOfTable

                #msgbox "DEBUG" ("curbottomOfTable: $BottomOfTable")

                $NewBottomOfTable = $this.position.y + $this.get_Height()

                #msgbox "DEBUG" ("newbottomOfTable: $NewBottomOfTable")

                #get Empty Cell Text
                $emptyCellText = $this.CreateEmptyCellText()

                #get Row Break Text
                $rowBreakObj = $this.CreateRowBreakText()
                $headerRowBreak = $rowBreakObj.HeaderRowBreak
                $rowBreak = $rowBreakObj.rowBreak

                #msgbox "DEBUG" "creating cell objects..."

                #create cell objects
                for($j = 1; $j -le $this.columns.count; $j++){
                    $this.CreateCellObj($j,$userFriendRowNum)
                }

                #set cell positions
                #msgBox "DEBUG" "settings cellpositions for row: $userFriendRowNum"
                $this.SetCellPositionsByRow($userFriendRowNum)

                #msgbox "DEBUG" "getting buffer info..."

                $bufferHeight = $host.ui.rawui.CursorPosition.Y
                $bufferWidth = $host.ui.rawui.BufferSize.Width
                #msgBox "DEBUG" "bufferHeight: $bufferHeight`nbufferWidth: $bufferWidth"
                #rectangle args = left , top , right , bottom
                #$rec = new-object System.Management.Automation.Host.Rectangle 0,0,($bufferWidth - 1),$bufferHeight

                $recLeft = 0
                $recTop = $bottomOfTable
                $recRight = $bufferWidth - 1
                $recBottom = $bufferHeight

                $rec = new-object System.Management.Automation.Host.Rectangle $recLeft,$recTop,$recRight,$recBottom
                $buffer = $host.ui.rawui.GetBufferContents($rec)

                #msgBox "DEBUG" ("rec: $recLeft , $recTop, $recRight , $recBottom")

                $heightOfRec = $recBottom - $recTop

                #msgbox "DEBUG" "creating text builders..."
                #create TextBuilder object of text that was grabbed from the console
                # Iterate through the lines in the console buffer.
                # Initialize string builder.
                $eraser = new-object system.text.stringbuilder
                $textBuilder = new-object system.text.stringbuilder
                for($i = 0; $i -lt $heightOfRec; $i++)
                {
                    for($j = 0; $j -lt $bufferWidth; $j++)
                    {
                        $BufferCell = $buffer[$i,$j]
                        $textBuilder.Append($BufferCell.Character) | Out-Null
                        $eraser.Append(" ") | Out-Null
                    }
                    $textBuilder.Append("`r`n") | Out-Null
                    $eraser.Append("`r`n") | Out-Null
                }

                #msgbox "DEBUG" ("contents:`n`""+$textBuilder.toString()+"`"")

                #msgbox "DEBUG" "erasing buffer after table..."

                #erase buffer after table
                # Initialize string builder.

                [Console]::SetCursorPosition(0,$bottomOfTable)

                #msgBox "DEBUG" $erasor.length

                if($eraser.length -gt 0){
                    $bufferSize = $Host.UI.RawUI.BufferSize
                    $bufferSize.width++
                    $Host.UI.RawUI.BufferSize = $bufferSize
                    #msgBox "DEBUG" ("eraserstring: `""+$eraser.toString()+"`"")
                    [Console]::Write($eraser.toString())
                    $bufferSize = $Host.UI.RawUI.BufferSize
                    $bufferSize.width--
                    $Host.UI.RawUI.BufferSize = $bufferSize

                    [Console]::SetCursorPosition(0,$bottomOfTable)
                }

                #msgbox "DEBUG" "Adding Table row..."
#                Write-Host "|                    |                    |" -ForegroundColor Magenta
#                Write-Host "+--------------------+--------------------+" -ForegroundColor Magenta

                $row = $this.rows[$rowNum]
                #the height of the row is 2x padding + 1
                #example - padding 0
                #----
                #<content>
                #----
                #as you can see, rowheight = (0*2)+1 = 1
                #example 2 - padding 1
                #----
                #
                #<content>
                #
                #----
                #as you can see rowheight = (1*2)+1 = 3
                $rowHeight = ($row.VerticalPadding * 2) + 1

                $this.cells | where { $_.row -eq $rowNum } | %{

                    $YOffset = $this.position.y
                    #we start calculating the Y position after the border (if there is one)
                    if($this.borders -eq $true){
                         $YOffset++
                    }

                    #loop through  all rows before this one, and get the row height of each
                    #add these values to $topMostPositionOfCell
                    for($i = 0; $i -lt ($rowNum - 1); $i++){
                        $YOffset += ($this.rows[$i].verticalpadding * 2) + 1
                        #the following only applies to rows after the 1st row
                        if($rowNum -gt 1){
                            #if borders are enabled, each row will have a top border
                            #add 1 X <Number of Rows before this one> to $topMostPositionOfCell
                            if($this.borders -eq $true){
                                $YOffset++
                            }
                        }
                    }

                    #the "if borders eq $true" above will take care of borders on every row
                    #but if the "header" switch is enabled,
                    #we will have 1 "border" below row 1 (above row 2), and no additional borders
                    #so we must offset each row after the first by 1
                    if($rowNum -gt 1 -and $this.borders -eq $false -and $this.header -eq $true){
                        $YOffset++
                    }

                    #once we know where the very top of the cell is, we need to know the write position
                    #the write position (in this version) is the vertically aligned to the middle of the cell
                    #thus, we need to determine the row height, divide by 2, and floor it
                    #note: writepos 0 = the top of the cell
                    #eg. rowheight 3 (padding1) - writePos = 3/2 rounded down = 1
                    if($rowHeight -gt 1){
                        $writePos = [Math]::Floor($rowHeight / 2)
                    }else{
                        $writePos = 0
                    }

                    $yPosOfCell = $YOffset + $writePos

                    $_.position.y = $yPosOfCell
                }

                for($i = 0; $i -lt $rowHeight; $i++){

                    [Console]::Write($emptyCellText+"`n")

                }

                if($rowNum -eq 1 -and $this.header -eq $true -and $this.borders -eq $false){
                    [Console]::Write($headerRowBreak+"`n")
                }elseif($this.borders -eq $true){
                    [Console]::Write($rowBreak+"`n")
                }

                #msgbox "DEBUG" "setting cursor to new bottom: $NewBottomOfTable"

                [Console]::SetCursorPosition(0,$NewBottomOfTable)

                #msgbox "DEBUG" "Writing saved console contents..."

                #Write what was grabbed back to the console
                $bufferSize = $Host.UI.RawUI.BufferSize
                $bufferSize.width++
                $Host.UI.RawUI.BufferSize = $bufferSize
                [Console]::Write($textBuilder.toString())
                $bufferSize = $Host.UI.RawUI.BufferSize
                $bufferSize.width--
                $Host.UI.RawUI.BufferSize = $bufferSize

                #updateBottomOfTable
                $this.BottomOfTable = $NewBottomOfTable

                [Console]::SetCursorPosition(0,$host.ui.rawui.CursorPosition.Y)

                #msgBox "DEBUG" "endof dynamic addRow"

            }
        }

        $tableObj | Add-Member -MemberType ScriptMethod -Name RemoveRow -Value {
            #this function always removes the last row in the table (it is the opposite of the "addrow" function)

            $rowToRemove = $this.rows.count-1

            $row = $this.rows[$rowToRemove]
            #the height of the row is 2x padding + 1
            #example - padding 0
            #----
            #<content>
            #----
            #as you can see, rowheight = (0*2)+1 = 1
            #example 2 - padding 1
            #----
            #
            #<content>
            #
            #----
            #as you can see rowheight = (1*2)+1 = 3
            $rowHeight = ($row.VerticalPadding * 2) + 1

            #removeCells
            $cellsToRemove = @()
            for($i = 0; $i -lt $this.cells.count; $i++){
                if($this.cells[$i].row -eq $rowToRemove){
                    $cellsToRemove += $i
                }
            }
            foreach($cell in $cellsToRemove){
                $this.cells.removeAt($cell)
            }

            #removeRow
            $this.rows.RemoveAt($rowToRemove)

            #if the table was already written, we need to remove the row text from the console
            if($this.Instances -gt 0){
                #msgbox "DEBUG" "removing row after table written"

                #msgbox "DEBUG" "getting bottom of table..."

                $BottomOfTable = $this.BottomOfTable

                #msgbox "DEBUG" ("curbottomOfTable: $BottomOfTable")

                #new bottom of table position = Top of Table position + Height of Table
                #we already removed the backend rows/cells that are used in the get_Height() calculations
                $NewBottomOfTable = $this.position.y + $this.get_Height()

                #msgbox "DEBUG" ("newbottomOfTable: $NewBottomOfTable")

                #msgbox "DEBUG" "getting buffer info..."

                $bufferHeight = $host.ui.rawui.CursorPosition.Y
                $bufferWidth = $host.ui.rawui.BufferSize.Width
                #msgBox "DEBUG" "bufferHeight: $bufferHeight`nbufferWidth: $bufferWidth"
                #rectangle args = left , top , right , bottom
                #$rec = new-object System.Management.Automation.Host.Rectangle 0,0,($bufferWidth - 1),$bufferHeight

                $recLeft = 0
                $recTop = $bottomOfTable
                $recRight = $bufferWidth - 1
                $recBottom = $bufferHeight

                $rec = new-object System.Management.Automation.Host.Rectangle $recLeft,$recTop,$recRight,$recBottom
                $buffer = $host.ui.rawui.GetBufferContents($rec)

                #msgBox "DEBUG" ("rec: $recLeft , $recTop, $recRight , $recBottom")

                $heightOfRec = $recBottom - $recTop

                #msgbox "DEBUG" "creating text builders..."
                #create TextBuilder object of text that was grabbed from the console
                # Iterate through the lines in the console buffer.
                # Initialize string builder.
                $eraser = new-object system.text.stringbuilder
                $textBuilder = new-object system.text.stringbuilder

                #calculate the height of what we will be erasing from the table
                $heightToEraseFromTable = $BottomOfTable - $NewBottomOfTable

                for($i = 0; $i -lt ($heightOfRec + $heightToEraseFromTable); $i++)
                {
                    for($j = 0; $j -lt $bufferWidth; $j++)
                    {
                        $BufferCell = $buffer[$i,$j]
                        $textBuilder.Append($BufferCell.Character) | Out-Null
                        $eraser.Append(" ") | Out-Null
                    }
                    $textBuilder.Append("`r`n") | Out-Null
                    $eraser.Append("`r`n") | Out-Null
                }

                #msgbox "DEBUG" ("contents:`n`""+$textBuilder.toString()+"`"")

                #msgbox "DEBUG" "erasing buffer after table..."

                #erase buffer after table
                # Initialize string builder.

                [Console]::SetCursorPosition(0,$NewBottomOfTable)

                #msgBox "DEBUG" $erasor.length

                if($eraser.length -gt 0){
                    $bufferSize = $Host.UI.RawUI.BufferSize
                    $bufferSize.width++
                    $Host.UI.RawUI.BufferSize = $bufferSize
                    #msgBox "DEBUG" ("eraserstring: `""+$eraser.toString()+"`"")
                    [Console]::Write($eraser.toString())
                    $bufferSize = $Host.UI.RawUI.BufferSize
                    $bufferSize.width--
                    $Host.UI.RawUI.BufferSize = $bufferSize

                    [Console]::SetCursorPosition(0,$NewBottomOfTable)
                }

                #msgbox "DEBUG" "Writing saved console contents..."

                #Write what was grabbed back to the console
                $bufferSize = $Host.UI.RawUI.BufferSize
                $bufferSize.width++
                $Host.UI.RawUI.BufferSize = $bufferSize
                [Console]::Write($textBuilder.toString())
                $bufferSize = $Host.UI.RawUI.BufferSize
                $bufferSize.width--
                $Host.UI.RawUI.BufferSize = $bufferSize

                #updateBottomOfTable
                $this.BottomOfTable = $NewBottomOfTable

                [Console]::SetCursorPosition(0,$host.ui.rawui.CursorPosition.Y - $heightToEraseFromTable)

                #msgBox "DEBUG" "endof dynamic removeRow"

            }
        }

        $tableObj | Add-Member -MemberType ScriptMethod -Name AddColumn -Value {
            param ($width = $null)

            if($Host.Version.ToString() -match "^1"){
                $width = $args[0]
            }

            #validation
            if($this.Instances -gt 0){
                #throw "cannot add columns after the table is written"
            }

            if($width -eq $null){
                [int]$width = $this.defaultCellWidth
            }
            elseif([int]$width -lt 1){
                throw "width must be greater than 0"
            }

            [int]$width = $width

            $singleColumnObj = New-Object System.Management.Automation.PSObject
            $singleColumnObj | Add-Member -MemberType NoteProperty -Name Width -Value $width

            $this.columns.add($singleColumnObj) | Out-Null

            #if the table was already written, we need to write the column to the console
            if($this.Instances -gt 0){
                #NEEDS TO BE COMPLETED.
            }
        }

        $tableObj | Add-Member -MemberType ScriptMethod -Name UpdateCell -Value {
            param([int]$column,[int]$row,[string]$value = "")

            if($Host.Version.ToString() -match "^1"){
                [int]$column = $args[0]
                [int]$row = $args[1]
                [string]$value = $args[2]
            }

            if($this.Instances -lt 1){
                throw "can't update cell contents until table is written"
            }

            #general validation
            if($row -lt 1){ throw "row must be greater than 0"}
            if($column -lt 1){ throw "column must be greater than 0"}

            #verify cell doesn't fall outside of the scope of the table
            if($row -gt $this.rows.count -or $column -gt $this.columns.count){
                throw "requested position is outside the scope of the table"
            }

            $MaxCellWidth = $this.columns[$column - 1].width

            if($this.SaveData -eq $true){
                $this.cells | where { $_.row -eq $row -and $_.column -eq $column } | %{$_.value = $value}
            }

            $theCell = $this.cells | where { $_.row -eq $row -and $_.column -eq $column }

            $CursorX = $theCell.position.x
            $CursorY = $theCell.position.y

            if(isNumeric $value){
                #"int"
                #If the value is a number.. pad left
                #example output:
                #|   12.01|
                #msgBox "debug" ("value length: "+$value.toString().length+"`nCellWidth: "+$MaxCellWidth)
                if($value.toString().length -gt $MaxCellWidth){
                    #msgbox "debug - number bigger than cell width" ($value+"`nLength: "+$value.toString().length+"`nCellWidth: "+$MaxCellWidth)
                    if(([Int64]$value).toString().length -gt $MaxCellWidth){
                        #msgBox "debug - int is bigger than cell width" (([Int64]$value).toString()+"`nLength: "+([Int64]$value).toString().length+"`nCellWidth: "+$MaxCellWidth)
                        $EPrecision = $MaxCellWidth - 7
                        if($EPrecision -lt 0){$EPrecision = 0}
                        #msgBox "eprecision" $EPrecision
                        $formatString = "{0:E$EPrecision}"
                        [string]$value = [string]::Format($formatString,[double]$value)
                    }
                }
                $writeValue = ((truncate-string $value $MaxCellWidth).padLeft($MaxCellWidth," "))
            }else{
                #"not an integer"
                #If the value is text.. pad right
                #example output:
                #|asdf   |
                $writeValue = ((truncate-string $value $MaxCellWidth).padRight($MaxCellWidth," "))
            }

            $this.RememberCursorPosition()

            #msgBox "DEBUG" "X: $CursorX, Y: $CursorY"
            [Console]::SetCursorPosition($CursorX,$CursorY)
            #msgBox "DEBUG" "About to Write: `n`"$writeValue`""
            [Console]::Write($writeValue)

            $this.ReturnCursor()
        }

        $tableObj | Add-Member -MemberType ScriptMethod -Name GetCellValue -Value {
            param([int]$column,[int]$row)

            if($Host.Version.ToString() -match "^1"){
                [int]$column = $args[0]
                [int]$row = $args[1]
            }

            if($this.saveData -eq $false){
                throw "noSave switch was used for this table, data is not saved"
            }

            if($this.Instances -lt 1){
                throw "cells won't have content until table is written"
            }

            #general validation
            if($row -lt 1){ throw "row must be greater than 0"}
            if($column -lt 1){ throw "column must be greater than 0"}

            #verify cell doesn't fall outside of the scope of the table
            if($row -gt $this.rows.count -or $column -gt $this.columns.count){
                throw "requested position is outside the scope of the table"
            }

            return $this.cells | where { $_.row -eq $row -and $_.column -eq $column } | %{$_.value}

        }

        $tableObj | Add-Member -MemberType ScriptMethod -Name CreateCellObj -Value {
            param ([int]$column,[int]$row)

            if($Host.Version.ToString() -match "^1"){
                [int]$column = $args[0]
                [int]$row = $args[1]
            }

            #general validation
            if($row -lt 1){ throw "row must be greater than 0"}
            if($column -lt 1){ throw "column must be greater than 0"}

            #verify cell doesn't fall outside of the scope of the table
            if($row -gt $this.rows.count -or $column -gt $this.columns.count){
                throw "requested position is outside the scope of the table"
            }

            $cell = New-Object System.Management.Automation.PSObject
            $cell | Add-Member -MemberType NoteProperty -Name Row -Value $row
            $cell | Add-Member -MemberType NoteProperty -Name Column -Value $column

            $cellPosObj = New-Object System.Management.Automation.PSObject
            $cellPosObj | Add-Member -MemberType NoteProperty -Name X -Value 0
            $cellPosObj | Add-Member -MemberType NoteProperty -Name Y -Value 0

            $cell | Add-Member -MemberType NoteProperty -Name position -Value $cellPosObj
            $cell | Add-Member -MemberType NoteProperty -Name value -Value ""

            $this.cells.add($cell) | Out-Null
        }

        $tableObj | Add-Member -MemberType ScriptMethod -Name RememberCursorPosition -Value {
            $this.CursorPosition.X = $host.UI.RawUI.CursorPosition.X
            $this.CursorPosition.Y = $host.UI.RawUI.CursorPosition.Y
        }

        $tableObj | Add-Member -MemberType ScriptMethod -Name ReturnCursor -Value {
            [Console]::SetCursorPosition(0,$this.CursorPosition.Y)
        }

        $tableObj | Add-Member -MemberType ScriptMethod -Name Clear -Value {
            $this.cells | %{$this.updateCell($_.column,$_.row),$null}
        }

        $tableObj | Add-Member -MemberType ScriptMethod -Name get_Height -Value {

            if($this.Instances -lt 1){
                throw "can't get table height until it is written"
            }

            $tableHeight = 0

            #msgBox "DEBUG" "getHeightCalled"

            #add row heights
            $i = 0
            foreach($row in $this.rows){
                $rowHeight = ($row.verticalPadding * 2) + 1
                $tableHeight += $rowHeight
                $i++
                #msgbox "DEBUG" ("Adding row $i`nRowHeight: "+$rowHeight+"`nNewTableHeight: "+$tableHeight)
            }
            #add height created from borders
            if($this.borders -eq $true){
                #msgBox "DEBUG" "borders TRUE"
                #msgBox "DEBUG" ("rowCount"+$this.rows.count)
                #msgBox "DEBUG" ("rowcount + 1 = "+($this.rows.count + 1))
                $tableHeight += $this.rows.count + 1
                #msgBox "DEBUG" "newTableHeight: $tableHeight"
            #add height created from the header row lower border
            }elseif($this.header -eq $true){
                #msgBox "DEBUG" "header TRUE"
                $tableHeight++
                #msgBox "DEBUG" "newTableHeight: $tableHeight"
            }

            #msgBox "DEBUG" "finalTableHeight: $tableHeight"

            return $tableHeight

        }

        $tableObj | Add-Member -MemberType ScriptMethod -Name get_Width -Value {

            if($this.Instances -lt 1){
                throw "can't get table width until it is written"
            }

            $tableWidth = 0

            foreach($column in $this.columns){
                $tableWidth += $column.width
            }

            if($this.borders -eq $true){
                $tableWidth++
                foreach($column in $this.columns){
                    $tableWidth++
                }
            }
        }

        $tableObj | Add-Member -MemberType ScriptMethod -Name CreateRowBreakText -Value {
            #create rowBreak text
            #eg
            # +------+--+
            #note: there is no rowBreaktext if -noBorders is enabled

            #we will create a "header row break" in the case the -noBorders is enabled and -noHeaders is disabled
            $headerRowBreak = ""
            $headerRowColIntersect = " "
            $headerHorizontalBorder = "-"

            $rowColIntersect = "+"
            $horizontalBorder = "-"
            if($this.borders -eq $true){
                $rowBreak = $rowColIntersect
            }else{
                $rowBreak = ""
            }
            foreach($column in $this.columns){

                $Cellwidth = $column.width

                for($i = 0; $i -lt $Cellwidth; $i++){
                    $headerRowBreak += $headerHorizontalBorder
                    $rowBreak += $horizontalBorder
                }
                $headerRowBreak += $headerRowColIntersect
                $rowBreak += $rowColIntersect
            }

            $rowBreakTextObj = New-Object System.Management.Automation.PSObject
            $rowBreakTextObj | Add-Member -MemberType NoteProperty -Name HeaderRowBreak -Value $headerRowBreak
            $rowBreakTextObj | Add-Member -MemberType NoteProperty -Name RowBreak -Value $rowBreak

            return $rowBreakTextObj
        }

        $tableObj | Add-Member -MemberType ScriptMethod -Name CreateEmptyCellText -Value {

            #create single line emptyCell text
            #while we are in this loop and figuring out widths and all that, we can assign the POS X value for each cell in each column
            #eg
            # |      |  |

            if($this.borders -eq $true){
                $verticalBorder = "|"
                #we start our string with the vertical border
                $emptyCellText = $verticalBorder
            }else{
                $verticalBorder = " "
                #we start our string with the vertical border. in this case, there is no border
                $emptyCellText = ""
            }
            $colNum = 1

            foreach($column in $this.columns){

                $Cellwidth = $column.width

                for($i = 0; $i -lt $Cellwidth; $i++){
                    $emptyCellText += " "
                }

                $emptyCellText += $verticalBorder

                $colNum++
            }

            return $emptyCellText
        }

        $tableObj | Add-Member -MemberType ScriptMethod -Name SetCellPositionsByRow -Value {
            param([int]$rowNum)

            if($Host.Version.ToString() -match "^1"){
                [int]$rowNum = $args[0]
            }

            #msgBox "DEBUG" "setCellPositionsByRow called for rowNum $rowNum"

            #calculate and set cell positions
            $this.cells | where { $_.row -eq $rowNum } | %{

                ############
                # SET X POSITION
                ############
                $colNum = $_.column

                $xPosOfCell = $this.position.x
                if($this.borders -eq $true){
                    $xPosOfCell++
                }

                for($i = 0; $i -lt ($colNum - 1); $i++){

                    $xPosOfCell += $this.columns[$i].width
                    $xPosOfCell += 1

                }

                $_.position.x = $xPosOfCell

                ############
                # / SET X POSITION
                ############

                ############
                # SET Y POSITION
                ############
                $YOffset = $this.position.y
                #msgBox "DEBUG" "starting y position: $YOffset"
                #we start calculating the Y position after the border (if there is one)
                if($this.borders -eq $true){
                     $YOffset++
                     #msgBox "DEBUG" "borders true, new y: $YOffset"
                }

                #loop through  all rows before this one, and get the row height of each
                #add these values to $topMostPositionOfCell
                for($i = 0; $i -lt ($rowNum - 1); $i++){
                    $YOffset += ($this.rows[$i].verticalpadding * 2) + 1
                    #the following only applies to rows after the 1st row
                    if($rowNum -gt 1){
                        #if borders are enabled, each row will have a top border
                        #add 1 X <Number of Rows before this one> to $topMostPositionOfCell
                        if($this.borders -eq $true){
                            $YOffset++
                        }
                    }
                }

                #the "if borders eq $true" above will take care of borders on every row
                #but if the "header" switch is enabled,
                #we will have 1 "border" below row 1 (above row 2), and no additional borders
                #so we must offset each row after the first by 1
                if($rowNum -gt 1 -and $this.borders -eq $false -and $this.header -eq $true){
                    $YOffset++
                }

                #once we know where the very top of the cell is, we need to know the write position
                #the write position (in this version) is the vertically aligned to the middle of the cell
                #thus, we need to determine the row height, divide by 2, and floor it
                #note: writepos 0 = the top of the cell
                #eg. rowheight 3 (padding1) - writePos = 3/2 rounded down = 1
                if($rowHeight -gt 1){
                    $writePos = [Math]::Floor($rowHeight / 2)
                }else{
                    $writePos = 0
                }

                $yPosOfCell = $YOffset + $writePos

                $_.position.y = $yPosOfCell

                ############
                # / SET Y POSITION
                ############

                #msgBox "DEBUG" ("Y: "+$_.position.y+",X: "+$_.position.x)
            }
        }

        $tableObj | Add-Member -MemberType ScriptMethod -Name Write -Value {

            $rows = $this.rows.count
            $columns = $this.columns.count
            $MaxCellWidth = $this.defaultCellWidth
            $cellHeightPadding = $this.defaultCellVerticalPadding

            if($this.Instances -lt 1){
                if($rows -lt 1){
                    throw "cannot write a table without rows"
                }
                if($columns -lt 1){
                    throw "cannot write a table without columns"
                }
                $this.Instances = 1
            }else{
                throw "only 1 table allowed per object"
            }

            #capture position of the cursor. This is where the table will write to
            $this.position.X = $host.UI.RawUI.CursorPosition.X
            $this.position.Y = $host.UI.RawUI.CursorPosition.Y

            $maxWidth = $columns + ($columns * $maxCellwidth) + 1

            #adjust buffer size if it's too small to display the table
            $bufferSize = $Host.UI.RawUI.BufferSize
            if($bufferSize.Width -le $maxWidth){
                $bufferSize.Width = $maxWidth + 1
                $Host.UI.RawUI.BufferSize = $bufferSize
            }

            #create cell objects
            for($i = 1; $i -le $rows; $i++){

                for($j = 1; $j -le $columns; $j++){

                    $this.CreateCellObj($j,$i)
                }
            }

            #get Empty Cell Text (full table)
            $emptyCellText = $this.CreateEmptyCellText()

            #get Row Break Text (full table)
            $rowBreakObj = $this.CreateRowBreakText()
            $headerRowBreak = $rowBreakObj.HeaderRowBreak
            $rowBreak = $rowBreakObj.rowBreak

            #write out the table
            if($this.borders -eq $true){
                [Console]::Write($rowBreak+"`n")
            }
            $rowNum = 1
            foreach($row in $this.rows){

                #the height of the row is 2x padding + 1
                #example - padding 0
                #----
                #<content>
                #----
                #as you can see, rowheight = (0*2)+1 = 1
                #example 2 - padding 1
                #----
                #
                #<content>
                #
                #----
                #as you can see rowheight = (1*2)+1 = 3
                $rowHeight = ($row.VerticalPadding * 2) + 1

                #setCellPositions for this row
                $this.SetCellPositionsByRow($rowNum)

                for($i = 0; $i -lt $rowHeight; $i++){

                    [Console]::Write($emptyCellText+"`n")

                }
                if($rowNum -eq 1 -and $this.header -eq $true -and $this.borders -eq $false){
                    [Console]::Write($headerRowBreak+"`n")
                }elseif($this.borders -eq $true){
                    [Console]::Write($rowBreak+"`n")
                }
                $rowNum++
            }

            #setting bottom of table
            $this.BottomOfTable = $this.position.y + $this.get_Height()
            #msgBox "DEBUG" ("bottomOfTableSet: "+$this.BottomOfTable)
        }

        ###### END METHODS #######

        ###### Other Initializations #####

        for($i = 0; $i -lt $rows; $i++){
            $tableObj.AddRow()
        }

        for($i = 0; $i -lt $columns; $i++){
            $tableObj.AddColumn()
        }

        ###### End Other Initializations #####

        return $tableObj
}

function isNumeric {
    param([string]$value)
    [reflection.assembly]::LoadWithPartialName("'Microsoft.VisualBasic") | out-null
    return [Microsoft.VisualBasic.Information]::isNumeric($value)
}

function truncate-string([string]$value, [int]$length)
{
    if ($value.Length -gt $length) { $value.Substring(0, $length) }
    else { $value }
}

redpajama_set_name: RedPajamaGithub


When we poured concrete in our barn, the contractor said there are two kinds: Concrete that has cracked, and concrete that will crack. Apparently if we just change the word cracked to hacked, the same can be said for WordPress websites.
Knowing this, why was I surprised when back in January my site was invaded by some beastly no-life? Someone who could've easily applied such skills to things more productive. Upset? You bet!
According to Sucuri Remediation Group, of the 34,371 infected websites it analyzed in 2017, 83% were built on the WordPress. Of course, there are statistical considerations: WordPress is now powering 30% of the internet and the number of sites on its platform increases every year. Even though I sometimes contemplate moving mine somewhere else, I'm always drawn back to the ease and convenience of WordPress.
So, if I'm not setting up shop elsewhere, then I personally must take responsibility for my site's well-being. The Sucuri team agrees. It's research showed hackings were more the fault the webmaster than the WordPress framework.
With that in mind, here are a few of the practices I've taken on with vigor.
As of this month (July 2018), Google Chrome has begun flagging all HTTP sites as insecure. To avoid this, I moved my website to HTTPS by installing an SSL Certificate (Secure Sockets Layer). This acts as an encrypted security between the web server and browser.
I purchased the SSL Certificate from my host provider and installed it from the AutoInstallSSL in my cPanel (your host provider can help you with this). I then went into my WordPress settings and changed my website address from HTTP to HTTPS. I also installed the WordPress plugin Really Simple SSL, which automatically made the necessary configuration changes to all my site's pages.
Overall, the process was fairly straightforward.
There are plenty of effective WordPress plugins that provide security from known threats. I chose Wordfence and use it to regularly scan my files for infection. It sends me an email whenever I log into my website administration and would also email if anyone else did, like say a hacker. It also notifies me when plugins need to be updated.
Speaking of plugins: I'm keeping them current!
Sucuri's research shows the most common way hackers get into WordPress sites is through out-of-date components: plugins, themes and installations. I'm embarrassed to say I was guilty as charged. Call it a classic case of the shoemaker's children having no shoes—while I was busy keeping my client's websites current, I let my own fall behind.
Now I obsessively update my plugins. I'm demanding the same of developers as well—if a plugin or theme hasn't been refreshed by its creator in the past 12 months, I won't take the chance of using it. And if I'm not using it, I delete it. As for my own creations, I previously had test folders that sometimes sat empty and unused. Not anymore. Basically, I've decluttered my files as thoroughly as Marie Kondo does her closets.
And now…drumroll, please…may I present Adunate's New Website!
As I said, in the end things worked out well for my website. After weeks of back and forth with my host provider and continued cleansing of my files, I finally just scratched the whole thing and rebuilt it. This proved to be a good thing—I was long past giving my site its biennial overhaul and it was ready for a new look. It now comes with an https in its address and a cute little padlock.
I was also able to catch up on the latest and greatest of WordPress; including StudioPress, producers of WP themes I've purchased and customized. This, of course, enables me to better serve my clients.
Best of all, each time I redo my site I get a greater sense of the real Adunate—and that's who you get when you hire me as your contractor. I'd love to help show the real you in your website.
Thanks, Rhonda! My own fault, I got busy and slacked off.


Space Taxi is a great gaming app with fantastic graphics and a unique playing environment that offers hours of playing time. Children who love challenging game apps are going to love this as it offers a unique gravity feature that players must use to move the taxi driver from planet to planet. With lots of stars and extra lives to collect, upgrades, and additional characters and taxi cabs to select, this app is one that offers endless play and lots of fun.
Space Taxi is an interesting app that is full of great graphics, music, and sound effects that children are going to love. The user interface includes pretty simple controls that involve tapping on the screen to make the taxi driver jump from planet to planet. There is a very unique gravity feature that takes some getting used to for players to jump from planet to planet, but with a little practice children will have no problem moving through the app.
Children are going to love this app for all of the fun and challenging obstacles that are included as they move further along in the game. Once they get used to the gravity feature and master how to move the taxi driver through the planets, players are going to have so much fun delivering their alien friends to their spaceships. The developers have done a nice job including some fun features for children to customize their character, spaceships etc. in the 'upgrade' section of the app. By using some of the stars they have collected throughout the app, they can change the look of their spaceship, characters, and implement a few special features that will help them move through the game. These simple features will certainly encourage children to keep playing so they can collect more stars for future upgrades.
Priced at just under three dollars this app isn't one that will break the bank and it will offer hours of entertainment for kids who love this sort of thing. With endless play and lots of great upgrades to make, Space Taxi is a great deal.
The developers have done a nice job making this app easy and safe to use for children of all ages. With simple tap and touch functioning to move through the app players will not need much instruction or assistance to get started.


text:
\section{Introduction}

The matroids can be defined in several equivalent ways.
We prefer the definition which is in terms of independent sets.
Let $E$ be a finite set of cardinality~$n$ and
$2^{E}$ denotes the set of all subsets of $E$.
A (finite) \emph{matroid}
$ M $ is an ordered pair $ (E, \mathcal{I}) $,
where $ \mathcal{I} $ is the collection of subsets of $ E $
satisfying the following conditions:
\begin{itemize}
	\item[(M1)]
	$ \emptyset \in \mathcal{I} $.
	\item[(M2)]
	$ I \in \mathcal{I} $
	and
	$ J \subset I $
	implies
	$ J \in \mathcal{I} $.
	\item[(M3)]
	$ I, J \in \mathcal{I} $
	with $ |I| < |J| $
	then there exists
	$ j \in J $
	such that
	$ I \cup \{ j \} \in \mathcal{I} $.
\end{itemize}

The elements of $ \mathcal{I} $ are called the \emph{independent}
sets of $ M $,
and $ E $ is called the \emph{ground set} of $ M $.
A subset of the ground set $ E $
that is not belongs to $ \mathcal{I} $ is called \emph{dependent}.
An independent set $I$ is called a \emph{maximal independent set}
if it becomes dependent on adding any element of $ E\setminus I $.

It follows from the axiom (M3) that the cardinality of all the
maximal independent sets in a
matroid $M$ is equal, called the \emph{rank} of $M$.
These maximal independent sets are called the \emph{bases} of $M$.
The \emph{rank} $\rho(J)$ of an arbitrary subset $J$ of $E$
is the size of the largest independent subset of~$J$.
That is,
$
	\rho(J)
	:=
	\max_{I \subset J}
	\{
		|I| :
		I \in \mathcal{I}
	\}.
$
This implies
$ \rho $
maps
$ 2^{E} $
into
$\mathbb{Z}$.
This function $ \rho $ is called the \emph{rank function} of $ M $.
In particular,
$ \rho(\emptyset) = 0 $.
We shall denote
$\rho(E)$ the rank of~$M$.
We refer the readers to \cite{MOSS2019,Oxley1992} for detailed discussion.

\begin{df}
	Let $A$ be a $k \times n$ matrix over a finite field $\mathbb{F}_{2}$.
	This offers a matroid $M$ on the set
	\[
		E
		=
		\{z \in \mathbb{Z} \mid 1 \leq z \leq n\}
	\]
	in which a set $\mathcal{I}$ is independent if and only if the family of
	columns of~$A$ whose indices belong to $\mathcal{I}$ is linearly independent.
	Such a matroid is called a \emph{vector matroid}.
\end{df}

The classification of the matroids is one of the most important problems
in the theory of matroids.
Tutte~\cite{Tutte1947,Tutte1954,Tutte1967} introduced a
powerful tool to classify the matroids which is known as Tutte
polynomial. Let~$M$ be a matroid on the set $E$ having a rank function $\rho$.
The \emph{Tutte polynomial} of $M$ is defined as follows:
\[
	T(M;x,y)
	:=
	\sum_{J \subset E}
	(x-1)^{\rho(E)-\rho(J)}
	(y-1)^{|J|-\rho(J)}.
\]

We recall \cite{HP2003, MS1977} for the basic notations and
definitions of coding theory.
Let $\mathbb{F}_{2}^{n}$ be the vector space of dimension~$n$
over~$\mathbb{F}_{2}$ with ordinary inner product
$\bm{u}\cdot\bm{v} := u_{1}v_{1} + \cdots + u_{n}v_{n}$
for $\bm{u},\bm{v} \in \mathbb{F}_{2}^{n}$,
where
$\bm{u} = (u_{1},\ldots,u_{n})$ and $\bm{v} = (v_{1},\ldots,v_{n})$.
We denote by
$\supp(\bm{u}) := \{i \mid u_{i} \neq 0\}$
and
$\wt(\bm{u}) := |\supp(\bm{u})|$
for $\bm{u} \in \mathbb{F}_{2}^{n}$.
A binary \emph{linear code} of length~$n$ is a linear subspace of $\mathbb{F}_{2}^{n}$.
Throughout this paper,
by a code we mean a binary linear code.
Let $C$ be a code.
We denote by $C^{\perp}$ the \emph{dual code} of $C$:
\[
	C^{\perp}
	:=
	\{
	\bm{u} \in \mathbb{F}_{2}^{n}
	\mid
	\bm{u} \cdot \bm{v} = 0
	\mbox{ for all }
	\bm{v} \in C
	\}.
\]
The \emph{weight distribution} of $C$ is the sequence
$\{A_{i}\mid i=0,1, \dots, n \}$,
where $A_{i}$ is the number of codewords of weight $i$.
The polynomial
\[
	W_C(x,y)
	:=
	\sum_{{\bm{u}}\in C}
	x^{n - \wt({\bm{u}})}
	y^{\wt(\bm{u})}
	=
	\sum^{n}_{i=0}
	A_{i} x^{n-i} y^{i}
\]
is called the \emph{weight enumerator} of $C$
and satisfies the MacWilliams identity:
\[
	W_{C^{\perp}}(x,y)
	=
	\dfrac{1}{|C|}
	W_{C}(x+y,x-y).
\]

For a code $C$, $M_{C}$ denotes the (vector) matroid corresponds to the code~$C$.
For the construction of such matroids we recall
\cite{JP2013}.

Let $G$ be a $k \times n$ matrix with entries
from the field $\mathbb{F}_{2}$.
Let $E$ be the finite set $[n]$
indexing the columns of $G$ and $\mathcal{I}_{G}$
be the collection of all subsets~$J$ of $E$
such that
the submatrix $G_{J}$ consisting of
the columns of $G$
at the positions of $J$ are independent.
Then $M_{G} := (E; \mathcal{I}_{G})$ is a matroid.
Let
$G_{1}$ and $G_{2}$ be the generator matrices of a code $C$,
then
$(E; \mathcal{I}_{G_1}) = (E; \mathcal{I}_{G_2})$.
So the matroid~$M_{C} := (E; \mathcal{I}_{C})$ of a code $C$ is well
defined by $(E; \mathcal{I}_{G})$ for some generator matrix~$G$ of~$C$.

Greene~\cite{Greene1976} pointed out a remarkable connection between
the weight enumerator of an $[n,k]$ code $C$ and the Tutte polynomial of the matroid $M_{C}$ corresponding to $C$ which is known as Greene's identity as follows:
\[
	W_{C}(x,y)
	=
	(x-y)^{k}
	y^{n-k}
	T\left(M_{C}; \dfrac{x+y}{x-y},\dfrac{x}{y}\right).
\]

As an application of the above relation, Greene~\cite{Greene1976}
also gave an alternative proof of the MacWilliams identity for the
weight enumerator of a code.
A striking generalization of the MacWilliams identity
was obtained by Bachoc \cite{Bachoc},
who gave the concept of  harmonic weight enumerators
$W_{C,f}$ associated with a harmonic function $f$ of degree~$d$
and a generalization of the MacWilliams identity as follows:

\begin{thm}[\cite{Bachoc}] \label{thm: Bachoc iden.}
	Let $W_{C,f}(x,y)$ be
	the harmonic weight enumerator associated with the code $C$
	and the harmonic function $f$ of degree $d$. Then
	\[
		W_{C,f}(x,y)= (xy)^{d} Z_{C,f}(x,y)
	\]
	where $Z_{C,f}$ is a homogeneous polynomial of degree $n-2d$, and satisfies
	\[
		Z_{C^{\perp},f}
		(x,y)
		=
		(-1)^{d}
		\frac{2^{n/2}}{|C|}
		Z_{C,f}
		\left(
		\frac{x+y}{\sqrt{2}},
		\frac{x-y}{\sqrt{2}}
		\right).
	\]
\end{thm}

In this paper, we introduce the notion of the harmonic Tutte polynomials
associated with a harmonic function of a certain degree,
and give a Greene-type identity which we call the \emph{generalized Greene's identity}
between the harmonic weight enumerator of a code and the harmonic Tutte polynomial
of a matroid corresponding to the code.
Moreover, as an application of the generalized Greene's identity,
we give a combinatorial proof of Bachoc's MacWilliams-type identity which is stated in Theorem~\ref{thm: Bachoc iden.}.
In the subsequent sections of this note, by matroids we mean vector matroids.

This paper is organized as follows:
In Section~\ref{Sec:HarmTuttePoly},
we define the harmonic Tutte polynomial,
and obtain a relation between the harmonic Tutte polynomials
of a matroid and its dual (Theorem~\ref{Thm:HarmTutteMacIden.}).
In Section~\ref{Sec:HarmWeightEnum},
we reinterpret the definition of
harmonic weight enumerators (Theorem~\ref{Thm:reinter}).
In Section~\ref{Sec:GenGreeneIden},
we give a generalization of Greene's identity (Theorem~\ref{thm:Miezaki})
with an application in the proof of the MacWilliams identity for
harmonic weight enumerator. We also obtain an $\mathbb{F}_{q}$-analogue
of Theorem~\ref{thm:Miezaki} (Theorem~\ref{thm:MiezakiFq}).

All computer calculations in this paper were done with the help of Magma~\cite{Magma}
and Mathematica~\cite{Mathematica}.

\section{Harmonic Tutte Polynomials}\label{Sec:HarmTuttePoly}

In this section,
we define the harmonic Tutte polynomials
of a (finite) matroid $M$ associated with a harmonic function~$f$
of degree~$d$. We present a very useful relation between
the harmonic Tutte polynomial of a matroid and its dual.
We recall~\cite{Bachoc,Delsarte} for some definitions and properties
of the (discrete) harmonic functions.

Let $E := \{z \in \mathbb{Z} \mid 1 \leq z \leq n\}$ be a finite set
(in future, if there is no confusion, a finite set $E$ with cardinality~$n$
denotes the same).
We define
$E_{d} := \{ X \in 2^{E} \mid |X| = d\}$
for $d = 0,1, \ldots, n$.
We denote by
$\mathbb{R} 2^{E}$, $\mathbb{R} E_{d}$
the real vector spaces spanned by the elements of
$2^{E}$, $E_{d}$,
respectively.
An element of
$\mathbb{R} E_{d}$
is denoted by
\begin{equation}\label{Equ:FunREd}
	f :=
	\sum_{Z \in E_{d}}
	f(Z) Z
\end{equation}
and is identified with the real-valued function on
$E_{d}$
given by
$Z \mapsto f(Z)$.
Such an element
$f \in \mathbb{R} E_{d}$
can be extended to an element
$\widetilde{f}\in \mathbb{R} 2^{E}$
by setting, for all
$X \in 2^{E}$,
\begin{equation}\label{Equ:TildeF}
	\widetilde{f}(X)
	:=
	\sum_{Z\in E_{d}, Z\subset X}
	f(Z).
\end{equation}
If an element
$g \in \mathbb{R} 2^{E}$
is equal to some
$\widetilde{f}$,
for
$f \in \mathbb{R} E_{d}$,
we say that $g$ has degree $d$.
The differentiation $\gamma$ is the operator defined by the linear form
\begin{equation}\label{Equ:Gamma}
	\gamma(Z) :=
	\sum_{Y\in {E}_{d-1}, Y\subset Z}
	Y
\end{equation}
for all
$Z \in E_{d}$
and for all $d=0,1, \ldots n$,
and $\Harm_{d}$ is the kernel of $\gamma$:
\[
	\Harm_{d}
	:=
	\ker
	\left(
	\gamma\big|_{\mathbb{R} E_{d}}
	\right).
\]

\begin{rem}[\cite{Bachoc,Delsarte}]\label{Rem:Gamma}
	Let $f \in \Harm_{d}$.
	Then $\gamma^{i-1}(f) = 0$ for all $0 \leq i \leq d-1$.
	That is, (from~\ref{Equ:Gamma})
	$\sum_{\substack{Z \in E_{d},\\ X \subset Z}} f(Z) = 0$
	for any $X \in E_{i}$.
\end{rem}

\begin{df}
	Let $M = (E,\mathcal{I})$ be a matroid with rank function $\rho$,
	and $f$ be a real-valued function of degree~$d$.
	Then the \emph{weighted Tutte polynomial} of $M$
	associated with the function~$f$ is defined
	as follows:
	\[
		T(M,f;x,y)
		:=
		\sum_{J \subset E}
		\widetilde{f}(J)
		(x-1)^{\rho(E)-\rho(J)}
		(y-1)^{|J|-\rho(J)}.
	\]
	In particular,
	if $f$ is a harmonic function of degree~$d$,
	then we call the weighted Tutte polynomial
	$T(M,f;x,y)$ a \emph{harmonic Tutte polynomial}
	associated with $f$.
\end{df}

We define
\[
	\mathcal{I}^{\perp}
	:=
	\{
	I \in 2^{E}
	\mid
	I \subset E\setminus A
	\mbox{ for some } A \in \mathcal{B}(M)
	\},
\]
where
$\mathcal{B}(M)$
be the collection of all bases of $M$.
Then
$M^{\perp} := (E,\mathcal{I}^{\perp})$
is called the \emph{dual matroid}
of $M$.
It is well known from~\cite{Cameron,Greene1976,JP2013} that
if~$\rho$ is the rank function of a matroid $M = (E,\mathcal{I})$,
then for any $J \subset E$,
the rank function of $M^{\perp} = (E,\mathcal{I}^{\perp})$
is given by
\[
	\rho^{\perp}(J)
	:=
	|J|+\rho(E\setminus J) -\rho(E).
\]
In particular,
$\rho^{\perp}(E) + \rho(E) = |E|$.
The relation between the harmonic Tutte polynomials of a matroid~$M$
associate with the harmonic function $f$ of degree~$d$ and its dual~$M^{\perp}$
is given as follows:

\begin{thm}\label{Thm:HarmTutteMacIden.}
	Let $M = (E,\mathcal{I})$ be a matroid with a rank function~$\rho$,
	and $f \in \Harm_{d}$.
	Then $T(M^{\perp},f;x,y) = (-1)^{d} T(M,f;y,x)$.
\end{thm}

We shall give a proof of the above theorem
after the following technical lemma on harmonic functions.

\begin{lem}[\cite{Bachoc}]\label{Lem:Bachoc}
	Let $f \in \Harm_{d}$ and $J \subset E$.
	Let
	\[
		f^{(i)}(J)
		:=
		\sum_{\substack{Z \in E_{d}\\ |J \cap Z| = i}}
		f(Z).
	\]
	Then for all
	$0 \leq i \leq d$,
	$f^{(i)}(J) = (-1)^{d-i} \binom{d}{i} \widetilde{f}(J)$.
\end{lem}

\begin{rem}\label{Rem:BachocLem}
	From the definition of $\widetilde{f}$
	for $f \in \Harm_{d}$,
	we have $\widetilde{f}(J) = 0$
	for any $J \in 2^{E}$ such that $|J| < d$.
	Let $I, J \in 2^{E}$ such that $I = E\setminus J$.
	Then
	\begin{align*}
		\widetilde{f}(J)
		=
		\sum_{\substack{Z \in E_{d}\\mathbb{Z} \subset J}}
		f(Z)
		=
		\sum_{\substack{Z \in E_{d}\\ |Z \cap I|=0}}
		f(Z)
		=
		f^{(0)}(I)
		=
		(-1)^{d} \widetilde{f}(E\setminus J).
	\end{align*}
	We have from the above equality that if $ |J| > n-d$,
	then $\widetilde{f}(J) = 0$.
\end{rem}

\begin{proof}[Proof of Theorem~\ref{Thm:HarmTutteMacIden.}]
	Let $M$ be a matroid on $E$ with rank function $\rho$.
	Then $M^{\perp}$ is the dual matroid of $M$ with
	rank function
	$\rho^{\perp}(J) = |J|+\rho(E\setminus J)-\rho(E)$
	for any $J \subset E$.
	Therefore,
	\begin{align*}
		T(M^{\perp},f;x,y)
		& =
		\sum_{J \subset E}
		\widetilde{f}(J)
		(x-1)^{\rho^{\perp}(E)-\rho^{\perp}(J)}
		(y-1)^{|J|-\rho^{\perp}(J)}\\
		& =
		\sum_{J \subset E}
		\widetilde{f}(J)
		(x-1)^{\rho^{\perp}(E)-|J|-\rho(E \setminus J) + \rho(E)}
		(y-1)^{|J|-|J|-\rho(E \setminus J) + \rho(E)}\\
		& =
		\sum_{J \subset E}
		\widetilde{f}(J)
		(x-1)^{|E\setminus J|-\rho(E\setminus J)}
		(y-1)^{\rho(E)-\rho(E\setminus J)}\\
		& =
		(-1)^{d}
		\sum_{J \subset E}
		\widetilde{f}(E\setminus J)
		(y-1)^{\rho(E)-\rho(E\setminus J)}
		(x-1)^{|E\setminus J|-\rho(E\setminus J)}\\
		& =
		(-1)^{d}
		T(M,f;y,x).
	\end{align*}
	This completes the proof.
\end{proof}

\section{Harmonic Weight Enumerator}\label{Sec:HarmWeightEnum}

In this section, we review~\cite{Bachoc} for the concept of the harmonic weight enumerators. Later we introduce another formulation for the computation
of the harmonic weight enumerator. This formulation is inspired from
Jurrius and Pellikaan~\cite{JP2013}.

\begin{comment}
For the reader's convenience, we quote
the definitions and properties of discrete harmonic functions from \cite{Bachoc,Delsarte}.
\end{comment}

\begin{df}\label{DefHarmWeightBachoc}
Let $C$ be a code of length $n$ and let $f\in\Harm_{k}$.
The \emph{harmonic weight enumerator} associated with $C$ and $f$ is
\[
	W_{C,f}(x,y)
	:=
	\sum_{{\bf u}\in C}
	\widetilde{f}({\bf u})
	x^{n-\wt({\bf u})}
	y^{\wt({\bf u})}.
\]
\end{df}

With the help of Lemma~\ref{Lem:Bachoc} and Remark~\ref{Rem:BachocLem},
we have that $Z_{C,f}$ is a polynomial.
Therefore we can rewrite the above definition
as follows:

\begin{df}
	Let $C$ be a code of length $n$ and let $f  \in \Harm_{d}$. Then the \emph{harmonic weight enumerator} associated with $C$ and $f$ is
	\[
		W_{C,f}(x,y)
		=
		\sum_{i=0}^{n}
		A_{i,f} x^{n-i} y^{i},
	\]
	where $A_{i,f} = \sum_{{\bm{u} \in C},\wt({\bm u}) = i} \widetilde{f}({\bm u})$.
	From Theorem~\ref{thm: Bachoc iden.}, we have
	$$Z_{C,f}(x,y) = \sum_{i = 0}^{n} A_{i,f} x^{n-i-d}y^{i-d}.$$
\end{df}

\begin{rem}
	If $\deg f = 0$, we have $A_{i,f} = A_{i}$, that is, $W_{C,f}(x,y)$ becomes the usual weight enumerator $W_{C}(x,y)$.
\end{rem}

\begin{df}
	Let $E$ be a finite set of cardinality~$n$.
	For an arbitrary subset $J$ of $E$,

	we define
	\begin{align*}
		C(J)
		& :=
		\{
			\bm{c} \in C
			\mid
			c_{j} = 0 \text{ for all } j \in J
		\}\\
		\ell(J)
		& := \dim C(J)\\
		B_{J}
		& :=
		2^{\ell(J)}-1.
	\end{align*}
\end{df}

\begin{lem}[\cite{JP2013}]\label{LemRank}
	Let $E$ be a finite set of cardinality~$n$
	and $C$ be an $[n,k]$ linear code with generator matrix~$G$.
	Let $G_{J}$ be the $k \times t$ submatrix of $G$ consisting of the columns of $G$ indexed by $J \in E_{t}$,
	and let $\rho(J)$ be the rank of $G_{J}$.
	Then it holds $\ell(J) = k - \rho(J)$.

\end{lem}

Now we have the following proposition.

\begin{prop}\label{Prop:Connection}
	Let $f \in \Harm_{d}$ and $J \subset E$.
	Define
	\[
		B_{t,f}
		:=
		\sum_{J=E_{t}}
		\widetilde{f}(J)B_{J}.
	\]
	Then, for all
	$0 \leq t \leq n$,
	we have the following relation between $B_{t,f}$ and $A_{i,f}$ as follows:
	\[
		B_{t,f}
		=
		(-1)^{d}
		\sum_{i=d}^{n-t}
		\binom{n-d-i}{t-d} A_{i,f},
	\]
	if $d \leq t \leq n-d$;
	otherwise $B_{t,f} = 0$.
\end{prop}

\begin{proof}
	It is immediate from Remark~\ref{Rem:BachocLem} that
	$B_{t,f} = 0$ for $0 \leq t < d$ and~$n-d < t \leq n$.
	We only need to show for $d \leq t \leq n-d$,
	\[
		B_{t,f}
		=
		(-1)^{d}
		\sum_{i=d}^{n-t}
		\binom{n-d-i}{t-d} A_{i,f}.
	\]
	From the construction of $B_{t,f}$ and Remark~\ref{Rem:BachocLem},
	it is clear that
	\[
		B_{t,f}
		=
		(-1)^{d}
		{\binom{t}{d}}^{-1}
		\sum_{\substack{J \in E_{t}, X \in E_{d},\\ X \subset J}} 	\widetilde{f}(E\setminus J)B_{J}.
	\]
	Therefore, it is sufficient to show that for $d \leq t \leq n-d$,
	\[
		{\binom{t}{d}}^{-1}
		\sum_{\substack{J \in E_{t}, X \in E_{d},\\ X \subset J}}
		\widetilde{f}(E\setminus J)B_{J}
		=
		\sum_{i=d}^{n-t}
		\binom{n-d-i}{t-d} A_{i,f}.
	\]
	Now following the definition of $B_{J}$, we can easily observe that
	\begin{align*}
		\sum_{\substack{J \in E_{t}, X \in E_{d},\\ X \subset J}}
		\widetilde{f}(E\setminus J)
		B_{J}
		& =
		\sum_{\substack{J \in E_{t}, X \in E_{d},\\ X \subset J}}
		\sum_{\substack{\bm{c} \in C,\\ \supp(\bm{c}) \cap J = \emptyset,\\ \bm{c} \neq 0}}
		\widetilde{f}(E\setminus J)\\
		& =
		\sum_{\substack{\bm{c} \in C, \\ \bm{c} \neq 0}}
		\sum_{\substack{J \in E_{t}, X \in E_{d},\\
				\supp(\bm{c})\cap J = \emptyset,\\ X \subset J}}
		\widetilde{f}(E\setminus J).
	\end{align*}
	Note that
	from the definition of harmonic function and Remark~\ref{Rem:Gamma}
	we have
	$\sum_{\substack{J \in E_{t}, X \in E_{d},\\
			\supp(\bm{c})\cap J = \emptyset,\\ X \subset J}}
	\widetilde{f}(E\setminus J) = 0$
	for $\bm{c} \in C$ with $\wt(\bm{c}) < d$.
	Therefore,
	\begin{align*}
		\sum_{\substack{J \in E_{t}, X \in E_{d},\\ X \subset J}}
		\widetilde{f}(E\setminus J)
		B_{J}
		& =
		\sum_{i = d}^{n-t}
		\sum_{\substack{\bm{c} \in C,\\ \wt(\bm{c}) = i}}
		\sum_{\substack{J \in E_{t}, X \in E_{d},\\
				\supp(\bm{c})\cap J = \emptyset,\\ X \subset J}}
		\widetilde{f}(E\setminus J).
	\end{align*}
	After expanding the right hand side of above expression
	for each $\bm{c} \in C$ with $\wt(\bm{c}) = i$ for $d \leq i \leq n-t$,
	Remark~\ref{Rem:Gamma} together with (\ref{Equ:TildeF})
	implies that
	\begin{align*}
		\sum_{\substack{J \in E_{t}, X \in E_{d},\\ X \subset J}}
		\widetilde{f}(E\setminus J)
		B_{J}

		& =
		\sum_{i = d}^{n-t}
		\sum_{\substack{\bm{c} \in C,\\ \wt(\bm{c}) = i}}
		\binom{t}{d}
		N_{X}(J)

		\widetilde{f}(\bm{c}),
	\end{align*}
	where
	$N_{X}(J)$ denotes the number of $J \in E_{t}$ disjoint from $\supp(\bm{c})$
	and containing $X \in E_{d}$. Therefore
	\begin{align*}
		\sum_{\substack{J \in E_{t}, X \in E_{d},\\ X \subset J}}
		\widetilde{f}(E\setminus J)
		B_{J}
		& =
		\sum_{i = d}^{n-t}
		\sum_{\substack{\bm{c} \in C,\\ \wt(\bm{c}) = i}}
		\binom{t}{d}
		\binom{n-d-i}{t-d}
		\widetilde{f}(\bm{c}).
	\end{align*}
This completes the proof.
\end{proof}

\begin{thm}\label{Thm:reinter}
	Let $C$ be a code of length~$n$, and $f \in \Harm_{d}$.
	Then
	\[
		Z_{C,f}(x,y)
		=
		(-1)^{d}
		\sum_{t=d}^{n-d}
		B_{t,f}
		(x-y)^{t-d} y^{n-t-d}.
	\]
\end{thm}

\begin{proof}
	By using Proposition~\ref{Prop:Connection} and using the binomial expansion of
	$x^{n-i} = ((x-y)+y)^{n-i}$
	we have
	\begin{align*}
		(-1)^{d}
		&
		\sum_{t=d}^{n-d}
		B_{t,f}
		(x-y)^{t-d} y^{n-t-d}\\
		= &
		\sum_{t=d}^{n-d}
		\sum_{i = d}^{n-t}
		\binom{n-d-i}{t-d}
		A_{i,f}
		(x-y)^{t-d} y^{n-t-d}\\
		= &
		\sum_{i=d}^{n-d} A_{i,f}
		\left(
			\sum_{t=d}^{n-i}
			\binom{n-d-i}{t-d}
			(x-y)^{t-d} y^{(n-d-i)-(t-d)}
		\right)
		y^{i-d}\\
		= &
		\sum_{i = d}^{n-d}
		A_{i,f}
		x^{n-d-i} y^{i-d}\\
		= &
		\sum_{i = 0}^{n}
		A_{i,f}
		x^{n-i-d} y^{i-d}\\
		= &
		Z_{C,f}(x,y),
	\end{align*}
	since $A_{i,f} = 0$ for $i<d$ and $i > n-d$.
\end{proof}

\section{Generalized Greene's Identity}\label{Sec:GenGreeneIden}

Let $M_{C}$ be a matroid associated to a code~$C$
of length~$n$.
It is immediate from~\cite{Cameron,Greene1976,JP2013}
that $M_{C}^{\perp} = M_{C^{\perp}}$.
Now we have the following proposition.
\begin{prop}\label{PropTutteMC}
	Let $C$ be an $[n,k]$ code
	and $M_{C}$ be the matroid correspond to~$C$. Again let $f$ be a harmonic function of degree $d$. Then the harmonic Tutte polynomial $T(M_{C},f;x,y)$ is given by
	\[
		T(M_{C},f;x,y)
		=
		\sum_{t=d}^{n-d}\sum_{J \in E_{t}}
		\tilde{f}(J)
		(x-1)^{\ell(J)}
		(y-1)^{\ell(J)-(k-t)}.
	\]
\end{prop}

\begin{proof}
	The proposition follows from
	$\ell(J) = k - \rho(J)$
	for any $J \in E_{t}$ by Lemma~\ref{LemRank},
	and
	$\rho(E) = k$.
\end{proof}

\begin{rem}
	For a finite set $E$ with cardinality~$n$, we have
	for all~$f \in \Harm_{d}$,

	$\sum_{X \in E_{t}} \widetilde{f}(X) = 0$, where
	$1 \leq d \leq t \leq n$.
\end{rem}

Now we have the following generalization of the Greene's identity.

\begin{thm}\label{thm:Miezaki}
	Let $C$ be an $[n,k]$ code
	and $f$ be a harmonic function with degree $d$.
	Then
	\[
		Z_{C,f}(x,y)
		=
		(-1)^{d}
		(x-y)^{k-d} y^{n-k-d}
		T
		\left(
			M_{C},f;
			\dfrac{x+y}{x-y},
			\dfrac{x}{y}
		\right).
	\]
\end{thm}

\begin{proof}
	By using the Proposition~\ref{PropTutteMC}, we can write
	\begin{align*}
	T
	\left(
		M_{C},f;
		\dfrac{x+y}{x-y},
		\dfrac{x}{y}
	\right)
	& =
	\sum_{t=d}^{n-d}\sum_{J \in E_{t}}
	\widetilde{f}(J)
	\left(
		\dfrac{2y}{x-y}
	\right)^{\ell(J)}
	\left(
		\dfrac{x-y}{y}
	\right)^{\ell(J)-(k-t)}\\
	= &
	\sum_{t=d}^{n-d}\sum_{J \in E_{t}}
	\widetilde{f}(J)2^{\ell(J)}
	\left(
		\dfrac{y}{x-y}
	\right)^{\ell(J)}
	\left(
		\dfrac{x-y}{y}
	\right)^{\ell(J)-(k-t)}\\
	= &
	\sum_{t=d}^{n-d}
	\sum_{J \in E_{t}}
	\widetilde{f}(J)((2^{\ell(J)}-1)+1)
	(x-y)^{-(k-t)} y^{k-t}\\
	= &
	\sum_{t=d}^{n-d}
	\sum_{J \in E_{t}}
	\widetilde{f}(J)(B_{J}+1)
	(x-y)^{-(k-t)} y^{k-t}\\
	= &
	\sum_{t=d}^{n-d}
	\left(
		\sum_{J \in E_{t}}
		\widetilde{f}(J)B_{J}
		+
		\sum_{J \in E_{t}}
		\widetilde{f}(J)
	\right)
	(x-y)^{-(k-t)} y^{k-t}\\
	= &
	\sum_{t=d}^{n-d}
	\left(
		B_{t,f}
		+
		0
	\right)
	(x-y)^{-(k-t)} y^{k-t}\\
	= &
	\sum_{t=d}^{n-d}
	B_{t,f}
	(x-y)^{-(k-t)} y^{k-t}.
\end{align*}

Therefore, from Proposition~\ref{Prop:Connection} we have
\begin{align*}
	(-1)^{d}
	(x-y)^{k-d} y^{n-k-d}
	T
	&
	\left(
		M_{C},f;
		\dfrac{x+y}{x-y},
		\dfrac{x}{y}
	\right)\\
	= &
	(-1)^{d}
	\sum_{t=d}^{n-d}
	B_{t,f}
	(x-y)^{t-d} y^{n-t-d}\\
	= &
	Z_{C,f}(x,y).
	\end{align*}
This completes the proof.
\end{proof}

Tanabe~\cite{Tanabe2001} defined the harmonic weight enumerators
for the non-binary codes,
particularly, for the codes
over $\mathbb{F}_{q}$ associated with the harmonic functions of a certain degree.
For definitions and notations we refer the reader to~\cite{Tanabe2001}.
Motivated by this work, we present the $\mathbb{F}_{q}$-analogue of
Theorem~\ref{thm:Miezaki} as follows.

\begin{thm}\label{thm:MiezakiFq}
	Let $C$ be an $[n,k]$ code over~$\mathbb{F}_{q}$
	and $f$ be a harmonic function with degree $d$.
	Then
	\[
		Z_{C,f}(x,y)
		=
		(-1)^{d}
		(x-y)^{k-d} y^{n-k-d}
		T
		\left(
		M_{C},f;
		\dfrac{x+(q-1)y}{x-y},
		\dfrac{x}{y}
		\right).
	\]
\end{thm}

The proof of the above theorem is quite similar to the case of $\mathbb{F}_{2}$.
So we omit the detail discussions.
Now we give an alternative proof of the MacWilliams identity stated in
Theorem~\ref{thm: Bachoc iden.}
as an application of Theorem~\ref{thm:Miezaki}.

\begin{proof}[Proof of Theorem~\ref{thm: Bachoc iden.}]
	Let
	$C$ be an $[n,k]$ code,
	and $M_{C}$ be a matroid corresponds to $C$.
	Then
	\begin{align*}
		(-1)^{d}
		&
		\frac{2^{n/2}}{|C|}
		Z_{C,f}
		\left(
			\frac{x+y}{\sqrt{2}},
			\frac{x-y}{\sqrt{2}}
		\right)\\
		& =
		(-1)^{2d}
		\frac{2^{n/2}}{2^{k}}
		\left(\dfrac{2y}{\sqrt{2}}\right)^{k-d}
		\left(\dfrac{x-y}{\sqrt{2}}\right)^{n-k-d}
		T\left(M_{C},f;\dfrac{x}{y},\dfrac{x+y}{x-y}\right)\\
		& =
		(x-y)^{n-k-d}
		y^{k-d}
		T
		\left(
			M_{C},f;
			\dfrac{x}{y},
			\dfrac{x+y}{x-y}
		\right)\\
		& =
		(-1)^{d}
		(x-y)^{(n-k)-d}
		y^{n-(n-k)-d}
		T
		\left(
			M_{C^{\perp}},f;
			\dfrac{x+y}{x-y},
			\dfrac{x}{y}
		\right)\\
		& =
		(-1)^{d}
		(x-y)^{\dim C^{\perp}-d}
		y^{n-\dim C^{\perp}-d}
		T
		\left(
			M_{C^{\perp}},f;
			\dfrac{x+y}{x-y},
			\dfrac{x}{y}
			\right)\\
		& =
		Z_{C^{\perp},f}(x,y).
	\end{align*}
Hence Theorem is proved.
\end{proof}

We close this paper with the following
design theoretical remark that gives
an application of the harmonic function connecting
the $t$-designs with matroids.

\begin{rem}
	Let
	$n,k,t$ and $\lambda$ be non-negative integers
	such that
	$n \geq k \geq t$ and~$\lambda \geq 1$.
	A $t$-$(n,k,\lambda)$~\emph{design}
	(in short, $t$-design)
	is a pair
	$\mathcal{D} := (E,\mathcal{B})$,
	where $E$ is a finite set of point of cardinality~$n$,
	and $\mathcal{B}$ is a collection of $k$-element
	subsets of $E$ called \emph{blocks},
	with the property that any~$t$ points are contained
	in precisely $\lambda$ blocks.
	Some properties of combinatorial $t$-designs obtained from codes
	and their analogies were discussed
	in~\cite{{Bachoc},{Bannai-Koike-Shinohara-Tagami},{BM1},{BM2},{BMY},
		{extremal design H-M-N},{Miezaki},{Miezaki2},{MMN},{extremal design2 M-N},{MN-tec},{RCW1975}}.

	The harmonic functions have many applications;
	particularly, the relations between design theory and
	coding theory were stated in Bachoc~\cite{Bachoc}:
	the set of words with fixed weight in a code $C$
	forms a $t$-design if and only if
	$W_{C, f}(x, y) = 0$ for all
	$f \in \Harm_{d}$, $1 \leq d \leq t$.
	Then it is trivial that
	if $T(M_{C},f;x,y) = 0$ for all
	$f \in \Harm_{d}$, $1 \leq d \leq t$,
	then the set of words with fixed weight in a code $C$
	forms a $t$-design.

We will more precisely discuss about a
relation between matroids and combinatorial designs with respect to ``harmonic Tutte polynomials" in the forthcoming paper.
\end{rem}

\section*{Acknowledgements}
The second author is supported by JSPS KAKENHI (18K03217).

redpajama_set_name: RedPajamaArXiv


With the King Electric W1215-A Wall Heater 120V 1750-750 Watt, you can warm up a large area without making a large investment. This value-priced unit is ideal for remodeling and home improvements on a budget, yet it performs incredibly well in living spaces.
Part of the economy collection from King Electric, the King Electric W1215-A Wall Heater makes heating residential living areas more affordable. Often, this model is used to provide heat in apartments due to its low price and easy maintenance. In single family homes, the wall heater makes an excellent affordable secondary source of heat for bedrooms and other spaces. Whisper quiet, the heater won't disrupt the peace and tranquility of residences.
The King Electric W1215-A Wall Heater is a highly effective, flexible heater. At the time of installation, you can choose to set the unit for 750 or 1750 watts of heating power. With either setting, the heater works similarly to a central heating system, heating the air through convection to warm up a large area within a room. A four-blade metal fan helps to distribute the heated air, moving it at a speed of 85 cubic feet per minute, so it can be felt more evenly throughout a space.
Almond colored, the King Electric W1215-A Wall Heater has an attractive grille with a modern design that looks at home in any environment with its sleek finish and rounded corners. The wall heater is intended to be installed in existing wall cans but you can also purchase a can separately to mount the unit in your space. This model is ideal for homes and apartments with 120-volt wiring systems. If you require a 240-volt heating solution, order King Electric model W2415-A.
Built to last, the King Electric W1215-A Wall Heater features a heavy-duty galvanized steel grille that is extra thick with a 20 gauge rating. The heater is UL listed for your peace of mind and comes equipped with Smart Limit Protection against overheating to ensure safe operation.
Product Dimensions: L: 10.00" x W: 5.00" x H: 13.50"


Leaptronix SU-3280 is high speed programming for design engineering and small production. It supports PC-based and Stand-along programming mode which through LCD and keypad download the file to the inside 3.2GB memory. Moreover, SU-3280 adopts modular design. If with the universal DIP module, you can just use general type adapter on the market for different package. Or you can select gang module for 8-16 site programming.
� Provides with DUT 75MHz bandwidth and <2.5nS signal skew.
� Provides the stand-alone mode operation. Just use 5 keys and 20x4 LCD, you can select a project and start to program.
� Provides asynchronous and concurrent operation for the 4 modules which allows chips to begin programming immediately upon insertion the chip fully on the same module. There is a message show on the LCD to inform operator to take off the finished device and inserts a new device.
� Provides IC insertion test and contact check before programming. Under the AUTO mode, just insert the IC, SU-320 will start the processes automatically.
� Provides high-expansion flexibility modular design. It can use as single-side universal programmer or SPI and FLASH gang programmer.
� Provides mass-production-oriented software. There is used a project file to control to minimize the operator error. Moreover, the log file help the production managements.


text:
Croatia, Ambassador Bradtke: Peratović certainly has enemies
MediaHuman rightsperkovic
By Željko Peratović Last updated May 14, 2019 1,013 2
Peratović claims that newspapers had published the other two documents, which included references to the British Secret Service and meetings between British intelligence and the former Police Chief of Croatia, Ranko Ostojić.
Cablegate: Croatian Journalist Detained, Released
Thursday, 25 October 2007, 2:04 pm
Cable: Wikileaks
Ref: 07ZAGREB970
FOR EUR/SCE, EUR/PPD, AND DRL
E.O. 12958: N/A
TAGS: PREL PGOV PHUM HR
SUBJECT: CROATIAN JOURNALIST DETAINED, RELEASED
1. (SBU) SUMMARY:
Zagreb police arrested freelance journalist, Željko Peratović, on October 18, and released him the following the day, charging him with posting classified documents to his website.
Human rights and media groups and the opposition Social Democratic Party (SDP) quickly protested the arrest. Prime Minister Sanader expressed support for media freedom in the days following.
President Mesić characterized the search of Peratović's apartment as a mistake and said that the case should have been handled differently. END SUMMARY
2. (U) Zagreb police arrested free-lance journalist Željko Peratović October 18 on charges of revealing state and military secrets on his website, releasing him on October 19. The police seized three
computers, a mobile phone, and documents from his apartment. While Peratović is the subject of a criminal investigation, prosecutors have not decided whether he will be brought to trial. Police are
seeking to identify the government officials who allegedly leaked the documents.
3. (U) According to Peratović, the documents in question were already in the public domain and had been on his website for months. One of the documents allegedly had been submitted to the Parliament
to substantiate his claim that Croatian intelligence had trailed him as a result of his reporting on the ICTY case against retired General Gotovina. Peratović claims that newspapers had published the other two documents, which included references to the British Secret Service and meetings between British intelligence and the former Croatian Police Chief, Ranko Ostojić.
Published in Nacional number 670, 2008-09-15 / Autor: Ivo Pukanić
4. (U) Croatian Prime Minister Sanader commented on the case on October 18, announcing that he would request a report from the Minister of Internal Affairs. Sanader expressed full support for media freedoms, declaring that he was always on the side of journalists. On October 22, President Mesić called the police search of Peratović's apartment a mistake, said that the case should have been handled differently. He said that the police had taken the path of least resistance in investigating the person who had received the classified documents rather than those responsible for the information, and said this was this totally wrong.
5. (U) The Zagreb police department announced on October 20 that the head of the criminal investigation department, Darko Dundović, would assume a new post as the senior professor at the Police Academy. While police deny any linkage between Dundović's stepping down and
the arrest, PM Sanader suggested that Dundović had been reassigned as a result of the incident.
6. (U) The Croatian Journalists Association, the Croatian Helsinki Committee on Human Rights Media Council, Reporters without Frontiers, the Social Democratic Party (SDP), the Center for Development of Democracy, and journalists spoke out against the arrest. The Croatian Journalists Association condemned the arrest, calling it a drastic example of endangering journalistic freedom and argued that the government employees leaking the documents should be investigated, not the journalist who informed the public. The opposition Social Democratic Party (Zoran Milanović,remark by ž.p.) called Peratović's detention an attempt to intimidate the press.
Gordan Malić published in Globus secret document of Counterintelligence Agency (POA) that arethe agents of MI6: Christopher Looms and J. Gareth Longley and CIA agent Oscar Vera, cooperated with Josip Perković and Ranko Ostojić.
[box type="custom" color="#000000″ bg="#7ea0bf" border="#ed3664″]
7. (SBU) Comment:
While Peratovic's arrest has caused controversy in Croatia, it appears to be an isolated case and not indicative of a pattern to suppress the media. The police and the prosecutor's office have sought to blame each other for the incident. With parliamentary elections just one month away, the GOC would not likely seek to anger the media. At the same time, Peratović is known for his investigative reporting on war crimes and the intelligence services and certainly has enemies.
BRADTKE (Robert A. Bradtke, the United States Ambassador to the Republic of Croatia, presented his credentials to President Mesić on July 7, 2006., remark by ž.p.)
source WikiLeaks[/box]
Ante GotovinaChristopher LoomsDarko DundovićIvo SanaderJosip PerkovićOscar VeraRanko OstojićRobert A. Bradtke
Chief editor 45lines.com
investigative journalist, independent blogger & secular activist
/ Member of the Board of Directors of Matica BiH
In 2003, received a press freedom award from the Austrian Section of Reporters Without Borders / In 2015, received a press freedom award from the Croatian Journalist' Association "Marija Juric Zagorka" for investigative journalism.
The Croatian State Attorney's Office has approved new indictments by Germany against Perković and Mustač
Glasnović spreading hatred – Orešković was caught for domestic violence

redpajama_set_name: RedPajamaCommonCrawl


LUMATEQ(A Division of TACO Metals) is ahead of the curve with its new and improved line of LED Blaster lights. The latest in lighting technology is now available for commercial and residential installations and replacement. LUMATEQ Blaster lights assure efficient light distribution, free from environmentally hazardous materials and unmatched in energy savings. This LUMATEQ Blaster series is our brightest most state-of-the-art design for uplight, downlight, wall pack installations and more!
Replaces: 175W MH light in downlight application; 250W MH light in flood light application with 2x projection.
Wide range of power supply with no special ballast or transformers required.
Comes with exclusive stainless steel 180° swivel universal mounting bracket for up, down and wallpack installations.
Clean look blends seamlessly with architectural elements.
Wet and dry zone lighting.
Crisp white, energy efficient light best for security cameras.
Significantly longer life leads to reduced maintenance costs.
LM 80 tested; waterproof; ETL rated IP-65 for wet locations.
Durable aluminum housing with 360°/180° stainless steel mounting bracket; powder-coated finish.
Vibration and shock resistant LEDs.


"An astronomical offer has come in from Chelsea for Kaka," Galliani told Italian newspaper La Stampa, adding that club have also expressed interest in the club's World Cup winner Andrea Pirlo.
Despite failing to qualify for the Champions League, Galliani insisted the Rossoneri have been continuing to strengthen their squad and increase players' salaries.
AC Milan have been linked with various players in the close season, including Barcelona duo Samuel Eto'o and Ronaldinho, and Arsenal's unsettled star Emmanuel Adebayor.


text:
Hit + Want to See to get notified when it's added to your services.
Because You d My Family
Comedy Drama 19861h 26mOn: Not Available Country: Hong Kong
The Ng family: Doctor Ng, Mrs. Ng, Ng Chee (little daughter), Ng Lei and Ng Choi (son and daughter of Doctor Ng and his ex-wife) went to picnic happily. Hereon, different romances happened between them: First of all, Lei was attracted by Macdonna, a very sexy girl; Chee love little Rambo who saved her from two "teddy' boys; Choi loved her elder cousin who was graduated from a foreign university and had not found a job yet; Ms Ng decided to apply for the post of actress for a drama association. Billy, the director of the drama was the divorced father of little Rambo. He fell in love with Mrs.Ng at the first sight. On the birthday party of Dr. Ng, Lei and Choi discovered that Danny and Macdonna were lovers. They were very disappointed. When the drama was showing, Chee misunderstood that it was real. She rushed on to the stage and accused Billy of taking her mother away. The other family members also ran onto the stage and accused Billy of destroying their family happiness......My Family featuring Fung Bo-Bo and Lui Fong is not currently available to stream, rent, or buy but you can add it to your want to see list for updates. It's a comedy and drama movie with an average IMDb audience rating of 5.8 (41 votes).
Where to Watch My Family
My Family is not streaming nor available to rent or purchase.
Click here to get notified when it's available.
Raymond Fung Sai-Hung
Fung Bo-Bo
May Lo Mei-Mei
Billy Lau
Richard Ng
Dr Richard Ng
Alan Tam
Clifton Ko Chi-Sum
Michael Chow Man-Kin
Cheung Tat-Ming
Pauline Kwan
Tai Lung Siu
Bing-cheung Mak
Chan Gam-Kuen
Joe Ma
Kin-yee Pang
Kwok-ming Lai
Not available to watch free online.
#39792 Ranked in Comedy Movies
#64601 Ranked in Drama Movies
My Family has an average IMDb audience rating of 5.8 (41 votes). The movie is not at all popular with Reelgood users lately.
Stream More Movies & Shows Like My Family
Laws of Gravity (1992)
Raising Victor Vargas (2002)
Baby It's You (1983)
In the Soup (1992)
Our Song (2000)
Winnebago Man (2010)
Simple Men (1992)
The Immaculate Conception of Little Dizzle (2010)
Living in Oblivion (1995)
Spring Forward (2000)
Terror's Advocate (2007)
I Was Born, But... (1932)
At the Death House Door (2008)
Heartland (1979)
La Ronde (1950)
Jazz on a Summer's Day (1960)
It's Not Me, I Swear! (2008)
Who is KK Downey (2008)
The Makioka Sisters (1983)
Smash Palace (1981)
Soni (2019)
Rocket Science (2007)
Osama (2003)
Bukowski: Born into This (2003)
Trust (1990)
Love and a .45 (1994)
Up the Yangtze (2007)
L'Argent (1983)
An Autumn Afternoon (1962)
My Winnipeg (2007)
The Village Barbershop (2008)
The Tao of Steve (2000)
Southern Comfort (2001)
Samson and Delilah (2009)
Secrecy (2008)
Hell House (2001)
The Saddest Music in the World (2003)
The Color of Pomegranates (1969)
Travellers and Magicians (2003)
The Beautiful Country (2004)
Swimming with Sharks (1994)
Mystic Pizza (1988)
The White Stripes: Under Great White Northern Lights (2009)
3 Backyards (2010)
Momma's Man (2008)
The Devil and Daniel Johnston (2006)
Hello I Must Be Going (2012)
Nine Lives (2005)
More Comedy Movies
National Lampoon's Christmas Vacation (1989)
Virgin Territory (2007)
Cashback (2006)


text:
Q: Nested routing in aurelia js Is there any way to have nested routing/child router in Aurelia JS
as we have in ui-router for angular js?
so that we can achieve following

*

*Update the partial view (only update a selected portion on the given event).

*having parent child relationship in the components
TIA

A: Yes, it does.
Multiple View Ports
http://aurelia.io/hub.html#/doc/article/aurelia/router/latest/router-configuration/9
You can define two or more different views to be affected by a route, by creating more than one <router-view> in your template like this:
<template>

    <router-view name="left"></router-view>

    <router-view name="right"></router-view>

</template>

And then defining both destinations in your individual routes:
{ route: 'users', name: 'users', viewPorts: { left: { moduleId: 'user/list' }, right: { moduleId: 'user/detail' } } }

Accessing your Router from Parent to Affect Child
See this post and the first answer for an in-depth explanation for how to access the Router to create parent/child component routing.
Linking directly to both parent+child views/controllers from the main navigation menu
In summary, you probably need to access your main router by injecting it into any parent components that need child routing, like this:
import {inject} from 'aurelia-framework';
import {Router} from 'aurelia-router';
@inject(Router)
export class SomeParent {
  constructor(router) {
    this.router = router;
  }
}

More Examples
You should check out the skeleton-navigation examples at https://github.com/aurelia/skeleton-navigation. There are good examples, including how to do child routing.

redpajama_set_name: RedPajamaStackExchange


You have successfully added 3-Pack Blessed Protein | 3 x 30 serves to your bag.
Blessed Protein by Clear Vegan is a plant-based protein with an unfairly delicious taste. Unlike other plant-based products, we ONLY include one source of the highest quality pea protein, making it easier for you to digest.
Go for Triple Pack & save 20%!
Feel BLESSED - Choose plant-based!
Want to know more about the taste and benefits? Click on the 'FAQ' tab to find out more!
How do I take Blessed Plant-Based Protein? Mix 1 scoop with 240ml (6-8oz) of chilled water or almond milk in a shaker bottle. May be taken at any time of the day, either on its own (with water) or mixed into smoothies, yoghurt, juice etc.
What flavors is Blessed Protein available in and how do they taste?
- Salted Caramel has a deep, rich and earthy taste. Pairs well with coffee, chocolate, peaches, nut butter, berries, nuts, and popcorn! BLESSED TIP: Try mixing a tbsp of maple syrup and tbsp of Salted Caramel and drizzling over some hot popcorn!


GSE Holding is a provider of geosynthetic containment solutions for environmental protection and confinement applications. Co. groups its products into geomembranes, which are synthetic polymeric lining materials used as barriers in geotechnical engineering applications; drainage products, including geonets and geocomposites; geosynthetic clay liners, which are synthetic clay liners that are installed as the bottom layer of a liner system; nonwoven geotextiles, which are synthetic, staple fiber, nonwoven needle-punched fabrics used in environmental and other industrial applications; and specialty products. Each of these products can be used on a stand-alone basis or packaged into solutions.
GSE (GSE) has the following price history information. Looking back at GSE historical stock prices for the last five trading days, on February 26, 2014, GSE opened at $0.61, traded as high as $0.63 and as low as $0.60, and closed at $0.63. Trading volume was a total of 97.70K shares. On February 27, 2014, GSE opened at $0.63, traded as high as $0.63 and as low as $0.60, and closed at $0.62. Trading volume was a total of 109.90K shares. On February 28, 2014, GSE opened at $0.65, traded as high as $0.65 and as low as $0.57, and closed at $0.61. Trading volume was a total of 261.60K shares. On March 03, 2014, GSE opened at $0.60, traded as high as $0.60 and as low as $0.50, and closed at $0.53. Trading volume was a total of 900.10K shares. On March 04, 2014, GSE opened at $0.53, traded as high as $0.54 and as low as $0.41, and closed at $0.42. Trading volume was a total of 1.73M shares.
Below, we examine the compound annual growth rate — CAGR for short — of an investment into GSE shares, starting with a $10,000 purchase of GSE, and working forward through the historical stock price information to today.


text:
President Trump, is it important to you to limit civilian deaths in US military operations?
The new administration has already faced questions about whether it's doing enough to limit civilian casualties. Will Trump's beefed-up military be one with looser rules of engagement?
The worst humanitarian crisis in decades is happening right now
"Without collective and coordinated global efforts, people will simply starve to death."
The World's music feature this week: Contrabanned at SXSW
The World is part of a very cool project at the upcoming South by Southwest festival in Austin, Texas. We've collaborated on a showcase called Contrabanned: #MusicUnites.
The story of two brothers, one green card and Trump's ban
For the past three years, our reporter in London, Leo Hornak, has kept in close touch with two brothers from Somalia, both refugees. They fled the violence of the extremist group al-Shabab. But their fates have diverged. One got lucky, receiving a US green card. He's now living in Maine. The other is still waiting to get refugee status in the US. But with Trump's immigrant and refugee ban, it's not looking good.
These young Somalis refuse to go 'home' when Kenya closes the world's largest refugee camp
Since the Dadaab refugee camp complex opened 26 years ago, an entire generation has grown up there. For many Somalis born and raised in Dadaab, it's more than just a camp. It's home. And Kenya plans to close it in May.
When a suicide bomber destroyed my home
"Today is going to be another good day," I thought.
A banana with your Somali dish? It's not dessert or an appetizer, as this reporter found out
While on assignment, reporter Matt Pearce stopped by a Somali restaurant and ordered a rice and lamb platter. Along with his food, came a banana. Things got interesting from there.
What if one culture shares multiple languages? That's a challenge Oregon is taking up with its Somali students.
In Portland, Oregon, the Somali community is more mixed than in many other cities in the US. Careful not to leave one part of the culture out, the city now offers a program featuring two Somali languages.
Guilty verdict in Minnesota ISIS trial splinters Somali community
Minneapolis friends stood trial for charges that included conspiracy to provide support to ISIS and commit murder abroad.
An unlikely early adopter of Paris climate agreement: Somalia
"Somalia is telling the world, stop denying that climate change is here, that the world is changing, and we are the cause of it," said Somali Foreign Minister Abdusalam Omer.


← Others are right also, aren't they?
Whoever it was they had twisted the truth.
Paul was not teaching the Gentiles to turn away from Moses. However, he wasn't telling the Gentiles who got saved that they should then follow the Jewish customs and laws. So the informant had taken what was actually true and made it into something quite different.
Whoever it was could have been confronted by James and the elders of the Church, but were not. Were they themselves fooled by the informant? Or were they intimidated? Informants need to be disciplined if they have spoken falsely.
Whoever it was doesn't seem to have a name because the information was more important than where it came from.
Sometimes the information can be so sensational that accuracy is not that important either, just ask those who read the many tabloids!
I don't know but informants can often be informed on! Gossipers can be gossiped about! Siggi Thorsdarson worshipped the ground Julian Assange walked on and was fast tracked through the Wikileaks organisation. He decided to hack into the Icelandic government and in order to authenticate his position with the hackers there he sent a secret film of him and Assange. But actually the leader of that hacking group had become informants for the FBI themselves. Siggi was sacked from Wikileaks on another matter and for revenge he entered into some sort of deal with the FBI and gave crucial information to them but for a very small $5000.
Informants don't make great confidantes or friends. It is so today and it was then in the early Church.


text:
Everything You Need To Know About Electric Cars
Electric cars are the future! There's no denying that the popularity of electric cars is growing, as their ease of use, range and variations increase. But what do you know about them? Find out everything that you need to know about electric vehicles (EVs)…
The history of electric cars
Believe it or not, the first electric vehicle was actually built in 1832 by Scottish inventor Robert Anderson. It was an electric carriage powered by non-rechargeable cells. Following this, in the second half of the 19th century, French and English inventors built the first usable electric cars. These became extremely popular, and by 1900, electric cars accounted for around a third of the vehicles on the road!
Thomas Edison, the famous inventor, and Henry Ford, of Ford cars, worked together to explore options for a low-cost electric car in 1914. Edison believed that electric cars were superior, and worked hard to develop a better battery.
However, Ford's Model T dealt a huge blow to electric vehicles. It was mass produced and affordable, costing a third of the price of an electric car, and petrol prices fell at around the same time. Improving road surfaces meant that Americans could get out and explore and the range of petrol vehicles was far better. Electric vehicles were all but gone by 1935.
It wasn't until rising oil prices in the 1970s that electric vehicles were looked at again. The technology was still crude, though, and these cars had a top speed of 45 miles per hour, and could only travel 40 miles before needing to be recharged. They were forgotten again.
Then, in the 90s, environmental concerns began to arise. In 1997, the Toyota Prius was brought out and since then, electric vehicles have experienced a slow and steady increase in popularity, exploding in the last few years. There are currently over 50 models of electric cars on the market.
How do electric cars work?
Electric cars are powered by an electrically powered battery pack. This powers the motor and turns the wheels, until the battery runs out. They can be recharged by plugging into a socket or from a dedicated charging unit.
There are a few types of electric vehicle – fully electric (these only have a battery) and hybrid (these use petrol as a back up for when the battery runs out).
What happens when the battery runs out?
It's important to make sure that your electric car has enough battery power to get you where you need to go. There are many public charging points available, but you need to plan carefully! The range of electric vehicles has grown massively over the last few years, and they are more than suitable for commutes and running around town. For longer journeys, you'll need to plan your route to ensure you can charge up on the way if necessary.
Are electric cars good for the environment?
It's widely believed that electric vehicles are much better for the environment, and to a large extent, this is true. Electric vehicles don't emit exhaust fumes, leading to cleaner air in city centres. They also don't rely on fossil fuels to the same extent that traditional petrol powered cars do.
Petrol and diesel cars can only be fuelled by fossil fuels. Although electric cars need to be charged, and electricity production uses fossil fuels, this is changing. Much of the electricity currently produced comes from green sources, and this will only increase as governments work to reduce reliance on fossil fuels. In fact, it is possible to buy green tariffs from electricity suppliers, or use solar panels at home to ensure that charging your electric vehicle is as green as possible.
How do electric vehicles perform in hot and cold weather?
The true challenge for cars is how they perform in extreme temperatures. Petrol and diesel cars can struggle in hot and cold weather, so how do electric cars measure up?
Both hot and cold weather can affect the range of an EV. However, there are some things you can do to improve this; for example, running the air conditioner and heating while the car is plugged in, braking smoothly and parking in a covered area.
Are electric cars more expensive than normal cars?
Electric cars are still more expensive than petrol vehicles, and this is mostly due to the cost of producing lithium batteries. However, it's important to consider the differing fuel costs. Completely recharging an electric car battery can cost as little as £3-4 (less if you have solar panels!).
In addition, because there are fewer moving parts, electric cars need less frequent maintenance – this could save you over £300 a year.
You'll also have less road tax to pay and, if you're in a city centre, won't need to pay a congestion charge.
What is the future of electric vehicles?
Electric cars are going to become a more and more common sight on the roads. The UK government has made a pledge to ban sales of petrol and diesel cars by 2040, and car brands such as BMW, Volkswagen and Volvo have all promised to make more electric vehicles in the coming years. The increased research going into electric vehicles means that, as they are produced more frequently, they will get better and cheaper – and more accessible for a wider market.
It isn't just in the UK that we'll see more electric vehicles, though:
Germany also plans to introduce a ban of sales of petrol and diesel cars in the future.
Denmark has more electric charging points than petrol stations.
Italy has exempted electric cars from annual circulation tax and ownership tax.
These initiatives show a real push from governments around Europe to encourage sales of electric vehicles and provide a cleaner method of transport. In fact, Norway's market share of electric vehicles is a massive 49.1%, and the government wants to reach 100% by 2025. This has been achieved by heavy taxation of fossil fuels.
Get in touch with RES-EV today!
Everything You Need To Know About The Electric Car Battery
How To Find The Cheapest Electric Car
Which Are The Best Electric Car Companies?
How To Easily Find Electric Charging Stations