From 617f679912febdb206284d9e8a1340deb9c3b9f9 Mon Sep 17 00:00:00 2001 From: jamescussen <46733443+jamescussen@users.noreply.github.com> Date: Thu, 22 Oct 2020 20:49:25 +1100 Subject: [PATCH] Add files via upload --- TeamsPhoneScreenCaptureTool.ps1 | 2278 +++++++++++++++++++++++++++++++ 1 file changed, 2278 insertions(+) create mode 100644 TeamsPhoneScreenCaptureTool.ps1 diff --git a/TeamsPhoneScreenCaptureTool.ps1 b/TeamsPhoneScreenCaptureTool.ps1 new file mode 100644 index 0000000..f698e8b --- /dev/null +++ b/TeamsPhoneScreenCaptureTool.ps1 @@ -0,0 +1,2278 @@ +######################################################################## +# Name: Teams Phone Screen Capture Tool +# Version: v1.0.0 (20/10/2020) +# Original Release Date: 20/10/2020 +# Created By: James Cussen +# Web Site: http://www.myteamslab.com +# Notes: This is a PowerShell tool. To run the tool, open it from the PowerShell command line or right click on it and select "Run with PowerShell". +# For more information on the requirements for setting up and using this tool please visit http://www.myteamslab.com. +# +# Copyright: Copyright (c) 2020, James Cussen (www.myteamslab.com) All rights reserved. +# Licence: Redistribution and use of script, source and binary forms, with or without modification, are permitted provided that the following conditions are met: +# 1) Redistributions of script code must retain the above copyright notice, this list of conditions and the following disclaimer. +# 2) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +# 3) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +# 4) This license does not include any resale or commercial use of this software. +# 5) Any portion of this software may not be reproduced, duplicated, copied, sold, resold, or otherwise exploited for any commercial purpose without express written consent of James Cussen. +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; LOSS OF GOODWILL OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Prerequisites: You need a Microsoft Teams Phone to connect to +# Known Issues: Doesn't work with AudioCodes phones because at the time of making it they don't support web based access to screen images. +# Release Notes: +# 1.00 - Initial Release +# +######################################################################### + + + +param ( +[parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] +[ValidateNotNullOrEmpty()] +[string] $IPAddress = "10.0.0.10", + +[parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] +[ValidateNotNullOrEmpty()] +[string] $DeviceType = "Poly", + + +[parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] +[ValidateNotNullOrEmpty()] +[string] $Password = "456" +) + + +$theVersion = $PSVersionTable.PSVersion +$MajorVersion = $theVersion.Major + +Write-Host "" +Write-Host "--------------------------------------------------------------" +Write-Host "PowerShell Version Check..." -foreground "yellow" +if($MajorVersion -eq "1") +{ + Write-Host "This machine only has Version 1 PowerShell installed. This version of PowerShell is not supported." -foreground "red" + exit +} +elseif($MajorVersion -eq "2") +{ + Write-Host "This machine has Version 2 PowerShell installed. This version of PowerShell is not supported." -foreground "red" + exit +} + + +add-type @" + using System.Net; + using System.Security.Cryptography.X509Certificates; + + public class IDontCarePolicy : ICertificatePolicy { + public IDontCarePolicy() {} + public bool CheckValidationResult( + ServicePoint sPoint, X509Certificate cert, + WebRequest wRequest, int certProb) { + return true; + } + } +"@ +[System.Net.ServicePointManager]::CertificatePolicy = new-object IDontCarePolicy +[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls11 + + + + +# Set up the form ============================================================ + +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + +$objForm = New-Object System.Windows.Forms.Form +$objForm.Text = "Teams Phone Screen Capture Tool 1.00" +$objForm.Size = New-Object System.Drawing.Size(390,220) +$objForm.MinimumSize = New-Object System.Drawing.Size(300,220) +$objForm.StartPosition = "CenterScreen" +#MyTeamsLab Icon +[byte[]]$WindowIcon = @(71, 73, 70, 56, 57, 97, 32, 0, 32, 0, 231, 137, 0, 0, 52, 93, 0, 52, 94, 0, 52, 95, 0, 53, 93, 0, 53, 94, 0, 53, 95, 0,53, 96, 0, 54, 94, 0, 54, 95, 0, 54, 96, 2, 54, 95, 0, 55, 95, 1, 55, 96, 1, 55, 97, 6, 55, 96, 3, 56, 98, 7, 55, 96, 8, 55, 97, 9, 56, 102, 15, 57, 98, 17, 58, 98, 27, 61, 99, 27, 61, 100, 24, 61, 116, 32, 63, 100, 36, 65, 102, 37, 66, 103, 41, 68, 104, 48, 72, 106, 52, 75, 108, 55, 77, 108, 57, 78, 109, 58, 79, 111, 59, 79, 110, 64, 83, 114, 65, 83, 114, 68, 85, 116, 69, 86, 117, 71, 88, 116, 75, 91, 120, 81, 95, 123, 86, 99, 126, 88, 101, 125, 89, 102, 126, 90, 103, 129, 92, 103, 130, 95, 107, 132, 97, 108, 132, 99, 110, 134, 100, 111, 135, 102, 113, 136, 104, 114, 137, 106, 116, 137, 106,116, 139, 107, 116, 139, 110, 119, 139, 112, 121, 143, 116, 124, 145, 120, 128, 147, 121, 129, 148, 124, 132, 150, 125,133, 151, 126, 134, 152, 127, 134, 152, 128, 135, 152, 130, 137, 154, 131, 138, 155, 133, 140, 157, 134, 141, 158, 135,141, 158, 140, 146, 161, 143, 149, 164, 147, 152, 167, 148, 153, 168, 151, 156, 171, 153, 158, 172, 153, 158, 173, 156,160, 174, 156, 161, 174, 158, 163, 176, 159, 163, 176, 160, 165, 177, 163, 167, 180, 166, 170, 182, 170, 174, 186, 171,175, 186, 173, 176, 187, 173, 177, 187, 174, 178, 189, 176, 180, 190, 177, 181, 191, 179, 182, 192, 180, 183, 193, 182,185, 196, 185, 188, 197, 188, 191, 200, 190, 193, 201, 193, 195, 203, 193, 196, 204, 196, 198, 206, 196, 199, 207, 197,200, 207, 197, 200, 208, 198, 200, 208, 199, 201, 208, 199, 201, 209, 200, 202, 209, 200, 202, 210, 202, 204, 212, 204,206, 214, 206, 208, 215, 206, 208, 216, 208, 210, 218, 209, 210, 217, 209, 210, 220, 209, 211, 218, 210, 211, 219, 210,211, 220, 210, 212, 219, 211, 212, 219, 211, 212, 220, 212, 213, 221, 214, 215, 223, 215, 216, 223, 215, 216, 224, 216,217, 224, 217, 218, 225, 218, 219, 226, 218, 220, 226, 219, 220, 226, 219, 220, 227, 220, 221, 227, 221, 223, 228, 224,225, 231, 228, 229, 234, 230, 231, 235, 251, 251, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 33, 254, 17, 67, 114, 101, 97, 116, 101, 100, 32, 119, 105, 116, 104, 32, 71, 73, 77, 80, 0, 33, 249, 4, 1, 10, 0, 255, 0, 44, 0, 0, 0, 0, 32, 0, 32, 0, 0, 8, 254, 0, 255, 29, 24, 72, 176, 160, 193, 131, 8, 25, 60, 16, 120, 192, 195, 10, 132, 16, 35, 170, 248, 112, 160, 193, 64, 30, 135, 4, 68, 220, 72, 16, 128, 33, 32, 7, 22, 92, 68, 84, 132, 35, 71, 33, 136, 64, 18, 228, 81, 135, 206, 0, 147, 16, 7, 192, 145, 163, 242, 226, 26, 52, 53, 96, 34, 148, 161, 230, 76, 205, 3, 60, 214, 204, 72, 163, 243, 160, 25, 27, 62, 11, 6, 61, 96, 231, 68, 81, 130, 38, 240, 28, 72, 186, 114, 205, 129, 33, 94, 158, 14, 236, 66, 100, 234, 207, 165, 14, 254, 108, 120, 170, 193, 15, 4, 175, 74, 173, 30, 120, 50, 229, 169, 20, 40, 3, 169, 218, 28, 152, 33, 80, 2, 157, 6, 252, 100, 136, 251, 85, 237, 1, 46, 71,116, 26, 225, 66, 80, 46, 80, 191, 37, 244, 0, 48, 57, 32, 15, 137, 194, 125, 11, 150, 201, 97, 18, 7, 153, 130, 134, 151, 18, 140, 209, 198, 36, 27, 24, 152, 35, 23, 188, 147, 98, 35, 138, 56, 6, 51, 251, 29, 24, 4, 204, 198, 47, 63, 82, 139, 38, 168, 64, 80, 7, 136, 28, 250, 32, 144, 157, 246, 96, 19, 43, 16, 169, 44, 57, 168, 250, 32, 6, 66, 19, 14, 70, 248, 99, 129, 248, 236, 130, 90, 148, 28, 76, 130, 5, 97, 241, 131, 35, 254, 4, 40, 8, 128, 15, 8, 235, 207, 11, 88, 142, 233, 81, 112, 71, 24, 136, 215, 15, 190, 152, 67, 128, 224, 27, 22, 232, 195, 23, 180, 227, 98, 96, 11, 55, 17, 211, 31, 244, 49, 102, 160, 24, 29, 249, 201, 71, 80, 1, 131, 136, 16, 194, 30, 237, 197, 215, 91, 68, 76, 108, 145, 5, 18, 27, 233, 119, 80, 5, 133, 0, 66, 65, 132, 32, 73, 48, 16, 13, 87, 112, 20, 133, 19, 28, 85, 113, 195, 1, 23, 48, 164, 85, 68, 18, 148, 24, 16, 0, 59) +$ico = New-Object IO.MemoryStream($WindowIcon, 0, $WindowIcon.Length) +$objForm.Icon = [System.Drawing.Icon]::FromHandle((new-object System.Drawing.Bitmap -argument $ico).GetHIcon()) +$objForm.KeyPreview = $True +$objForm.TabStop = $false + + +$MyLinkLabel = New-Object System.Windows.Forms.LinkLabel +$MyLinkLabel.Location = New-Object System.Drawing.Size(220,10) +$MyLinkLabel.Size = New-Object System.Drawing.Size(130,15) +$MyLinkLabel.DisabledLinkColor = [System.Drawing.Color]::Red +$MyLinkLabel.VisitedLinkColor = [System.Drawing.Color]::Blue +$MyLinkLabel.LinkBehavior = [System.Windows.Forms.LinkBehavior]::HoverUnderline +$MyLinkLabel.LinkColor = [System.Drawing.Color]::Navy +$MyLinkLabel.TabStop = $False +$MyLinkLabel.Text = " www.myteamslab.com" +$MyLinkLabel.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Right +$MyLinkLabel.TextAlign = [System.Drawing.ContentAlignment]::BottomRight #TopRight +$MyLinkLabel.add_click( +{ + [system.Diagnostics.Process]::start("http://www.myteamslab.com") +}) +$objForm.Controls.Add($MyLinkLabel) + + +$IPAddressLabel = New-Object System.Windows.Forms.Label +$IPAddressLabel.Location = New-Object System.Drawing.Size(50,40) +$IPAddressLabel.Size = New-Object System.Drawing.Size(80,15) +$IPAddressLabel.Text = "IP Address:" +$IPAddressLabel.TabStop = $false +$IPAddressLabel.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left +$objForm.Controls.Add($IPAddressLabel) + + +#IPAddressTextBox ============================================================ +$IPAddressTextBox = new-object System.Windows.Forms.textbox +$IPAddressTextBox.location = new-object system.drawing.size(130,40) +$IPAddressTextBox.size= new-object system.drawing.size(150,23) +$IPAddressTextBox.text = $IPAddress +$IPAddressTextBox.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left +$IPAddressTextBox.tabIndex = 1 +$objform.controls.add($IPAddressTextBox) + + +$BrandLabel = New-Object System.Windows.Forms.Label +$BrandLabel.Location = New-Object System.Drawing.Size(50,70) +$BrandLabel.Size = New-Object System.Drawing.Size(80,15) +$BrandLabel.Text = "Phone Type:" +$BrandLabel.TabStop = $false +$BrandLabel.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left +$objForm.Controls.Add($BrandLabel) + +$BrandDropDownBox = New-Object System.Windows.Forms.ComboBox +$BrandDropDownBox.Location = New-Object System.Drawing.Size(130,70) +$BrandDropDownBox.Size = New-Object System.Drawing.Size(150,15) +$BrandDropDownBox.DropDownHeight = 100 +$BrandDropDownBox.tabIndex = 2 +$BrandDropDownBox.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left +$BrandDropDownBox.DropDownStyle = "DropDownList" + +[void] $BrandDropDownBox.Items.Add("Poly") +[void] $BrandDropDownBox.Items.Add("Yealink") +#[void] $BrandDropDownBox.Items.Add("AudioCodes") + +$objForm.Controls.Add($BrandDropDownBox) + +$DeviceType = $DeviceType.toLower() +if($DeviceType -eq "yealink") +{ + $BrandDropDownBox.SelectedItem = "Yealink" +} +else +{ + $BrandDropDownBox.SelectedItem = "Poly" +} + + +$BrandDropDownBox.Add_SelectedIndexChanged({ + + if($BrandDropDownBox.SelectedItem -eq "Poly") + { + $PasswordTextBox.text = "456" + } + elseif($BrandDropDownBox.SelectedItem -eq "Yealink") + { + $PasswordTextBox.text = "admin" + } +}) + +#PasswordLabel ============================================================ +$PasswordLabel = New-Object System.Windows.Forms.Label +$PasswordLabel.Location = New-Object System.Drawing.Size(50,100) +$PasswordLabel.Size = New-Object System.Drawing.Size(80,15) +$PasswordLabel.Text = "Password:" +$PasswordLabel.TabStop = $false +$PasswordLabel.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left +$objForm.Controls.Add($PasswordLabel) + + +#PasswordTextBox ============================================================ +$PasswordTextBox = new-object System.Windows.Forms.textbox +$PasswordTextBox.location = new-object system.drawing.size(130,100) +$PasswordTextBox.size = new-object system.drawing.size(150,23) +$PasswordTextBox.text = $Password +$PasswordTextBox.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left +$PasswordTextBox.tabIndex = 3 +$objform.controls.add($PasswordTextBox) + + +# ScreenButton ============================================================ +$ScreenButton = New-Object System.Windows.Forms.Button +$ScreenButton.Location = New-Object System.Drawing.Size(120,135) +$ScreenButton.Size = New-Object System.Drawing.Size(130,23) +$ScreenButton.Text = "Show Screen" +$ScreenButton.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left +$ScreenButton.Add_Click( +{ + + [System.Windows.Forms.Application]::DoEvents() + + $theIPAddress = $null + $theIPAddress = $IPAddressTextBox.Text + + if($theIPAddress -ne $null) + { + $theBrand = $BrandDropDownBox.SelectedItem + $thePassword = $PasswordTextBox.text + Write-Host "INFO: Type Selected: $theBrand" -foreground yellow + $Script:ImageArrayResult = $null + ShowScreen -IPAddress $theIPAddress -Brand $theBrand -Password $thePassword + if($Script:ImageArrayResult -ne $null) + { + EditGifDialog -ImageArray $Script:ImageArrayResult + } + + } + +}) +$objForm.Controls.Add($ScreenButton) + + +$Script:ImageArrayResult = $null +function ShowScreen([string]$IPAddress, [string] $Brand, [string] $Password) +{ + + $SyncHash = [hashtable]::Synchronized(@{}) + $SyncHash.boolWhile = $true + $SyncHash.IPAddress = $IPAddress + $SyncHash.Brand = $Brand + $SyncHash.Port = "443" + $SyncHash.Image = $null + if($SyncHash.Brand -eq "Poly") + { + $SyncHash.HTTPUsername = "Polycom" + $SyncHash.HTTPPassword = $Password + } + elseif($SyncHash.Brand -eq "Yealink") + { + $SyncHash.HTTPUsername = "admin" + $SyncHash.HTTPPassword = $Password + } + + $SyncHash.UseHTTPS = $true + + $SyncHash.screenConnected = $false + + [byte[]]$SyncHash.connectingImage = @(71, 73, 70, 56, 57, 97, 100, 1, 200, 0, 231, 255, 0, 46, 15, 20, 50, 14, 22, 56, 13, 24, 52, 15, 18, 62, 12, 17, 44, 18, 15, 62, 12, 22, 61, 12, 27, 48, 17, 17, 57, 14, 20, 65, 13, 13, 69, 11, 22, 44, 19, 21, 43, 19, 26, 72, 11, 17, 47, 18, 26, 55, 17, 14, 60, 16, 16, 50, 19, 23, 40, 22, 30, 84, 9, 23, 36, 25, 16, 34, 25, 26, 43, 23, 23, 92, 8, 22, 30, 27, 26, 29, 27, 30, 36, 25, 35, 40, 25, 23, 39, 25, 27, 24, 29, 35, 38, 25, 32, 27, 29, 26, 84, 12, 19, 26, 29, 31, 43, 24, 28, 68, 17, 22, 33, 28, 23, 34, 27, 32, 33, 27, 36, 37, 27, 24, 32, 29, 28, 31, 29, 32, 30, 30, 24, 77, 15, 30, 36, 28, 28, 33, 29, 28, 26, 32, 24, 25, 32, 28, 29, 31, 28, 30, 30, 37, 28, 31, 33, 97, 11, 19, 32, 30, 33, 23, 33, 33, 36, 29, 34, 30, 32, 29, 80, 17, 23, 34, 31, 30, 33, 31, 34, 22, 35, 30, 26, 34, 30, 31, 33, 30, 78, 19, 27, 33, 33, 27, 40, 31, 31, 90, 16, 27, 96, 14, 32, 45, 31, 33, 34, 35, 33, 92, 18, 24, 113, 13, 34, 84, 24, 32, 106, 18, 31, 108, 18, 37, 38, 40, 37, 117, 17, 30, 117, 18, 37, 97, 25, 39, 99, 25, 34, 105, 23, 36, 42, 44, 41, 133, 19, 35, 115, 25, 43, 121, 23, 47,45, 47, 45, 131, 23, 45, 133, 23, 41, 111, 30, 42, 128, 29, 40, 109, 35, 42, 51, 53, 50, 122, 32, 48, 217, 3, 50, 151, 25, 45, 130, 32, 50, 143, 28, 52, 217, 5, 61, 160, 24, 49, 217, 6, 56, 55, 57, 54, 219, 8, 51, 160, 27, 45, 155, 28, 52,220, 11, 46, 210, 15, 47, 209, 15, 52, 135, 38, 55, 142, 36, 53, 220, 12, 52, 60, 62, 59, 137, 39, 51, 176, 27, 53, 219, 13, 62, 210, 17, 58, 220, 14, 57, 143, 40, 50, 203, 23, 44, 222, 17, 53, 212, 21, 49, 202, 24, 55, 212, 21, 54, 213, 22, 43, 211, 21, 64, 204, 25, 50, 169, 35, 61, 176, 33, 59, 155, 40, 55, 185, 31, 52, 169, 36, 56, 171, 36, 52, 212, 23, 60, 195, 29, 52, 203, 26, 61, 203, 26, 66, 214, 24, 50, 194, 29, 67, 186, 32, 63, 223, 21, 59, 164, 40, 60, 187, 33, 59,214, 25, 55, 186, 33, 69, 196, 31, 58, 195, 31, 63, 215, 26, 50, 165, 41, 66, 179, 37, 67, 69, 71, 69, 158, 44, 65, 206, 30, 57, 182, 38, 57, 217, 28, 51, 153, 47, 64, 182, 39, 63, 191, 37, 56, 173, 43, 65, 175, 43, 60, 191, 38, 62, 190, 38, 67, 165, 49, 57, 74, 76, 73, 202, 40, 68, 217, 36, 71, 79, 81, 78, 83, 85, 83, 88, 90, 87, 200, 56, 82, 200, 57, 88, 177, 65, 82, 204, 57, 78, 187, 62, 83, 94, 96, 93, 193, 66, 89, 102, 104, 101, 207, 83, 106, 203, 85, 99, 111, 113, 110,209, 84, 101, 198, 88, 97, 192, 89, 109, 204, 87, 106, 197, 90, 104, 175, 102, 112, 119, 121, 118, 124, 126, 123, 130, 132, 129, 135, 137, 134, 240, 105, 129, 222, 113, 133, 225, 113, 126, 139, 141, 138, 234, 114, 130, 235, 114, 139, 230, 117, 130, 225, 120, 136, 143, 145, 142, 231, 120, 140, 217, 125, 138, 207, 129, 146, 148, 150, 147, 197, 136, 146, 156, 158, 155, 163, 165, 162, 255, 137, 158, 255, 144, 169, 170, 172, 169, 255, 149, 171, 174, 177, 173, 245, 158, 164, 255, 155, 166, 253, 156, 174, 246, 160, 174, 179, 182, 178, 239, 167, 174, 187, 189, 186, 193, 195, 192, 198, 200, 197, 202, 205, 201, 255, 190, 208, 255, 191, 201, 206, 209, 205, 254, 198, 205, 210, 213, 209, 255, 199, 212, 214, 216, 213, 218, 221, 217, 255, 211, 224, 222, 224, 221, 255, 215, 224, 255, 219, 220, 225, 228, 224, 255, 224, 229, 230, 232, 229, 234, 237, 233, 255, 230, 241, 237, 240, 236, 255, 236, 239, 255, 236, 245, 254, 238, 253, 241, 244, 240, 255, 242, 236, 255, 242, 243, 254, 244, 250, 245, 248, 244, 250, 247, 252, 249, 251, 248, 255, 250, 242, 255, 250, 248, 255, 252, 251, 255, 252, 255, 251, 254, 250, 250, 254, 255, 254, 254, 245, 253, 255, 252, 255, 255, 255, 33, 254, 17, 67, 114, 101, 97, 116,101, 100, 32, 119, 105, 116, 104, 32, 71, 73, 77, 80, 0, 33, 249, 4, 1, 10, 0, 255, 0, 44, 0, 0, 0, 0, 100, 1, 200, 0, 0, 8, 254, 0, 99, 8, 28, 72, 176, 160, 193, 131, 8, 19, 42, 92, 200, 176, 161, 195, 135, 16, 17, 186, 112, 33, 16, 134, 192, 137, 20, 7, 98, 140, 200, 177, 163, 199, 143, 32, 67, 138, 28, 73, 178, 164, 201, 147, 40, 21, 78, 172, 120, 113, 165, 70, 151, 41, 99, 202, 156, 73, 179, 166, 205, 155, 56, 65, 194, 108, 89, 112, 99, 206, 159, 64, 131, 10, 29, 74, 212, 230, 206, 24, 71, 125, 22, 93, 202, 180, 169, 211, 167, 57, 147, 102, 124, 9, 181, 170, 213, 171, 88, 179, 30, 148, 106, 112, 170, 214, 175, 96, 195, 138, 141, 121, 116, 36, 198, 179, 104, 207, 142, 93, 203, 182, 45, 81, 165, 36, 211, 202, 133, 235, 182, 174, 221, 187, 113, 213, 66, 212, 235, 81, 133, 10, 134, 126, 241, 10, 30, 44, 24, 109, 68, 190, 29, 3,47, 84, 76, 184, 177, 99, 177, 103, 113, 8, 4, 193, 83, 34, 221, 131, 56, 36, 31, 100, 60, 16, 132, 231, 129, 53, 106, 60, 30, 77, 26, 43, 70, 205, 159, 47, 183, 44, 251, 121, 96, 102, 132, 156, 39, 183, 198, 17, 186, 180, 237, 219, 75, 79, 203, 70, 76, 144, 119, 140, 214, 174, 97, 255, 45, 232, 153, 114, 12, 218, 162, 113, 43, 95, 206, 188, 185, 243, 231, 208, 163, 75, 159, 78, 189, 186, 245, 235, 216, 179, 107, 223, 206, 189, 187, 247, 239, 224, 195, 254, 139, 31, 79, 190,188, 249, 243, 232, 211, 171, 95, 207, 190, 189, 251, 247, 240, 227, 203, 159, 79, 191, 190, 253, 251, 248, 243, 235, 223, 207, 191, 191, 255, 255, 0, 6, 40, 224, 128, 51, 41, 229, 153, 111, 171, 121, 197, 81, 108, 155, 13, 71, 224, 131, 157, 129, 128, 145, 103, 48, 80, 54, 81, 11, 20, 25, 215, 155, 106, 15, 49, 248, 218, 64, 12, 66, 40, 224, 129, 46, 20, 151, 218, 132, 32, 56, 152, 22, 67, 192, 21, 52, 131, 131, 26, 209, 246, 87, 113, 34, 138, 168, 130, 9, 129, 89, 116, 28,106, 34, 248, 165, 130, 6, 26, 236, 48, 17, 8, 62, 200, 230, 163, 8, 34, 204, 160, 228, 111, 2, 225, 48, 209, 107, 158,37, 233, 3, 14, 21, 34, 133, 163, 143, 44, 213, 72, 160, 11, 38, 224, 56, 131, 13, 58, 254, 70, 164, 15, 51, 104, 80, 195, 14, 59, 36, 39, 89, 6, 40, 116, 208, 193, 5, 23, 48, 32, 129, 4, 12, 212, 9, 231, 8, 28, 116, 208, 66, 9, 37, 122, 134, 67, 17, 59, 168, 32, 2, 8, 61, 76, 233, 130, 143, 88, 106, 9, 225, 74, 74, 190, 232, 66, 11, 65, 252, 134, 195, 14, 55, 152, 80, 34, 12, 152, 246, 0, 130, 5, 12, 12, 64, 128, 3, 20, 132, 64, 3, 13, 73, 96, 128, 65, 8, 20, 56, 16, 1, 2, 23, 148, 176, 194, 11, 254, 56, 72, 232, 2, 144, 51, 100, 70, 99, 69, 74, 118, 169, 160, 162, 2, 42, 233, 215, 7, 24, 254, 150, 1, 164, 46, 148, 16, 4, 7, 157, 146, 128, 196, 19, 83, 188, 145, 201, 31, 160, 116, 210, 73, 32, 210, 46, 178, 8, 27, 111, 96, 225, 196, 15, 9, 12, 192, 0, 156, 122, 30, 10, 130, 6, 147, 173, 240, 42, 166, 51, 116, 9, 35, 175, 3, 190, 120, 163, 10, 51, 88, 88, 44, 10, 12, 36, 64, 65, 19, 103, 248, 1, 9, 36, 143, 60, 66, 200, 191, 120, 88, 98, 9, 31, 120, 224, 65, 72, 191, 144, 32, 146, 72, 31, 96, 76, 33, 4, 9, 3, 112, 192, 167, 11, 53, 40, 41, 153, 185, 43, 196, 144,46, 142, 236, 214, 56, 67, 154, 241, 174, 128, 66, 1, 16, 44, 240, 196, 26, 146, 36, 82, 200, 32, 99, 180, 225, 114, 27, 141, 196, 124, 7, 26, 101, 148, 113, 200, 24, 99, 204, 49, 134, 34, 113, 236, 33, 138, 35, 146, 88, 1, 197, 15, 16, 0,48, 130, 11, 72, 206, 64, 145, 185, 2, 37, 218, 177, 127, 126, 81, 228, 82, 153, 34, 20, 81, 66, 1, 33, 92, 33, 8, 35, 252, 226, 49, 72, 35, 56, 151, 209, 197, 33, 119, 148, 125, 136, 29, 46, 147, 109, 246, 29, 99, 52, 162, 70, 193, 143, 120, 18, 200, 21, 33, 36, 208, 2, 14, 47, 234, 250, 244, 254, 131, 81, 35, 69, 81, 133, 65, 116, 0, 64, 4, 90, 252, 225, 9, 31, 135, 196, 172, 56, 216, 99, 28, 226, 120, 226, 135, 212, 252, 248, 228, 143, 183, 129, 118, 35, 131, 64, 178, 200, 20, 36, 0, 208, 65, 165, 62, 238, 186, 55, 127, 26, 168, 80, 195, 74, 146, 149, 192, 192, 2, 74, 156, 161, 201, 35, 120, 152, 77, 57, 206, 180, 151, 129, 243, 226, 49, 59, 110, 118, 25, 47, 195, 204, 71, 33, 159, 244, 209, 196, 2, 12, 224, 32, 130, 6, 55, 220, 144, 129, 11, 154, 141, 206, 223, 12, 199, 87, 140, 131, 5, 23, 36, 144, 67, 22, 157, 24, 162, 134, 26, 141, 76, 94, 243, 247, 142, 211, 126, 187, 226, 145, 219, 76, 57, 239, 109, 220, 161, 179, 26, 133, 104, 194, 6, 18, 158, 155, 80, 169, 14, 37, 58, 223, 159, 103, 74, 218, 0, 2, 17, 4, 48, 33, 200, 38, 120, 72, 131, 34, 20, 97, 59, 156, 61, 174, 102, 104, 64, 67, 27, 10, 72, 62, 244, 185, 204, 102, 184, 19, 95, 204, 222, 246, 8, 78, 80, 97, 1, 23, 192, 129, 160, 124, 160, 33, 251, 229, 199, 56, 69, 112, 193, 8, 22, 144, 5, 79, 88, 66, 13, 135, 120, 160, 206, 104, 119, 192, 4, 46, 208, 118, 185, 115, 224, 203, 32, 24, 193, 220, 149, 173, 17, 150, 240, 3, 27, 8, 112, 129, 18, 37, 201, 131, 254, 250, 57, 77, 9, 46, 176, 128, 51, 64, 2, 15, 221, 211, 3, 26, 236, 224, 182, 49, 192, 112, 113, 141, 43, 159, 249, 190, 71, 197, 222, 221, 110, 16, 95, 195, 89, 218, 238, 80, 7, 75, 48, 130, 13, 14, 184, 64, 147, 128, 152, 159, 11, 9, 206, 1, 108, 16, 133, 204, 34, 215, 134, 46, 144, 47, 113, 109, 195, 93, 247, 164, 104, 62, 199, 117, 207, 138, 184, 179, 92, 2, 239, 16, 137, 70, 224, 193, 19, 127, 200, 1, 3, 74, 80, 36, 50, 226, 71, 3, 31, 0, 64, 14, 22, 177, 9, 196, 145, 45, 133, 99, 232, 194, 13, 187, 231, 64, 155, 221, 1, 138, 45, 163, 97, 35, 118, 39, 185, 196, 53, 34, 13, 119, 224,221, 18, 219, 112, 136, 52, 184, 77, 20, 146, 192, 128, 4, 68, 103, 200, 242, 248, 102, 6, 49, 8, 2, 0, 132, 240, 135, 71, 168, 97, 119, 181, 35, 91, 238, 202, 71, 51, 93, 42, 78, 139, 141, 147, 153, 236, 192, 183, 198, 222, 189, 44, 133, 153, 59, 3, 5, 16, 208, 129, 173, 176, 178, 149, 216, 185, 145, 174, 50, 80, 132, 223, 28, 74, 105, 28, 112, 192, 34, 68, 129, 196, 237, 241, 110, 151, 139, 83, 219, 29, 60, 185, 75, 244, 101, 178, 123, 107, 147, 98, 28, 121, 87, 134, 6, 190, 204, 143, 155, 48, 3, 13, 0, 208, 39, 14, 74, 72, 93, 235, 254, 130, 230, 117, 242, 166, 171, 88, 89, 68, 7, 63, 226,128, 2, 232, 0, 137, 9, 114, 207, 101, 114, 52, 96, 217, 198, 25, 199, 201, 1, 211, 113, 157, 60, 32, 66, 27, 145, 54, 183, 113, 143, 119, 104, 43, 195, 219, 8, 225, 5, 7, 140, 128, 154, 198, 185, 39, 188, 96, 201, 52, 125, 90, 7, 81, 127,241, 65, 166, 50, 96, 129, 32, 36, 224, 10, 158, 144, 67, 219, 184, 151, 66, 82, 206, 241, 118, 45, 163, 153, 57, 27, 183, 80, 220, 157, 141, 148, 143, 3, 219, 49, 237, 232, 182, 220, 245, 238, 14, 124, 240, 98, 19, 12, 208, 129, 113, 137,166, 7, 72, 241, 11, 73, 51, 102, 82, 234, 28, 74, 170, 21, 233, 129, 13, 244, 215, 1, 9, 12, 33, 17, 114, 80, 195, 28,98, 22, 201, 7, 62, 14, 167, 198, 68, 91, 250, 22, 186, 61, 197, 161, 15, 142, 113, 180, 220, 2, 229, 72, 201, 5, 46, 176, 108, 132, 224, 132, 18, 36, 144, 129, 27, 252, 5, 170, 49, 240, 209, 12, 74, 90, 85, 233, 92, 117, 73, 49, 192, 212,86, 123, 112, 1, 109, 22, 34, 103, 106, 192, 89, 23, 94, 216, 201, 39, 78, 180, 101, 104, 91, 168, 39, 29, 8, 215, 241,153, 149, 174, 141, 168, 217, 216, 30, 216, 136, 66, 44, 98, 1, 35, 184, 129, 6, 112, 112, 174, 23, 157, 192, 4, 175, 42, 254, 44, 117, 176, 74, 17, 28, 216, 160, 76, 56, 24, 192, 21, 32, 49, 136, 177, 70, 182, 11, 117, 172, 108, 1, 131, 41, 212, 204, 142, 243, 102, 57, 181, 41, 227, 60, 11, 212, 114, 218, 241, 146, 155, 180, 220, 229, 32, 241, 5, 3, 124, 64, 66, 175, 122, 1, 12, 164, 25, 131, 23, 200, 54, 58, 22, 161, 45, 69, 242, 198, 0, 33, 124, 66, 13, 131, 104, 171, 29,106, 182, 208, 154, 197, 176, 13, 113, 92, 110, 27, 18, 168, 7, 59, 166, 16, 13, 208, 93, 110, 92, 23, 88, 185, 25, 30,162, 173, 141, 152, 236, 203, 240, 48, 137, 33, 92, 160, 66, 64, 120, 129, 119, 221, 245, 93, 233, 132, 23, 94, 126, 187, 234, 8, 217, 128, 135, 54, 108, 239, 162, 118, 88, 104, 40, 219, 25, 218, 119, 46, 55, 133, 101, 64, 131, 30, 198, 137, 62, 14, 203, 151, 195, 21, 173, 89, 239, 32, 120, 201, 178, 189, 12, 13, 165, 61, 67, 2, 248, 212, 193, 6, 87, 167, 81, 171, 49, 129, 0, 154, 240, 9, 62, 0, 85, 197, 101, 208, 172, 123, 41, 186, 64, 180, 193, 149, 157, 143, 188, 131, 90,221, 216, 8, 2, 130, 248, 101, 151, 220, 30, 27, 103, 168, 73, 242, 181, 81, 13, 159, 112, 2, 3, 50, 226, 21, 196, 218,120, 58, 102, 100, 193, 25, 10, 113, 71, 255, 14, 19, 197, 46, 211, 131, 254, 229, 120, 122, 135, 177, 69, 185, 205, 11, 188, 29, 31, 184, 7, 92, 250, 90, 52, 134, 84, 236, 100, 30, 213, 247, 8, 54, 44, 160, 3, 61, 50, 65, 12, 152, 134, 227, 47, 47, 39, 159, 191, 105, 1, 3, 158, 112, 222, 232, 30, 243, 141, 194, 37, 91, 102, 83, 200, 68, 238, 13, 34, 96, 220, 211, 25, 230, 54, 17, 211, 77, 62, 114, 14, 119, 0, 112, 56, 43, 25, 206, 196, 225, 129, 17, 76, 0, 128, 6, 5, 189, 130, 18, 104, 204, 203, 134, 190, 13, 103, 2, 211, 1, 2, 188, 161, 160, 199, 141, 104, 3, 193, 247, 200, 67, 116, 97, 14,107, 69, 111, 33, 16, 209, 9, 102, 140, 98, 123, 99, 24, 196, 35, 192, 225, 139, 215, 89, 34, 13, 165, 228, 93, 124, 71, 237, 95, 220, 165, 33, 169, 98, 48, 0, 151, 44, 181, 130, 241, 194, 58, 214, 165, 9, 12, 211, 112, 132, 131, 11, 24, 97, 17, 143, 216, 100, 59, 185, 23, 90, 77, 150, 143, 114, 161, 76, 159, 205, 6, 81, 8, 71, 208, 194, 28, 237, 80, 5, 89,199, 192, 136, 118, 196, 195, 26, 169, 128, 4, 247, 198, 144, 6, 151, 229, 23, 210, 213, 86, 28, 40, 249, 141, 4, 14, 168, 107, 42, 136, 6, 247, 99, 196, 237, 221, 46, 197, 0, 0, 48, 117, 228, 76, 99, 166, 231, 119, 207, 17, 162, 160, 30, 39, 31, 254, 30, 49, 137, 98, 184, 227, 30, 241, 56, 133, 26, 218, 25, 6, 77, 180, 163, 31, 242, 40, 199, 43, 84, 54, 112, 245, 145, 115, 151, 16, 213, 179, 219, 28, 103, 135, 71, 96, 129, 153, 78, 43, 139, 196, 29, 227, 151, 236, 110, 87, 5, 32, 72, 128, 24, 6, 17, 185, 105, 59, 113, 138, 80, 222, 29, 219, 186, 48, 54, 53, 108, 194, 22, 220, 112, 7, 62, 252, 33, 143, 83, 80, 116, 12, 97, 72, 132, 59, 250, 129, 143, 121, 184, 131, 26, 125, 120, 4, 31, 208, 73, 197, 160, 150, 154, 168, 78, 180, 3, 30, 216, 64, 130, 14, 204, 64, 6, 50, 80, 1, 135, 134, 78, 24, 189, 155, 203, 34, 50, 48, 1, 10, 144, 192, 136, 57, 40, 48, 190, 78, 228, 239, 148, 97, 102, 54, 156, 205, 1, 189, 132, 96, 132, 48, 220, 33, 143, 173, 115, 29, 21, 44, 43, 67, 24, 28, 225, 14, 127, 248, 3, 31, 101, 31, 71, 45, 46, 65, 8, 104, 151, 216, 237, 13, 180, 99, 36, 121, 103, 137, 62, 24, 225, 2, 183, 141, 154, 208, 249, 62, 154, 208, 200, 160, 5, 8, 72, 2, 36, 50, 57, 134, 11, 119,152, 191, 57, 99, 225, 228, 112, 248, 137, 90, 128, 99, 30, 243, 208, 199, 214, 251, 209, 14, 84, 236, 97, 147, 113, 72, 68, 59, 60, 207, 15, 125, 212, 195, 236, 211, 8, 4, 30, 124, 254, 221, 70, 181, 17, 21, 108, 145, 182, 157, 26, 30, 33, 5, 9, 192, 96, 73, 46, 200, 0, 237, 113, 163, 164, 228, 201, 160, 3, 17, 200, 194, 35, 88, 24, 234, 139, 62, 176, 12, 43, 28, 67, 188, 47, 137, 135, 71, 104, 98, 24, 235, 48, 15, 248, 160, 15, 250, 176, 15, 251, 0, 115, 206, 151, 51, 141,32, 125, 254, 176, 15, 213, 87, 15, 214, 55, 15, 220, 32, 11, 176, 115, 75, 233, 147, 66, 227, 68, 86, 91, 36, 57, 138,99, 9, 98, 144, 0, 26, 82, 34, 205, 179, 126, 163, 209, 126, 56, 210, 1, 14, 64, 7, 243, 103, 64, 250, 5, 100, 166, 212, 86, 81, 118, 106, 182, 224, 13, 149, 7, 122, 91, 199, 15, 254, 192, 124, 167, 160, 127, 151, 36, 125, 3, 72, 128, 158,151, 131, 248, 208, 14, 198, 48, 9, 100, 182, 51, 167, 87, 102, 49, 51, 89, 139, 51, 8, 129, 64, 2, 234, 119, 17, 199, 65, 130, 165, 225, 43, 126, 113, 1, 33, 0, 10, 100, 150, 54, 55, 3, 95, 44, 132, 78, 25, 72, 48, 144, 48, 9, 195, 160, 117, 158, 103, 15, 250, 224, 15, 202, 39, 15, 242, 96, 12, 143, 96, 51, 138, 48, 126, 195, 80, 14, 200, 183, 117, 246, 96, 15, 251, 160, 134, 243, 176, 13, 173, 0, 9, 133, 32, 86, 119, 0, 109, 158, 228, 50, 97, 3, 51, 96, 19, 51, 254, 154, 128, 4, 22, 208, 60, 53, 70, 133, 164, 161, 2, 18, 64, 3, 157, 128, 68, 6, 55, 101, 180, 179, 70, 75, 116, 7, 163, 192, 8, 181, 192, 13, 108, 136, 15, 121, 72, 128, 252, 128, 15, 238, 0, 14, 178, 208, 72, 135, 120, 109, 132, 160, 9, 220, 240, 114, 121, 216, 128, 213, 135, 124, 238, 80, 132, 134, 32, 7, 95, 211, 83, 132, 24, 117, 186, 195, 8, 78, 208, 1, 94, 209, 136, 142, 72, 116, 18, 192, 4, 158, 128, 68, 188, 147, 107, 94, 104, 81, 119, 176, 64, 236, 227, 7, 101, 88, 121, 65, 168, 135, 216, 167, 125, 151, 116, 59, 138, 16, 73, 57, 100, 12, 53, 232, 128, 213, 151, 134, 164, 200, 135, 52, 39, 51, 68, 150, 73, 146, 68, 98, 93, 0, 9, 78, 208, 0, 83, 49, 130, 193, 56, 26, 32, 48, 0, 82, 0, 59, 171, 7, 119, 78, 247,120, 144, 48, 131, 53, 168, 134, 250, 192, 15, 177, 184, 14, 175, 192, 8, 120, 64, 83, 108, 214, 5, 138, 128, 67, 155, 32, 11, 158, 216, 15, 14, 40, 138, 159, 215, 14, 179, 152, 8, 123, 144, 73, 59, 21, 100, 143, 228, 50, 144, 48, 5, 1, 208, 2, 84, 197, 142, 237, 88, 24, 157, 145, 0, 94, 16, 144, 145, 52, 54, 158, 52, 109, 110, 131, 7, 137, 80, 12, 237, 0, 122, 65, 248, 131, 215, 231, 13, 156, 240, 254, 8, 97, 213, 56, 81, 228, 133, 138, 48, 7, 237, 132, 7, 130, 16, 13, 53, 104, 121, 159, 7, 122, 243, 48, 13, 167, 176, 50, 29, 134, 98, 227, 228, 98, 118, 80, 8, 92, 32, 0, 29, 144, 49, 32, 16,43, 29, 217, 24, 127, 3, 85, 74, 103, 9, 224, 167, 92, 115, 100, 54, 111, 115, 10, 158, 184, 117, 4, 248, 138, 160, 231, 14, 189, 240, 9, 21, 8, 73, 49, 35, 98, 165, 118, 7, 167, 246, 10, 229, 0, 141, 158, 71, 128, 214, 23, 115, 193, 0, 144, 1, 54, 89, 32, 118, 67, 243, 85, 8, 107, 192, 148, 43, 80, 36, 192, 24, 149, 109, 177, 17, 48, 64, 149, 75, 199, 113,230, 99, 64, 135, 160, 7, 245, 53, 126, 205, 32, 15, 121, 216, 141, 202, 135, 15, 242, 224, 13, 169, 0, 8, 115, 22, 51,30, 134, 122, 115, 52, 86, 143, 208, 7, 212, 0, 141, 112, 89, 15, 91, 135, 15, 235, 192, 9, 132, 16, 90, 106, 166, 64, 150, 20, 90, 104, 160, 151, 6, 192, 1, 43, 32, 25, 127, 9, 152, 107, 33, 152, 132, 249, 53, 31, 135, 92, 53, 51, 98, 119, 96, 9, 144, 240, 12, 102, 8, 153, 102, 103, 12, 130, 64, 8, 107, 247, 75, 104, 211, 123, 134, 57, 124, 23, 86, 8, 41, 217, 150, 248, 128, 131, 158, 87, 118, 235, 32, 9, 2, 23, 57, 46, 100, 62, 29, 254, 230, 154, 176, 41, 155, 180, 137, 23, 83, 129, 41, 49, 160, 116, 233, 181, 75, 181, 83, 6, 188, 233, 155, 205, 48, 15, 254, 80, 15, 16, 24, 129, 201, 144, 9, 182, 244, 73, 250, 53, 86, 110, 133, 6, 103, 5, 96, 106, 0, 9, 146, 112, 11, 236, 201, 143, 252, 88, 118, 238, 80, 9, 233, 54, 78, 217, 105, 95, 109, 240, 8, 107, 240, 154, 221, 86, 63, 223, 105, 23, 46, 129, 41, 73, 39, 6, 39, 68, 62, 81, 132, 64, 237, 36, 7, 144, 208, 152, 250, 8, 129, 122, 120, 12, 126, 112, 66, 142, 211, 6, 43, 132, 103, 52, 116, 59, 227, 148, 6, 131, 160, 9, 199, 128, 14, 55, 136, 131, 222, 216, 14, 4, 250, 73, 24, 72, 76, 221, 163, 160, 12, 186, 18, 179, 249, 160, 95, 17, 161, 21, 50, 0, 94, 80, 161, 224, 84, 62, 113, 198, 62, 207, 32, 15, 247, 240, 121, 162, 184, 15, 101, 183, 13, 168, 112, 68, 40, 244, 68, 183, 196, 59, 228, 132, 51, 129, 56, 114, 147, 48, 13, 148, 199, 146, 250, 40, 153, 235, 208, 7, 72, 84, 84, 237, 70, 67, 135, 240, 8, 95, 112, 0, 77, 57, 123, 60, 26, 22, 59, 241, 142, 33, 201, 61, 52, 165, 54, 53, 67, 59, 151, 198, 149, 160, 153, 134, 159, 119, 125, 98, 57, 9, 150, 16, 136, 203, 200, 97, 67, 134, 153, 11, 196, 7, 254, 140, 96, 11, 116, 8, 129, 150, 199, 15, 251, 160, 15, 243, 48, 14, 188, 80, 160, 19, 116, 158, 185, 227, 9, 103, 154, 166, 215, 180, 166, 119, 161, 36, 239, 24, 143, 86, 121, 81, 114, 58, 62, 110, 243, 8, 129, 160, 141, 54, 216, 128, 106, 40, 153, 238, 48, 13, 171, 160, 118, 203, 136, 6, 109, 3, 170, 161, 213, 8, 143, 224, 7, 211, 176, 14, 150, 135, 167, 160, 87, 15, 103, 183, 170, 209, 53, 92, 181, 51, 169, 92, 144, 145, 126, 131, 169, 110, 1, 75, 19, 225, 35, 145, 120, 9, 207, 150, 59, 110, 149, 140, 49, 115, 105, 158, 240, 10, 220, 16, 15, 73, 250, 150, 145, 57, 15, 229,64, 11, 202, 26, 98, 152, 51, 62, 208, 38, 171, 51, 136, 124, 251, 24, 141, 97, 57, 12, 137, 96, 149, 64, 101, 86, 52, 217, 54, 5, 199, 8, 79, 208, 0, 27, 32, 3, 26, 224, 2, 42, 69, 172, 107, 97, 3, 23, 129, 172, 70, 48, 137, 55, 199, 113,164, 85, 84, 189, 39, 170, 209, 16, 15, 165, 90, 128, 158, 39, 15, 238, 240, 12, 126, 112, 154, 219, 51, 7, 113, 168, 6, 124, 64, 8, 158, 208, 11, 90, 71, 128, 245, 224, 15, 246, 240, 147, 242, 192, 13, 169, 0, 86, 199, 180, 97, 162, 197, 54, 220, 51, 78, 140, 128, 4, 29, 112, 2, 175, 229, 2, 61, 16, 38, 246, 58, 254, 22, 46, 224, 46, 12, 144, 3, 127, 64, 8, 45, 243, 75, 137, 87, 81, 159, 116, 147, 244, 198, 8, 176, 0, 157, 209, 249, 147, 160, 55, 153, 181, 192, 8, 106, 64, 64, 109, 160, 162, 144, 176, 10, 52, 104, 131, 105, 152, 135, 94, 26, 12, 154, 80, 8, 182, 136, 66, 110, 247, 64, 110, 116, 80, 105, 112, 9, 36, 64, 49, 129, 119, 41, 45, 219, 22, 190, 50, 2, 182, 246, 134, 39, 218, 56, 156, 245, 130, 56, 51, 8, 26, 186, 8, 209, 208, 14, 208, 88, 170, 97, 9, 12, 120, 48, 89, 203, 72, 8, 193, 48, 14, 2, 104, 121, 25, 139, 170, 220, 208, 135, 17, 217, 123, 183, 228, 118, 153, 148, 56, 236, 198, 7, 129, 144, 0, 49, 80, 3, 122, 231, 160, 95, 11, 25, 2, 241, 34, 130, 131, 5, 144, 128, 158, 186, 68, 84, 83, 102, 159, 6, 37, 7, 167, 86, 11, 235, 224, 150, 55, 168, 124, 249, 70, 86, 122, 0, 8, 1, 72, 128, 160, 135, 131, 48, 183, 14, 197, 112, 9, 82, 219, 86, 52, 133, 179, 136, 25, 57, 161, 86, 8, 87, 48, 0, 61, 224, 40, 207, 212, 184, 87, 1, 113, 45, 208, 1, 72, 240, 9, 99, 80, 95, 108, 115, 115, 53, 21, 100, 184, 179, 114, 106, 0, 8, 139, 112, 124, 149, 183, 143, 252, 184, 15, 93, 183, 61, 203, 8, 8, 238, 0, 151, 150, 254, 39, 153, 222, 80, 11, 128, 128, 7, 52, 100, 74, 105, 208, 118, 200, 85, 87, 106, 249, 9, 71, 192, 0, 154, 98, 28, 138, 171, 187, 108, 58, 16, 142, 98, 0, 126, 176, 73, 122, 128, 100, 165, 150, 62, 138, 160, 59, 52, 117, 73, 132, 0, 7, 119, 91, 121, 246, 192, 143, 254, 208, 14, 94, 23, 51, 122, 112, 9, 213, 27, 141, 186, 250, 12, 175, 19, 64, 165, 52, 57,134, 88, 102, 138, 247, 50, 166, 69, 1, 25, 244, 148, 177, 178, 3, 228, 162, 190, 61, 202, 18, 74, 18, 0, 99, 150, 6, 106, 166, 120, 138, 99, 54, 109, 244, 78, 40, 20, 74, 119, 32, 7, 136, 32, 9, 219, 208, 188, 105, 56, 15, 1, 220, 61, 151, 240, 14, 251, 184, 134, 217, 10, 86, 136, 35, 59, 53, 101, 185, 84, 54, 89, 188, 131, 163, 29, 32, 25, 62, 240, 2, 32,96, 193, 17, 135, 193, 87, 161, 36, 15, 112, 4, 61, 246, 86, 30, 167, 89, 46, 99, 7, 106, 245, 72, 152, 83, 8, 254, 39,12, 1, 8, 129, 249, 6, 103, 101, 16, 195, 1, 218, 14, 210, 224, 7, 134, 112, 66, 233, 229, 118, 50, 84, 71, 83, 86, 141, 136, 160, 101, 45, 32, 16, 84, 229, 52, 70, 124, 196, 4, 49, 3, 13, 64, 1, 103, 192, 189, 25, 88, 188, 226, 84, 83, 43, 22, 62, 88, 4, 177, 155, 176, 10, 254, 219, 240, 14, 102, 167, 10, 203, 56, 89, 140, 80, 189, 216, 58, 11, 128, 32, 86, 27, 23, 168, 101, 252, 70, 192, 229, 54, 123, 208, 7, 36, 128, 2, 10, 242, 109, 111, 92, 21, 248, 58, 16, 55, 48, 1, 2, 48, 5, 159, 224, 54, 208, 37, 191, 228, 227, 78, 132, 216, 54, 87, 186, 138, 38, 135, 14, 170, 192, 110, 109, 176, 9, 235, 144, 170, 173, 240, 8, 117, 160, 8, 36, 138, 108, 19, 37, 84, 206, 42, 76, 115, 36, 7, 159, 96, 5, 1, 224, 36, 46, 146, 201, 89, 241, 37, 4, 209, 187, 23, 240, 3, 125, 176, 50, 151, 36, 69, 158, 20, 57, 55, 183, 83, 119, 149, 129, 40, 137, 117, 162, 0, 131, 203, 102, 174, 1, 217, 70, 192, 165, 62, 45, 211, 192, 140, 35, 71, 147, 116, 7, 133, 32, 9, 20, 48, 2, 195, 26, 88, 69, 76, 204, 76, 81, 104, 221, 214, 2, 45, 16, 0, 84, 192, 167, 36, 54, 87, 138, 227, 95, 122, 188, 78, 16, 116, 59, 150, 224, 47, 94, 131, 155, 35, 247, 8, 86, 89, 84, 138, 176, 68, 101, 144, 6, 160, 202, 110, 115, 132,59, 245, 247, 9, 24, 249, 1, 139, 219, 52, 235, 204, 206, 69, 1, 47, 195, 209, 106, 72, 51, 1, 44, 64, 160, 149, 99, 98, 68, 246, 192, 201, 232, 61, 119, 165, 54, 152, 163, 56, 145, 229, 75, 166, 84, 254, 6, 80, 204, 97, 55, 35, 142, 56, 199, 172, 161, 214, 122, 63, 208, 1, 26, 160, 52, 25, 99, 3, 121, 55, 104, 20, 93, 21, 130, 53, 104, 230, 34, 2, 27, 240,0, 88, 240, 8, 248, 21, 111, 52, 100, 163, 168, 204, 54, 183, 131, 62, 191, 150, 152, 118, 144, 212, 221, 51, 89, 115, 96, 95, 119, 80, 191, 13, 117, 122, 7, 84, 64, 15, 196, 7, 158, 112, 5, 118, 147, 36, 76, 131, 211, 127, 65, 85, 59, 237, 20, 61, 141, 49, 54, 160, 2, 31, 176, 0, 96, 26, 184, 111, 245, 113, 12, 173, 212, 70, 213, 6, 138, 224, 98, 241, 75, 74, 12, 197, 205, 54, 35, 136, 112, 218, 172, 189, 68, 98, 170, 231, 133, 166, 21, 2, 12, 0, 2, 208, 3, 34, 57, 77, 214,101, 13, 21, 79, 2, 3, 60, 96, 3, 241, 60, 4, 146, 192, 7, 248, 217, 8, 192, 198, 102, 143, 115, 92, 225, 115, 213, 247, 103, 185, 89, 109, 198, 207, 44, 62, 226, 180, 127, 255, 197, 200, 123, 224, 8, 66, 80, 0, 40, 144, 184, 34, 112, 91, 38, 0, 209, 139, 253, 20, 25, 97, 17, 143, 114, 55, 142, 205, 3, 46, 208, 0, 7, 64, 5, 155, 144, 6, 3, 103, 203, 186, 163, 217, 57, 71, 188, 37, 70, 166, 148, 115, 220, 14, 133, 162, 34, 236, 170, 69, 85, 6, 131, 128, 8, 86, 48, 0, 230, 254, 66, 36, 173, 61, 3, 31, 240, 1, 185, 27, 219, 81, 1, 19, 181, 45, 130, 18, 242, 1, 13, 240, 3, 94, 144, 110, 2, 36, 215, 155, 20, 111, 9, 135, 103, 47, 244, 204, 200, 221, 222, 77, 199, 217, 232, 51, 7, 115, 208, 5, 133, 64, 119, 21, 240,2, 43, 240, 148, 49, 224, 218, 130, 198, 178, 218, 45, 20, 74, 113, 33, 24, 82, 34, 19, 145, 1, 0, 112, 110, 5, 170, 156, 184, 169, 199, 233, 93, 87, 29, 231, 222, 199, 93, 95, 190, 250, 196, 107, 134, 67, 130, 240, 3, 173, 242, 2, 64, 16,43, 90, 197, 96, 255, 205, 20, 122, 113, 33, 22, 48, 224, 56, 192, 3, 49, 80, 94, 124, 74, 165, 191, 244, 50, 90, 196, 95, 165, 198, 107, 16, 142, 220, 141, 39, 62, 42, 102, 97, 166, 101, 4, 5, 176, 2, 64, 160, 227, 254, 180, 21, 31, 94, 20, 1, 222, 221, 32, 192, 3, 60, 0, 2, 18, 144, 4, 33, 202, 131, 130, 58, 81, 157, 13, 105, 48, 30, 227, 237, 13, 95, 240, 69, 54, 54, 30, 8, 80, 48, 0, 40, 224, 36, 25, 2, 149, 5, 17, 34, 63, 142, 19, 62, 161, 35, 143, 114, 41, 48, 128, 72,2, 0, 5, 126, 48, 103, 34, 12, 95, 205, 170, 115, 229, 244, 228, 80, 30, 69, 12, 254, 72, 132, 176, 8, 88, 16, 0, 29, 16, 4, 240, 220, 2, 254, 234, 199, 142, 239, 50, 209, 95, 94, 32, 43, 129, 41, 48, 128, 3, 203, 131, 33, 120, 115, 35, 45, 176, 99, 147, 64, 8, 117, 160, 152, 132, 88, 84, 206, 76, 188, 116, 4, 229, 201, 61, 162, 9, 100, 51, 236, 211, 9, 87,14, 209, 242, 115, 3, 37, 82, 4, 203, 67, 16, 127, 30, 232, 67, 225, 163, 180, 61, 230, 46, 80, 41, 59, 208, 1, 1, 0, 5, 154, 208, 167, 55, 68, 67, 185, 118, 64, 111, 30, 81, 200, 173, 107, 113, 154, 100, 135, 80, 8, 125, 160, 4, 76, 233, 87, 35, 101, 172, 193, 66, 232, 238, 2, 232, 166, 158, 18, 74, 33, 158, 126, 3, 207, 22, 240, 178, 62, 160, 3, 3, 144, 4, 125, 0, 64, 209, 149, 97, 166, 228, 105, 148, 51, 71, 224, 123, 220, 184, 14, 57, 12, 229, 219, 126, 4, 9, 98, 0, 5, 104, 42, 88, 91, 101, 3, 221, 157, 88, 232, 226, 46, 217, 157, 236, 38, 177, 34, 9, 1, 2, 64, 128, 41, 46, 224, 234, 44, 240, 5, 126, 48, 8, 118, 144, 64, 165, 4, 74, 23, 165, 107, 220, 14, 218, 7, 228, 61, 17, 181, 51, 165, 165, 9, 95, 0, 63, 31, 160, 90, 25, 96, 91, 233, 190, 238, 3, 145, 234, 239, 14, 239, 121, 33, 239, 5, 1, 3, 10, 246, 2, 61, 144, 1, 138, 59, 1, 11, 208, 4, 177, 78, 81, 217, 30, 254, 194, 108, 164, 157, 195, 13, 225, 188, 70, 147, 141, 160, 161, 147, 64, 5, 6, 112, 1, 132, 162, 229, 20, 177, 85, 74, 19, 44, 62, 110, 241, 55, 49, 23, 48, 129, 41, 10, 22, 155, 198, 227, 1, 173, 30, 0, 57, 192, 6, 159, 224, 53, 22, 197, 110, 236, 68, 240, 150, 62, 124, 109, 83, 8, 147, 176, 6, 78, 32, 0, 13, 96, 2, 56, 208, 3, 13, 42, 23, 195, 94, 241, 58, 79, 22, 1, 62, 241, 153, 194, 36, 183, 149, 36, 25, 112, 1, 4, 144, 4, 139, 144, 8, 176, 51, 103, 153, 214, 70, 223, 222, 244, 145, 131, 67, 143, 16, 60, 74, 96, 0, 85, 127, 3, 162, 129, 223, 13, 10, 207, 27, 177, 245, 92, 31, 232, 177, 242, 26, 31, 18, 18, 226, 121, 25, 46, 17, 43, 46, 160, 3, 32, 144, 41, 62,224, 2, 31, 48, 2, 18, 64, 0, 80, 240, 7, 141, 36, 189, 197, 171, 157, 185, 233, 237, 16, 21, 54, 167, 246, 7, 73, 64, 0, 12, 64, 4, 65, 240, 236, 2, 161, 93, 180, 237, 34, 61, 205, 34, 201, 174, 223, 76, 194, 250, 32, 193, 236, 101, 225, 18, 126, 97, 41, 204, 163, 96, 18, 162, 184, 155, 34, 1, 14, 32, 5, 102, 112, 9, 158, 224, 47, 150, 32, 7, 56, 231, 237,28, 120, 146, 253, 199, 8, 128, 96, 6, 76, 144, 3, 8, 176, 218, 250, 254, 51, 17, 78, 57, 152, 194, 156, 88, 143, 155, 250, 11, 193, 145, 255, 221, 60, 216, 191, 243, 207, 244, 40, 23, 224, 41, 57, 0, 5, 108, 32, 9, 154, 224, 135, 95, 243,61, 32, 29, 233, 153, 163, 9, 139, 144, 45, 57, 16, 1, 3, 112, 1, 107, 220, 27, 40, 177, 163, 93, 223, 20, 18, 210, 85,6, 64, 1, 73, 96, 5, 249, 146, 8, 0, 225, 233, 209, 64, 130, 3, 55, 49, 98, 228, 71, 204, 149, 36, 20, 8, 0, 224, 80, 2, 4, 136, 24, 21, 45, 94, 196, 152, 81, 227, 70, 142, 29, 61, 126, 4, 25, 82, 228, 72, 146, 37, 77, 158, 68, 153, 82, 229, 74, 148, 42, 84, 104, 48, 97, 162, 195, 5, 0, 3, 18, 144, 248, 33, 228, 9, 22, 44, 92, 124, 242, 116, 130, 228, 7, 137, 4, 3, 36, 48, 232, 208, 98, 199, 14, 138, 44, 157, 62, 133, 26, 85, 234, 84, 170, 85, 173, 58, 85, 33, 195, 131, 7, 17, 34, 102, 224, 192, 225, 2, 5, 135, 11, 12, 36, 72, 16, 96, 64, 64, 0, 6, 23, 80, 148, 88, 1, 4, 71, 69, 151, 117, 175, 222, 197, 155, 87, 239, 94, 190, 125, 67, 206, 232, 58, 67, 176, 75, 23, 25, 92, 180, 64, 140, 248, 195, 132, 9, 29, 92, 196, 0, 1, 3, 198, 68, 23, 46, 106, 212, 112, 233, 87, 243, 102, 206, 157, 61, 127, 254, 174, 40, 120, 34, 8, 176, 77, 113, 248, 16, 44, 56, 166, 138, 138, 48, 122, 244, 240, 129, 3, 68, 6, 195, 149, 65, 223, 198, 157, 91, 247, 238, 141,133, 93, 172, 88, 49, 49, 6, 142, 30, 146, 71, 131, 56, 140, 216, 197, 68, 24, 193, 129, 175, 224, 29, 93, 250, 116, 234, 121, 75, 148, 168, 12, 86, 182, 228, 225, 115, 43, 127, 127, 140, 17, 120, 69, 225, 213, 205, 159, 71, 159, 94, 35, 120, 246, 182, 99, 212, 85, 145, 122, 6, 235, 202, 202, 31, 75, 134, 161, 94, 255, 126, 254, 186, 193, 195, 7, 176, 174, 25, 108, 72, 205, 165, 152, 86, 27, 208, 6, 27, 250, 99, 176, 65, 7, 243, 146, 207, 165, 193, 234, 74, 46, 188, 208, 230, 11, 16, 190, 7, 55, 228, 176, 67, 15, 63, 4, 49, 68, 17, 71, 36, 177, 68, 19, 79, 68, 49, 69, 21, 87, 100, 177, 69, 23, 95, 132, 49, 70, 25, 103, 164, 177, 70, 27, 111, 196, 49, 71, 29, 119, 228, 241, 174, 101, 252, 241, 135, 156, 30, 135, 20, 105, 23, 108, 206, 129, 103, 159, 125, 224, 57, 39, 27, 98, 170, 120, 241, 71, 127, 156, 217, 72, 27, 32, 175, 33,50, 75, 142, 136, 81, 7, 72, 47, 191, 244, 7, 158, 106, 182, 104, 49, 27, 32, 113, 217, 40, 29, 32, 145, 209, 178, 77, 139, 40, 9, 7, 76, 57, 129, 220, 254, 135, 76, 22, 213, 180, 103, 9, 55, 247, 236, 200, 20, 53, 129, 100, 231, 26, 93, 76, 217, 194, 20, 92, 148, 209, 134, 30, 127, 210, 105, 209, 141, 125, 130, 228, 51, 210, 140, 200, 232, 210, 31, 123, 198, 220, 136, 146, 107, 178, 105, 113, 151, 43, 37, 5, 181, 34, 51, 253, 161, 103, 151, 146, 182, 80, 38, 28, 118, 236, 161, 39, 157, 107, 66, 209, 232, 26, 32, 119, 113, 229, 154, 115, 232, 217, 135, 30, 114, 126, 137, 117, 214, 90, 111, 205, 117, 215, 142, 126, 201, 70, 29, 92, 225, 249, 198, 84, 142, 118, 41, 246, 88, 113, 160, 49, 165, 34, 100, 230, 164, 211, 78, 89, 253, 33, 230, 162, 107, 105, 181, 21, 87, 93, 121, 221, 8, 85, 113, 146, 204, 213, 85, 69, 197, 9, 181, 63,93, 188, 4, 119, 164, 95, 42, 5, 19, 30, 52, 49, 34, 7, 200, 108, 30, 149, 115, 153, 140, 234, 245, 231, 222, 57, 245, 205, 200, 21, 113, 168, 173, 70, 35, 92, 248, 149, 211, 30, 88, 171, 161, 214, 31, 117, 44, 26, 216, 31, 88, 45, 226, 215, 223, 124, 53, 202, 5, 222, 57, 177, 76, 119, 191, 56, 251, 45, 73, 74, 106, 225, 161, 228, 162, 40, 236, 105, 24, 72,120, 244, 180, 232, 228, 148, 195, 100, 217, 162, 92, 20, 109, 88, 89, 139, 144, 65, 121, 228, 138, 186, 105, 56, 156, 138, 138, 254, 80, 244, 225, 150, 115, 110, 120, 101, 140, 126, 33, 154, 218, 118, 59, 70, 207, 21, 58, 89, 33, 105, 90,32, 207, 81, 198, 20, 55, 112, 177, 18, 200, 130, 45, 194, 229, 75, 118, 160, 113, 133, 12, 87, 70, 245, 39, 150, 139, 186, 246, 242, 235, 176, 199, 246, 210, 108, 139, 98, 65, 217, 158, 110, 136, 113, 101, 11, 74, 118, 225, 183, 155, 139,118, 193, 87, 157, 101, 234, 14, 37, 150, 101, 190, 209, 187, 34, 151, 25, 213, 40, 22, 32, 181, 57, 219, 107, 176, 197, 38, 219, 237, 138, 112, 201, 217, 111, 86, 196, 70, 166, 155, 156, 75, 102, 58, 61, 103, 128, 252, 134, 36, 82, 224, 185, 178, 8, 140, 70, 21, 210, 162, 207, 45, 117, 6, 74, 139, 150, 32, 221, 159, 92, 46, 90, 221, 158, 214, 47, 130, 29, 200, 217, 43, 34, 67, 205, 116, 92, 153, 20, 101, 161, 99, 160, 36, 118, 109, 236, 228, 40, 23, 32, 177, 217, 72, 74, 42, 85, 7, 210, 118, 215, 43, 202, 93, 246, 150, 255, 60, 126, 95, 135, 59, 87, 239, 27, 32, 159, 23, 233, 218, 194, 49, 114, 218, 31, 118, 46, 226, 217, 31, 101, 52, 58, 7, 72, 168, 45, 74, 127, 253, 140, 218, 247, 231, 253, 24, 160, 33, 181, 148, 141, 216, 9, 211, 34, 134, 253, 17, 135, 233, 60, 242, 191, 108, 105, 36, 107, 146, 139, 65, 252, 254, 216, 231, 62, 139, 72, 41, 128, 25, 169, 2, 202, 24, 199, 61, 244, 84, 106, 119, 33, 217, 2, 233, 236, 65, 10, 141, 44, 225, 81, 240, 184, 8, 255, 252, 161, 191, 140, 116, 9, 132, 33, 4, 18, 9, 49, 98, 194, 150, 197, 238, 101, 136, 171, 2, 233, 246, 97, 191, 142, 196, 105, 31, 110, 216, 72, 151, 232, 33, 192, 138, 136, 80, 133, 23, 97, 161, 69, 212, 52, 67, 141, 172, 203, 31, 0, 163, 160, 121, 104, 70, 195, 143, 120, 202, 31, 227, 195, 200, 22, 128, 132, 184, 24, 144, 2, 72, 195, 187, 136, 27, 128, 228, 51, 139, 88, 113, 123, 25, 209, 162, 63, 184, 24, 3, 35, 190, 204, 31, 161, 139, 129, 19, 161, 216, 17, 69, 157, 35, 83, 64, 66, 87, 23, 175, 168, 145, 48, 142, 81, 113, 103, 220, 200, 255, 16, 152, 68, 233, 68, 193, 75, 28, 20, 201, 255, 144, 136, 145, 59, 142, 81, 106, 19, 60, 154, 214, 46, 114, 72, 141, 252, 66, 145, 21, 249, 159, 25, 183, 118, 173, 65, 114, 228, 142, 28, 203, 136, 35, 253, 129, 201, 24, 48, 50, 147, 143, 140, 193, 234, 192, 135, 145, 129, 209, 131, 143, 230, 241, 35, 144, 246, 232, 145, 172, 233, 98, 35, 248, 243, 7, 52, 44, 66, 201, 94, 249, 195, 149, 179, 4, 82, 37, 43, 114, 173, 91, 198, 32, 107, 54, 99, 229, 172, 64, 254, 178, 58, 96, 106, 11, 72, 5, 220, 101, 46, 107, 217, 203, 86, 106, 196, 101, 113, 60, 37, 117, 104, 54, 202, 143, 124, 236, 130, 23, 41, 194, 159, 36, 199, 47, 224, 101, 100, 96, 246, 64, 94, 12, 184, 169, 145, 111, 34, 239, 99, 243, 170, 38, 144, 122, 217, 17, 158, 237, 131, 12, 27, 137, 216, 196, 42, 50, 78, 111, 90, 202, 156, 170, 196, 24, 40, 163, 41, 157, 136, 169, 35, 156, 30, 241, 158, 250, 52, 178, 58, 104, 46, 1, 101, 39, 196, 136, 65, 253, 225, 198, 215, 29, 180, 131, 40, 99, 104, 69, 2, 170, 203, 141, 124, 140, 162, 25, 225, 31, 22, 177, 25, 52, 220, 57, 52, 35, 10, 141, 104, 12, 34, 182, 52, 255, 1, 137, 164, 251, 220, 141, 200, 186, 241, 206, 14, 18, 67, 28, 243, 194, 198, 212, 120, 40, 173, 71, 237, 227, 130, 104, 67, 35, 70, 148, 231, 15, 230, 113, 13, 116, 249, 228, 169, 49, 29, 6, 72, 143, 196, 116, 81, 44, 229, 8, 37, 230, 152, 184, 197, 53, 14, 143, 25, 217, 105, 79, 119, 102, 175, 76, 118, 233, 134, 40, 157, 78, 21, 224, 165, 14, 103, 196, 194, 13, 100, 96, 5, 46, 150, 161, 13, 13, 70, 161, 34, 78, 12, 210, 46, 66, 17, 138, 93, 164, 111, 147, 180, 251, 158, 70, 96, 201, 38, 232, 77, 73, 174, 107, 114, 106, 152, 156, 81, 254, 183, 45, 144, 34, 23, 202, 192, 70, 58, 108, 166, 73, 135, 33, 131, 21, 91, 40, 133, 88, 181, 161, 14, 179, 198, 128, 21, 94, 130, 70, 41, 220, 128, 12, 104, 58, 15, 174, 118, 205, 200, 92, 47, 2, 203, 125, 92, 35, 108, 172, 88, 6, 253, 22, 149, 17, 145, 161, 179, 129, 94, 50, 109, 69, 74, 139, 213, 167, 196, 130, 102, 47, 75, 221, 60, 83, 198, 41, 244, 157, 73, 35, 1, 253, 97, 250, 82, 43, 209, 20, 98, 36, 107, 13, 187, 42, 197, 82, 22, 209, 45, 36, 109, 106, 22, 57, 96, 109, 253, 177, 219, 24, 224, 246, 34, 166, 48, 174, 156, 104, 123, 145, 172, 237, 48, 35, 213, 157, 105, 69, 176, 203, 218, 167, 184, 2, 97, 115, 162, 71, 54, 16, 232, 167, 57, 217, 174, 132, 164, 202, 110,69, 72, 167, 81, 29, 166, 55, 6, 235, 133, 224, 111, 231, 4, 205, 138, 144, 66, 180, 96, 218, 199, 214, 68, 37, 167, 241, 181, 23, 136, 232, 213, 8, 124, 49, 34, 178, 47, 169, 227, 90, 116, 253, 47, 0, 53, 82, 41, 250, 90, 132, 193, 220, 141, 138, 46, 178, 145, 14, 92, 217, 3, 30, 228, 192, 6, 49, 254, 201, 59, 103, 144, 227, 88, 231, 168, 70, 180, 48, 226,197, 6, 87, 164, 124, 80, 36, 177, 70, 78, 188, 145, 92, 76, 88, 81, 246, 96, 199, 55, 160, 177, 202, 245, 24, 68, 97, 25, 227, 218, 135, 133, 195, 225, 12, 162, 26, 206, 25, 20, 182, 135, 58, 186, 113, 203, 80, 192, 241, 34, 41, 14, 24, 144, 214, 120, 86, 113, 28, 139, 28, 203, 136, 66, 76, 247, 193, 57, 139, 148, 194, 75, 250, 173, 242, 149, 51, 98, 101, 125, 66, 216, 203, 123, 169, 2, 255, 114, 250, 101, 50, 243, 167, 8, 233, 91, 103, 153, 213, 188, 155, 88, 176, 35, 195,135, 21, 91, 104, 155, 186, 102, 58, 167, 116, 184, 56, 172, 115, 158, 111, 67, 54, 254, 202, 83, 207, 127, 230, 12, 46, 174, 65, 142, 85, 229, 234, 28, 216, 96, 46, 160, 21, 189, 104, 70, 55, 218, 209, 143, 134, 116, 164, 37, 61, 105, 74,87, 218, 210, 151, 198, 116, 166, 53, 189, 105, 78, 119, 218, 211, 46, 210, 206, 167, 25, 13, 150, 139, 104, 199, 212, 165, 54, 245, 92, 42, 146, 234, 211, 136, 90, 209, 170, 30, 201, 169, 81, 61, 23, 82, 187, 218, 214, 183, 198, 117, 174,117, 189, 107, 94, 247, 218, 215, 191, 6, 118, 176, 133, 61, 108, 98, 23, 219, 216, 199, 70, 118, 178, 149, 189, 108, 102, 55, 219, 217, 207, 134, 118, 180, 165, 61, 109, 106, 87, 219, 218, 215, 198, 118, 182, 181, 189, 109, 110, 119, 219,219, 223, 6, 119, 184, 197, 61, 110, 28, 5, 4, 0, 59) + [byte[]]$SyncHash.screenCapErrorImage = @(71, 73, 70, 56, 57, 97, 100, 1, 200, 0, 231, 255, 0, 66, 8, 18, 46, 15, 20, 51, 14, 17, 50, 14, 21, 74, 7, 17, 61, 11, 21, 75, 8, 11, 56, 13, 24, 62, 12, 17, 50, 15, 26, 44, 18, 15, 43, 18, 20, 61, 12, 27, 48, 17, 17, 57, 14, 20, 31, 22, 23, 65, 13, 13, 43, 19, 26, 90, 5, 21, 47, 18, 26, 55, 17, 14, 55, 17, 20, 60, 16, 16, 50, 19, 23, 71, 13, 17, 42, 22, 22, 40, 22, 30, 72, 13, 22, 46, 21, 23, 71, 13, 27, 32, 25, 29, 31, 26, 21, 36, 25, 16, 36, 24, 30, 38, 24, 26, 85, 10, 24, 30, 27, 26, 29, 27, 30, 36, 25, 35, 35, 26, 27, 40, 25, 23, 24, 29, 35, 27, 29, 26, 26, 29, 31, 43, 24, 28, 68, 17, 22, 45, 24, 24, 33, 27, 36, 68, 17, 26, 23, 31, 27, 37, 27, 24, 22, 31, 32, 35, 27, 32, 40, 26, 28, 28, 30, 28, 32, 29, 28, 31, 29, 32, 30, 30, 24, 36, 28, 28, 33, 29, 28, 26, 32, 24, 27, 31, 33, 40, 27, 33, 29, 31, 28, 30, 30, 37, 97, 11, 19, 32, 30, 33, 87, 14, 21, 35, 30, 24, 36, 29, 34, 25, 33, 29, 24, 33, 34, 82, 16, 23, 77, 18, 22, 30, 32, 29, 34, 31, 30, 33, 31, 34, 22, 35, 30, 26, 34, 30, 82, 17, 31, 31, 33, 30, 30, 33, 35, 33, 33, 27, 99, 13, 27, 40, 31, 31, 96, 14, 32, 91, 17, 28, 45, 31, 33, 80, 21, 29, 34, 35, 33, 93, 19, 25, 122, 12, 38, 124, 13, 29, 109, 18, 32, 95, 22, 38, 87, 25,34, 38, 40, 37, 116, 16, 37, 117, 17, 30, 105, 23, 32, 99, 25, 34, 111, 21, 39, 105, 24, 37, 42, 44, 41, 45, 47, 45, 103, 30, 40, 141, 19, 39, 110, 29, 42, 131, 23, 39, 122, 25, 50, 124, 26, 47, 118, 29, 50, 132, 25, 47, 49, 51, 48, 157, 18, 42, 114, 33, 44, 128, 29, 40, 143, 24, 47, 121, 32, 47, 128, 30, 45, 52, 54, 51, 152, 26, 46, 160, 24, 50, 218, 6, 56, 55, 57, 54, 218, 8, 51, 132, 35, 53, 154, 29, 52, 57, 59, 57, 140, 34, 52, 210, 15, 47, 220, 12, 46, 209, 15, 52, 135,38, 55, 165, 29, 52, 220, 12, 52, 219, 12, 57, 158, 32, 45, 137, 39, 51, 152, 36, 53, 221, 15, 53, 62, 64, 61, 143, 40,50, 168, 33, 49, 211, 19, 59, 221, 16, 58, 167, 33, 59, 212, 21, 49, 212, 21, 54, 176, 32, 59, 211, 21, 64, 203, 25, 55, 148, 42, 57, 223, 19, 54, 214, 23, 44, 162, 38, 58, 205, 26, 45, 203, 26, 61, 223, 20, 59, 214, 24, 50, 205, 27, 51, 214, 24, 55, 196, 30, 53, 194, 30, 68, 171, 38, 64, 180, 36, 56, 196, 31, 58, 215, 25, 61, 163, 41, 65, 179, 36, 66, 188,34, 60, 187, 34, 65, 69, 71, 68, 206, 30, 58, 174, 40, 59, 205, 30, 68, 197, 33, 64, 160, 45, 59, 190, 36, 56, 182, 39,63, 168, 44, 62, 189, 37, 71, 207, 33, 64, 73, 75, 72, 192, 39, 63, 191, 39, 68, 169, 47, 58, 77, 79, 77, 213, 40, 63, 215, 41, 63, 81, 83, 81, 215, 43, 70, 86, 88, 85, 215, 53, 72, 90, 92, 89, 95, 97, 94, 216, 65, 81, 100, 103, 100, 104, 106, 103, 109, 111, 108, 114, 116, 113, 116, 119, 116, 120, 122, 120, 123, 126, 123, 130, 132, 129, 134, 136, 133, 137, 139, 136, 142, 144, 141, 222, 123, 130, 147, 149, 146, 222, 130, 134, 150, 152, 149, 156, 158, 155, 226, 141, 147, 162, 164, 161, 227, 148, 152, 166, 168, 165, 170, 173, 170, 229, 156, 157, 229, 158, 165, 175, 177, 174, 230, 165, 170, 179, 182, 179, 231, 173, 175, 185, 187, 184, 235, 177, 179, 188, 191, 187, 193, 195, 192, 198, 200, 197, 202, 204, 201, 206, 208, 205, 239, 202, 203, 210, 212, 209, 214, 216, 213, 242, 213, 212, 219, 221, 218, 244, 217, 221, 222, 224, 221, 225, 227, 224, 243, 223, 225, 230, 232, 229, 249, 229, 231, 246, 233, 233, 234, 237, 233, 238, 240, 237, 250, 237, 238, 247, 241, 240, 241, 244, 240, 246, 248, 245, 252, 247, 246, 249, 251, 248, 255, 251, 250, 251, 253, 250, 255, 253, 251, 253, 255, 252, 30, 30, 30, 33, 254, 17, 67, 114, 101, 97, 116, 101, 100, 32, 119, 105, 116, 104, 32, 71, 73, 77, 80, 0, 33, 249, 4, 1, 10, 0, 255, 0, 44, 0, 0, 0, 0, 100, 1, 200, 0, 0, 8, 254, 0, 127, 8, 28, 72, 176, 160, 193, 131, 8, 19, 42, 92, 200, 176, 161, 195, 135, 16, 17, 238, 216, 33, 208, 136, 192, 137, 20, 7, 98, 140, 200, 177, 163, 199, 143, 32, 67, 138, 28, 73, 178, 164, 201, 147, 40, 21, 78, 172, 120, 113, 165, 70, 151, 41, 99, 202, 156, 73, 179, 166, 205, 155, 56, 65, 194, 108, 89, 112, 99, 206, 159, 64, 131, 10, 29, 74, 212, 230, 206, 31, 71, 125, 22, 93, 202, 180, 169, 211, 167, 57,147, 102, 124, 9, 181, 170, 213, 171, 88, 179, 30, 148, 106, 112, 170, 214, 175, 96, 195, 138, 141, 121, 116, 36, 198, 179, 104, 207, 142, 93, 203, 182, 45, 81, 165, 36, 211, 202, 133, 235, 182, 174, 221, 187, 113, 213, 66, 212, 235, 17, 7, 14, 134, 126, 241, 10, 30, 44, 24, 109, 68, 190, 29, 3, 47, 84, 76, 184, 177, 99, 177, 103, 149, 8, 84, 193, 83, 34, 221, 131, 74, 36, 31, 100, 60, 80, 133, 231, 129, 66, 132, 60, 30, 77, 26, 43, 70, 205, 159, 47, 183, 44, 251, 121, 96, 102, 132, 156, 39, 183, 86, 18, 186, 180, 237, 219, 75, 79, 203, 70, 76, 144, 247, 143, 214, 174, 97, 255, 45, 232, 153, 242, 15, 218, 162, 113, 43, 95, 206, 188, 185, 243, 231, 208, 163, 75, 159, 78, 189, 186, 245, 235, 216, 179, 107, 223, 206, 189, 187, 247, 239, 224, 195, 254, 139, 31, 79, 190, 188, 249, 243, 232, 211, 171, 95, 207, 190, 189, 251, 247, 240, 227, 203, 159, 79, 191, 190, 253, 251, 248, 243, 235, 223, 207, 191, 191, 255, 255, 0, 6, 40, 224, 128, 51, 41, 229, 153, 111, 171, 121, 197, 81, 108, 155, 13, 71, 224, 131, 157, 169, 128, 145, 103, 49, 80, 54, 145, 14, 20, 25, 215, 155, 106, 15, 49, 248, 218, 64, 12, 66, 40, 224, 129, 59, 20, 151, 218, 132, 42, 56, 152, 22, 67, 192, 21, 180, 130, 131, 26,209, 246, 87, 113, 34, 138, 136, 3, 13, 129, 89, 116, 28, 106, 47, 250, 85, 66, 9, 76, 76, 164, 2, 20, 178, 249, 133, 195, 10, 72, 70, 17, 197, 111, 2, 41, 49, 209, 107, 158, 173, 16, 5, 20, 74, 84, 136, 20, 142, 70, 178, 84, 35, 129, 59, 208, 128, 227, 10, 71, 232, 248, 219, 144, 80, 172, 80, 130, 16, 76, 48, 145, 156, 100, 36, 200, 80, 131, 8, 25, 100, 192, 193, 5, 23, 112, 96, 103, 6, 46, 176, 128, 66, 13, 58, 16, 81, 162, 103, 74, 100, 193, 196, 145, 42, 56, 65, 229, 14,70, 102, 185, 37, 132, 43, 33, 249, 226, 14, 58, 80, 241, 155, 18, 76, 20, 225, 65, 137, 49, 100, 234, 132, 10, 15, 44,32, 0, 2, 24, 140, 48, 68, 16, 65, 76, 49, 133, 4, 67, 140, 128, 129, 5, 13, 100, 240, 65, 14, 254, 60, 40, 33, 225, 14, 63, 70, 145, 25, 141, 21, 33, 233, 165, 130, 139, 10, 136, 164, 95, 33, 156, 144, 33, 9, 39, 80, 177, 3, 17, 84, 160, 224, 105, 11, 95, 144, 97, 135, 34, 152, 196, 162, 139, 43, 212, 82, 75, 11, 45, 152, 220, 49, 135, 23, 88, 56, 32, 192,2, 120, 242, 137, 168, 10, 37, 76, 150, 3, 172, 49, 24, 177, 130, 151, 48, 246, 58, 96, 143, 95, 90, 184, 195, 7, 50, 44, 224, 192, 8, 97, 252, 81, 9, 44, 176, 152, 98, 138, 40, 0, 95, 114, 73, 43, 160, 8, 44, 138, 191, 176, 140, 178, 138,36, 117, 148, 49, 66, 11, 2, 160, 240, 193, 68, 66, 32, 41, 217, 185, 57, 252, 176, 46, 142, 238, 214, 184, 130, 154, 43, 168, 144, 131, 12, 10, 80, 176, 1, 25, 133, 160, 178, 74, 39, 167, 32, 194, 200, 203, 140, 132, 18, 10, 37, 147, 12, 210, 71, 31, 159, 32, 162, 51, 34, 145, 156, 98, 9, 44, 181, 160, 18, 136, 25, 88, 80, 16, 0, 11, 59, 36, 73, 209, 185, 2, 41, 218, 177, 127, 126, 81, 228, 146, 153, 43, 100, 65, 132, 2, 67, 176, 241, 136, 42, 253, 94, 2, 73, 40, 58, 223, 252, 201, 36, 100, 127, 146, 9, 35, 56, 147, 61, 201, 216, 136, 132, 66, 136, 192, 166, 224, 98, 8, 27, 67, 56, 112, 130,18, 47, 238, 250, 244, 254, 131, 81, 35, 69, 145, 17, 42, 80, 81, 67, 0, 22, 164, 17, 139, 42, 160, 124, 66, 137, 204, 148, 52, 174, 243, 39, 144, 43, 254, 137, 216, 145, 87, 14, 121, 31, 103, 83, 2, 9, 44, 155, 148, 209, 66, 0, 34, 176, 219, 247, 222, 1, 150, 128, 131, 16, 43, 73, 70, 196, 2, 27, 148, 241, 199, 44, 166, 92, 82, 182, 229, 59, 135, 173, 115,227, 184, 83, 2, 121, 217, 55, 247, 30, 10, 40, 157, 44, 28, 70, 7, 28, 224, 93, 130, 151, 36, 236, 160, 25, 233, 252, 69, 97, 102, 197, 74, 60, 144, 129, 3, 72, 208, 225, 202, 43, 132, 16, 18, 74, 229, 189, 83, 94, 59, 34, 185, 79, 142, 179, 229, 189, 79, 162, 51, 33, 157, 204, 18, 200, 19, 160, 123, 233, 193, 18, 37, 50, 223, 95, 148, 96, 170, 112, 5, 2, 98, 60, 34, 203, 37, 130, 32, 226, 73, 31, 59, 139, 220, 205, 6, 97, 51, 0, 130, 175, 113, 226, 235, 158, 226, 114, 87, 187, 198, 189, 205, 20, 164, 112, 3, 0, 92, 160, 132, 35, 65, 65, 67, 242, 203, 143, 113, 178, 176, 3, 22, 0, 224, 14, 170, 184, 4, 33, 62, 129, 54, 3, 6, 240, 114, 4, 236, 221, 1, 19, 216, 61, 156, 229, 206, 113, 50, 27, 219, 36, 40, 209, 138, 74, 4, 2, 1, 25, 40, 145, 148, 50, 168, 159, 211, 124, 32, 3, 254, 27, 248, 3, 44, 46, 161, 59, 77, 12, 34, 19, 110, 67, 4, 0, 95, 136, 136, 203, 81, 174, 133, 80, 188, 29, 36, 32, 65, 137, 176, 165, 141, 19, 173, 80, 69, 32, 8, 224, 130, 38, 241, 48, 63, 19, 57, 193, 224, 48, 128, 9, 88, 52, 110, 109, 189, 91, 156, 238, 20, 119, 192, 23, 58, 145, 114, 144, 211, 93, 247, 218, 56, 51, 204, 17, 112, 109, 161, 184, 4, 46, 22, 145, 4, 14, 124, 128, 72, 95, 196, 79, 9, 124, 16, 0, 36, 108, 66, 22, 137, 27, 219, 228, 148, 72, 54, 4, 182, 112, 108, 12, 84, 162, 11, 207, 136, 70, 202, 53, 78, 16,147, 24, 224, 217, 62, 33, 8, 183, 193, 2, 21, 18, 184, 0, 175, 2, 105, 30, 223, 172, 224, 7, 84, 8, 192, 8, 22, 97, 10, 66, 240, 110, 103, 105, 67, 160, 248, 108, 6, 73, 220, 217, 110, 129, 106, 123, 35, 46, 89, 216, 187, 201, 109, 238, 15, 35, 104, 64, 13, 182, 50, 74, 82, 102, 231, 70, 187, 34, 65, 22, 126, 131, 168, 40, 236, 0, 5, 24, 216, 196, 16, 221,70, 136, 155, 201, 50, 124, 185, 124, 161, 54, 113, 87, 182, 74, 46, 145, 18, 105, 116, 100, 31, 94, 150, 71, 89, 36, 34, 8, 1, 248, 211, 5, 37, 36, 58, 99, 114, 39, 111, 187, 146, 85, 12, 126, 176, 4, 28, 148, 0, 5, 16, 254, 112, 132, 25,41, 145, 189, 80, 88, 147, 137, 77, 204, 101, 27, 183, 233, 70, 1, 254, 83, 108, 252, 36, 4, 56, 25, 113, 182, 62, 188,77, 20, 121, 192, 0, 11, 148, 105, 28, 118, 30, 233, 148, 76, 115, 167, 117, 18, 245, 23, 40, 104, 138, 88, 84, 112, 0,27, 112, 1, 137, 182, 105, 79, 124, 146, 203, 25, 248, 148, 88, 64, 130, 186, 212, 165, 113, 228, 167, 35, 75, 56, 9, 80, 100, 241, 14, 5, 168, 1, 185, 68, 227, 4, 164, 248, 5, 163, 25, 211, 40, 117, 16, 245, 83, 129, 196, 192, 9, 71, 56, 130, 10, 106, 112, 129, 42, 172, 2, 18, 132, 56, 160, 36, 225, 120, 59, 37, 50, 226, 165, 88, 205, 170, 56, 203, 55, 9, 81, 144, 162, 12, 23, 32, 1, 199, 122, 250, 3, 35, 173, 32, 163, 66, 149, 14, 81, 145, 100, 212, 24, 28, 97, 6, 78, 112,1, 1, 54, 209, 137, 243, 89, 81, 129, 139, 212, 170, 94, 181, 218, 203, 151, 245, 129, 18, 157, 160, 197, 6, 88, 80, 132, 18, 40, 1, 93, 47, 122, 1, 13, 96, 149, 86, 234, 20, 149, 34, 74, 152, 65, 20, 12, 91, 1, 54, 192, 162, 164, 73, 132,227, 19, 255, 186, 215, 206, 18, 116, 134, 161, 200, 100, 38, 206, 22, 10, 88, 184, 161, 0, 33, 144, 16, 172, 120, 96, 4, 100, 254, 128, 7, 141, 141, 254, 142, 69, 30, 75, 145, 40, 220, 104, 1, 86, 200, 5, 33, 160, 170, 189, 76, 220, 76, 109, 255, 92, 160, 103, 135, 155, 187, 126, 46, 20, 102, 151, 72, 69, 21, 50, 80, 33, 41, 240, 0, 182, 61, 138, 173, 116,102, 123, 36, 191, 17, 149, 5, 27, 8, 196, 37, 24, 145, 61, 237, 97, 78, 109, 153, 228, 44, 113, 199, 251, 194, 208, 134, 183, 15, 131, 8, 69, 39, 254, 224, 128, 137, 97, 80, 186, 213, 113, 212, 106, 104, 112, 128, 45, 228, 2, 20, 227, 235, 94, 46, 255, 73, 222, 254, 106, 147, 132, 14, 93, 69, 26, 22, 144, 17, 175, 176, 21, 190, 67, 133, 84, 13, 58, 32, 137, 78, 108, 239, 145, 179, 19, 175, 127, 39, 140, 187, 62, 152, 207, 20, 129, 216, 128, 8, 242, 246, 3, 166, 201, 23, 193, 203, 105, 215, 100, 116, 176, 0, 50, 232, 54, 180, 10, 196, 29, 228, 226, 225, 143, 22, 187, 248, 197, 48, 142, 177, 140, 103, 44, 99, 121, 192, 244, 19, 121, 84, 133, 24, 2, 80, 65, 26, 116, 152, 8, 26, 59, 48, 136, 113, 195, 153, 192, 212, 0, 1, 138, 48, 227, 218, 80, 26, 211, 198, 177, 152, 198, 80, 142, 178, 148, 109, 236, 210, 80, 8, 194, 166, 122, 40, 64, 151, 104, 176, 131, 28, 80, 228, 195, 67, 190, 77, 96, 152, 134, 35, 37, 100, 64, 11, 180, 48, 5, 254, 138, 101, 10, 206, 73, 82, 226, 201, 82, 142, 179, 156, 91, 76, 101, 130, 90, 217, 124, 170, 120, 2, 10, 216, 53, 21, 17, 135, 121,52, 99, 134, 173, 151, 126, 16, 128, 145, 38, 18, 124, 10, 109, 179, 112, 225, 60, 231, 70, 211, 184, 206, 219, 28, 161, 217, 76, 49, 7, 97, 58, 173, 44, 127, 118, 140, 95, 86, 27, 3, 191, 168, 192, 1, 134, 128, 68, 94, 109, 201, 223, 55, 183, 184, 30, 20, 206, 170, 60, 232, 140, 85, 37, 102, 226, 18, 152, 104, 65, 13, 86, 0, 4, 32, 224, 128, 67, 153, 38, 204, 173, 207, 101, 17, 32, 208, 64, 6, 88, 80, 5, 34, 6, 193, 136, 182, 57, 46, 156, 78, 62, 117, 170, 177, 186, 106, 127, 64, 186, 188, 146, 100, 68, 43, 72, 161, 5, 23, 28, 161, 71, 184, 206, 181, 99, 66, 3, 132, 19, 52, 96, 12, 176, 144,36, 34, 186, 219, 230, 23, 62, 25, 213, 4, 253, 133, 103, 213, 77, 208, 102, 63, 251, 133, 56, 3, 32, 33, 76, 193, 133,11, 168, 235, 148, 59, 32, 129, 182, 113, 163, 43, 26, 0, 65, 4, 22, 160, 131, 41, 2, 56, 137, 236, 149, 59, 119, 231, 38, 40, 52, 236, 81, 141, 189, 86, 195, 30, 208, 104, 55, 171, 93, 138, 179, 153, 133, 162, 21, 122, 112, 128, 134, 74, 180, 188, 125, 143, 166, 223, 56, 16, 1, 6, 254, 28, 49, 240, 199, 85, 113, 103, 218, 76, 184, 54, 161, 145, 15, 127, 236, 163, 225, 89, 189, 198, 62, 252, 145, 143, 136, 107, 211, 221, 90, 149, 25, 36, 92, 209, 2, 125, 95, 228, 56, 30, 47,205, 175, 252, 146, 129, 33, 232, 194, 193, 222, 51, 96, 202, 149, 173, 77, 118, 184, 120, 31, 215, 192, 170, 204, 93, 252, 142, 109, 226, 252, 165, 51, 59, 224, 44, 176, 112, 183, 206, 4, 93, 57, 56, 184, 64, 16, 92, 113, 9, 127, 90, 56, 129, 3, 77, 182, 63, 208, 253, 66, 98, 188, 227, 233, 218, 112, 233, 54, 102, 222, 226, 120, 16, 195, 234, 19, 119, 233,236, 38, 161, 138, 47, 136, 192, 43, 239, 253, 250, 99, 194, 46, 134, 16, 154, 125, 201, 55, 75, 187, 169, 215, 78, 208, 96, 188, 189, 197, 251, 216, 198, 54, 231, 78, 245, 187, 227, 221, 217, 88, 229, 93, 31, 96, 145, 134, 8, 76, 165, 227, 130, 31, 141, 10, 42, 160, 134, 216, 73, 50, 166, 183, 51, 55, 211, 183, 25, 12, 167, 67, 190, 27, 47, 236, 6, 221, 253, 241, 142, 96, 184, 244, 234, 48, 93, 219, 203, 96, 241, 134, 1, 232, 32, 168, 160, 15, 125, 97, 58, 227, 128, 60, 136, 240, 244, 11, 84, 252, 226, 217, 190, 205, 95, 168, 227, 197, 223, 192, 221, 55, 94, 172, 14, 219, 223, 62, 239, 4, 149, 33, 67, 59, 254, 97, 135, 3, 212, 32, 99, 42, 144, 149, 240, 27, 67, 145, 163, 254, 192, 1, 122, 104, 69, 21, 17, 122, 77, 213, 51, 254, 165, 188, 120, 190, 139, 195, 65, 137, 112, 80, 159, 23, 204, 198, 254, 54, 27, 137, 222, 78, 20, 194, 251, 57, 64, 36, 129, 55, 126, 110, 177, 17, 230, 7, 106, 167, 208, 56, 222, 211, 68, 194, 133, 59, 42, 247, 82, 167,112, 14, 47, 246, 120, 45, 166, 14, 248, 151, 127, 152, 247, 82, 144, 212, 127, 133, 80, 0, 40, 144, 3, 146, 49, 128, 4, 200, 22, 27, 97, 4, 61, 133, 128, 139, 83, 57, 86, 180, 116, 239, 135, 85, 161, 32, 129, 49, 118, 14, 9, 168, 106, 250, 247, 95, 138, 51, 78, 254, 231, 129, 32, 200, 36, 35, 120, 23, 83, 97, 4, 22, 1, 106, 80, 21, 67, 42, 37, 73, 44, 200,124, 88, 5, 131, 46, 118, 14, 51, 163, 85, 184, 151, 125, 146, 195, 8, 166, 208, 129, 31, 40, 36, 61, 232, 131, 25, 1, 132, 159, 150, 126, 218, 51, 51, 57, 227, 68, 71, 184, 87, 74, 216, 98, 76, 168, 87, 79, 184, 77, 147, 244, 9, 83, 168, 131, 43, 33, 130, 87, 8, 22, 46, 161, 133, 21, 144, 7, 173, 144, 104, 107, 36, 71, 18, 166, 118, 72, 104, 103, 99, 184, 132, 77, 136, 129, 239, 6, 111, 11, 164, 134, 126, 192, 0, 223, 135, 105, 254, 111, 8, 25, 128, 55, 135, 34, 36, 83, 187, 19, 94, 97, 136, 85, 17, 56, 129, 247, 71, 131, 25, 72, 113, 156, 245, 9, 184, 224, 6, 134, 232, 101, 136, 114, 74, 137, 104, 23, 72, 50, 122, 165, 167, 126, 222, 37, 67, 223, 132, 112, 171, 71, 80, 241, 247, 98, 244, 103, 127, 46, 102, 129, 128, 216, 106, 153, 136, 11, 189, 167, 3, 126, 19, 138, 110, 129, 111, 68, 21, 118, 65, 80, 10, 173, 208, 73, 186, 83, 97, 169, 168, 135, 47, 229, 124, 208, 39, 125, 212, 103, 125, 18, 119, 137, 4, 165, 51, 86, 198, 8, 170, 64, 6, 17, 96, 2, 64, 80, 2, 59, 224, 81, 186, 184, 22, 71, 112, 17, 70, 114, 1, 90, 160, 11, 151, 128, 99, 240, 86, 106, 203, 231, 82, 173, 247, 116, 176, 151, 59, 178, 71, 117, 204, 120, 115, 53, 200, 68, 218, 179, 54, 170, 128, 5, 34, 240, 2, 138, 181, 3, 78, 48, 79, 219, 72, 130, 61, 194, 1, 72, 16, 11, 162, 160, 68, 77, 120, 87, 238, 183, 135, 141, 227, 120, 79, 39, 121, 218, 212, 142, 45, 246, 14, 150, 7, 143, 206, 184, 77, 110, 227, 79, 130, 80, 10, 45, 176, 3, 66, 224, 107, 37, 34, 38, 253, 56, 22, 191, 194, 2, 72, 102, 10, 236, 247, 56, 200, 118, 142, 218, 228, 118, 112, 39, 119, 179, 103, 119, 151, 23, 136, 185, 227, 254, 54, 139, 3, 10, 134, 224, 0, 63, 32, 4, 183, 22, 63, 31, 57, 22, 25, 241, 34, 131, 51, 7, 176, 208, 7, 154, 48, 54, 219, 51, 136, 18, 246, 128, 185, 227, 122, 46, 23, 117, 47, 53, 117, 15, 249, 146, 26, 56, 57, 5, 215, 9, 117, 32, 0, 78, 240, 40, 197, 180, 147, 166, 1, 34, 58, 32, 2, 95, 144, 11, 136, 48, 148, 230, 211, 128, 147, 227, 128, 171, 136, 59, 44, 231, 114, 48, 39, 117, 51, 151, 15, 210, 0, 149, 48, 53, 78, 147, 112, 9, 171, 16, 6, 11, 176, 41, 198, 129, 147, 90, 25, 22, 83, 241, 40, 48, 80, 9, 161, 165, 9, 189, 20, 62, 102, 217, 130, 47, 180, 112, 107, 153, 85, 15, 103, 115, 18, 9, 147, 107, 52, 78, 125, 208, 9, 155, 48, 2, 25, 32, 43, 183, 194, 4, 229, 178, 151, 95, 145, 133, 65, 54, 0, 127, 208, 9, 130, 32, 152, 150, 68, 73, 198, 152, 110, 235, 118, 125, 19, 153, 59, 55, 83, 66, 166, 224,7, 5, 32, 2, 146, 1, 5, 60, 160, 2, 152, 233, 103, 154, 137, 21, 82, 50, 1, 97, 112, 95, 171, 233, 68, 138, 163, 54, 40, 185, 108, 205, 8, 147, 171, 57, 9, 96, 51, 10, 94, 176, 0, 184, 216, 97, 77, 19, 34, 183, 249, 20, 160, 40, 16, 43, 16, 1, 35, 240, 7, 151, 112, 118, 120, 152, 54, 101, 254, 131, 148, 194, 249, 66, 103, 40, 75, 214, 68, 8, 150, 32, 9, 45,32, 3, 10, 34, 100, 207, 121, 21, 221, 56, 16, 52, 160, 1, 7, 80, 6, 185, 192, 79, 51, 212, 102, 110, 182, 120, 142, 118, 159, 49, 22, 136, 141, 4, 57, 144, 144, 11, 112, 48, 0, 78, 226, 34, 233, 153, 21, 96, 66, 16, 58, 80, 3, 46, 176, 1,13, 6, 9, 51, 148, 64, 70, 201, 104, 248, 25, 161, 250, 105, 156, 161, 213, 9, 168, 48, 2, 44, 144, 139, 101, 101, 155,3, 218, 20, 31, 230, 101, 58, 160, 3, 3, 208, 6, 169, 32, 59, 9, 164, 154, 125, 0, 161, 17, 122, 159, 142, 89, 112, 132, 144, 11, 118, 48, 0, 62, 144, 147, 205, 217, 161, 88, 113, 36, 195, 145, 3, 126, 178, 2, 26, 240, 4, 152, 96, 10, 6, 133, 162, 42, 186, 162, 141, 86, 103, 49, 245, 155, 132, 48, 109, 27, 80, 3, 37, 224, 76, 25, 115, 4, 182, 198, 156, 54, 10, 21, 102, 213, 97, 231, 178, 2, 38, 48, 1, 107, 96, 10, 131, 64, 54, 131, 73, 159, 201, 71, 51, 230, 211, 157, 113, 105, 64, 189, 3, 10, 184, 192, 6, 14, 160, 3, 82, 194, 52, 80, 250, 23, 65, 53, 165, 78, 81, 165, 24, 115, 4, 56, 16, 2, 0, 32, 9, 34, 228, 77, 41, 213, 128, 98, 154, 122, 100, 202, 77, 147, 19, 71, 254, 74, 164, 51, 146, 105, 0, 28, 160, 2,206, 3, 34, 81, 26, 167, 114, 10, 21, 79, 18, 3, 77, 112, 4, 58, 144, 0, 85, 64, 10, 160, 48, 8, 108, 4, 64, 50, 20, 57, 75, 6, 57, 169, 199, 75, 126, 74, 92, 192, 117, 118, 217, 163, 51, 150, 80, 11, 86, 160, 0, 50, 112, 147, 96, 178, 46,51, 250, 168, 79, 193, 153, 144, 162, 3, 85, 210, 4, 77, 176, 3, 17, 192, 0, 109, 32, 11, 130, 160, 61, 97, 243, 136, 228, 83, 159, 162, 42, 75, 150, 115, 172, 145, 131, 114, 251, 53, 8, 136, 6, 78, 144, 48, 10, 112, 80, 1, 231, 50, 36, 43, 48, 3, 43, 224, 3, 33, 144, 149, 178, 250, 19, 74, 81, 171, 28, 39, 33, 33, 16, 1, 27, 144, 7, 166, 64, 9, 253, 99, 62, 7, 228, 165, 143, 20, 62, 235, 186, 70, 200, 250, 174, 74, 39, 71, 104, 131, 54, 97, 99, 11, 129, 208, 2, 32, 192, 3, 57, 16, 126, 63, 112, 109, 131, 230, 145, 219, 42, 20, 221, 234, 173, 37, 50, 17, 36, 16, 0, 67, 176, 9, 106, 102, 62, 218, 67, 69, 217, 153, 98, 42, 134, 87, 238, 250, 174, 150, 51, 148, 38, 100, 85, 190, 149, 9, 224, 211, 10, 143, 128, 5,25, 64, 4, 60, 32, 5, 178, 130, 84, 209, 21, 176, 76, 161, 23, 23, 114, 2, 24, 162, 60, 77, 240, 254, 3, 184, 149, 10, 173, 48, 78, 194, 101, 85, 102, 202, 126, 224, 9, 71, 20, 139, 172, 101, 243, 61, 171, 233, 80, 129, 165, 5, 10, 144, 3,82, 32, 180, 178, 2, 176, 63, 103, 178, 111, 1, 19, 23, 130, 33, 42, 128, 171, 42, 112, 1, 93, 80, 9, 173, 128, 8, 141,68, 159, 156, 5, 177, 143, 217, 75, 57, 187, 181, 0, 196, 169, 153, 132, 62, 174, 96, 6, 2, 32, 3, 78, 146, 33, 226, 87, 16, 206, 137, 180, 55, 225, 19, 58, 2, 41, 152, 98, 4, 131, 116, 0, 102, 80, 9, 160, 224, 74, 149, 212, 70, 18, 171, 98, 44, 180, 181, 180, 99, 80, 98, 179, 54, 162, 176, 9, 107, 48, 0, 53, 64, 5, 58, 160, 178, 250, 6, 122, 55, 146, 182, 106, 91, 19, 37, 8, 132, 74, 144, 60, 24, 130, 55, 55, 162, 3, 7, 16, 6, 169, 32, 10, 156, 160, 9, 162, 217, 172, 14, 74, 150, 123, 203, 183, 201, 202, 128, 232, 69, 75, 96, 43, 182, 51, 234, 37, 92, 166, 2, 89, 144, 60, 4, 177, 184, 28, 218, 184, 142, 155, 133, 64, 232, 55, 43, 107, 41, 76, 32, 2, 3, 96, 6, 179, 32, 59, 252, 183, 75, 131, 122, 57, 55, 139, 179, 199, 10, 71, 142, 184, 59, 138, 100, 11, 146, 80, 6, 7, 32, 2, 69, 240, 83, 108, 229, 182, 63, 0, 132, 234, 226, 52, 178, 254, 27, 21, 48, 81, 187, 182, 171, 3, 15, 144, 52, 80, 176, 4, 2, 48, 5, 146, 176, 63, 40, 150, 9, 147, 208, 73,161, 117, 172, 89, 75, 188, 6, 101, 57, 186, 179, 54, 136, 240, 171, 121, 4, 11, 122, 96, 6, 12, 32, 2, 102, 53, 3, 73,229, 173, 211, 11, 132, 67, 167, 173, 215, 123, 18, 43, 146, 16, 42, 32, 5, 153, 178, 3, 34, 144, 0, 79, 0, 7, 149, 0, 9, 153, 64, 64, 156, 132, 73, 10, 165, 181, 131, 200, 100, 197, 203, 61, 84, 5, 62, 233, 227, 7, 88, 16, 0, 33, 64, 3, 37, 64, 2, 74, 144, 84, 251, 27, 162, 94, 97, 17, 217, 22, 192, 38, 49, 23, 7, 97, 4, 207, 197, 3, 78, 64, 2, 56, 169, 1,29, 16, 6, 179, 160, 126, 125, 32, 140, 140, 195, 167, 41, 197, 190, 195, 58, 62, 77, 4, 62, 155, 147, 10, 110, 0, 3, 25, 80, 40, 101, 75, 17, 73, 181, 2, 210, 187, 21, 42, 140, 19, 115, 145, 189, 46, 172, 175, 153, 177, 2, 41, 144, 187, 3, 128, 4, 129, 176, 10, 94, 147, 80, 137, 134, 87, 162, 251, 174, 96, 163, 94, 169, 16, 8, 94, 112, 0, 17, 64, 3, 74, 224, 4, 158, 40, 23, 23, 197, 196, 79, 60, 20, 124, 241, 131, 70, 96, 126, 148, 113, 4, 206, 19, 5, 36, 144, 1, 8, 208, 5,155, 176, 10, 254, 177, 83, 183, 192, 90, 66, 227, 19, 198, 220, 115, 113, 166, 144, 11, 203, 91, 0, 105, 76, 3, 162, 161, 175, 158, 104, 194, 43, 241, 198, 136, 24, 199, 150, 41, 25, 31, 18, 18, 181, 123, 25, 46, 33, 43, 59, 176, 4, 42, 160, 41, 80, 176, 3, 33, 192, 2, 23, 128, 0, 102, 176, 8, 136, 148, 61, 186, 87, 66, 71, 74, 177, 249, 21, 54, 151, 160, 10, 139, 48, 6, 8, 176, 0, 87, 64, 5, 194, 34, 16, 60, 144, 41, 72, 225, 34, 85, 202, 34, 215, 203, 175, 76, 66, 204, 32, 161, 189, 101, 225, 18, 126, 193, 101, 202, 243, 92, 18, 130, 147, 42, 112, 2, 23, 64, 0, 92, 32, 7, 165, 128, 11, 255, 210, 197, 19, 251, 195, 138, 227, 54, 112, 163, 10, 178, 240, 8, 98, 128, 4, 13, 208, 170, 51, 48, 43, 224, 103, 130, 1, 58, 189, 210, 25, 204, 11, 17, 124, 1, 187, 60, 240, 188, 182, 89, 9, 41, 46, 240, 41, 73, 96, 6, 129, 128, 10, 179, 0, 11, 157, 240, 53, 143, 52, 57, 48, 35, 196, 176, 48, 11, 155, 160, 8, 107, 144, 4, 22, 80, 1, 25, 176, 156, 26, 129, 18, 110, 24, 199, 78, 33, 33, 76, 85, 0, 35, 208, 5, 112, 176, 9, 149, 176, 10, 170, 224, 47, 30, 237, 209, 178, 160, 10, 170, 80, 9, 122, 80, 7, 93, 48, 2, 8, 16, 254, 0, 18, 211, 34, 18, 29, 29, 62, 226, 37, 53, 144, 1, 1, 32, 0, 14, 208,2, 88, 96, 5, 100, 176, 6, 115, 96, 7, 60, 61, 7, 107, 224, 5, 95, 128, 5, 45, 224, 0, 21, 80, 39, 124, 146, 38, 17, 221, 210, 33, 6, 4, 41, 144, 2, 73, 146, 25, 59, 32, 3, 40, 144, 1, 11, 64, 39, 7, 80, 0, 7, 48, 0, 224, 34, 3, 175, 34, 178, 205, 105, 189, 74, 13, 29, 142, 162, 36, 216, 38, 185, 33, 26, 162, 33, 160, 1, 26, 80, 3, 25, 146, 41, 36, 18, 26, 140, 27, 214, 203, 161, 36, 197, 113, 43, 77, 2, 5, 206, 3, 114, 21, 225, 4, 134, 34, 43, 36, 144, 60, 149, 44, 215, 202, 145, 111, 93, 182, 175, 148, 177, 198, 110, 93, 28, 181, 202, 180, 161, 188, 175, 24, 35, 216, 215, 65, 4, 126, 162, 60, 183, 82, 187, 175, 49, 192, 4, 145, 81, 44, 13, 217, 204, 17, 197, 202, 108, 86, 142, 242, 23, 75, 187, 18, 212, 203,217, 209, 113, 22, 28, 149, 218, 71, 114, 109, 67, 167, 186, 95, 66, 194, 166, 45, 214, 161, 125, 81, 137, 194, 191, 3,49, 116, 170, 29, 215, 177, 189, 219, 188, 221, 219, 190, 253, 219, 192, 29, 220, 194, 61, 220, 196, 93, 220, 198, 13, 22, 216, 208, 98, 237, 16, 219, 206, 48, 14, 238, 112, 15, 250, 160, 15, 247, 254, 224, 14, 228, 240, 12, 104, 64, 29, 214, 208, 98, 217, 128, 16, 229, 208, 98, 226, 240, 20, 183, 32, 103, 212, 224, 78, 207, 48, 15, 80, 118, 15, 222, 128, 7, 210, 65, 14, 45, 166, 12, 8, 1, 15, 45, 22, 13, 79, 17, 13, 114, 118, 12, 164, 196, 10, 233, 16, 103, 250, 160, 222, 209, 1, 223, 250, 0, 6, 99, 33, 14, 250, 189, 76, 95, 36, 12, 240, 221, 98, 244, 32, 14, 204, 32, 12, 120, 32, 12, 202, 64, 13, 229, 128, 15, 254, 0, 15, 210, 209, 8, 252, 224, 15, 203, 61, 22, 237, 208, 98, 207, 128, 96, 128, 96, 222, 254, 160, 15, 222, 16, 7, 8, 209, 8, 226, 64, 14, 210, 225, 12, 222, 61, 22, 103, 160, 15, 45, 198, 10, 8, 198, 222, 254, 128, 15, 205, 192, 17, 120, 64, 13, 233, 64, 15, 250, 128, 15, 240, 0, 14, 187, 112, 16, 2, 238, 15, 206, 80, 12, 224, 224,14, 248, 192, 15, 248, 208, 14, 29, 110, 16, 65, 62, 228, 69, 126, 228, 73, 190, 228, 8, 225, 12, 228, 48, 15, 248, 32,221, 232, 224, 12, 10, 65, 229, 86, 46, 221, 235, 192, 13, 192, 32, 16, 244, 61, 99, 252, 192, 223, 224, 192, 225, 6, 113, 227, 57, 190, 227, 61, 254, 227, 76, 222, 98, 78, 110, 228, 72, 174, 228, 28, 177, 12, 45, 70, 225, 14, 49, 14, 45, 86, 227, 254, 202, 80, 14, 58, 174, 15, 224, 32, 16, 122, 238, 15, 124, 238, 231, 209, 29, 232, 3, 161, 230, 58, 206, 227, 62, 126, 16, 131, 94, 232, 127, 142, 232, 217, 193, 12, 46, 38, 229, 15, 225, 12, 32, 14, 99, 247, 224, 222, 5, 177, 225, 254, 64, 14, 23, 30, 99, 214, 96, 16, 158, 14, 234, 50, 54, 234, 6, 97, 12, 235, 48, 99, 222, 112, 16, 202, 224, 233, 49, 166, 15, 183, 240, 3, 222, 64, 99, 243, 48, 16, 171, 238, 15, 110, 62, 16, 152, 46, 99, 155, 78, 234, 45, 102, 234, 162, 30, 17, 220, 16, 236, 15, 225, 14, 33, 110, 12, 249, 253, 98, 168, 142, 236, 250, 160, 236, 48, 134, 234, 63, 208, 235, 49, 246, 235, 5, 225, 236, 208, 206, 236, 219, 177, 236, 40, 30, 17, 217, 77, 99, 247, 0, 227, 3, 209, 226, 81, 118, 15, 0, 62, 238, 46, 126, 222, 231, 62, 16, 203, 32, 225, 52, 86, 227, 4, 17, 13, 233, 238, 235, 2, 97, 14, 52, 150,14, 2, 145, 5, 18, 126, 235, 4, 241, 237, 51, 22, 238, 4, 65, 238, 234, 14, 17, 232, 208, 98, 227, 221, 16, 113, 224, 226, 209, 29, 99, 246, 157, 240, 33, 62, 239, 46, 102, 223, 63, 224, 239, 190, 46, 238, 2, 225, 240, 11, 15, 99, 18, 143,29, 197, 208, 98, 250, 32, 12, 17, 49, 230, 254, 224, 14, 212, 32, 254, 12, 141, 208, 231, 46, 214, 234, 3, 161, 12, 47, 70, 15, 220, 96, 12, 128, 80, 12, 50, 238, 15, 27, 255, 3, 44, 239, 98, 46, 15, 243, 50, 31, 241, 4, 113, 12, 10, 111,14, 207, 80, 12, 120, 192, 10, 205, 224, 233, 232, 64, 16, 205, 16, 234, 243, 128, 13, 66, 127, 11, 200, 96, 13, 232, 112, 244, 2, 65, 238, 120, 110, 16, 199, 208, 98, 230, 16, 239, 46, 70, 242, 38, 143, 242, 45, 166, 242, 2, 113, 243, 8, 254, 242, 49, 63, 243, 53, 207, 16, 247, 208, 98, 195, 224, 16, 148, 238, 98, 240, 144, 13, 198, 112, 221, 3, 209, 246, 119, 14, 247, 114, 47, 230, 91, 95, 242, 39, 223, 221, 95, 79, 16, 116, 63, 225, 118, 223, 29, 201, 237, 15, 82, 255, 16, 187, 144, 246, 254, 32, 14, 4, 62, 16, 50, 158, 225, 2, 145, 13, 30, 159, 13, 119, 255, 3, 96, 128, 248, 203, 64, 16, 144, 31, 226, 146, 79, 16, 149, 223, 98, 151, 47, 16, 124, 0, 223, 240, 80, 12, 6, 1, 8, 46, 206, 239, 63, 192, 10, 136,111, 14, 36, 174, 16, 109, 63, 14, 8, 49, 248, 216, 48, 16, 135, 239, 221, 139, 47, 16, 141, 143, 249, 145, 63, 249, 157, 239, 15, 159, 223, 16, 195, 32, 103, 210, 94, 236, 51, 110, 13, 183, 63, 16, 196, 143, 15, 198, 111, 16, 181, 159, 248, 199, 254, 159, 251, 200, 223, 98, 202, 127, 252, 219, 81, 240, 254, 48, 251, 16, 17, 228, 89, 159, 234, 8, 78, 16, 246, 238, 15, 7, 127, 237, 45, 6, 242, 3, 241, 253, 225, 79, 16, 200, 238, 15, 228, 255, 3, 197, 142, 15, 97, 126, 16, 244, 224, 15, 247, 48, 16, 103, 238, 15, 235, 64, 253, 6, 65, 252, 150, 78, 16, 124, 143, 12, 3, 161, 253, 0, 241, 67, 224,192, 31, 198, 252, 249, 163, 71, 208, 220, 65, 106, 4, 7, 186, 59, 40, 204, 225, 68, 130, 212, 14, 94, 196, 152, 17, 217, 64, 116, 7, 149, 81, 20, 216, 209, 223, 71, 138, 226, 14, 154, 163, 104, 16, 33, 65, 145, 36, 65, 190, 132, 25, 83, 230, 76, 154, 53, 107, 206, 59, 184, 204, 38, 158, 123, 254, 244, 237, 162, 8, 134, 159, 191, 123, 4, 233, 29, 4, 70, 17,103, 81, 163, 72, 149, 18, 29, 120, 166, 103, 70, 170, 254, 224, 9, 68, 211, 83, 223, 176, 153, 233, 124, 54, 2, 137, 19, 95, 22, 129, 60, 125, 2, 157, 40, 20, 234, 192, 163, 254, 146, 78, 92, 106, 147, 92, 85, 170, 250, 192, 176, 245, 55,246, 229, 81, 189, 19, 205, 254, 12, 58, 148, 169, 64, 190, 100, 109, 30, 70, 156, 88, 49, 98, 124, 7, 185, 214, 116, 118, 18, 100, 156, 131, 87, 5, 250, 58, 56, 143, 98, 163, 131, 233, 8, 98, 254, 246, 167, 121, 34, 103, 127, 158, 5, 50, 163, 75, 21, 157, 192, 102, 7, 87, 207, 108, 236, 14, 36, 171, 131, 235, 6, 70, 246, 135, 146, 34, 101, 171, 3, 65, 139,118, 72, 218, 52, 77, 120, 7, 163, 209, 4, 86, 251, 101, 114, 127, 182, 41, 226, 214, 61, 145, 183, 229, 31, 204, 157, 47, 198, 158, 93, 251, 225, 51, 23, 209, 210, 4, 119, 208, 26, 72, 100, 157, 7, 70, 59, 88, 238, 249, 65, 111, 4, 209, 251, 83, 63, 17, 119, 123, 129, 225, 83, 99, 4, 87, 255, 32, 182, 153, 229, 253, 229, 167, 232, 153, 131, 0, 252, 193, 190, 241, 40, 242, 111, 184, 247, 226, 115, 104, 190, 154, 26, 25, 74, 31, 176, 102, 154, 102, 192, 151, 42, 252, 15, 36, 3, 201, 51, 79, 32, 12, 9, 220, 46, 68, 17, 71, 236, 238, 160, 141, 106, 42, 231, 32, 102, 64, 226, 230, 32, 110, 6, 50,201, 159, 3, 29, 178, 111, 69, 24, 197, 163, 168, 198, 129, 82, 244, 199, 25, 154, 120, 244, 81, 38, 108, 14, 10, 114, 34, 251, 158, 217, 81, 69, 22, 93, 188, 81, 198, 28, 149, 164, 9, 183, 118, 106, 26, 231, 32, 36, 65, 170, 210, 159, 43,39, 226, 209, 198, 137, 90, 244, 231, 69, 129, 178, 220, 114, 68, 51, 207, 84, 172, 49, 127, 248, 171, 201, 43, 127, 116, 154, 40, 139, 226, 252, 57, 254, 102, 160, 118, 14, 42, 134, 162, 117, 124, 194, 131, 160, 59, 253, 201, 115, 162, 61, 245, 233, 83, 32, 55, 93, 138, 201, 77, 47, 97, 90, 136, 31, 64, 64, 218, 211, 159, 91, 6, 114, 19, 78, 135, 228, 60, 168, 78, 129, 254, 12, 212, 161, 65, 11, 157, 201, 62, 16, 99, 250, 115, 82, 144, 74, 5, 169, 82, 138, 48, 165, 211, 206, 131, 76, 69, 51, 86, 89, 101, 138, 116, 158, 56, 106, 18, 169, 161, 137, 178, 81, 78, 32, 48, 244, 89, 203, 161, 95, 253, 145, 109, 160, 97, 7, 35, 104, 216, 98, 67, 194, 177, 171, 102, 99, 58, 10, 184, 75, 27, 147, 54, 87, 138, 120, 109,206, 88, 96, 145, 213, 150, 88, 155, 34, 181, 52, 166, 51, 128, 149, 214, 161, 113, 67, 123, 201, 218, 93, 123, 253, 225, 220, 114, 103, 133, 55, 222, 31, 134, 116, 141, 15, 144, 192, 120, 102, 29, 146, 178, 116, 199, 176, 129, 166, 1, 150, 31, 75, 149, 113, 141, 34, 130, 253, 25, 135, 160, 131, 95, 115, 232, 224, 132, 7, 178, 111, 158, 239, 96, 202, 18, 30, 123, 97, 162, 13, 93, 4, 211, 35, 136, 95, 127, 61, 12, 120, 224, 130, 39, 114, 184, 166, 44, 26, 235, 75, 166, 131, 25, 36, 153, 99, 44, 15, 234, 215, 33, 128, 253, 17, 120, 160, 149, 229, 197, 57, 94, 52, 112, 202, 44, 155, 99, 26, 254,225, 99, 24, 101, 176, 49, 71, 171, 51, 4, 194, 205, 159, 118, 154, 185, 229, 22, 103, 22, 178, 112, 32, 122, 179, 161,8, 204, 105, 8, 154, 186, 234, 131, 174, 182, 249, 162, 123, 176, 49, 6, 143, 56, 124, 81, 134, 154, 113, 224, 105, 102, 32, 1, 51, 155, 102, 152, 56, 128, 81, 198, 154, 114, 230, 57, 250, 135, 97, 46, 226, 198, 151, 70, 162, 185, 142, 94,54, 145, 190, 104, 233, 166, 159, 190, 8, 196, 172, 191, 220, 186, 38, 255, 24, 150, 9, 219, 191, 215, 93, 243, 165, 164, 5, 119, 26, 234, 12, 7, 114, 60, 103, 205, 101, 61, 70, 205, 251, 148, 246, 243, 62, 114, 28, 130, 250, 68, 135, 68, 242, 69, 33, 19, 41, 66, 221, 33, 30, 83, 227, 103, 194, 77, 239, 91, 22, 15, 96, 51, 90, 150, 71, 211, 103, 79, 109, 116, 213, 253, 217, 157, 163, 131, 82, 167, 137, 222, 207, 145, 45, 253, 165, 228, 95, 250, 147, 46, 223, 7, 90, 126, 115,233, 71, 44, 166, 249, 170, 240, 33, 71, 83, 129, 128, 153, 51, 35, 125, 168, 118, 72, 172, 143, 7, 234, 169, 92, 241, 41, 42, 127, 34, 52, 94, 175, 234, 186, 203, 32, 170, 138, 31, 250, 4, 154, 43, 163, 232, 206, 39, 136, 251, 170, 190, 135, 43, 175, 241, 5, 74, 95, 77, 44, 119, 159, 225, 252, 0, 127, 79, 73, 25, 69, 254, 244, 87, 23, 240, 17, 228, 128, 211, 131, 224, 118, 152, 65, 14, 120, 224, 131, 31, 250, 184, 71, 59, 198, 17, 141, 91, 77, 132, 15, 217, 104, 135, 5, 239, 225, 14, 111, 72, 196, 33, 187, 232, 144, 67, 84, 18, 157, 31, 160, 176, 52, 41, 145, 12, 69, 150, 65, 193, 198, 232, 131, 30, 232, 224, 134, 246, 8, 114, 6, 107, 172, 227, 30, 250, 192, 96, 58, 176, 65, 188, 168, 96, 163, 130, 250, 152, 135, 57, 108, 116, 11, 118, 17, 228, 131, 33, 228, 199, 8, 75, 56, 17, 23, 22, 112, 32, 43, 180, 9, 207, 62, 71, 32, 23,186, 239, 132, 77, 4, 201, 19, 69, 72, 66, 19, 18, 164, 139, 17, 68, 99, 26, 213, 184, 70, 54, 182, 209, 141, 111, 132,99, 28, 229, 56, 71, 58, 214, 209, 142, 119, 196, 99, 30, 245, 184, 71, 62, 246, 209, 143, 127, 4, 100, 32, 5, 57, 72, 66, 22, 210, 144, 135, 68, 100, 34, 21, 185, 72, 70, 54, 210, 145, 143, 132, 100, 36, 37, 57, 73, 74, 86, 210, 146, 151,196, 100, 38, 53, 185, 73, 78, 118, 210, 147, 159, 4, 101, 40, 69, 57, 74, 82, 150, 210, 148, 167, 68, 101, 42, 85, 185, 74, 86, 182, 242, 37, 74, 128, 165, 43, 101, 73, 201, 88, 14, 4, 150, 183, 172, 165, 64, 112, 153, 203, 93, 42, 1, 10,179, 4, 230, 35, 149, 96, 128, 24, 92, 58, 228, 150, 63, 200, 101, 48, 149, 185, 76, 102, 54, 211, 153, 207, 132, 102, 52, 165, 57, 77, 106, 86, 211, 154, 215, 196, 102, 54, 181, 185, 77, 110, 118, 211, 155, 223, 4, 103, 56, 197, 57, 78, 114, 150, 211, 156, 231, 68, 103, 58, 213, 185, 78, 118, 182, 211, 157, 239, 132, 103, 60, 229, 57, 79, 122, 214, 211, 158, 247, 196, 103, 62, 245, 185, 79, 126, 246, 211, 159, 255, 4, 104, 64, 5, 58, 80, 130, 22, 180, 158, 1, 1, 0, 59) + + + # SaveImageButton ============================================================ + $SyncHash.SaveImageButton = New-Object System.Windows.Forms.Button + $SyncHash.SaveImageButton.Location = New-Object System.Drawing.Size(20,230) + $SyncHash.SaveImageButton.Size = New-Object System.Drawing.Size(80,22) + $SyncHash.SaveImageButton.Text = "Save Image" + $SyncHash.SaveImageButton.Margin = 10 + $SyncHash.SaveImageButton.Enabled = $false + $SyncHash.SaveImageButton.Add_Click( + { + #SAVE IMAGE + $img = $SyncHash.PictureBox.Image + SaveImageFile -bmp $img + }) + + + $SyncHash.RecordingGIF = $false + + # RecordGifButton button ============================================================ + $SyncHash.RecordGifButton = New-Object System.Windows.Forms.Button + $SyncHash.RecordGifButton.Location = New-Object System.Drawing.Size(200,230) + $SyncHash.RecordGifButton.Size = New-Object System.Drawing.Size(80,22) + $SyncHash.RecordGifButton.Text = "Record GIF" + #$SyncHash.RecordGifButton.Margin = 10 + $SyncHash.RecordGifButton.ForeColor = "green" + $SyncHash.RecordGifButton.Enabled = $false + #$SyncHash.RecordGifButton.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left + $SyncHash.RecordGifButton.Add_Click( + { + Write-Host "INFO: Recording GIF" -foreground yellow + $SyncHash.RecordGifButton.Enabled = $false + $SyncHash.SaveImageButton.Enabled = $false + $SyncHash.StopRecordGifButton.Enabled = $true + + #SAVE IMAGE + $imgArray = @() + + $SyncHash.RecordingGIF = $true + While ($SyncHash.RecordingGIF) + { + [System.Drawing.Image]$imageObject = $SyncHash.PictureBox.Image + $imgArray += $imageObject + [System.Windows.Forms.Application]::DoEvents() + Start-Sleep -Milliseconds 500 + [System.Windows.Forms.Application]::DoEvents() + + } + + $SyncHash.RecordGifButton.Enabled = $true + $SyncHash.SaveImageButton.Enabled = $true + $Script:ImageArrayResult = $imgArray + $SyncHash.form.Close() + }) + + # StopRecordGifButton ============================================================ + $SyncHash.StopRecordGifButton = New-Object System.Windows.Forms.Button + $SyncHash.StopRecordGifButton.Location = New-Object System.Drawing.Size(290,230) + $SyncHash.StopRecordGifButton.Size = New-Object System.Drawing.Size(80,22) + $SyncHash.StopRecordGifButton.Text = "Stop Record" + $SyncHash.StopRecordGifButton.Enabled = $false + $SyncHash.StopRecordGifButton.ForeColor = "red" + $SyncHash.StopRecordGifButton.Add_Click( + { + Write-Host "INFO: Stop Recording GIF" -foreground yellow + $SyncHash.RecordingGIF = $false + $SyncHash.StopRecordGifButton.Enabled = $false + }) + + $SyncHash.ImageWidth = 300 + $SyncHash.ImageHeight = 300 + + # PictureBox ============================================================ + $SyncHash.PictureBox = new-object Windows.Forms.PictureBox + $SyncHash.PictureBox.Location = New-Object System.Drawing.Size(10,10) + $SyncHash.PictureBox.width = 0 + $SyncHash.PictureBox.height = 0 + $SyncHash.PictureBox.BorderStyle = "FixedSingle" + $SyncHash.PictureBox.sizemode = "Autosize" + $SyncHash.PictureBox.Margin = 10 + $SyncHash.PictureBox.WaitOnLoad = $true + $SyncHash.PictureBox.Image = $SyncHash.connectingImage + + $SyncHash.PictureBox.Add_SizeChanged( + { + if($SyncHash.screenConnected) + { + if($SyncHash.ImageHeight -gt 700) + { + $SyncHash.PictureBox.sizemode = "StretchImage" + $SyncHash.PictureBox.width = ($SyncHash.ImageWidth / 2) + $SyncHash.PictureBox.height = ($SyncHash.ImageHeight / 2) + + if($SyncHash.form -ne $null) + { + $SyncHash.form.Height = ($SyncHash.ImageHeight / 2) + 60 + $SyncHash.form.Width = ($SyncHash.ImageWidth / 2) + 40 + $SyncHash.form.Refresh() + [System.Windows.Forms.Application]::DoEvents() + } + } + else + { + $SyncHash.form.Refresh() + [System.Windows.Forms.Application]::DoEvents() + } + } + + elseif(!$SyncHash.screenConnected) + { + $SyncHash.PictureBox.sizemode = "Autosize" + } + + $width = $SyncHash.PictureBox.Width + $height = $SyncHash.PictureBox.Height + $SyncHash.SaveImageButton.Location = New-Object System.Drawing.Size(20,($height + 20)) + $SyncHash.RecordGifButton.Location = New-Object System.Drawing.Size(($width - 150),($height + 20)) + $SyncHash.StopRecordGifButton.Location = New-Object System.Drawing.Size(($width - 70),($height + 20)) + + $SyncHash.form.Refresh() + [System.Windows.Forms.Application]::DoEvents() + }) + + $SyncHash.PictureBox.Add_MouseDown( + { + #$script:startX = $_.X + #$script:startY = $_.Y + }) + + $SyncHash.PictureBox.Add_MouseUp( + { + #$X = $_.X + #$Y = $_.Y + }) + + + + + # Create the form + $SyncHash.form = New-Object System.Windows.Forms.Form + $SyncHash.form.Text = "Screen" + $SyncHash.form.Size = New-Object System.Drawing.Size(100,100) + $SyncHash.form.FormBorderStyle = "FixedSingle" + $SyncHash.form.StartPosition = "CenterScreen" + $SyncHash.form.AutoSizeMode = "GrowAndShrink" + $SyncHash.form.AutoSize = $True + $SyncHash.form.Topmost = $True + $SyncHash.form.MaximizeBox = $False + $SyncHash.form.MinimizeBox = $False + $SyncHash.form.tag = $null + #$SyncHash.form.MaximumSize = New-Object System.Drawing.Size(500,370) + #Myteamslab Icon + [byte[]]$WindowIcon = @(71, 73, 70, 56, 57, 97, 32, 0, 32, 0, 231, 137, 0, 0, 52, 93, 0, 52, 94, 0, 52, 95, 0, 53, 93, 0, 53, 94, 0, 53, 95, 0,53, 96, 0, 54, 94, 0, 54, 95, 0, 54, 96, 2, 54, 95, 0, 55, 95, 1, 55, 96, 1, 55, 97, 6, 55, 96, 3, 56, 98, 7, 55, 96, 8, 55, 97, 9, 56, 102, 15, 57, 98, 17, 58, 98, 27, 61, 99, 27, 61, 100, 24, 61, 116, 32, 63, 100, 36, 65, 102, 37, 66, 103, 41, 68, 104, 48, 72, 106, 52, 75, 108, 55, 77, 108, 57, 78, 109, 58, 79, 111, 59, 79, 110, 64, 83, 114, 65, 83, 114, 68, 85, 116, 69, 86, 117, 71, 88, 116, 75, 91, 120, 81, 95, 123, 86, 99, 126, 88, 101, 125, 89, 102, 126, 90, 103, 129, 92, 103, 130, 95, 107, 132, 97, 108, 132, 99, 110, 134, 100, 111, 135, 102, 113, 136, 104, 114, 137, 106, 116, 137, 106,116, 139, 107, 116, 139, 110, 119, 139, 112, 121, 143, 116, 124, 145, 120, 128, 147, 121, 129, 148, 124, 132, 150, 125,133, 151, 126, 134, 152, 127, 134, 152, 128, 135, 152, 130, 137, 154, 131, 138, 155, 133, 140, 157, 134, 141, 158, 135,141, 158, 140, 146, 161, 143, 149, 164, 147, 152, 167, 148, 153, 168, 151, 156, 171, 153, 158, 172, 153, 158, 173, 156,160, 174, 156, 161, 174, 158, 163, 176, 159, 163, 176, 160, 165, 177, 163, 167, 180, 166, 170, 182, 170, 174, 186, 171,175, 186, 173, 176, 187, 173, 177, 187, 174, 178, 189, 176, 180, 190, 177, 181, 191, 179, 182, 192, 180, 183, 193, 182,185, 196, 185, 188, 197, 188, 191, 200, 190, 193, 201, 193, 195, 203, 193, 196, 204, 196, 198, 206, 196, 199, 207, 197,200, 207, 197, 200, 208, 198, 200, 208, 199, 201, 208, 199, 201, 209, 200, 202, 209, 200, 202, 210, 202, 204, 212, 204,206, 214, 206, 208, 215, 206, 208, 216, 208, 210, 218, 209, 210, 217, 209, 210, 220, 209, 211, 218, 210, 211, 219, 210,211, 220, 210, 212, 219, 211, 212, 219, 211, 212, 220, 212, 213, 221, 214, 215, 223, 215, 216, 223, 215, 216, 224, 216,217, 224, 217, 218, 225, 218, 219, 226, 218, 220, 226, 219, 220, 226, 219, 220, 227, 220, 221, 227, 221, 223, 228, 224,225, 231, 228, 229, 234, 230, 231, 235, 251, 251, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 33, 254, 17, 67, 114, 101, 97, 116, 101, 100, 32, 119, 105, 116, 104, 32, 71, 73, 77, 80, 0, 33, 249, 4, 1, 10, 0, 255, 0, 44, 0, 0, 0, 0, 32, 0, 32, 0, 0, 8, 254, 0, 255, 29, 24, 72, 176, 160, 193, 131, 8, 25, 60, 16, 120, 192, 195, 10, 132, 16, 35, 170, 248, 112, 160, 193, 64, 30, 135, 4, 68, 220, 72, 16, 128, 33, 32, 7, 22, 92, 68, 84, 132, 35, 71, 33, 136, 64, 18, 228, 81, 135, 206, 0, 147, 16, 7, 192, 145, 163, 242, 226, 26, 52, 53, 96, 34, 148, 161, 230, 76, 205, 3, 60, 214, 204, 72, 163, 243, 160, 25, 27, 62, 11, 6, 61, 96, 231, 68, 81, 130, 38, 240, 28, 72, 186, 114, 205, 129, 33, 94, 158, 14, 236, 66, 100, 234, 207, 165, 14, 254, 108, 120, 170, 193, 15, 4, 175, 74, 173, 30, 120, 50, 229, 169, 20, 40, 3, 169, 218, 28, 152, 33, 80, 2, 157, 6, 252, 100, 136, 251, 85, 237, 1, 46, 71,116, 26, 225, 66, 80, 46, 80, 191, 37, 244, 0, 48, 57, 32, 15, 137, 194, 125, 11, 150, 201, 97, 18, 7, 153, 130, 134, 151, 18, 140, 209, 198, 36, 27, 24, 152, 35, 23, 188, 147, 98, 35, 138, 56, 6, 51, 251, 29, 24, 4, 204, 198, 47, 63, 82, 139, 38, 168, 64, 80, 7, 136, 28, 250, 32, 144, 157, 246, 96, 19, 43, 16, 169, 44, 57, 168, 250, 32, 6, 66, 19, 14, 70, 248, 99, 129, 248, 236, 130, 90, 148, 28, 76, 130, 5, 97, 241, 131, 35, 254, 4, 40, 8, 128, 15, 8, 235, 207, 11, 88, 142, 233, 81, 112, 71, 24, 136, 215, 15, 190, 152, 67, 128, 224, 27, 22, 232, 195, 23, 180, 227, 98, 96, 11, 55, 17, 211, 31, 244, 49, 102, 160, 24, 29, 249, 201, 71, 80, 1, 131, 136, 16, 194, 30, 237, 197, 215, 91, 68, 76, 108, 145, 5, 18, 27, 233, 119, 80, 5, 133, 0, 66, 65, 132, 32, 73, 48, 16, 13, 87, 112, 20, 133, 19, 28, 85, 113, 195, 1, 23, 48, 164, 85, 68, 18, 148, 24, 16, 0, 59) + $ico = New-Object IO.MemoryStream($WindowIcon, 0, $WindowIcon.Length) + $SyncHash.form.Icon = [System.Drawing.Icon]::FromHandle((new-object System.Drawing.Bitmap -argument $ico).GetHIcon()) + $SyncHash.form.ShowInTaskbar = $true + + $SyncHash.form.Add_Closing( + { + Write-Host "INFO: Closing window" -foreground yellow + $SyncHash.boolWhile = $false + } + ) + + + # Add all of the controls to the form + $SyncHash.form.Controls.Add($SyncHash.PictureBox) + $SyncHash.form.Controls.Add($SyncHash.TextLabel) + $SyncHash.form.Controls.Add($SyncHash.SaveImageButton) + $SyncHash.form.Controls.Add($SyncHash.RecordGifButton) + $SyncHash.form.Controls.Add($SyncHash.StopRecordGifButton) + + + $runspace = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace($Host) + $runspace.Open() + $runspace.SessionStateProxy.SetVariable('SyncHash',$SyncHash) + $powershell = [System.Management.Automation.PowerShell]::Create() + $powershell.Runspace = $runspace + + + #THIS IS THE RUNSPACE CODE + $powershell.AddScript({ + + [string]$theIPAddress = $SyncHash.IPAddress + [string]$thePort = $SyncHash.Port + [byte[]]$errorImage = @(71, 73, 70, 56, 57, 97, 100, 1, 200, 0, 231, 255, 0, 66, 8, 18, 46, 15, 20, 51, 14, 17, 50, 14, 21, 74, 7, 17, 61, 11, 21, 75, 8, 11, 56, 13, 24, 62, 12, 17, 50, 15, 26, 44, 18, 15, 43, 18, 20, 61, 12, 27, 48, 17, 17, 57, 14, 20, 31, 22, 23, 65, 13, 13, 43, 19, 26, 90, 5, 21, 47, 18, 26, 55, 17, 14, 55, 17, 20, 60, 16, 16, 50, 19, 23, 71, 13, 17, 42, 22, 22, 40, 22, 30, 72, 13, 22, 46, 21, 23, 71, 13, 27, 32, 25, 29, 31, 26, 21, 36, 25, 16, 36, 24, 30, 38, 24, 26, 85, 10, 24, 30, 27, 26, 29, 27, 30, 36, 25, 35, 35, 26, 27, 40, 25, 23, 24, 29, 35, 27, 29, 26, 26, 29, 31, 43, 24, 28, 68, 17, 22, 45, 24, 24, 33, 27, 36, 68, 17, 26, 23, 31, 27, 37, 27, 24, 22, 31, 32, 35, 27, 32, 40, 26, 28, 28, 30, 28, 32, 29, 28, 31, 29, 32, 30, 30, 24, 36, 28, 28, 33, 29, 28, 26, 32, 24, 27, 31, 33, 40, 27, 33, 29, 31, 28, 30, 30, 37, 97, 11, 19, 32, 30, 33, 87, 14, 21, 35, 30, 24, 36, 29, 34, 25, 33, 29, 24, 33, 34, 82, 16, 23, 77, 18, 22, 30, 32, 29, 34, 31, 30, 33, 31, 34, 22, 35, 30, 26, 34, 30, 82, 17, 31, 31, 33, 30, 30, 33, 35, 33, 33, 27, 99, 13, 27, 40, 31, 31, 96, 14, 32, 91, 17, 28, 45, 31, 33, 80, 21, 29, 34, 35, 33, 93, 19, 25, 122, 12, 38, 124, 13, 29, 109, 18, 32, 95, 22, 38, 87, 25,34, 38, 40, 37, 116, 16, 37, 117, 17, 30, 105, 23, 32, 99, 25, 34, 111, 21, 39, 105, 24, 37, 42, 44, 41, 45, 47, 45, 103, 30, 40, 141, 19, 39, 110, 29, 42, 131, 23, 39, 122, 25, 50, 124, 26, 47, 118, 29, 50, 132, 25, 47, 49, 51, 48, 157, 18, 42, 114, 33, 44, 128, 29, 40, 143, 24, 47, 121, 32, 47, 128, 30, 45, 52, 54, 51, 152, 26, 46, 160, 24, 50, 218, 6, 56, 55, 57, 54, 218, 8, 51, 132, 35, 53, 154, 29, 52, 57, 59, 57, 140, 34, 52, 210, 15, 47, 220, 12, 46, 209, 15, 52, 135,38, 55, 165, 29, 52, 220, 12, 52, 219, 12, 57, 158, 32, 45, 137, 39, 51, 152, 36, 53, 221, 15, 53, 62, 64, 61, 143, 40,50, 168, 33, 49, 211, 19, 59, 221, 16, 58, 167, 33, 59, 212, 21, 49, 212, 21, 54, 176, 32, 59, 211, 21, 64, 203, 25, 55, 148, 42, 57, 223, 19, 54, 214, 23, 44, 162, 38, 58, 205, 26, 45, 203, 26, 61, 223, 20, 59, 214, 24, 50, 205, 27, 51, 214, 24, 55, 196, 30, 53, 194, 30, 68, 171, 38, 64, 180, 36, 56, 196, 31, 58, 215, 25, 61, 163, 41, 65, 179, 36, 66, 188,34, 60, 187, 34, 65, 69, 71, 68, 206, 30, 58, 174, 40, 59, 205, 30, 68, 197, 33, 64, 160, 45, 59, 190, 36, 56, 182, 39,63, 168, 44, 62, 189, 37, 71, 207, 33, 64, 73, 75, 72, 192, 39, 63, 191, 39, 68, 169, 47, 58, 77, 79, 77, 213, 40, 63, 215, 41, 63, 81, 83, 81, 215, 43, 70, 86, 88, 85, 215, 53, 72, 90, 92, 89, 95, 97, 94, 216, 65, 81, 100, 103, 100, 104, 106, 103, 109, 111, 108, 114, 116, 113, 116, 119, 116, 120, 122, 120, 123, 126, 123, 130, 132, 129, 134, 136, 133, 137, 139, 136, 142, 144, 141, 222, 123, 130, 147, 149, 146, 222, 130, 134, 150, 152, 149, 156, 158, 155, 226, 141, 147, 162, 164, 161, 227, 148, 152, 166, 168, 165, 170, 173, 170, 229, 156, 157, 229, 158, 165, 175, 177, 174, 230, 165, 170, 179, 182, 179, 231, 173, 175, 185, 187, 184, 235, 177, 179, 188, 191, 187, 193, 195, 192, 198, 200, 197, 202, 204, 201, 206, 208, 205, 239, 202, 203, 210, 212, 209, 214, 216, 213, 242, 213, 212, 219, 221, 218, 244, 217, 221, 222, 224, 221, 225, 227, 224, 243, 223, 225, 230, 232, 229, 249, 229, 231, 246, 233, 233, 234, 237, 233, 238, 240, 237, 250, 237, 238, 247, 241, 240, 241, 244, 240, 246, 248, 245, 252, 247, 246, 249, 251, 248, 255, 251, 250, 251, 253, 250, 255, 253, 251, 253, 255, 252, 30, 30, 30, 33, 254, 17, 67, 114, 101, 97, 116, 101, 100, 32, 119, 105, 116, 104, 32, 71, 73, 77, 80, 0, 33, 249, 4, 1, 10, 0, 255, 0, 44, 0, 0, 0, 0, 100, 1, 200, 0, 0, 8, 254, 0, 127, 8, 28, 72, 176, 160, 193, 131, 8, 19, 42, 92, 200, 176, 161, 195, 135, 16, 17, 238, 216, 33, 208, 136, 192, 137, 20, 7, 98, 140, 200, 177, 163, 199, 143, 32, 67, 138, 28, 73, 178, 164, 201, 147, 40, 21, 78, 172, 120, 113, 165, 70, 151, 41, 99, 202, 156, 73, 179, 166, 205, 155, 56, 65, 194, 108, 89, 112, 99, 206, 159, 64, 131, 10, 29, 74, 212, 230, 206, 31, 71, 125, 22, 93, 202, 180, 169, 211, 167, 57,147, 102, 124, 9, 181, 170, 213, 171, 88, 179, 30, 148, 106, 112, 170, 214, 175, 96, 195, 138, 141, 121, 116, 36, 198, 179, 104, 207, 142, 93, 203, 182, 45, 81, 165, 36, 211, 202, 133, 235, 182, 174, 221, 187, 113, 213, 66, 212, 235, 17, 7, 14, 134, 126, 241, 10, 30, 44, 24, 109, 68, 190, 29, 3, 47, 84, 76, 184, 177, 99, 177, 103, 149, 8, 84, 193, 83, 34, 221, 131, 74, 36, 31, 100, 60, 80, 133, 231, 129, 66, 132, 60, 30, 77, 26, 43, 70, 205, 159, 47, 183, 44, 251, 121, 96, 102, 132, 156, 39, 183, 86, 18, 186, 180, 237, 219, 75, 79, 203, 70, 76, 144, 247, 143, 214, 174, 97, 255, 45, 232, 153, 242, 15, 218, 162, 113, 43, 95, 206, 188, 185, 243, 231, 208, 163, 75, 159, 78, 189, 186, 245, 235, 216, 179, 107, 223, 206, 189, 187, 247, 239, 224, 195, 254, 139, 31, 79, 190, 188, 249, 243, 232, 211, 171, 95, 207, 190, 189, 251, 247, 240, 227, 203, 159, 79, 191, 190, 253, 251, 248, 243, 235, 223, 207, 191, 191, 255, 255, 0, 6, 40, 224, 128, 51, 41, 229, 153, 111, 171, 121, 197, 81, 108, 155, 13, 71, 224, 131, 157, 169, 128, 145, 103, 49, 80, 54, 145, 14, 20, 25, 215, 155, 106, 15, 49, 248, 218, 64, 12, 66, 40, 224, 129, 59, 20, 151, 218, 132, 42, 56, 152, 22, 67, 192, 21, 180, 130, 131, 26,209, 246, 87, 113, 34, 138, 136, 3, 13, 129, 89, 116, 28, 106, 47, 250, 85, 66, 9, 76, 76, 164, 2, 20, 178, 249, 133, 195, 10, 72, 70, 17, 197, 111, 2, 41, 49, 209, 107, 158, 173, 16, 5, 20, 74, 84, 136, 20, 142, 70, 178, 84, 35, 129, 59, 208, 128, 227, 10, 71, 232, 248, 219, 144, 80, 172, 80, 130, 16, 76, 48, 145, 156, 100, 36, 200, 80, 131, 8, 25, 100, 192, 193, 5, 23, 112, 96, 103, 6, 46, 176, 128, 66, 13, 58, 16, 81, 162, 103, 74, 100, 193, 196, 145, 42, 56, 65, 229, 14,70, 102, 185, 37, 132, 43, 33, 249, 226, 14, 58, 80, 241, 155, 18, 76, 20, 225, 65, 137, 49, 100, 234, 132, 10, 15, 44,32, 0, 2, 24, 140, 48, 68, 16, 65, 76, 49, 133, 4, 67, 140, 128, 129, 5, 13, 100, 240, 65, 14, 254, 60, 40, 33, 225, 14, 63, 70, 145, 25, 141, 21, 33, 233, 165, 130, 139, 10, 136, 164, 95, 33, 156, 144, 33, 9, 39, 80, 177, 3, 17, 84, 160, 224, 105, 11, 95, 144, 97, 135, 34, 152, 196, 162, 139, 43, 212, 82, 75, 11, 45, 152, 220, 49, 135, 23, 88, 56, 32, 192,2, 120, 242, 137, 168, 10, 37, 76, 150, 3, 172, 49, 24, 177, 130, 151, 48, 246, 58, 96, 143, 95, 90, 184, 195, 7, 50, 44, 224, 192, 8, 97, 252, 81, 9, 44, 176, 152, 98, 138, 40, 0, 95, 114, 73, 43, 160, 8, 44, 138, 191, 176, 140, 178, 138,36, 117, 148, 49, 66, 11, 2, 160, 240, 193, 68, 66, 32, 41, 217, 185, 57, 252, 176, 46, 142, 238, 214, 184, 130, 154, 43, 168, 144, 131, 12, 10, 80, 176, 1, 25, 133, 160, 178, 74, 39, 167, 32, 194, 200, 203, 140, 132, 18, 10, 37, 147, 12, 210, 71, 31, 159, 32, 162, 51, 34, 145, 156, 98, 9, 44, 181, 160, 18, 136, 25, 88, 80, 16, 0, 11, 59, 36, 73, 209, 185, 2, 41, 218, 177, 127, 126, 81, 228, 146, 153, 43, 100, 65, 132, 2, 67, 176, 241, 136, 42, 253, 94, 2, 73, 40, 58, 223, 252, 201, 36, 100, 127, 146, 9, 35, 56, 147, 61, 201, 216, 136, 132, 66, 136, 192, 166, 224, 98, 8, 27, 67, 56, 112, 130,18, 47, 238, 250, 244, 254, 131, 81, 35, 69, 145, 17, 42, 80, 81, 67, 0, 22, 164, 17, 139, 42, 160, 124, 66, 137, 204, 148, 52, 174, 243, 39, 144, 43, 254, 137, 216, 145, 87, 14, 121, 31, 103, 83, 2, 9, 44, 155, 148, 209, 66, 0, 34, 176, 219, 247, 222, 1, 150, 128, 131, 16, 43, 73, 70, 196, 2, 27, 148, 241, 199, 44, 166, 92, 82, 182, 229, 59, 135, 173, 115,227, 184, 83, 2, 121, 217, 55, 247, 30, 10, 40, 157, 44, 28, 70, 7, 28, 224, 93, 130, 151, 36, 236, 160, 25, 233, 252, 69, 97, 102, 197, 74, 60, 144, 129, 3, 72, 208, 225, 202, 43, 132, 16, 18, 74, 229, 189, 83, 94, 59, 34, 185, 79, 142, 179, 229, 189, 79, 162, 51, 33, 157, 204, 18, 200, 19, 160, 123, 233, 193, 18, 37, 50, 223, 95, 148, 96, 170, 112, 5, 2, 98, 60, 34, 203, 37, 130, 32, 226, 73, 31, 59, 139, 220, 205, 6, 97, 51, 0, 130, 175, 113, 226, 235, 158, 226, 114, 87, 187, 198, 189, 205, 20, 164, 112, 3, 0, 92, 160, 132, 35, 65, 65, 67, 242, 203, 143, 113, 178, 176, 3, 22, 0, 224, 14, 170, 184, 4, 33, 62, 129, 54, 3, 6, 240, 114, 4, 236, 221, 1, 19, 216, 61, 156, 229, 206, 113, 50, 27, 219, 36, 40, 209, 138, 74, 4, 2, 1, 25, 40, 145, 148, 50, 168, 159, 211, 124, 32, 3, 254, 27, 248, 3, 44, 46, 161, 59, 77, 12, 34, 19, 110, 67, 4, 0, 95, 136, 136, 203, 81, 174, 133, 80, 188, 29, 36, 32, 65, 137, 176, 165, 141, 19, 173, 80, 69, 32, 8, 224, 130, 38, 241, 48, 63, 19, 57, 193, 224, 48, 128, 9, 88, 52, 110, 109, 189, 91, 156, 238, 20, 119, 192, 23, 58, 145, 114, 144, 211, 93, 247, 218, 56, 51, 204, 17, 112, 109, 161, 184, 4, 46, 22, 145, 4, 14, 124, 128, 72, 95, 196, 79, 9, 124, 16, 0, 36, 108, 66, 22, 137, 27, 219, 228, 148, 72, 54, 4, 182, 112, 108, 12, 84, 162, 11, 207, 136, 70, 202, 53, 78, 16,147, 24, 224, 217, 62, 33, 8, 183, 193, 2, 21, 18, 184, 0, 175, 2, 105, 30, 223, 172, 224, 7, 84, 8, 192, 8, 22, 97, 10, 66, 240, 110, 103, 105, 67, 160, 248, 108, 6, 73, 220, 217, 110, 129, 106, 123, 35, 46, 89, 216, 187, 201, 109, 238, 15, 35, 104, 64, 13, 182, 50, 74, 82, 102, 231, 70, 187, 34, 65, 22, 126, 131, 168, 40, 236, 0, 5, 24, 216, 196, 16, 221,70, 136, 155, 201, 50, 124, 185, 124, 161, 54, 113, 87, 182, 74, 46, 145, 18, 105, 116, 100, 31, 94, 150, 71, 89, 36, 34, 8, 1, 248, 211, 5, 37, 36, 58, 99, 114, 39, 111, 187, 146, 85, 12, 126, 176, 4, 28, 148, 0, 5, 16, 254, 112, 132, 25,41, 145, 189, 80, 88, 147, 137, 77, 204, 101, 27, 183, 233, 70, 1, 254, 83, 108, 252, 36, 4, 56, 25, 113, 182, 62, 188,77, 20, 121, 192, 0, 11, 148, 105, 28, 118, 30, 233, 148, 76, 115, 167, 117, 18, 245, 23, 40, 104, 138, 88, 84, 112, 0,27, 112, 1, 137, 182, 105, 79, 124, 146, 203, 25, 248, 148, 88, 64, 130, 186, 212, 165, 113, 228, 167, 35, 75, 56, 9, 80, 100, 241, 14, 5, 168, 1, 185, 68, 227, 4, 164, 248, 5, 163, 25, 211, 40, 117, 16, 245, 83, 129, 196, 192, 9, 71, 56, 130, 10, 106, 112, 129, 42, 172, 2, 18, 132, 56, 160, 36, 225, 120, 59, 37, 50, 226, 165, 88, 205, 170, 56, 203, 55, 9, 81, 144, 162, 12, 23, 32, 1, 199, 122, 250, 3, 35, 173, 32, 163, 66, 149, 14, 81, 145, 100, 212, 24, 28, 97, 6, 78, 112,1, 1, 54, 209, 137, 243, 89, 81, 129, 139, 212, 170, 94, 181, 218, 203, 151, 245, 129, 18, 157, 160, 197, 6, 88, 80, 132, 18, 40, 1, 93, 47, 122, 1, 13, 96, 149, 86, 234, 20, 149, 34, 74, 152, 65, 20, 12, 91, 1, 54, 192, 162, 164, 73, 132,227, 19, 255, 186, 215, 206, 18, 116, 134, 161, 200, 100, 38, 206, 22, 10, 88, 184, 161, 0, 33, 144, 16, 172, 120, 96, 4, 100, 254, 128, 7, 141, 141, 254, 142, 69, 30, 75, 145, 40, 220, 104, 1, 86, 200, 5, 33, 160, 170, 189, 76, 220, 76, 109, 255, 92, 160, 103, 135, 155, 187, 126, 46, 20, 102, 151, 72, 69, 21, 50, 80, 33, 41, 240, 0, 182, 61, 138, 173, 116,102, 123, 36, 191, 17, 149, 5, 27, 8, 196, 37, 24, 145, 61, 237, 97, 78, 109, 153, 228, 44, 113, 199, 251, 194, 208, 134, 183, 15, 131, 8, 69, 39, 254, 224, 128, 137, 97, 80, 186, 213, 113, 212, 106, 104, 112, 128, 45, 228, 2, 20, 227, 235, 94, 46, 255, 73, 222, 254, 106, 147, 132, 14, 93, 69, 26, 22, 144, 17, 175, 176, 21, 190, 67, 133, 84, 13, 58, 32, 137, 78, 108, 239, 145, 179, 19, 175, 127, 39, 140, 187, 62, 152, 207, 20, 129, 216, 128, 8, 242, 246, 3, 166, 201, 23, 193, 203, 105, 215, 100, 116, 176, 0, 50, 232, 54, 180, 10, 196, 29, 228, 226, 225, 143, 22, 187, 248, 197, 48, 142, 177, 140, 103, 44, 99, 121, 192, 244, 19, 121, 84, 133, 24, 2, 80, 65, 26, 116, 152, 8, 26, 59, 48, 136, 113, 195, 153, 192, 212, 0, 1, 138, 48, 227, 218, 80, 26, 211, 198, 177, 152, 198, 80, 142, 178, 148, 109, 236, 210, 80, 8, 194, 166, 122, 40, 64, 151, 104, 176, 131, 28, 80, 228, 195, 67, 190, 77, 96, 152, 134, 35, 37, 100, 64, 11, 180, 48, 5, 254, 138, 101, 10, 206, 73, 82, 226, 201, 82, 142, 179, 156, 91, 76, 101, 130, 90, 217, 124, 170, 120, 2, 10, 216, 53, 21, 17, 135, 121,52, 99, 134, 173, 151, 126, 16, 128, 145, 38, 18, 124, 10, 109, 179, 112, 225, 60, 231, 70, 211, 184, 206, 219, 28, 161, 217, 76, 49, 7, 97, 58, 173, 44, 127, 118, 140, 95, 86, 27, 3, 191, 168, 192, 1, 134, 128, 68, 94, 109, 201, 223, 55, 183, 184, 30, 20, 206, 170, 60, 232, 140, 85, 37, 102, 226, 18, 152, 104, 65, 13, 86, 0, 4, 32, 224, 128, 67, 153, 38, 204, 173, 207, 101, 17, 32, 208, 64, 6, 88, 80, 5, 34, 6, 193, 136, 182, 57, 46, 156, 78, 62, 117, 170, 177, 186, 106, 127, 64, 186, 188, 146, 100, 68, 43, 72, 161, 5, 23, 28, 161, 71, 184, 206, 181, 99, 66, 3, 132, 19, 52, 96, 12, 176, 144,36, 34, 186, 219, 230, 23, 62, 25, 213, 4, 253, 133, 103, 213, 77, 208, 102, 63, 251, 133, 56, 3, 32, 33, 76, 193, 133,11, 168, 235, 148, 59, 32, 129, 182, 113, 163, 43, 26, 0, 65, 4, 22, 160, 131, 41, 2, 56, 137, 236, 149, 59, 119, 231, 38, 40, 52, 236, 81, 141, 189, 86, 195, 30, 208, 104, 55, 171, 93, 138, 179, 153, 133, 162, 21, 122, 112, 128, 134, 74, 180, 188, 125, 143, 166, 223, 56, 16, 1, 6, 254, 28, 49, 240, 199, 85, 113, 103, 218, 76, 184, 54, 161, 145, 15, 127, 236, 163, 225, 89, 189, 198, 62, 252, 145, 143, 136, 107, 211, 221, 90, 149, 25, 36, 92, 209, 2, 125, 95, 228, 56, 30, 47,205, 175, 252, 146, 129, 33, 232, 194, 193, 222, 51, 96, 202, 149, 173, 77, 118, 184, 120, 31, 215, 192, 170, 204, 93, 252, 142, 109, 226, 252, 165, 51, 59, 224, 44, 176, 112, 183, 206, 4, 93, 57, 56, 184, 64, 16, 92, 113, 9, 127, 90, 56, 129, 3, 77, 182, 63, 208, 253, 66, 98, 188, 227, 233, 218, 112, 233, 54, 102, 222, 226, 120, 16, 195, 234, 19, 119, 233,236, 38, 161, 138, 47, 136, 192, 43, 239, 253, 250, 99, 194, 46, 134, 16, 154, 125, 201, 55, 75, 187, 169, 215, 78, 208, 96, 188, 189, 197, 251, 216, 198, 54, 231, 78, 245, 187, 227, 221, 217, 88, 229, 93, 31, 96, 145, 134, 8, 76, 165, 227, 130, 31, 141, 10, 42, 160, 134, 216, 73, 50, 166, 183, 51, 55, 211, 183, 25, 12, 167, 67, 190, 27, 47, 236, 6, 221, 253, 241, 142, 96, 184, 244, 234, 48, 93, 219, 203, 96, 241, 134, 1, 232, 32, 168, 160, 15, 125, 97, 58, 227, 128, 60, 136, 240, 244, 11, 84, 252, 226, 217, 190, 205, 95, 168, 227, 197, 223, 192, 221, 55, 94, 172, 14, 219, 223, 62, 239, 4, 149, 33, 67, 59, 254, 97, 135, 3, 212, 32, 99, 42, 144, 149, 240, 27, 67, 145, 163, 254, 192, 1, 122, 104, 69, 21, 17, 122, 77, 213, 51, 254, 165, 188, 120, 190, 139, 195, 65, 137, 112, 80, 159, 23, 204, 198, 254, 54, 27, 137, 222, 78, 20, 194, 251, 57, 64, 36, 129, 55, 126, 110, 177, 17, 230, 7, 106, 167, 208, 56, 222, 211, 68, 194, 133, 59, 42, 247, 82, 167,112, 14, 47, 246, 120, 45, 166, 14, 248, 151, 127, 152, 247, 82, 144, 212, 127, 133, 80, 0, 40, 144, 3, 146, 49, 128, 4, 200, 22, 27, 97, 4, 61, 133, 128, 139, 83, 57, 86, 180, 116, 239, 135, 85, 161, 32, 129, 49, 118, 14, 9, 168, 106, 250, 247, 95, 138, 51, 78, 254, 231, 129, 32, 200, 36, 35, 120, 23, 83, 97, 4, 22, 1, 106, 80, 21, 67, 42, 37, 73, 44, 200,124, 88, 5, 131, 46, 118, 14, 51, 163, 85, 184, 151, 125, 146, 195, 8, 166, 208, 129, 31, 40, 36, 61, 232, 131, 25, 1, 132, 159, 150, 126, 218, 51, 51, 57, 227, 68, 71, 184, 87, 74, 216, 98, 76, 168, 87, 79, 184, 77, 147, 244, 9, 83, 168, 131, 43, 33, 130, 87, 8, 22, 46, 161, 133, 21, 144, 7, 173, 144, 104, 107, 36, 71, 18, 166, 118, 72, 104, 103, 99, 184, 132, 77, 136, 129, 239, 6, 111, 11, 164, 134, 126, 192, 0, 223, 135, 105, 254, 111, 8, 25, 128, 55, 135, 34, 36, 83, 187, 19, 94, 97, 136, 85, 17, 56, 129, 247, 71, 131, 25, 72, 113, 156, 245, 9, 184, 224, 6, 134, 232, 101, 136, 114, 74, 137, 104, 23, 72, 50, 122, 165, 167, 126, 222, 37, 67, 223, 132, 112, 171, 71, 80, 241, 247, 98, 244, 103, 127, 46, 102, 129, 128, 216, 106, 153, 136, 11, 189, 167, 3, 126, 19, 138, 110, 129, 111, 68, 21, 118, 65, 80, 10, 173, 208, 73, 186, 83, 97, 169, 168, 135, 47, 229, 124, 208, 39, 125, 212, 103, 125, 18, 119, 137, 4, 165, 51, 86, 198, 8, 170, 64, 6, 17, 96, 2, 64, 80, 2, 59, 224, 81, 186, 184, 22, 71, 112, 17, 70, 114, 1, 90, 160, 11, 151, 128, 99, 240, 86, 106, 203, 231, 82, 173, 247, 116, 176, 151, 59, 178, 71, 117, 204, 120, 115, 53, 200, 68, 218, 179, 54, 170, 128, 5, 34, 240, 2, 138, 181, 3, 78, 48, 79, 219, 72, 130, 61, 194, 1, 72, 16, 11, 162, 160, 68, 77, 120, 87, 238, 183, 135, 141, 227, 120, 79, 39, 121, 218, 212, 142, 45, 246, 14, 150, 7, 143, 206, 184, 77, 110, 227, 79, 130, 80, 10, 45, 176, 3, 66, 224, 107, 37, 34, 38, 253, 56, 22, 191, 194, 2, 72, 102, 10, 236, 247, 56, 200, 118, 142, 218, 228, 118, 112, 39, 119, 179, 103, 119, 151, 23, 136, 185, 227, 254, 54, 139, 3, 10, 134, 224, 0, 63, 32, 4, 183, 22, 63, 31, 57, 22, 25, 241, 34, 131, 51, 7, 176, 208, 7, 154, 48, 54, 219, 51, 136, 18, 246, 128, 185, 227, 122, 46, 23, 117, 47, 53, 117, 15, 249, 146, 26, 56, 57, 5, 215, 9, 117, 32, 0, 78, 240, 40, 197, 180, 147, 166, 1, 34, 58, 32, 2, 95, 144, 11, 136, 48, 148, 230, 211, 128, 147, 227, 128, 171, 136, 59, 44, 231, 114, 48, 39, 117, 51, 151, 15, 210, 0, 149, 48, 53, 78, 147, 112, 9, 171, 16, 6, 11, 176, 41, 198, 129, 147, 90, 25, 22, 83, 241, 40, 48, 80, 9, 161, 165, 9, 189, 20, 62, 102, 217, 130, 47, 180, 112, 107, 153, 85, 15, 103, 115, 18, 9, 147, 107, 52, 78, 125, 208, 9, 155, 48, 2, 25, 32, 43, 183, 194, 4, 229, 178, 151, 95, 145, 133, 65, 54, 0, 127, 208, 9, 130, 32, 152, 150, 68, 73, 198, 152, 110, 235, 118, 125, 19, 153, 59, 55, 83, 66, 166, 224,7, 5, 32, 2, 146, 1, 5, 60, 160, 2, 152, 233, 103, 154, 137, 21, 82, 50, 1, 97, 112, 95, 171, 233, 68, 138, 163, 54, 40, 185, 108, 205, 8, 147, 171, 57, 9, 96, 51, 10, 94, 176, 0, 184, 216, 97, 77, 19, 34, 183, 249, 20, 160, 40, 16, 43, 16, 1, 35, 240, 7, 151, 112, 118, 120, 152, 54, 101, 254, 131, 148, 194, 249, 66, 103, 40, 75, 214, 68, 8, 150, 32, 9, 45,32, 3, 10, 34, 100, 207, 121, 21, 221, 56, 16, 52, 160, 1, 7, 80, 6, 185, 192, 79, 51, 212, 102, 110, 182, 120, 142, 118, 159, 49, 22, 136, 141, 4, 57, 144, 144, 11, 112, 48, 0, 78, 226, 34, 233, 153, 21, 96, 66, 16, 58, 80, 3, 46, 176, 1,13, 6, 9, 51, 148, 64, 70, 201, 104, 248, 25, 161, 250, 105, 156, 161, 213, 9, 168, 48, 2, 44, 144, 139, 101, 101, 155,3, 218, 20, 31, 230, 101, 58, 160, 3, 3, 208, 6, 169, 32, 59, 9, 164, 154, 125, 0, 161, 17, 122, 159, 142, 89, 112, 132, 144, 11, 118, 48, 0, 62, 144, 147, 205, 217, 161, 88, 113, 36, 195, 145, 3, 126, 178, 2, 26, 240, 4, 152, 96, 10, 6, 133, 162, 42, 186, 162, 141, 86, 103, 49, 245, 155, 132, 48, 109, 27, 80, 3, 37, 224, 76, 25, 115, 4, 182, 198, 156, 54, 10, 21, 102, 213, 97, 231, 178, 2, 38, 48, 1, 107, 96, 10, 131, 64, 54, 131, 73, 159, 201, 71, 51, 230, 211, 157, 113, 105, 64, 189, 3, 10, 184, 192, 6, 14, 160, 3, 82, 194, 52, 80, 250, 23, 65, 53, 165, 78, 81, 165, 24, 115, 4, 56, 16, 2, 0, 32, 9, 34, 228, 77, 41, 213, 128, 98, 154, 122, 100, 202, 77, 147, 19, 71, 254, 74, 164, 51, 146, 105, 0, 28, 160, 2,206, 3, 34, 81, 26, 167, 114, 10, 21, 79, 18, 3, 77, 112, 4, 58, 144, 0, 85, 64, 10, 160, 48, 8, 108, 4, 64, 50, 20, 57, 75, 6, 57, 169, 199, 75, 126, 74, 92, 192, 117, 118, 217, 163, 51, 150, 80, 11, 86, 160, 0, 50, 112, 147, 96, 178, 46,51, 250, 168, 79, 193, 153, 144, 162, 3, 85, 210, 4, 77, 176, 3, 17, 192, 0, 109, 32, 11, 130, 160, 61, 97, 243, 136, 228, 83, 159, 162, 42, 75, 150, 115, 172, 145, 131, 114, 251, 53, 8, 136, 6, 78, 144, 48, 10, 112, 80, 1, 231, 50, 36, 43, 48, 3, 43, 224, 3, 33, 144, 149, 178, 250, 19, 74, 81, 171, 28, 39, 33, 33, 16, 1, 27, 144, 7, 166, 64, 9, 253, 99, 62, 7, 228, 165, 143, 20, 62, 235, 186, 70, 200, 250, 174, 74, 39, 71, 104, 131, 54, 97, 99, 11, 129, 208, 2, 32, 192, 3, 57, 16, 126, 63, 112, 109, 131, 230, 145, 219, 42, 20, 221, 234, 173, 37, 50, 17, 36, 16, 0, 67, 176, 9, 106, 102, 62, 218, 67, 69, 217, 153, 98, 42, 134, 87, 238, 250, 174, 150, 51, 148, 38, 100, 85, 190, 149, 9, 224, 211, 10, 143, 128, 5,25, 64, 4, 60, 32, 5, 178, 130, 84, 209, 21, 176, 76, 161, 23, 23, 114, 2, 24, 162, 60, 77, 240, 254, 3, 184, 149, 10, 173, 48, 78, 194, 101, 85, 102, 202, 126, 224, 9, 71, 20, 139, 172, 101, 243, 61, 171, 233, 80, 129, 165, 5, 10, 144, 3,82, 32, 180, 178, 2, 176, 63, 103, 178, 111, 1, 19, 23, 130, 33, 42, 128, 171, 42, 112, 1, 93, 80, 9, 173, 128, 8, 141,68, 159, 156, 5, 177, 143, 217, 75, 57, 187, 181, 0, 196, 169, 153, 132, 62, 174, 96, 6, 2, 32, 3, 78, 146, 33, 226, 87, 16, 206, 137, 180, 55, 225, 19, 58, 2, 41, 152, 98, 4, 131, 116, 0, 102, 80, 9, 160, 224, 74, 149, 212, 70, 18, 171, 98, 44, 180, 181, 180, 99, 80, 98, 179, 54, 162, 176, 9, 107, 48, 0, 53, 64, 5, 58, 160, 178, 250, 6, 122, 55, 146, 182, 106, 91, 19, 37, 8, 132, 74, 144, 60, 24, 130, 55, 55, 162, 3, 7, 16, 6, 169, 32, 10, 156, 160, 9, 162, 217, 172, 14, 74, 150, 123, 203, 183, 201, 202, 128, 232, 69, 75, 96, 43, 182, 51, 234, 37, 92, 166, 2, 89, 144, 60, 4, 177, 184, 28, 218, 184, 142, 155, 133, 64, 232, 55, 43, 107, 41, 76, 32, 2, 3, 96, 6, 179, 32, 59, 252, 183, 75, 131, 122, 57, 55, 139, 179, 199, 10, 71, 142, 184, 59, 138, 100, 11, 146, 80, 6, 7, 32, 2, 69, 240, 83, 108, 229, 182, 63, 0, 132, 234, 226, 52, 178, 254, 27, 21, 48, 81, 187, 182, 171, 3, 15, 144, 52, 80, 176, 4, 2, 48, 5, 146, 176, 63, 40, 150, 9, 147, 208, 73,161, 117, 172, 89, 75, 188, 6, 101, 57, 186, 179, 54, 136, 240, 171, 121, 4, 11, 122, 96, 6, 12, 32, 2, 102, 53, 3, 73,229, 173, 211, 11, 132, 67, 167, 173, 215, 123, 18, 43, 146, 16, 42, 32, 5, 153, 178, 3, 34, 144, 0, 79, 0, 7, 149, 0, 9, 153, 64, 64, 156, 132, 73, 10, 165, 181, 131, 200, 100, 197, 203, 61, 84, 5, 62, 233, 227, 7, 88, 16, 0, 33, 64, 3, 37, 64, 2, 74, 144, 84, 251, 27, 162, 94, 97, 17, 217, 22, 192, 38, 49, 23, 7, 97, 4, 207, 197, 3, 78, 64, 2, 56, 169, 1,29, 16, 6, 179, 160, 126, 125, 32, 140, 140, 195, 167, 41, 197, 190, 195, 58, 62, 77, 4, 62, 155, 147, 10, 110, 0, 3, 25, 80, 40, 101, 75, 17, 73, 181, 2, 210, 187, 21, 42, 140, 19, 115, 145, 189, 46, 172, 175, 153, 177, 2, 41, 144, 187, 3, 128, 4, 129, 176, 10, 94, 147, 80, 137, 134, 87, 162, 251, 174, 96, 163, 94, 169, 16, 8, 94, 112, 0, 17, 64, 3, 74, 224, 4, 158, 40, 23, 23, 197, 196, 79, 60, 20, 124, 241, 131, 70, 96, 126, 148, 113, 4, 206, 19, 5, 36, 144, 1, 8, 208, 5,155, 176, 10, 254, 177, 83, 183, 192, 90, 66, 227, 19, 198, 220, 115, 113, 166, 144, 11, 203, 91, 0, 105, 76, 3, 162, 161, 175, 158, 104, 194, 43, 241, 198, 136, 24, 199, 150, 41, 25, 31, 18, 18, 181, 123, 25, 46, 33, 43, 59, 176, 4, 42, 160, 41, 80, 176, 3, 33, 192, 2, 23, 128, 0, 102, 176, 8, 136, 148, 61, 186, 87, 66, 71, 74, 177, 249, 21, 54, 151, 160, 10, 139, 48, 6, 8, 176, 0, 87, 64, 5, 194, 34, 16, 60, 144, 41, 72, 225, 34, 85, 202, 34, 215, 203, 175, 76, 66, 204, 32, 161, 189, 101, 225, 18, 126, 193, 101, 202, 243, 92, 18, 130, 147, 42, 112, 2, 23, 64, 0, 92, 32, 7, 165, 128, 11, 255, 210, 197, 19, 251, 195, 138, 227, 54, 112, 163, 10, 178, 240, 8, 98, 128, 4, 13, 208, 170, 51, 48, 43, 224, 103, 130, 1, 58, 189, 210, 25, 204, 11, 17, 124, 1, 187, 60, 240, 188, 182, 89, 9, 41, 46, 240, 41, 73, 96, 6, 129, 128, 10, 179, 0, 11, 157, 240, 53, 143, 52, 57, 48, 35, 196, 176, 48, 11, 155, 160, 8, 107, 144, 4, 22, 80, 1, 25, 176, 156, 26, 129, 18, 110, 24, 199, 78, 33, 33, 76, 85, 0, 35, 208, 5, 112, 176, 9, 149, 176, 10, 170, 224, 47, 30, 237, 209, 178, 160, 10, 170, 80, 9, 122, 80, 7, 93, 48, 2, 8, 16, 254, 0, 18, 211, 34, 18, 29, 29, 62, 226, 37, 53, 144, 1, 1, 32, 0, 14, 208,2, 88, 96, 5, 100, 176, 6, 115, 96, 7, 60, 61, 7, 107, 224, 5, 95, 128, 5, 45, 224, 0, 21, 80, 39, 124, 146, 38, 17, 221, 210, 33, 6, 4, 41, 144, 2, 73, 146, 25, 59, 32, 3, 40, 144, 1, 11, 64, 39, 7, 80, 0, 7, 48, 0, 224, 34, 3, 175, 34, 178, 205, 105, 189, 74, 13, 29, 142, 162, 36, 216, 38, 185, 33, 26, 162, 33, 160, 1, 26, 80, 3, 25, 146, 41, 36, 18, 26, 140, 27, 214, 203, 161, 36, 197, 113, 43, 77, 2, 5, 206, 3, 114, 21, 225, 4, 134, 34, 43, 36, 144, 60, 149, 44, 215, 202, 145, 111, 93, 182, 175, 148, 177, 198, 110, 93, 28, 181, 202, 180, 161, 188, 175, 24, 35, 216, 215, 65, 4, 126, 162, 60, 183, 82, 187, 175, 49, 192, 4, 145, 81, 44, 13, 217, 204, 17, 197, 202, 108, 86, 142, 242, 23, 75, 187, 18, 212, 203,217, 209, 113, 22, 28, 149, 218, 71, 114, 109, 67, 167, 186, 95, 66, 194, 166, 45, 214, 161, 125, 81, 137, 194, 191, 3,49, 116, 170, 29, 215, 177, 189, 219, 188, 221, 219, 190, 253, 219, 192, 29, 220, 194, 61, 220, 196, 93, 220, 198, 13, 22, 216, 208, 98, 237, 16, 219, 206, 48, 14, 238, 112, 15, 250, 160, 15, 247, 254, 224, 14, 228, 240, 12, 104, 64, 29, 214, 208, 98, 217, 128, 16, 229, 208, 98, 226, 240, 20, 183, 32, 103, 212, 224, 78, 207, 48, 15, 80, 118, 15, 222, 128, 7, 210, 65, 14, 45, 166, 12, 8, 1, 15, 45, 22, 13, 79, 17, 13, 114, 118, 12, 164, 196, 10, 233, 16, 103, 250, 160, 222, 209, 1, 223, 250, 0, 6, 99, 33, 14, 250, 189, 76, 95, 36, 12, 240, 221, 98, 244, 32, 14, 204, 32, 12, 120, 32, 12, 202, 64, 13, 229, 128, 15, 254, 0, 15, 210, 209, 8, 252, 224, 15, 203, 61, 22, 237, 208, 98, 207, 128, 96, 128, 96, 222, 254, 160, 15, 222, 16, 7, 8, 209, 8, 226, 64, 14, 210, 225, 12, 222, 61, 22, 103, 160, 15, 45, 198, 10, 8, 198, 222, 254, 128, 15, 205, 192, 17, 120, 64, 13, 233, 64, 15, 250, 128, 15, 240, 0, 14, 187, 112, 16, 2, 238, 15, 206, 80, 12, 224, 224,14, 248, 192, 15, 248, 208, 14, 29, 110, 16, 65, 62, 228, 69, 126, 228, 73, 190, 228, 8, 225, 12, 228, 48, 15, 248, 32,221, 232, 224, 12, 10, 65, 229, 86, 46, 221, 235, 192, 13, 192, 32, 16, 244, 61, 99, 252, 192, 223, 224, 192, 225, 6, 113, 227, 57, 190, 227, 61, 254, 227, 76, 222, 98, 78, 110, 228, 72, 174, 228, 28, 177, 12, 45, 70, 225, 14, 49, 14, 45, 86, 227, 254, 202, 80, 14, 58, 174, 15, 224, 32, 16, 122, 238, 15, 124, 238, 231, 209, 29, 232, 3, 161, 230, 58, 206, 227, 62, 126, 16, 131, 94, 232, 127, 142, 232, 217, 193, 12, 46, 38, 229, 15, 225, 12, 32, 14, 99, 247, 224, 222, 5, 177, 225, 254, 64, 14, 23, 30, 99, 214, 96, 16, 158, 14, 234, 50, 54, 234, 6, 97, 12, 235, 48, 99, 222, 112, 16, 202, 224, 233, 49, 166, 15, 183, 240, 3, 222, 64, 99, 243, 48, 16, 171, 238, 15, 110, 62, 16, 152, 46, 99, 155, 78, 234, 45, 102, 234, 162, 30, 17, 220, 16, 236, 15, 225, 14, 33, 110, 12, 249, 253, 98, 168, 142, 236, 250, 160, 236, 48, 134, 234, 63, 208, 235, 49, 246, 235, 5, 225, 236, 208, 206, 236, 219, 177, 236, 40, 30, 17, 217, 77, 99, 247, 0, 227, 3, 209, 226, 81, 118, 15, 0, 62, 238, 46, 126, 222, 231, 62, 16, 203, 32, 225, 52, 86, 227, 4, 17, 13, 233, 238, 235, 2, 97, 14, 52, 150,14, 2, 145, 5, 18, 126, 235, 4, 241, 237, 51, 22, 238, 4, 65, 238, 234, 14, 17, 232, 208, 98, 227, 221, 16, 113, 224, 226, 209, 29, 99, 246, 157, 240, 33, 62, 239, 46, 102, 223, 63, 224, 239, 190, 46, 238, 2, 225, 240, 11, 15, 99, 18, 143,29, 197, 208, 98, 250, 32, 12, 17, 49, 230, 254, 224, 14, 212, 32, 254, 12, 141, 208, 231, 46, 214, 234, 3, 161, 12, 47, 70, 15, 220, 96, 12, 128, 80, 12, 50, 238, 15, 27, 255, 3, 44, 239, 98, 46, 15, 243, 50, 31, 241, 4, 113, 12, 10, 111,14, 207, 80, 12, 120, 192, 10, 205, 224, 233, 232, 64, 16, 205, 16, 234, 243, 128, 13, 66, 127, 11, 200, 96, 13, 232, 112, 244, 2, 65, 238, 120, 110, 16, 199, 208, 98, 230, 16, 239, 46, 70, 242, 38, 143, 242, 45, 166, 242, 2, 113, 243, 8, 254, 242, 49, 63, 243, 53, 207, 16, 247, 208, 98, 195, 224, 16, 148, 238, 98, 240, 144, 13, 198, 112, 221, 3, 209, 246, 119, 14, 247, 114, 47, 230, 91, 95, 242, 39, 223, 221, 95, 79, 16, 116, 63, 225, 118, 223, 29, 201, 237, 15, 82, 255, 16, 187, 144, 246, 254, 32, 14, 4, 62, 16, 50, 158, 225, 2, 145, 13, 30, 159, 13, 119, 255, 3, 96, 128, 248, 203, 64, 16, 144, 31, 226, 146, 79, 16, 149, 223, 98, 151, 47, 16, 124, 0, 223, 240, 80, 12, 6, 1, 8, 46, 206, 239, 63, 192, 10, 136,111, 14, 36, 174, 16, 109, 63, 14, 8, 49, 248, 216, 48, 16, 135, 239, 221, 139, 47, 16, 141, 143, 249, 145, 63, 249, 157, 239, 15, 159, 223, 16, 195, 32, 103, 210, 94, 236, 51, 110, 13, 183, 63, 16, 196, 143, 15, 198, 111, 16, 181, 159, 248, 199, 254, 159, 251, 200, 223, 98, 202, 127, 252, 219, 81, 240, 254, 48, 251, 16, 17, 228, 89, 159, 234, 8, 78, 16, 246, 238, 15, 7, 127, 237, 45, 6, 242, 3, 241, 253, 225, 79, 16, 200, 238, 15, 228, 255, 3, 197, 142, 15, 97, 126, 16, 244, 224, 15, 247, 48, 16, 103, 238, 15, 235, 64, 253, 6, 65, 252, 150, 78, 16, 124, 143, 12, 3, 161, 253, 0, 241, 67, 224,192, 31, 198, 252, 249, 163, 71, 208, 220, 65, 106, 4, 7, 186, 59, 40, 204, 225, 68, 130, 212, 14, 94, 196, 152, 17, 217, 64, 116, 7, 149, 81, 20, 216, 209, 223, 71, 138, 226, 14, 154, 163, 104, 16, 33, 65, 145, 36, 65, 190, 132, 25, 83, 230, 76, 154, 53, 107, 206, 59, 184, 204, 38, 158, 123, 254, 244, 237, 162, 8, 134, 159, 191, 123, 4, 233, 29, 4, 70, 17,103, 81, 163, 72, 149, 18, 29, 120, 166, 103, 70, 170, 254, 224, 9, 68, 211, 83, 223, 176, 153, 233, 124, 54, 2, 137, 19, 95, 22, 129, 60, 125, 2, 157, 40, 20, 234, 192, 163, 254, 146, 78, 92, 106, 147, 92, 85, 170, 250, 192, 176, 245, 55,246, 229, 81, 189, 19, 205, 254, 12, 58, 148, 169, 64, 190, 100, 109, 30, 70, 156, 88, 49, 98, 124, 7, 185, 214, 116, 118, 18, 100, 156, 131, 87, 5, 250, 58, 56, 143, 98, 163, 131, 233, 8, 98, 254, 246, 167, 121, 34, 103, 127, 158, 5, 50, 163, 75, 21, 157, 192, 102, 7, 87, 207, 108, 236, 14, 36, 171, 131, 235, 6, 70, 246, 135, 146, 34, 101, 171, 3, 65, 139,118, 72, 218, 52, 77, 120, 7, 163, 209, 4, 86, 251, 101, 114, 127, 182, 41, 226, 214, 61, 145, 183, 229, 31, 204, 157, 47, 198, 158, 93, 251, 225, 51, 23, 209, 210, 4, 119, 208, 26, 72, 100, 157, 7, 70, 59, 88, 238, 249, 65, 111, 4, 209, 251, 83, 63, 17, 119, 123, 129, 225, 83, 99, 4, 87, 255, 32, 182, 153, 229, 253, 229, 167, 232, 153, 131, 0, 252, 193, 190, 241, 40, 242, 111, 184, 247, 226, 115, 104, 190, 154, 26, 25, 74, 31, 176, 102, 154, 102, 192, 151, 42, 252, 15, 36, 3, 201, 51, 79, 32, 12, 9, 220, 46, 68, 17, 71, 236, 238, 160, 141, 106, 42, 231, 32, 102, 64, 226, 230, 32, 110, 6, 50,201, 159, 3, 29, 178, 111, 69, 24, 197, 163, 168, 198, 129, 82, 244, 199, 25, 154, 120, 244, 81, 38, 108, 14, 10, 114, 34, 251, 158, 217, 81, 69, 22, 93, 188, 81, 198, 28, 149, 164, 9, 183, 118, 106, 26, 231, 32, 36, 65, 170, 210, 159, 43,39, 226, 209, 198, 137, 90, 244, 231, 69, 129, 178, 220, 114, 68, 51, 207, 84, 172, 49, 127, 248, 171, 201, 43, 127, 116, 154, 40, 139, 226, 252, 57, 254, 102, 160, 118, 14, 42, 134, 162, 117, 124, 194, 131, 160, 59, 253, 201, 115, 162, 61, 245, 233, 83, 32, 55, 93, 138, 201, 77, 47, 97, 90, 136, 31, 64, 64, 218, 211, 159, 91, 6, 114, 19, 78, 135, 228, 60, 168, 78, 129, 254, 12, 212, 161, 65, 11, 157, 201, 62, 16, 99, 250, 115, 82, 144, 74, 5, 169, 82, 138, 48, 165, 211, 206, 131, 76, 69, 51, 86, 89, 101, 138, 116, 158, 56, 106, 18, 169, 161, 137, 178, 81, 78, 32, 48, 244, 89, 203, 161, 95, 253, 145, 109, 160, 97, 7, 35, 104, 216, 98, 67, 194, 177, 171, 102, 99, 58, 10, 184, 75, 27, 147, 54, 87, 138, 120, 109,206, 88, 96, 145, 213, 150, 88, 155, 34, 181, 52, 166, 51, 128, 149, 214, 161, 113, 67, 123, 201, 218, 93, 123, 253, 225, 220, 114, 103, 133, 55, 222, 31, 134, 116, 141, 15, 144, 192, 120, 102, 29, 146, 178, 116, 199, 176, 129, 166, 1, 150, 31, 75, 149, 113, 141, 34, 130, 253, 25, 135, 160, 131, 95, 115, 232, 224, 132, 7, 178, 111, 158, 239, 96, 202, 18, 30, 123, 97, 162, 13, 93, 4, 211, 35, 136, 95, 127, 61, 12, 120, 224, 130, 39, 114, 184, 166, 44, 26, 235, 75, 166, 131, 25, 36, 153, 99, 44, 15, 234, 215, 33, 128, 253, 17, 120, 160, 149, 229, 197, 57, 94, 52, 112, 202, 44, 155, 99, 26, 254,225, 99, 24, 101, 176, 49, 71, 171, 51, 4, 194, 205, 159, 118, 154, 185, 229, 22, 103, 22, 178, 112, 32, 122, 179, 161,8, 204, 105, 8, 154, 186, 234, 131, 174, 182, 249, 162, 123, 176, 49, 6, 143, 56, 124, 81, 134, 154, 113, 224, 105, 102, 32, 1, 51, 155, 102, 152, 56, 128, 81, 198, 154, 114, 230, 57, 250, 135, 97, 46, 226, 198, 151, 70, 162, 185, 142, 94,54, 145, 190, 104, 233, 166, 159, 190, 8, 196, 172, 191, 220, 186, 38, 255, 24, 150, 9, 219, 191, 215, 93, 243, 165, 164, 5, 119, 26, 234, 12, 7, 114, 60, 103, 205, 101, 61, 70, 205, 251, 148, 246, 243, 62, 114, 28, 130, 250, 68, 135, 68, 242, 69, 33, 19, 41, 66, 221, 33, 30, 83, 227, 103, 194, 77, 239, 91, 22, 15, 96, 51, 90, 150, 71, 211, 103, 79, 109, 116, 213, 253, 217, 157, 163, 131, 82, 167, 137, 222, 207, 145, 45, 253, 165, 228, 95, 250, 147, 46, 223, 7, 90, 126, 115,233, 71, 44, 166, 249, 170, 240, 33, 71, 83, 129, 128, 153, 51, 35, 125, 168, 118, 72, 172, 143, 7, 234, 169, 92, 241, 41, 42, 127, 34, 52, 94, 175, 234, 186, 203, 32, 170, 138, 31, 250, 4, 154, 43, 163, 232, 206, 39, 136, 251, 170, 190, 135, 43, 175, 241, 5, 74, 95, 77, 44, 119, 159, 225, 252, 0, 127, 79, 73, 25, 69, 254, 244, 87, 23, 240, 17, 228, 128, 211, 131, 224, 118, 152, 65, 14, 120, 224, 131, 31, 250, 184, 71, 59, 198, 17, 141, 91, 77, 132, 15, 217, 104, 135, 5, 239, 225, 14, 111, 72, 196, 33, 187, 232, 144, 67, 84, 18, 157, 31, 160, 176, 52, 41, 145, 12, 69, 150, 65, 193, 198, 232, 131, 30, 232, 224, 134, 246, 8, 114, 6, 107, 172, 227, 30, 250, 192, 96, 58, 176, 65, 188, 168, 96, 163, 130, 250, 152, 135, 57, 108, 116, 11, 118, 17, 228, 131, 33, 228, 199, 8, 75, 56, 17, 23, 22, 112, 32, 43, 180, 9, 207, 62, 71, 32, 23,186, 239, 132, 77, 4, 201, 19, 69, 72, 66, 19, 18, 164, 139, 17, 68, 99, 26, 213, 184, 70, 54, 182, 209, 141, 111, 132,99, 28, 229, 56, 71, 58, 214, 209, 142, 119, 196, 99, 30, 245, 184, 71, 62, 246, 209, 143, 127, 4, 100, 32, 5, 57, 72, 66, 22, 210, 144, 135, 68, 100, 34, 21, 185, 72, 70, 54, 210, 145, 143, 132, 100, 36, 37, 57, 73, 74, 86, 210, 146, 151,196, 100, 38, 53, 185, 73, 78, 118, 210, 147, 159, 4, 101, 40, 69, 57, 74, 82, 150, 210, 148, 167, 68, 101, 42, 85, 185, 74, 86, 182, 242, 37, 74, 128, 165, 43, 101, 73, 201, 88, 14, 4, 150, 183, 172, 165, 64, 112, 153, 203, 93, 42, 1, 10,179, 4, 230, 35, 149, 96, 128, 24, 92, 58, 228, 150, 63, 200, 101, 48, 149, 185, 76, 102, 54, 211, 153, 207, 132, 102, 52, 165, 57, 77, 106, 86, 211, 154, 215, 196, 102, 54, 181, 185, 77, 110, 118, 211, 155, 223, 4, 103, 56, 197, 57, 78, 114, 150, 211, 156, 231, 68, 103, 58, 213, 185, 78, 118, 182, 211, 157, 239, 132, 103, 60, 229, 57, 79, 122, 214, 211, 158, 247, 196, 103, 62, 245, 185, 79, 126, 246, 211, 159, 255, 4, 104, 64, 5, 58, 80, 130, 22, 180, 158, 1, 1, 0, 59) + + $RetryTimer = 3 + + While($SyncHash.boolWhile) + { + if($SyncHash.UseHTTPS) + { + try { + if($SyncHash.Brand -eq "Poly") + { + $PhoneUrl = "https://${theIPAddress}:${thePort}/captureScreen/mainScreen" + } + elseif($SyncHash.Brand -eq "Yealink") + { + $PhoneUrl = "https://${theIPAddress}:${thePort}/screencapture/download" + } + + } catch { + Write-Host "ERROR: Failed to connect to phone..." -foreground "red" + Write-Host "Exception:" $_.Exception.Message -foreground "red" + if($_.Exception.Response.StatusCode.value__ -eq "") + { + Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__ -foreground "red" + Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription -foreground "red" + } + } + } + else + { + try { + + if($SyncHash.Brand -eq "Poly") + { + $PhoneUrl = "http://${theIPAddress}:${thePort}/captureScreen/mainScreen" + } + elseif($SyncHash.Brand -eq "Yealink") + { + $PhoneUrl = "http://${theIPAddress}:${thePort}/screencapture/download" + } + + } catch { + Write-Host "ERROR: Failed to connect to phone..." -foreground "red" + Write-Host "Exception:" $_.Exception.Message -foreground "red" + if($_.Exception.Response.StatusCode.value__ -eq "") + { + Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__ -foreground "red" + Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription -foreground "red" + } + } + } + + $WebClient = $null + $WebClient = New-Object System.Net.WebClient + $WebClient.Timeout = 800 + $WebClient.Credentials = New-Object System.Net.NetworkCredential($SyncHash.HTTPUsername,$SyncHash.HTTPPassword) + + Try { + [System.Drawing.Image] $Image = $WebClient.DownloadData($PhoneUrl) + } + Catch [Exception] { + $theError = $_.Exception.Message + Write-Host "ERROR: $theError" -foreground red + $WebResponse = [net.HttpWebResponse]$_.Exception.Response + $resst = $WebResponse.getResponseStream() + $sr = new-object IO.StreamReader($resst) + [string]$result = $sr.ReadToEnd() + $WebResponse.close() + + if($theError -imatch "Not Found") + { + Write-Host "ERROR: It looks like the phone does not have the Screen Capture feature enabled. Enable Screen Capture in the settings of the phone and try again." -foreground "red" + $Image = $null + $SyncHash.screenConnected = $false + $SyncHash.form.Close() + } + elseif($theError -imatch "Unauthorized") + { + Write-Host "ERROR: The password you have entered is incorrect. Check your password." -foreground "red" + $Image = $null + $SyncHash.screenConnected = $false + $SyncHash.form.Close() + } + elseif($theError -imatch "Forbidden") + { + Write-Host "ERROR: It looks like the phone does not have the Screen Capture feature enabled. Enable Screen Capture in the settings of the phone and try again." -foreground "red" + $Image = $null + $SyncHash.screenConnected = $false + $SyncHash.form.Close() + } + else + { + $Image = $null + $SyncHash.screenConnected = $false + Write-Host "INFO: " $_.Exception.Message -foreground "yellow" + } + + } + if($Image -ne $null) + { + + Try { + #DISPLAY IMAGE + $SyncHash.screenConnected = $true + + #Get the Image Size + $SyncHash.ImageWidth = $Image.Width + $SyncHash.ImageHeight = $Image.Height + + #Display Image + $SyncHash.PictureBox.Image = $Image + $SyncHash.PictureBox.Visible = $true + + if($SyncHash.RecordingGIF) + { + $SyncHash.RecordGifButton.Enabled = $false + $SyncHash.StopRecordGifButton.Enabled = $true + $SyncHash.SaveImageButton.Enabled = $false + } + else + { + $SyncHash.RecordGifButton.Enabled = $true + $SyncHash.StopRecordGifButton.Enabled = $false + $SyncHash.SaveImageButton.Enabled = $true + } + + + $RetryTimer = 1 + + } + Catch [Exception] { + Write-Host "INFO: Cannot display image." -foreground "yellow" + + $SyncHash.screenConnected = $false + + #If display fails show error image. + $SyncHash.PictureBox.Image = $errorImage + $SyncHash.PictureBox.Visible = $true + $SyncHash.SaveImageButton.Enabled = $false + $SyncHash.RecordGifButton.Enabled = $false + + $RetryTimer = 10 + } + } + else + { + #RESIZE THE IMAGE SIZE + $SyncHash.PictureBox.sizemode = "Autosize" + + $SyncHash.screenConnected = $false + #If display fails show error image. + $SyncHash.PictureBox.Image = $SyncHash.screenCapErrorImage + $SyncHash.PictureBox.Visible = $true + $SyncHash.SaveImageButton.Enabled = $false + $SyncHash.RecordGifButton.Enabled = $false + } + + for($i=0; $i -lt $RetryTimer; $i++) + { + if(!$SyncHash.boolWhile) + { + break + } + Start-Sleep -milliseconds 300 + } + + } + + }) | Out-Null + + $handle = $powershell.BeginInvoke() + + + # Initialize and show the form. + $SyncHash.form.Add_Shown({$SyncHash.form.Activate()}) + $SyncHash.form.ShowDialog() > $null # Trash the text of the button that was clicked. + + $SyncHash.boolWhile = $false + While (-Not $handle.IsCompleted) { + Start-Sleep -Milliseconds 50 + } + + $script:screenConnected = $false + + $runspace.Close() + $powershell.Dispose() +} + + +$script:startX = 0 +$script:startY = 0 +$script:currentImage = 0 +$script:frames = @() +$script:mouseDown = $false +$script:ghostBoxCount = 0 + +function EditGifDialog([array] $ImageArray) +{ + Add-Type -AssemblyName System.Drawing + Add-Type -AssemblyName System.Windows.Forms + + Write-Host "INFO: Opening GIF Editing Studio." -foreground yellow + + $X = 0 + $Y = 0 + + function Update-ShapeTable + { + $lv.Items.Clear() + foreach($frame in $frames) + { + $lvItem = new-object System.Windows.Forms.ListViewItem($frame.ShapeNumber) + [void]$lvItem.SubItems.Add($frame.StartFrame) + [void]$lvItem.SubItems.Add($frame.EndFrame) + [void]$lv.Items.Add($lvItem) + } + } + + + #DrawShapesLabel ============================================================ + $DrawShapesLabel = New-Object System.Windows.Forms.Label + $Font = New-Object System.Drawing.Font("Arial",10,[System.Drawing.FontStyle]::Bold) + # Font styles are: Regular, Bold, Italic, Underline, Strikeout + $DrawShapesLabel.Font = $Font + $DrawShapesLabel.Location = New-Object System.Drawing.Size(20,5) + $DrawShapesLabel.Size = New-Object System.Drawing.Size(150,18) + $DrawShapesLabel.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $DrawShapesLabel.Text = "Draw Shapes:" + $DrawShapesLabel.TabStop = $false + + $PictureBox = new-object Windows.Forms.PictureBox + $PictureBox.Location = New-Object System.Drawing.Size(20,25) + $PictureBox.width = 280 + $PictureBox.height = 280 + $PictureBox.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $PictureBox.BorderStyle = "FixedSingle" + $PictureBox.sizemode = "Zoom" + $PictureBox.Margin = 10 + #$PictureBox.ForeColor = [System.Drawing.Color]::Black + $PictureBox.WaitOnLoad = $true + if($ImageArray.Length -ne -1) + { + $PictureBox.Image = $ImageArray[0] + } + + $PictureBox.Add_MouseDown( + { + $script:startX = $_.X + $script:startY = $_.Y + $script:mouseDown = $true + }) + + $PictureBox.Add_MouseMove( + { + $script:ghostBoxCount++ + + if($script:ghostBoxCount -gt 10) + { + if($script:mouseDown -eq $true) + { + $X = $_.X + $Y = $_.Y + + $img = $ImageArray[$script:currentImage] + + $sizeMultiplier = 1 + $lineThickness = 1 + + $tempY = $script:startY + $tempX = $script:startX + if($img.Width -gt $PictureBox.Width -and $img.Width -gt $img.Height) + { + $sizeMultiplier = ($img.Width / $PictureBox.Width) + + $difference = ($PictureBox.Height - ($img.Height / $sizeMultiplier)) / 2 + $tempY = $tempY - $difference + $Y = $Y - $difference + $tempY = $tempY -as [int] + $Y = $Y -as [int] + + [int]$lineThickness = $img.Width / 200 + + } + elseif($img.Height -gt $PictureBox.Height -and $img.Height -gt $img.Width) + { + $sizeMultiplier = ($img.Height / $PictureBox.Height) + $difference = ($PictureBox.Width - ($img.Width / $sizeMultiplier)) / 2 + $tempX = $tempX - $difference + $X = $X - $difference + $tempX = $tempX -as [int] + $X = $X -as [int] + + [int]$lineThickness = $img.Height / 200 + + } + + $imgForGraph = New-Object System.Drawing.Bitmap($img.Width, $img.Height) + [System.Drawing.Graphics] $graph = [System.Drawing.Graphics]::FromImage($imgForGraph) #Converting image to stop indexed image error on GIFs + $graph.DrawImage($img, 0, 0) + + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Gray, $lineThickness) + + $1 = $tempX * $sizeMultiplier + $2 = $tempY * $sizeMultiplier + $3 = ($X * $sizeMultiplier - ($tempX * $sizeMultiplier)) + $4 =($Y * $sizeMultiplier - ($tempY * $sizeMultiplier)) + $1 = $1 -as [int] + $2 = $2 -as [int] + $3 = $3 -as [int] + $4 = $4 -as [int] + + if($3 -lt 0) + { + $1 = $1 + $3 + $3 = $3 * -1 + } + if($4 -lt 0) + { + $2 = $2 + $4 + $4 = $4 * -1 + } + + if($ShapeDropDownBox.SelectedItem -eq "Circle") + { + $graph.DrawEllipse($pen,$1, $2, $3, $4) + } + else + { + $graph.DrawRectangle($pen,$1, $2, $3, $4) + } + $graph.Dispose() + + $PictureBox.Image = $imgForGraph + $imgForGraph = $null + $script:ghostBoxCount = 0 + } + } + }) + + $PictureBox.Add_MouseUp( + { + $script:mouseDown = $false + + $X = $_.X + $Y = $_.Y + + $img = $ImageArray[$script:currentImage] + + $sizeMultiplier = 1 + $lineThickness = 1 + if($img.Width -gt $PictureBox.Width -and $img.Width -gt $img.Height) + { + $sizeMultiplier = ($img.Width / $PictureBox.Width) + + $difference = ($PictureBox.Height - ($img.Height / $sizeMultiplier)) / 2 + $script:startY = $script:startY - $difference + $Y = $Y - $difference + $script:startY = $script:startY -as [int] + $Y = $Y -as [int] + + [int]$lineThickness = $img.Width / 200 + + } + elseif($img.Height -gt $PictureBox.Height -and $img.Height -gt $img.Width) + { + $sizeMultiplier = ($img.Height / $PictureBox.Height) + $difference = ($PictureBox.Width - ($img.Width / $sizeMultiplier)) / 2 + $script:startX = $script:startX - $difference + $X = $X - $difference + $script:startX = $script:startX -as [int] + $X = $X -as [int] + + [int]$lineThickness = $img.Height / 200 + + } + + $1 = $script:startX * $sizeMultiplier + $2 = $script:startY * $sizeMultiplier + $3 = ($X * $sizeMultiplier - ($script:startX * $sizeMultiplier)) + $4 =($Y * $sizeMultiplier - ($script:startY * $sizeMultiplier)) + $1 = $1 -as [int] + $2 = $2 -as [int] + $3 = $3 -as [int] + $4 = $4 -as [int] + + if($3 -lt 0) + { + $1 = $1 + $3 + $3 = $3 * -1 + } + if($4 -lt 0) + { + $2 = $2 + $4 + $4 = $4 * -1 + } + + $lvItem = new-object System.Windows.Forms.ListViewItem($script:currentImage) + [void]$lvItem.SubItems.Add($script:currentImage) + [void]$lvItem.SubItems.Add($ShapeDropDownBox.SelectedItem) + [void]$lvItem.SubItems.Add($ColourDropDownBox.SelectedItem) + [void]$lvItem.SubItems.Add($1) + [void]$lvItem.SubItems.Add($2) + [void]$lvItem.SubItems.Add($3) + [void]$lvItem.SubItems.Add($4) + [void]$lv.Items.Add($lvItem) + + Update-AnimationScreen + + }) + + + #ShapeLabel ============================================================ + $ShapeLabel = New-Object System.Windows.Forms.Label + $Font = New-Object System.Drawing.Font("Arial",10,[System.Drawing.FontStyle]::Bold) + # Font styles are: Regular, Bold, Italic, Underline, Strikeout + $ShapeLabel.Font = $Font + $ShapeLabel.Location = New-Object System.Drawing.Size(340,20) + $ShapeLabel.Size = New-Object System.Drawing.Size(140,18) + $ShapeLabel.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $ShapeLabel.Text = "Markup Shape:" + $ShapeLabel.TabStop = $false + + + $ShapeDropDownBox = New-Object System.Windows.Forms.ComboBox + $ShapeDropDownBox.Location = New-Object System.Drawing.Size(340,40) + $ShapeDropDownBox.Size = New-Object System.Drawing.Size(140,15) + $ShapeDropDownBox.DropDownHeight = 100 + $ShapeDropDownBox.tabIndex = 4 + $ShapeDropDownBox.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $ShapeDropDownBox.DropDownStyle = "DropDownList" + + [void] $ShapeDropDownBox.Items.Add("Rectangle") + [void] $ShapeDropDownBox.Items.Add("Circle") + + $numberOfItems = $ShapeDropDownBox.count + if($numberOfItems -gt 0) + { + $ShapeDropDownBox.SelectedIndex = 0 + } + + #ColourLabel ============================================================ + $ColourLabel = New-Object System.Windows.Forms.Label + $Font = New-Object System.Drawing.Font("Arial",10,[System.Drawing.FontStyle]::Bold) + # Font styles are: Regular, Bold, Italic, Underline, Strikeout + $ColourLabel.Font = $Font + $ColourLabel.Location = New-Object System.Drawing.Size(500,20) + $ColourLabel.Size = New-Object System.Drawing.Size(140,18) + $ColourLabel.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $ColourLabel.Text = "Markup Colour:" + $ColourLabel.TabStop = $false + + + $ColourDropDownBox = New-Object System.Windows.Forms.ComboBox + $ColourDropDownBox.Location = New-Object System.Drawing.Size(500,40) + $ColourDropDownBox.Size = New-Object System.Drawing.Size(140,15) + $ColourDropDownBox.DropDownHeight = 200 + $ColourDropDownBox.tabIndex = 5 + $ColourDropDownBox.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $ColourDropDownBox.DropDownStyle = "DropDownList" + + [void] $ColourDropDownBox.Items.Add("Red") + [void] $ColourDropDownBox.Items.Add("Purple") + [void] $ColourDropDownBox.Items.Add("Green") + [void] $ColourDropDownBox.Items.Add("Blue") + [void] $ColourDropDownBox.Items.Add("Orange") + [void] $ColourDropDownBox.Items.Add("Pink") + [void] $ColourDropDownBox.Items.Add("Yellow") + [void] $ColourDropDownBox.Items.Add("White") + [void] $ColourDropDownBox.Items.Add("Maroon") + [void] $ColourDropDownBox.Items.Add("Black") + + $numberOfItems = $ColourDropDownBox.count + if($numberOfItems -gt 0) + { + $ColourDropDownBox.SelectedIndex = 0 + } + + #MarkupShapeLabel ============================================================ + $MarkupShapeLabel = New-Object System.Windows.Forms.Label + $Font = New-Object System.Drawing.Font("Arial",10,[System.Drawing.FontStyle]::Bold) + # Font styles are: Regular, Bold, Italic, Underline, Strikeout + $MarkupShapeLabel.Font = $Font + $MarkupShapeLabel.Location = New-Object System.Drawing.Size(340,70) + $MarkupShapeLabel.Size = New-Object System.Drawing.Size(200,18) + $MarkupShapeLabel.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $MarkupShapeLabel.Text = "Markup Shapes:" + $MarkupShapeLabel.TabStop = $false + + $lv = New-Object windows.forms.ListView + $lv.View = [System.Windows.Forms.View]"Details" + $lv.Size = New-Object System.Drawing.Size(510,190) + $lv.Location = New-Object System.Drawing.Size(340,90) + $lv.FullRowSelect = $true + $lv.GridLines = $true + $lv.HideSelection = $false + #$lv.Sorting = [System.Windows.Forms.SortOrder]::Ascending + $lv.Sorting = [System.Windows.Forms.SortOrder]::None + $lv.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + [void]$lv.Columns.Add("StartFrame", 65) + [void]$lv.Columns.Add("EndFrame", 60) + [void]$lv.Columns.Add("Shape", 60) + [void]$lv.Columns.Add("Colour", 60) + [void]$lv.Columns.Add("StartX", 60) + [void]$lv.Columns.Add("StartY", 60) + [void]$lv.Columns.Add("Width", 60) + [void]$lv.Columns.Add("Height", 60) + + $lv.add_MouseUp( + { + foreach ($item in $lv.SelectedItems) + { + $user = $item.Text + if($item -ne $null) + { + $startFrame = $item.Text -as [int] + $endFrame = $item.SubItems[1].Text -as [int] + $Shape = $item.SubItems[2].Text + $Colour = $item.SubItems[3].Text + $StartX = $item.SubItems[4].Text -as [int] + $StartY = $item.SubItems[5].Text -as [int] + $Width = $item.SubItems[6].Text -as [int] + $Height = $item.SubItems[7].Text -as [int] + $StartFrameTextBox.text = "$startFrame" + $EndFrameTextBox.text = "$endFrame" + $ShapeTextBox.SelectedItem = "$Shape" + $ColourTextBox.SelectedItem = "$Colour" + $StartXTextBox.text = "$StartX" + $StartYTextBox.text = "$StartY" + $WidthTextBox.text = "$Width" + $HeightTextBox.text = "$Height" + + #Update the image number + $arrayLength = $ImageArray.length - 1 + $script:currentImage = $startFrame + Update-AnimationScreen + $currentImageNumber = $script:currentImage + $FrameNumberNumberBox.Value = $currentImageNumber + } + } + #Write-Host "Number of selected items: " $lv.SelectedItems.count + if($lv.SelectedItems.count -eq 0) + { + $StartFrameTextBox.text = "" + $EndFrameTextBox.text = "" + $ShapeTextBox.SelectedItem = "" + $ColourTextBox.SelectedItem = "" + $StartXTextBox.text = "" + $StartYTextBox.text = "" + $WidthTextBox.text = "" + $HeightTextBox.text = "" + } + $lv.Refresh() + }) + + # List Key Event ============================================================ + $lv.add_KeyUp( + { + if ($_.KeyCode -eq "Up" -or $_.KeyCode -eq "Down") + { + foreach ($item in $lv.SelectedItems) + { + if($item -ne $null) + { + $startFrame = $item.Text -as [int] + $endFrame = $item.SubItems[1].Text -as [int] + $Shape = $item.SubItems[2].Text + $Colour = $item.SubItems[3].Text + $StartX = $item.SubItems[4].Text -as [int] + $StartY = $item.SubItems[5].Text -as [int] + $Width = $item.SubItems[6].Text -as [int] + $Height = $item.SubItems[7].Text -as [int] + $StartFrameTextBox.text = "$startFrame" + $EndFrameTextBox.text = "$endFrame" + $ShapeTextBox.SelectedItem = "$Shape" + $ColourTextBox.SelectedItem = "$Colour" + $StartXTextBox.text = "$StartX" + $StartYTextBox.text = "$StartY" + $WidthTextBox.text = "$Width" + $HeightTextBox.text = "$Height" + + #Update the image number + $arrayLength = $ImageArray.length - 1 + $script:currentImage = $startFrame + Update-AnimationScreen + $currentImageNumber = $script:currentImage + $FrameNumberNumberBox.Value = $currentImageNumber + + } + } + } + if($lv.SelectedItems.count -eq 0) + { + $StartFrameTextBox.text = "" + $EndFrameTextBox.text = "" + $ShapeTextBox.SelectedItem = "" + $ColourTextBox.SelectedItem = "" + $StartXTextBox.text = "" + $StartYTextBox.text = "" + $WidthTextBox.text = "" + $HeightTextBox.text = "" + } + $lv.Refresh() + }) + + $lv.add_SelectedIndexChanged( + { + Update-AnimationScreen + }) + + + + #StartFrameTextBox ============================================================ + $StartFrameTextBox = new-object System.Windows.Forms.textbox + $StartFrameTextBox.location = new-object system.drawing.size(340,285) + $StartFrameTextBox.size = new-object system.drawing.size(70,23) + $StartFrameTextBox.text = "" + $StartFrameTextBox.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left + $StartFrameTextBox.tabIndex = 6 + + + #EndFrameTextBox ============================================================ + $EndFrameTextBox = new-object System.Windows.Forms.textbox + $EndFrameTextBox.location = new-object system.drawing.size(410,285) + $EndFrameTextBox.size = new-object system.drawing.size(60,23) + $EndFrameTextBox.text = "" + $EndFrameTextBox.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left + $EndFrameTextBox.tabIndex = 7 + + #ShapeTextBox ============================================================ + $ShapeTextBox = New-Object System.Windows.Forms.ComboBox + $ShapeTextBox.Location = New-Object System.Drawing.Size(470,285) + $ShapeTextBox.Size = New-Object System.Drawing.Size(60,23) + $ShapeTextBox.DropDownHeight = 100 + $ShapeTextBox.tabIndex = 8 + $ShapeTextBox.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left + $ShapeTextBox.DropDownStyle = "DropDownList" + + [void] $ShapeTextBox.Items.Add("Rectangle") + [void] $ShapeTextBox.Items.Add("Circle") + + $numberOfItems = $ShapeTextBox.count + if($numberOfItems -gt 0) + { + $ShapeTextBox.SelectedIndex = 0 + } + + + $ColourTextBox = New-Object System.Windows.Forms.ComboBox + $ColourTextBox.Location = New-Object System.Drawing.Size(530,285) + $ColourTextBox.Size = New-Object System.Drawing.Size(60,23) + $ColourTextBox.DropDownHeight = 200 + $ColourTextBox.tabIndex = 9 + $ColourTextBox.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left + $ColourTextBox.DropDownStyle = "DropDownList" + + [void] $ColourTextBox.Items.Add("Red") + [void] $ColourTextBox.Items.Add("Purple") + [void] $ColourTextBox.Items.Add("Green") + [void] $ColourTextBox.Items.Add("Blue") + [void] $ColourTextBox.Items.Add("Orange") + [void] $ColourTextBox.Items.Add("Pink") + [void] $ColourTextBox.Items.Add("Yellow") + [void] $ColourTextBox.Items.Add("White") + [void] $ColourTextBox.Items.Add("Maroon") + [void] $ColourTextBox.Items.Add("Black") + + $numberOfItems = $ColourTextBox.count + if($numberOfItems -gt 0) + { + $ColourTextBox.SelectedIndex = 0 + } + + + #StartXTextBox ============================================================ + $StartXTextBox = new-object System.Windows.Forms.textbox + $StartXTextBox.location = new-object system.drawing.size(590,285) + $StartXTextBox.size = new-object system.drawing.size(60,23) + $StartXTextBox.text = "" + $StartXTextBox.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left + $StartXTextBox.tabIndex = 10 + + #StartYTextBox ============================================================ + $StartYTextBox = new-object System.Windows.Forms.textbox + $StartYTextBox.location = new-object system.drawing.size(650,285) + $StartYTextBox.size = new-object system.drawing.size(60,23) + $StartYTextBox.text = "" + $StartYTextBox.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left + $StartYTextBox.tabIndex = 11 + + #WidthTextBox ============================================================ + $WidthTextBox = new-object System.Windows.Forms.textbox + $WidthTextBox.location = new-object system.drawing.size(710,285) + $WidthTextBox.size = new-object system.drawing.size(60,23) + $WidthTextBox.text = "" + $WidthTextBox.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left + $WidthTextBox.tabIndex = 12 + + #HeightTextBox ============================================================ + $HeightTextBox = new-object System.Windows.Forms.textbox + $HeightTextBox.location = new-object system.drawing.size(770,285) + $HeightTextBox.size = new-object system.drawing.size(60,23) + $HeightTextBox.text = "" + $HeightTextBox.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left + $HeightTextBox.tabIndex = 13 + + + + #EditShapeButton ============================================================ + $EditShapeButton = New-Object System.Windows.Forms.Button + $EditShapeButton.Location = New-Object System.Drawing.Size(490,315) + $EditShapeButton.Size = New-Object System.Drawing.Size(100,20) + $EditShapeButton.Text = "Update Shape" + $EditShapeButton.TabIndex = 14 + $EditShapeButton.Add_Click( + { + foreach ($item in $lv.SelectedItems) + { + $StartFrame = $StartFrameTextBox.text -as [int] + if($StartFrame -gt 0 -and $StartFrame -lt ($ImageArray.length)) + { + $item.Text = $StartFrameTextBox.text + } + else + { + Write-Host "INFO: Unable to use the Start Frame value" -foreground yellow + } + $EndFrame = $EndFrameTextBox.text -as [int] + if($EndFrame -gt 0 -and $EndFrame -lt ($ImageArray.length)) + { + $item.SubItems[1].Text = $EndFrameTextBox.text + } + else + { + Write-Host "INFO: Unable to use the End Frame value" -foreground yellow + } + if($ShapeTextBox.text -eq "Rectangle" -or $ShapeTextBox.text -eq "Circle") + { + $item.SubItems[2].Text = $ShapeTextBox.text + } + else + { + Write-Host "INFO: Unable to use the Shape value" -foreground yellow + } + + $item.SubItems[3].Text = $ColourTextBox.text + + $StartX = $StartXTextBox.text -as [int] + if($StartX -ge 0) + { + $item.SubItems[4].Text = $StartXTextBox.text + } + else + { + Write-Host "INFO: Unable to use the Start X value" -foreground yellow + } + $StartY = $StartYTextBox.text -as [int] + if($StartY -ge 0) + { + $item.SubItems[5].Text = $StartYTextBox.text + } + else + { + Write-Host "INFO: Unable to use the Start Y value" -foreground yellow + } + $Width = $WidthTextBox.text -as [int] + if($Width -ge 0) + { + $item.SubItems[6].Text = $WidthTextBox.text + } + else + { + Write-Host "INFO: Unable to use the Width value" -foreground yellow + } + $Height = $HeightTextBox.text -as [int] + if($Height -ge 0) + { + $item.SubItems[7].Text = $HeightTextBox.text + } + else + { + Write-Host "INFO: Unable to use the Height value" -foreground yellow + } + + } + Update-AnimationScreen + + }) + + #DeleteShapeButton ============================================================ + $DeleteShapeButton = New-Object System.Windows.Forms.Button + $DeleteShapeButton.Location = New-Object System.Drawing.Size(600,315) + $DeleteShapeButton.Size = New-Object System.Drawing.Size(100,20) + $DeleteShapeButton.Text = "Delete Shape" + $DeleteShapeButton.TabIndex = 15 + $DeleteShapeButton.Add_Click( + { + $beforeDelete = $lv.SelectedItems[0].Index + if($beforeDelete -ne $null) + { + $lv.Items.RemoveAt($lv.SelectedItems[0].Index) + Update-AnimationScreen + } + if($beforeDelete -ge $lv.Items.Count) + { + $beforeDelete = $beforeDelete - 1 + } + if($lv.items.Count -ge 1) + { + $lv.Items[$beforeDelete].Selected = $true; + } + elseif($lv.items.Count -eq 0) + { + Write-Host "No items left" + } + }) + + + + function Update-AnimationScreen + { + $img = $ImageArray[$script:currentImage] + + $imgForGraph = New-Object System.Drawing.Bitmap($img.Width, $img.Height) + [System.Drawing.Graphics] $graph = [System.Drawing.Graphics]::FromImage($imgForGraph) #Converting image to stop indexed image error on GIFs + $graph.DrawImage($img, 0, 0) + + foreach ($item in $lv.Items) + { + [int]$lineThickness = $img.Height / 200 + + $startFrame = $item.Text -as [int] + $endFrame = $item.SubItems[1].Text -as [int] + $shape = $item.SubItems[2].Text + $colour = $item.SubItems[3].Text + $1 = $item.SubItems[4].Text -as [int] + $2 = $item.SubItems[5].Text -as [int] + $3 = $item.SubItems[6].Text -as [int] + $4 = $item.SubItems[7].Text -as [int] + + if($script:currentImage -ge $startFrame -and $script:currentImage -le $endFrame) + { + Write-Host "INFO: Found $shape to render" -foreground yellow + + if($item.Index -eq $lv.SelectedItems[0].Index) + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::MediumTurquoise, $lineThickness) + } + elseif($colour -eq "Green") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Green, $lineThickness) + } + elseif($colour -eq "Purple") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Purple, $lineThickness) + } + elseif($colour -eq "Blue") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Blue, $lineThickness) + } + elseif($colour -eq "Orange") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Orange, $lineThickness) + } + elseif($colour -eq "Pink") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Pink, $lineThickness) + } + elseif($colour -eq "Yellow") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Yellow, $lineThickness) + } + elseif($colour -eq "White") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::White, $lineThickness) + } + elseif($colour -eq "Maroon") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Maroon, $lineThickness) + } + elseif($colour -eq "Black") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Black, $lineThickness) + } + else + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Red, $lineThickness) + } + + if($shape -eq "Circle") + { + $graph.DrawEllipse($pen,$1, $2, $3, $4) + } + else + { + $graph.DrawRectangle($pen,$1, $2, $3, $4) + } + } + } + $graph.Dispose() + $PictureBox.Image = $imgForGraph + $imgForGraph = $null + } + + + #LeftManualButton ============================================================ + $LeftManualButton = New-Object System.Windows.Forms.Button + $LeftManualButton.Location = New-Object System.Drawing.Size(30,310) + $LeftManualButton.Size = New-Object System.Drawing.Size(60,18) + $LeftManualButton.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $LeftManualButton.Text = "Previous" + $LeftManualButton.TabIndex = 16 + $LeftManualButton.Add_Click( + { + $arrayLength = $ImageArray.length - 1 + if($script:currentImage -gt 0) + {$script:currentImage--} + $img = $ImageArray[$script:currentImage] + + Update-AnimationScreen + + $currentImageNumber = $script:currentImage + $FrameNumberNumberBox.Value = $currentImageNumber + + }) + + + #RightManualButton ============================================================ + $RightManualButton = New-Object System.Windows.Forms.Button + $RightManualButton.Location = New-Object System.Drawing.Size(100,310) + $RightManualButton.Size = New-Object System.Drawing.Size(60,18) + $RightManualButton.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $RightManualButton.Text = "Next" + $RightManualButton.TabIndex = 17 + $RightManualButton.Add_Click( + { + $arrayLength = $ImageArray.length - 1 + if($script:currentImage -lt ($ImageArray.length - 1)) + { + $script:currentImage++ + } + + Update-AnimationScreen + + $currentImageNumber = $script:currentImage + $FrameNumberNumberBox.Value = $currentImageNumber + }) + + #FrameNumberLabel ============================================================ + $FrameNumberLabel = New-Object System.Windows.Forms.Label + $Font = New-Object System.Drawing.Font("Arial",10,[System.Drawing.FontStyle]::Bold) + # Font styles are: Regular, Bold, Italic, Underline, Strikeout + $FrameNumberLabel.Font = $Font + $FrameNumberLabel.Location = New-Object System.Drawing.Size(170,310) + $FrameNumberLabel.Size = New-Object System.Drawing.Size(53,18) + $FrameNumberLabel.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $FrameNumberLabel.Text = "Frame:" + $FrameNumberLabel.TabStop = $false + + + $FrameNumberNumberBox = New-Object System.Windows.Forms.NumericUpDown + $FrameNumberNumberBox.Location = New-Object Drawing.Size(226,310) + $FrameNumberNumberBox.Size = New-Object Drawing.Size(45,24) + $FrameNumberNumberBox.Minimum = 0 + $FrameNumberNumberBox.Maximum = $ImageArray.length - 1 + $FrameNumberNumberBox.Increment = 1 + $FrameNumberNumberBox.Value = 0 + $FrameNumberNumberBox.TabIndex = 18 + + $FrameNumberNumberBox.Add_ValueChanged({ + + $script:currentImage = $FrameNumberNumberBox.Value + + Update-AnimationScreen + + }) + + #FrameNumberLabel ============================================================ + $FrameNumberEndNumberLabel = New-Object System.Windows.Forms.Label + $Font = New-Object System.Drawing.Font("Arial",10,[System.Drawing.FontStyle]::Bold) + # Font styles are: Regular, Bold, Italic, Underline, Strikeout + $FrameNumberEndNumberLabel.Font = $Font + $FrameNumberEndNumberLabel.Location = New-Object System.Drawing.Size(280,310) + $FrameNumberEndNumberLabel.Size = New-Object System.Drawing.Size(60,18) + $FrameNumberEndNumberLabel.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $arrayLength = $ImageArray.length - 1 + $FrameNumberEndNumberLabel.Text = "/ $arrayLength" + $FrameNumberEndNumberLabel.TabStop = $false + + + #StartFrameLabel ============================================================ + $StartFrameImageLabel = New-Object System.Windows.Forms.Label + $Font = New-Object System.Drawing.Font("Arial",10,[System.Drawing.FontStyle]::Bold) + # Font styles are: Regular, Bold, Italic, Underline, Strikeout + $StartFrameImageLabel.Font = $Font + $StartFrameImageLabel.Location = New-Object System.Drawing.Size(20,340) + $StartFrameImageLabel.Size = New-Object System.Drawing.Size(90,18) + $StartFrameImageLabel.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $StartFrameImageLabel.Text = "Start Frame:" + $StartFrameImageLabel.TabStop = $false + + + $StartFrameImageNumberBox = New-Object System.Windows.Forms.NumericUpDown + $StartFrameImageNumberBox.Location = New-Object Drawing.Size(110,340) + $StartFrameImageNumberBox.Size = New-Object Drawing.Size(45,24) + $StartFrameImageNumberBox.Minimum = 0 + $StartFrameImageNumberBox.Maximum = $ImageArray.length - 1 + $StartFrameImageNumberBox.Increment = 1 + $StartFrameImageNumberBox.Value = 0 + $StartFrameImageNumberBox.TabIndex = 19 + + $StartFrameImageNumberBox.Add_ValueChanged({ + + if($StartFrameImageNumberBox.Value -ge $EndFrameImageNumberBox.Value) + { + $StartFrameImageNumberBox.Value = $StartFrameImageNumberBox.Value - 1 + } + }) + + + #EndFrameLabel ============================================================ + $EndFrameImageLabel = New-Object System.Windows.Forms.Label + $Font = New-Object System.Drawing.Font("Arial",10,[System.Drawing.FontStyle]::Bold) + # Font styles are: Regular, Bold, Italic, Underline, Strikeout + $EndFrameImageLabel.Font = $Font + $EndFrameImageLabel.Location = New-Object System.Drawing.Size(160,340) + $EndFrameImageLabel.Size = New-Object System.Drawing.Size(90,18) + $EndFrameImageLabel.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $EndFrameImageLabel.Text = "End Frame:" + $EndFrameImageLabel.TabStop = $false + + + $EndFrameImageNumberBox = New-Object System.Windows.Forms.NumericUpDown + $EndFrameImageNumberBox.Location = New-Object Drawing.Size(250,340) + $EndFrameImageNumberBox.Size = New-Object Drawing.Size(45,24) + $EndFrameImageNumberBox.Minimum = 0 + $EndFrameImageNumberBox.Maximum = $ImageArray.length - 1 + $EndFrameImageNumberBox.Increment = 1 + $EndFrameImageNumberBox.Value = $ImageArray.length - 1 + $EndFrameImageNumberBox.TabIndex = 20 + + + $EndFrameImageNumberBox.Add_ValueChanged({ + + if($EndFrameImageNumberBox.Value -le $StartFrameImageNumberBox.Value) + { + $EndFrameImageNumberBox.Value = $EndFrameImageNumberBox.Value + 1 + } + }) + + + #ImageSizeLabel ============================================================ + $ImageSizeLabel = New-Object System.Windows.Forms.Label + $Font = New-Object System.Drawing.Font("Arial",10,[System.Drawing.FontStyle]::Bold) + # Font styles are: Regular, Bold, Italic, Underline, Strikeout + $ImageSizeLabel.Font = $Font + $ImageSizeLabel.Location = New-Object System.Drawing.Size(20,365) + $ImageSizeLabel.Size = New-Object System.Drawing.Size(90,18) + $ImageSizeLabel.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $ImageSizeLabel.Text = "Image Size:" + $ImageSizeLabel.TabStop = $false + + + $ImageHeightTextBox = New-Object System.Windows.Forms.NumericUpDown + $ImageHeightTextBox.Location = New-Object Drawing.Size(110,365) + $ImageHeightTextBox.Size = New-Object Drawing.Size(50,23) + $ImageHeightTextBox.Minimum = 0 + $ImageHeightTextBox.Maximum = 5000 + $ImageHeightTextBox.Increment = 1 + $ImageHeightTextBox.Value = $imgSize.Height -as [int] + $ImageHeightTextBox.TabIndex = 21 + + + $ImageHeightTextBox.Add_ValueChanged({ + + [int]$imageHeight = $ImageHeightTextBox.Value + $SizeMult = $imageHeight / $imgSize.Height + $ImageWidthTextBox.text = ($imgSize.Width * $SizeMult) -as [int] + + }) + + + #ImageSizeXLabel ============================================================ + $ImageSizeXLabel = New-Object System.Windows.Forms.Label + $Font = New-Object System.Drawing.Font("Arial",10,[System.Drawing.FontStyle]::Bold) + # Font styles are: Regular, Bold, Italic, Underline, Strikeout + $ImageSizeXLabel.Font = $Font + $ImageSizeXLabel.Location = New-Object System.Drawing.Size(167,365) + $ImageSizeXLabel.Size = New-Object System.Drawing.Size(9,18) + $ImageSizeXLabel.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $ImageSizeXLabel.Text = "x" + $ImageSizeXLabel.TabStop = $false + + #WidthWidth Text box ============================================================ + $ImageWidthTextBox = new-object System.Windows.Forms.textbox + $ImageWidthTextBox.location = new-object system.drawing.size(185,365) + $ImageWidthTextBox.size = new-object system.drawing.size(50,23) + $ImageWidthTextBox.text = "" + $ImageWidthTextBox.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $ImageWidthTextBox.tabIndex = 22 + $ImageWidthTextBox.Enabled = $false + + + $imgSize = $ImageArray[0] + if($imgSize -ne $null) + { + $ImageHeightTextBox.text = $imgSize.Height + $ImageWidthTextBox.text = $imgSize.Width + } + + #ResetSizeButton ============================================================ + $ResetSizeButton = New-Object System.Windows.Forms.Button + $ResetSizeButton.Location = New-Object System.Drawing.Size(245,365) + $ResetSizeButton.Size = New-Object System.Drawing.Size(70,18) + $ResetSizeButton.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $ResetSizeButton.Text = "Reset Size" + $ResetSizeButton.TabIndex = 23 + $ResetSizeButton.Add_Click( + { + $imgSize = $ImageArray[0] + if($imgSize -ne $null) + { + $ImageHeightTextBox.Value = $imgSize.Height + #$ImageWidthTextBox.text = $imgSize.Width + } + + }) + + + #InfiniteLoopsLabel ============================================================ + $InfiniteLoopsLabel = New-Object System.Windows.Forms.Label + $Font = New-Object System.Drawing.Font("Arial",10,[System.Drawing.FontStyle]::Bold) + # Font styles are: Regular, Bold, Italic, Underline, Strikeout + $InfiniteLoopsLabel.Font = $Font + $InfiniteLoopsLabel.Location = New-Object System.Drawing.Size(20,390) + $InfiniteLoopsLabel.Size = New-Object System.Drawing.Size(95,18) + $InfiniteLoopsLabel.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left + $InfiniteLoopsLabel.Text = "Infinite Loop:" + $InfiniteLoopsLabel.TabStop = $false + + # InfiniteLoopsCheckBox ============================================================ + $InfiniteLoopsCheckBox = New-Object System.Windows.Forms.Checkbox + $InfiniteLoopsCheckBox.Location = New-Object System.Drawing.Size(120,390) + $InfiniteLoopsCheckBox.Size = New-Object System.Drawing.Size(20,20) + $InfiniteLoopsCheckBox.Checked = $true + $InfiniteLoopsCheckBox.TabIndex = 24 + + + # ExportGIFButton button. + $ExportGIFButton = New-Object System.Windows.Forms.Button + $ExportGIFButton.Location = New-Object System.Drawing.Size(350,385) + $ExportGIFButton.Size = New-Object System.Drawing.Size(90,25) + $ExportGIFButton.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left + $ExportGIFButton.Text = "Export GIF" + $ExportGIFButton.tabIndex = 25 + $ExportGIFButton.Add_Click({ + + #Process the array + $loopNo = 0 + $FinalImageArray = @() + foreach($img in $ImageArray) + { + $StartFrameImageSetting = $StartFrameImageNumberBox.Value + $EndFrameImageSetting = $EndFrameImageNumberBox.Value + if($loopNo -ge $StartFrameImageSetting -and $loopNo -le $EndFrameImageSetting) + { + $imgForGraph = New-Object System.Drawing.Bitmap($img.Width, $img.Height) + [System.Drawing.Graphics] $graph = [System.Drawing.Graphics]::FromImage($imgForGraph) #Converting image to stop indexed image error on GIFs + $graph.DrawImage($img, 0, 0) + + + foreach ($item in $lv.Items) + { + [int]$lineThickness = $img.Height / 200 + + $startFrame = $item.Text -as [int] + $endFrame = $item.SubItems[1].Text -as [int] + $shape = $item.SubItems[2].Text + $colour = $item.SubItems[3].Text + $1 = $item.SubItems[4].Text -as [int] + $2 = $item.SubItems[5].Text -as [int] + $3 = $item.SubItems[6].Text -as [int] + $4 = $item.SubItems[7].Text -as [int] + + if($loopNo -ge $startFrame -and $loopNo -le $endFrame) + { + #Write-Host "INFO: Found shape to render - $colour,$1,$2,$3,$4" -foreground yellow + + if($colour -eq "Green") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Green, $lineThickness) + } + elseif($colour -eq "Purple") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Purple, $lineThickness) + } + elseif($colour -eq "Blue") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Blue, $lineThickness) + } + elseif($colour -eq "Orange") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Orange, $lineThickness) + } + elseif($colour -eq "Pink") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Pink, $lineThickness) + } + elseif($colour -eq "Yellow") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Yellow, $lineThickness) + } + elseif($colour -eq "White") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::White, $lineThickness) + } + elseif($colour -eq "Maroon") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Maroon, $lineThickness) + } + elseif($colour -eq "Black") + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Black, $lineThickness) + } + else + { + [System.Drawing.Pen] $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Red, $lineThickness) + } + + if($shape -eq "Circle") + { + $graph.DrawEllipse($pen,$1, $2, $3, $4) + } + else + { + $graph.DrawRectangle($pen,$1, $2, $3, $4) + } + } + } + + $graph.Dispose() + + $ImageHeightSetting = $ImageHeightTextBox.Value -as [int] + if($imgForGraph.Height -ne $ImageHeightSetting) + { + Write-Host "INFO: Resizing image." -foreground yellow + $imgForGraph = ResizeImageHeightRetainRatio -img $imgForGraph -heightInPixels $ImageHeightSetting + } + + $FinalImageArray += $imgForGraph + } + else + { + Write-Host "INFO: Ignoring frame $loopNo as it's outside of the start/end bounds." -foreground yellow + } + $loopNo++ + } + + if($FinalImageArray -eq $null) + { + Write-Host "INFO: Canceled Dialog - Image array equals null" -foreground "yellow" + } + else + { + try { + + $fileDialog = New-Object System.Windows.Forms.SaveFileDialog + $fileDialog.FileName = "AnimatedScreenShot.gif" + $fileDialog.Title = "Save Animated GIF" + $fileDialog.Filter = "GIF (*.gif)|*.*" + $fileDialog.CheckFileExists = $false + $Show = $fileDialog.ShowDialog() + if ($Show -eq "OK") + { + [string]$filename = $fileDialog.FileName + + #Write-Host 'INFO: Creating GifWriter object' -foreground yellow + + $infiniteloops = $InfiniteLoopsCheckBox.Checked + $fileLocation = $filename + $GifWriterObject = Import-GifWriter -FileLocation $fileLocation -InfiniteLoops $infiniteloops + + foreach ($img in $FinalImageArray) + { + Write-Host "INFO: Adding image to GIF." -foreground yellow + $GifWriterObject.WriteFrame([System.Drawing.Image]$img) + $img = $null + } + + $GifWriterObject.Dispose() + $FinalImageArray = @() + Write-Output $True + } + } + catch { + Write-Host $Error[0] -foreground red + exit -1 + } + } + + }) + + + # Create the Cancel button. + $CancelButton = New-Object System.Windows.Forms.Button + $CancelButton.Location = New-Object System.Drawing.Size(450,385) + $CancelButton.Size = New-Object System.Drawing.Size(90,25) + $CancelButton.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left + $CancelButton.Text = "Close" + $CancelButton.tabIndex = 26 + $CancelButton.Add_Click({ + Write-Host "INFO: Canceled dialog" -foreground "yellow" + $form.Tag = $null + $form.Close() + + }) + + # Create the form. + $form = New-Object System.Windows.Forms.Form + $form.Text = "GIF Editing Studio" + $form.Size = New-Object System.Drawing.Size(880,465) + $form.FormBorderStyle = 'FixedSingle' + $form.StartPosition = "CenterScreen" + $form.AutoSizeMode = 'GrowAndShrink' + [byte[]]$WindowIcon = @(71, 73, 70, 56, 57, 97, 32, 0, 32, 0, 231, 137, 0, 0, 52, 93, 0, 52, 94, 0, 52, 95, 0, 53, 93, 0, 53, 94, 0, 53, 95, 0,53, 96, 0, 54, 94, 0, 54, 95, 0, 54, 96, 2, 54, 95, 0, 55, 95, 1, 55, 96, 1, 55, 97, 6, 55, 96, 3, 56, 98, 7, 55, 96, 8, 55, 97, 9, 56, 102, 15, 57, 98, 17, 58, 98, 27, 61, 99, 27, 61, 100, 24, 61, 116, 32, 63, 100, 36, 65, 102, 37, 66, 103, 41, 68, 104, 48, 72, 106, 52, 75, 108, 55, 77, 108, 57, 78, 109, 58, 79, 111, 59, 79, 110, 64, 83, 114, 65, 83, 114, 68, 85, 116, 69, 86, 117, 71, 88, 116, 75, 91, 120, 81, 95, 123, 86, 99, 126, 88, 101, 125, 89, 102, 126, 90, 103, 129, 92, 103, 130, 95, 107, 132, 97, 108, 132, 99, 110, 134, 100, 111, 135, 102, 113, 136, 104, 114, 137, 106, 116, 137, 106,116, 139, 107, 116, 139, 110, 119, 139, 112, 121, 143, 116, 124, 145, 120, 128, 147, 121, 129, 148, 124, 132, 150, 125,133, 151, 126, 134, 152, 127, 134, 152, 128, 135, 152, 130, 137, 154, 131, 138, 155, 133, 140, 157, 134, 141, 158, 135,141, 158, 140, 146, 161, 143, 149, 164, 147, 152, 167, 148, 153, 168, 151, 156, 171, 153, 158, 172, 153, 158, 173, 156,160, 174, 156, 161, 174, 158, 163, 176, 159, 163, 176, 160, 165, 177, 163, 167, 180, 166, 170, 182, 170, 174, 186, 171,175, 186, 173, 176, 187, 173, 177, 187, 174, 178, 189, 176, 180, 190, 177, 181, 191, 179, 182, 192, 180, 183, 193, 182,185, 196, 185, 188, 197, 188, 191, 200, 190, 193, 201, 193, 195, 203, 193, 196, 204, 196, 198, 206, 196, 199, 207, 197,200, 207, 197, 200, 208, 198, 200, 208, 199, 201, 208, 199, 201, 209, 200, 202, 209, 200, 202, 210, 202, 204, 212, 204,206, 214, 206, 208, 215, 206, 208, 216, 208, 210, 218, 209, 210, 217, 209, 210, 220, 209, 211, 218, 210, 211, 219, 210,211, 220, 210, 212, 219, 211, 212, 219, 211, 212, 220, 212, 213, 221, 214, 215, 223, 215, 216, 223, 215, 216, 224, 216,217, 224, 217, 218, 225, 218, 219, 226, 218, 220, 226, 219, 220, 226, 219, 220, 227, 220, 221, 227, 221, 223, 228, 224,225, 231, 228, 229, 234, 230, 231, 235, 251, 251, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 33, 254, 17, 67, 114, 101, 97, 116, 101, 100, 32, 119, 105, 116, 104, 32, 71, 73, 77, 80, 0, 33, 249, 4, 1, 10, 0, 255, 0, 44, 0, 0, 0, 0, 32, 0, 32, 0, 0, 8, 254, 0, 255, 29, 24, 72, 176, 160, 193, 131, 8, 25, 60, 16, 120, 192, 195, 10, 132, 16, 35, 170, 248, 112, 160, 193, 64, 30, 135, 4, 68, 220, 72, 16, 128, 33, 32, 7, 22, 92, 68, 84, 132, 35, 71, 33, 136, 64, 18, 228, 81, 135, 206, 0, 147, 16, 7, 192, 145, 163, 242, 226, 26, 52, 53, 96, 34, 148, 161, 230, 76, 205, 3, 60, 214, 204, 72, 163, 243, 160, 25, 27, 62, 11, 6, 61, 96, 231, 68, 81, 130, 38, 240, 28, 72, 186, 114, 205, 129, 33, 94, 158, 14, 236, 66, 100, 234, 207, 165, 14, 254, 108, 120, 170, 193, 15, 4, 175, 74, 173, 30, 120, 50, 229, 169, 20, 40, 3, 169, 218, 28, 152, 33, 80, 2, 157, 6, 252, 100, 136, 251, 85, 237, 1, 46, 71,116, 26, 225, 66, 80, 46, 80, 191, 37, 244, 0, 48, 57, 32, 15, 137, 194, 125, 11, 150, 201, 97, 18, 7, 153, 130, 134, 151, 18, 140, 209, 198, 36, 27, 24, 152, 35, 23, 188, 147, 98, 35, 138, 56, 6, 51, 251, 29, 24, 4, 204, 198, 47, 63, 82, 139, 38, 168, 64, 80, 7, 136, 28, 250, 32, 144, 157, 246, 96, 19, 43, 16, 169, 44, 57, 168, 250, 32, 6, 66, 19, 14, 70, 248, 99, 129, 248, 236, 130, 90, 148, 28, 76, 130, 5, 97, 241, 131, 35, 254, 4, 40, 8, 128, 15, 8, 235, 207, 11, 88, 142, 233, 81, 112, 71, 24, 136, 215, 15, 190, 152, 67, 128, 224, 27, 22, 232, 195, 23, 180, 227, 98, 96, 11, 55, 17, 211, 31, 244, 49, 102, 160, 24, 29, 249, 201, 71, 80, 1, 131, 136, 16, 194, 30, 237, 197, 215, 91, 68, 76, 108, 145, 5, 18, 27, 233, 119, 80, 5, 133, 0, 66, 65, 132, 32, 73, 48, 16, 13, 87, 112, 20, 133, 19, 28, 85, 113, 195, 1, 23, 48, 164, 85, 68, 18, 148, 24, 16, 0, 59) + + $ico = New-Object IO.MemoryStream($WindowIcon, 0, $WindowIcon.Length) + $form.Icon = [System.Drawing.Icon]::FromHandle((new-object System.Drawing.Bitmap -argument $ico).GetHIcon()) + #$form.Topmost = $True + #$form.AcceptButton = $okButton + $form.ShowInTaskbar = $true + #$form.MinimizeBox = $False + $form.Tag = $null + + $form.Controls.Add($okButton) + $form.Controls.Add($CancelButton) + $form.Controls.Add($DrawShapesLabel) + $form.Controls.Add($PictureBox) + $form.Controls.Add($ShapeLabel) + $form.Controls.Add($ShapeDropDownBox) + $form.Controls.Add($ColourLabel) + $form.Controls.Add($ColourDropDownBox) + $form.Controls.Add($RightManualButton) + $form.Controls.Add($LeftManualButton) + $form.Controls.Add($FrameNumberLabel) + $form.Controls.Add($FrameNumberNumberBox) + $form.Controls.Add($FrameNumberEndNumberLabel) + $form.Controls.Add($lv) + $form.Controls.Add($EditShapeButton) + $form.Controls.Add($DeleteShapeButton) + $form.Controls.Add($StartFrameTextBox) + $form.Controls.Add($EndFrameTextBox) + $form.Controls.Add($ShapeTextBox) + $form.Controls.Add($ColourTextBox) + $form.Controls.Add($StartXTextBox) + $form.Controls.Add($StartYTextBox) + $form.Controls.Add($WidthTextBox) + $form.Controls.Add($HeightTextBox) + $form.Controls.Add($MarkupShapeLabel) + $form.Controls.Add($ImageSizeLabel) + $form.Controls.Add($ImageHeightTextBox) + $form.Controls.Add($ImageWidthTextBox) + $form.Controls.Add($ImageSizeXLabel) + $form.Controls.Add($StartFrameImageLabel) + $form.Controls.Add($StartFrameImageNumberBox) + $form.Controls.Add($EndFrameImageLabel) + $form.Controls.Add($EndFrameImageNumberBox) + $form.Controls.Add($ExportGIFButton) + $form.Controls.Add($ResetSizeButton) + $form.Controls.Add($InfiniteLoopsLabel) + $form.Controls.Add($InfiniteLoopsCheckBox) + + + # Initialize and show the form. + $form.Add_Shown({$form.Activate()}) + $form.ShowDialog() > $null # Trash the text of the button that was clicked. + +} + +function ResizeImageHeightRetainRatio([System.Drawing.Image] $img, [int] $heightInPixels) +{ + Write-Host "INFO: Resizing image to height: $heightInPixels" -foreground yellow + $imgWidth = $img.Width + $imgHeight = $img.Height + $ratio = $heightInPixels / $imgHeight + [int] $widthInPixels = $imgWidth*$ratio + $imgResized = New-Object System.Drawing.Bitmap([int]($imgWidth*$ratio), $heightInPixels) + $graph = [System.Drawing.Graphics]::FromImage($imgResized) + + $graph.Clear([System.Drawing.Color]::White) + $rectangle = New-Object System.Drawing.Rectangle(0, 0, $widthInPixels, $heightInPixels) + + $graph.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic + $graph.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::HighQuality + $graph.CompositingQuality = [System.Drawing.Drawing2D.CompositingQuality]::HighQuality + $graph.PixelOffsetMode = [System.Drawing.Drawing2D.PixelOffsetMode]::HighQuality + $graph.DrawImage($img,$rectangle, 0,0, $imgWidth, $imgHeight, [System.Drawing.GraphicsUnit]::Pixel) + + $img.Dispose() + return $imgResized +} + +function SaveImageFile([System.Drawing.Image] $bmp) +{ + + Write-Host "Saving Image..." -foreground "yellow" + #File Dialog + $objFileForm = New-Object System.Windows.Forms.SaveFileDialog + $objFileForm.FileName = "ScreenShot.jpg" + $objFileForm.Title = "Save Image" + $objFileForm.Filter = "JPG (*.jpg)|*.*" + $objFileForm.CheckFileExists = $false + $Show = $objFileForm.ShowDialog() + if ($Show -eq "OK") + { + [string]$imageTarget = $objFileForm.FileName + + Write-Host "Output File: $imageTarget" -foreground "green" + [int]$quality = 95 + + #Encoder parameter for image quality + $myEncoder = [System.Drawing.Imaging.Encoder]::Quality + $encoderParams = New-Object System.Drawing.Imaging.EncoderParameters(1) + $encoderParams.Param[0] = New-Object System.Drawing.Imaging.EncoderParameter($myEncoder, $quality) + # get codec + $myImageCodecInfo = [System.Drawing.Imaging.ImageCodecInfo]::GetImageEncoders()|where {$_.MimeType -eq 'image/jpeg'} + + #save to file + $bmp.Save($imageTarget,$myImageCodecInfo, $($encoderParams)) + $bmp.Dispose() + + } + else + { + Write-Host "INFO: Canceled save image dialog..." -foreground "Yellow" + return + } +} + + +function Import-GifWriter { + Param ( + [parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] + [ValidateNotNullOrEmpty()] + [string] $FileLocation, + [bool] $InfiniteLoops = $true + ) + +#https://stackoverflow.com/questions/1196322/how-to-create-an-animated-gif-in-net + $GifWriter = @' +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Threading.Tasks; + +/// +/// Creates a GIF using .Net GIF encoding and additional animation headers. +/// + +public class GifWriter +{ + #region Fields + const long SourceGlobalColorInfoPosition = 10, SourceImageBlockPosition = 789; + + readonly BinaryWriter _writer; + bool _firstFrame = true; + readonly object _syncLock = new object(); + #endregion + + /// + /// Creates a new instance of GifWriter. + /// + /// The to output the Gif to. + /// Default Delay between consecutive frames... FrameRate = 1000 / DefaultFrameDelay. + /// No of times the Gif should repeat... -1 to repeat indefinitely. + public GifWriter(Stream OutStream, int DefaultFrameDelay = 500, int Repeat = -1) + { + if (OutStream == null) + throw new ArgumentNullException("OutStream"); + + if (DefaultFrameDelay <= 0) + throw new ArgumentOutOfRangeException("DefaultFrameDelay"); + + if (Repeat < -1) + throw new ArgumentOutOfRangeException("Repeat"); + + _writer = new BinaryWriter(OutStream); + this.DefaultFrameDelay = DefaultFrameDelay; + this.Repeat = Repeat; + } + + /// + /// Creates a new instance of GifWriter. + /// + /// The path to the file to output the Gif to. + /// Default Delay between consecutive frames... FrameRate = 1000 / DefaultFrameDelay. + /// No of times the Gif should repeat... -1 to repeat indefinitely. + public GifWriter(string FileName, int DefaultFrameDelay = 500, int Repeat = -1) + : this(new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read), DefaultFrameDelay, Repeat) { } + + #region Properties + /// + /// Gets or Sets the Default Width of a Frame. Used when unspecified. + /// + public int DefaultWidth { get; set; } + + /// + /// Gets or Sets the Default Height of a Frame. Used when unspecified. + /// + public int DefaultHeight { get; set; } + + /// + /// Gets or Sets the Default Delay in Milliseconds. + /// + public int DefaultFrameDelay { get; set; } + + /// + /// The Number of Times the Animation must repeat. + /// -1 indicates no repeat. 0 indicates repeat indefinitely + /// + public int Repeat { get; set; } + #endregion + + /// + /// Adds a frame to this animation. + /// + /// The image to add + /// Delay in Milliseconds between this and last frame... 0 = + public void WriteFrame(Image Image, int Delay = 0) + { + lock (_syncLock) + using (var gifStream = new MemoryStream()) + { + Image.Save(gifStream, ImageFormat.Gif); + + // Steal the global color table info + if (_firstFrame) + InitHeader(gifStream, _writer, Image.Width, Image.Height); + + WriteGraphicControlBlock(gifStream, _writer, Delay == 0 ? DefaultFrameDelay : Delay); + WriteImageBlock(gifStream, _writer, !_firstFrame, 0, 0, Image.Width, Image.Height); + } + + if (_firstFrame) + _firstFrame = false; + } + + #region Write + void InitHeader(Stream SourceGif, BinaryWriter Writer, int Width, int Height) + { + // File Header + Writer.Write("GIF".ToCharArray()); // File type + Writer.Write("89a".ToCharArray()); // File Version + + Writer.Write((short)(DefaultWidth == 0 ? Width : DefaultWidth)); // Initial Logical Width + Writer.Write((short)(DefaultHeight == 0 ? Height : DefaultHeight)); // Initial Logical Height + + SourceGif.Position = SourceGlobalColorInfoPosition; + Writer.Write((byte)SourceGif.ReadByte()); // Global Color Table Info + Writer.Write((byte)0); // Background Color Index + Writer.Write((byte)0); // Pixel aspect ratio + WriteColorTable(SourceGif, Writer); + + // App Extension Header for Repeating + if (Repeat == -1) + return; + + Writer.Write(unchecked((short)0xff21)); // Application Extension Block Identifier + Writer.Write((byte)0x0b); // Application Block Size + Writer.Write("NETSCAPE2.0".ToCharArray()); // Application Identifier + Writer.Write((byte)3); // Application block length + Writer.Write((byte)1); + Writer.Write((short)Repeat); // Repeat count for images. + Writer.Write((byte)0); // terminator + } + + static void WriteColorTable(Stream SourceGif, BinaryWriter Writer) + { + SourceGif.Position = 13; // Locating the image color table + var colorTable = new byte[768]; + SourceGif.Read(colorTable, 0, colorTable.Length); + Writer.Write(colorTable, 0, colorTable.Length); + } + + static void WriteGraphicControlBlock(Stream SourceGif, BinaryWriter Writer, int FrameDelay) + { + SourceGif.Position = 781; // Locating the source GCE + var blockhead = new byte[8]; + SourceGif.Read(blockhead, 0, blockhead.Length); // Reading source GCE + + Writer.Write(unchecked((short)0xf921)); // Identifier + Writer.Write((byte)0x04); // Block Size + Writer.Write((byte)(blockhead[3] & 0xf7 | 0x08)); // Setting disposal flag + Writer.Write((short)(FrameDelay / 10)); // Setting frame delay + Writer.Write(blockhead[6]); // Transparent color index + Writer.Write((byte)0); // Terminator + } + + static void WriteImageBlock(Stream SourceGif, BinaryWriter Writer, bool IncludeColorTable, int X, int Y, int Width, int Height) + { + SourceGif.Position = SourceImageBlockPosition; // Locating the image block + var header = new byte[11]; + SourceGif.Read(header, 0, header.Length); + Writer.Write(header[0]); // Separator + Writer.Write((short)X); // Position X + Writer.Write((short)Y); // Position Y + Writer.Write((short)Width); // Width + Writer.Write((short)Height); // Height + + if (IncludeColorTable) // If first frame, use global color table - else use local + { + SourceGif.Position = SourceGlobalColorInfoPosition; + Writer.Write((byte)(SourceGif.ReadByte() & 0x3f | 0x80)); // Enabling local color table + WriteColorTable(SourceGif, Writer); + } + else Writer.Write((byte)(header[9] & 0x07 | 0x07)); // Disabling local color table + + Writer.Write(header[10]); // LZW Min Code Size + + // Read/Write image data + SourceGif.Position = SourceImageBlockPosition + header.Length; + + var dataLength = SourceGif.ReadByte(); + while (dataLength > 0) + { + var imgData = new byte[dataLength]; + SourceGif.Read(imgData, 0, dataLength); + + Writer.Write((byte)dataLength); + Writer.Write(imgData, 0, dataLength); + dataLength = SourceGif.ReadByte(); + } + + Writer.Write((byte)0); // Terminator + } + #endregion + + /// + /// Frees all resources used by this object. + /// + public void Dispose() + { + // Complete File + _writer.Write((byte)0x3b); // File Trailer + + _writer.BaseStream.Dispose(); + _writer.Dispose(); + } +} +'@ + + Write-Host 'INFO: Adding GifWriter Class Assembly' -foreground yellow + try { + Add-Type $GifWriter -ReferencedAssemblies 'System.Windows.Forms', 'System.Drawing' + + Write-Host "INFO: Saving GIF to file location: $FileLocation" -foreground green + if($InfiniteLoops) + { + $GifWriterObject = [GifWriter]::new($FileLocation,500,0) + } + else + { + $GifWriterObject = [GifWriter]::new($FileLocation,500,-1) + } + + Write-Host 'INFO: Returning GifWriter object' -foreground yellow + + Write-Output $GifWriterObject + } + catch { + Write-Host $Error[0] -foreground red + } +} + +# Activate the form ============================================================ +$objForm.Add_Shown({$objForm.Activate()}) +[void] $objForm.ShowDialog() + + +# SIG # Begin signature block +# MIIcfQYJKoZIhvcNAQcCoIIcbjCCHGoCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB +# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR +# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUQ7/TgULDERKvYFRMkkbdSd/O +# EYigghesMIIFMDCCBBigAwIBAgIQBAkYG1/Vu2Z1U0O1b5VQCDANBgkqhkiG9w0B +# AQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD +# VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVk +# IElEIFJvb3QgQ0EwHhcNMTMxMDIyMTIwMDAwWhcNMjgxMDIyMTIwMDAwWjByMQsw +# CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +# ZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQg +# Q29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +# +NOzHH8OEa9ndwfTCzFJGc/Q+0WZsTrbRPV/5aid2zLXcep2nQUut4/6kkPApfmJ +# 1DcZ17aq8JyGpdglrA55KDp+6dFn08b7KSfH03sjlOSRI5aQd4L5oYQjZhJUM1B0 +# sSgmuyRpwsJS8hRniolF1C2ho+mILCCVrhxKhwjfDPXiTWAYvqrEsq5wMWYzcT6s +# cKKrzn/pfMuSoeU7MRzP6vIK5Fe7SrXpdOYr/mzLfnQ5Ng2Q7+S1TqSp6moKq4Tz +# rGdOtcT3jNEgJSPrCGQ+UpbB8g8S9MWOD8Gi6CxR93O8vYWxYoNzQYIH5DiLanMg +# 0A9kczyen6Yzqf0Z3yWT0QIDAQABo4IBzTCCAckwEgYDVR0TAQH/BAgwBgEB/wIB +# ADAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwMweQYIKwYBBQUH +# AQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYI +# KwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFz +# c3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgwOqA4oDaGNGh0dHA6Ly9jcmw0 +# LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwOqA4oDaG +# NGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RD +# QS5jcmwwTwYDVR0gBEgwRjA4BgpghkgBhv1sAAIEMCowKAYIKwYBBQUHAgEWHGh0 +# dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCgYIYIZIAYb9bAMwHQYDVR0OBBYE +# FFrEuXsqCqOl6nEDwGD5LfZldQ5YMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6en +# IZ3zbcgPMA0GCSqGSIb3DQEBCwUAA4IBAQA+7A1aJLPzItEVyCx8JSl2qB1dHC06 +# GsTvMGHXfgtg/cM9D8Svi/3vKt8gVTew4fbRknUPUbRupY5a4l4kgU4QpO4/cY5j +# DhNLrddfRHnzNhQGivecRk5c/5CxGwcOkRX7uq+1UcKNJK4kxscnKqEpKBo6cSgC +# PC6Ro8AlEeKcFEehemhor5unXCBc2XGxDI+7qPjFEmifz0DLQESlE/DmZAwlCEIy +# sjaKJAL+L3J+HNdJRZboWR3p+nRka7LrZkPas7CM1ekN3fYBIM6ZMWM9CBoYs4Gb +# T8aTEAb8B4H6i9r5gkn3Ym6hU/oSlBiFLpKR6mhsRDKyZqHnGKSaZFHvMIIFNTCC +# BB2gAwIBAgIQCjSHIb+9FkHaGapmaAdBYDANBgkqhkiG9w0BAQsFADByMQswCQYD +# VQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGln +# aWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgQ29k +# ZSBTaWduaW5nIENBMB4XDTIwMDEwNjAwMDAwMFoXDTIzMDExMDEyMDAwMFowcjEL +# MAkGA1UEBhMCQVUxDDAKBgNVBAgTA1ZJQzEQMA4GA1UEBxMHTWl0Y2hhbTEVMBMG +# A1UEChMMSmFtZXMgQ3Vzc2VuMRUwEwYDVQQLEwxKYW1lcyBDdXNzZW4xFTATBgNV +# BAMTDEphbWVzIEN1c3NlbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +# AM3q0UPJQVPnA/Y1s0Fe4trGhjc16182jZBFJFHWW3pueKrpZaRkMKegW9IcxBbD +# yGj0ne/epCL70AnW9lulTPc6eWcWY/HSIed/X6K9jVuwL/JI4/qqavoHg+wRloS1 +# ynTEXX3VWYH/YYFovhTr/myR6eTAiovaTVhIvJoL2kWXdhbhie/kZWKWIRmpmDcP +# Smld9v0/bdjJu2/QLNY5bLPv2Y2vibG+UaQxX4Ul+XihtRcvE9EJ2hLyZtC469ig +# 9hPQAJgfemWpTbsIaj6HIhFH5U1Mq5kpWMPR8RWenFl7x4nXF5xVvXsR6WrFwtmo +# MMWM2LPhaqGy+nA8NufJInUCAwEAAaOCAcUwggHBMB8GA1UdIwQYMBaAFFrEuXsq +# CqOl6nEDwGD5LfZldQ5YMB0GA1UdDgQWBBT+fAtBa1j45lF9yIVym7Yzj/FB0DAO +# BgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwdwYDVR0fBHAwbjA1 +# oDOgMYYvaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC1jcy1n +# MS5jcmwwNaAzoDGGL2h0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEyLWFzc3Vy +# ZWQtY3MtZzEuY3JsMEwGA1UdIARFMEMwNwYJYIZIAYb9bAMBMCowKAYIKwYBBQUH +# AgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCAYGZ4EMAQQBMIGEBggr +# BgEFBQcBAQR4MHYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNv +# bTBOBggrBgEFBQcwAoZCaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lD +# ZXJ0U0hBMkFzc3VyZWRJRENvZGVTaWduaW5nQ0EuY3J0MAwGA1UdEwEB/wQCMAAw +# DQYJKoZIhvcNAQELBQADggEBAHwUySCXpI9ILpmOBI+3G0hy52zIdIaw16wGlMRW +# nSyYCjApfDdGDrkf+VcOL6Ar4Frhb9XVTp7O5Wc7v2PU/5D6jacVc8Szuo2Qzd8x +# D5qbdhNZ6npS9wXQRdHhCvIvJhJKxXYvEIE9VYao3kTgiylJvDfdvMDN4gRIx/aR +# ckJQQzRxYIhbfR/zV4RSeSHwvMg827e2v/YVcLXFjFsoMb0ioy+qQkwFwVz1mo4l +# PnXXFelUbN0LkWLHsdAxqwATNQHA150SmTpS7tm4Ye2m23lgVlwgGgR2JghWz6bK +# VI+nm+UfACOdvpXnjBIIDyMNUl9tRx4eo6xyxfUSVASQ3kswggZqMIIFUqADAgEC +# AhADAZoCOv9YsWvW1ermF/BmMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNVBAYTAlVT +# MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +# b20xITAfBgNVBAMTGERpZ2lDZXJ0IEFzc3VyZWQgSUQgQ0EtMTAeFw0xNDEwMjIw +# MDAwMDBaFw0yNDEwMjIwMDAwMDBaMEcxCzAJBgNVBAYTAlVTMREwDwYDVQQKEwhE +# aWdpQ2VydDElMCMGA1UEAxMcRGlnaUNlcnQgVGltZXN0YW1wIFJlc3BvbmRlcjCC +# ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKNkXfx8s+CCNeDg9sYq5kl1 +# O8xu4FOpnx9kWeZ8a39rjJ1V+JLjntVaY1sCSVDZg85vZu7dy4XpX6X51Id0iEQ7 +# Gcnl9ZGfxhQ5rCTqqEsskYnMXij0ZLZQt/USs3OWCmejvmGfrvP9Enh1DqZbFP1F +# I46GRFV9GIYFjFWHeUhG98oOjafeTl/iqLYtWQJhiGFyGGi5uHzu5uc0LzF3gTAf +# uzYBje8n4/ea8EwxZI3j6/oZh6h+z+yMDDZbesF6uHjHyQYuRhDIjegEYNu8c3T6 +# Ttj+qkDxss5wRoPp2kChWTrZFQlXmVYwk/PJYczQCMxr7GJCkawCwO+k8IkRj3cC +# AwEAAaOCAzUwggMxMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1Ud +# JQEB/wQMMAoGCCsGAQUFBwMIMIIBvwYDVR0gBIIBtjCCAbIwggGhBglghkgBhv1s +# BwEwggGSMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT +# MIIBZAYIKwYBBQUHAgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABo +# AGkAcwAgAEMAZQByAHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0 +# AGUAcwAgAGEAYwBjAGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBn +# AGkAQwBlAHIAdAAgAEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBs +# AHkAaQBuAGcAIABQAGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABp +# AGMAaAAgAGwAaQBtAGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABh +# AHIAZQAgAGkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABi +# AHkAIAByAGUAZgBlAHIAZQBuAGMAZQAuMAsGCWCGSAGG/WwDFTAfBgNVHSMEGDAW +# gBQVABIrE5iymQftHt+ivlcNK2cCzTAdBgNVHQ4EFgQUYVpNJLZJMp1KKnkag0v0 +# HonByn0wfQYDVR0fBHYwdDA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29t +# L0RpZ2lDZXJ0QXNzdXJlZElEQ0EtMS5jcmwwOKA2oDSGMmh0dHA6Ly9jcmw0LmRp +# Z2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRENBLTEuY3JsMHcGCCsGAQUFBwEB +# BGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsG +# AQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1 +# cmVkSURDQS0xLmNydDANBgkqhkiG9w0BAQUFAAOCAQEAnSV+GzNNsiaBXJuGziMg +# D4CH5Yj//7HUaiwx7ToXGXEXzakbvFoWOQCd42yE5FpA+94GAYw3+puxnSR+/iCk +# V61bt5qwYCbqaVchXTQvH3Gwg5QZBWs1kBCge5fH9j/n4hFBpr1i2fAnPTgdKG86 +# Ugnw7HBi02JLsOBzppLA044x2C/jbRcTBu7kA7YUq/OPQ6dxnSHdFMoVXZJB2vkP +# gdGZdA0mxA5/G7X1oPHGdwYoFenYk+VVFvC7Cqsc21xIJ2bIo4sKHOWV2q7ELlmg +# Yd3a822iYemKC23sEhi991VUQAOSK2vCUcIKSK+w1G7g9BQKOhvjjz3Kr2qNe9zY +# RDCCBs0wggW1oAMCAQICEAb9+QOWA63qAArrPye7uhswDQYJKoZIhvcNAQEFBQAw +# ZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQ +# d3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBS +# b290IENBMB4XDTA2MTExMDAwMDAwMFoXDTIxMTExMDAwMDAwMFowYjELMAkGA1UE +# BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj +# ZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgQXNzdXJlZCBJRCBDQS0xMIIBIjAN +# BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6IItmfnKwkKVpYBzQHDSnlZUXKnE +# 0kEGj8kz/E1FkVyBn+0snPgWWd+etSQVwpi5tHdJ3InECtqvy15r7a2wcTHrzzpA +# DEZNk+yLejYIA6sMNP4YSYL+x8cxSIB8HqIPkg5QycaH6zY/2DDD/6b3+6LNb3Mj +# /qxWBZDwMiEWicZwiPkFl32jx0PdAug7Pe2xQaPtP77blUjE7h6z8rwMK5nQxl0S +# QoHhg26Ccz8mSxSQrllmCsSNvtLOBq6thG9IhJtPQLnxTPKvmPv2zkBdXPao8S+v +# 7Iki8msYZbHBc63X8djPHgp0XEK4aH631XcKJ1Z8D2KkPzIUYJX9BwSiCQIDAQAB +# o4IDejCCA3YwDgYDVR0PAQH/BAQDAgGGMDsGA1UdJQQ0MDIGCCsGAQUFBwMBBggr +# BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCDCCAdIGA1UdIASC +# AckwggHFMIIBtAYKYIZIAYb9bAABBDCCAaQwOgYIKwYBBQUHAgEWLmh0dHA6Ly93 +# d3cuZGlnaWNlcnQuY29tL3NzbC1jcHMtcmVwb3NpdG9yeS5odG0wggFkBggrBgEF +# BQcCAjCCAVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAQwBl +# AHIAdABpAGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1AHQAZQBzACAAYQBj +# AGMAZQBwAHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABpAGcAaQBDAGUAcgB0 +# ACAAQwBQAC8AQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBlAGwAeQBpAG4AZwAg +# AFAAYQByAHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBoAGkAYwBoACAAbABp +# AG0AaQB0ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAgAGEAcgBlACAAaQBu +# AGMAbwByAHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAgAGIAeQAgAHIAZQBm +# AGUAcgBlAG4AYwBlAC4wCwYJYIZIAYb9bAMVMBIGA1UdEwEB/wQIMAYBAf8CAQAw +# eQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy +# dC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E +# aWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgwOqA4oDaGNGh0 +# dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5j +# cmwwOqA4oDaGNGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3Vy +# ZWRJRFJvb3RDQS5jcmwwHQYDVR0OBBYEFBUAEisTmLKZB+0e36K+Vw0rZwLNMB8G +# A1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA0GCSqGSIb3DQEBBQUAA4IB +# AQBGUD7Jtygkpzgdtlspr1LPUukxR6tWXHvVDQtBs+/sdR90OPKyXGGinJXDUOSC +# uSPRujqGcq04eKx1XRcXNHJHhZRW0eu7NoR3zCSl8wQZVann4+erYs37iy2QwsDS +# tZS9Xk+xBdIOPRqpFFumhjFiqKgz5Js5p8T1zh14dpQlc+Qqq8+cdkvtX8JLFuRL +# cEwAiR78xXm8TBJX/l/hHrwCXaj++wc4Tw3GXZG5D2dFzdaD7eeSDY2xaYxP+1ng +# Iw/Sqq4AfO6cQg7PkdcntxbuD8O9fAqg7iwIVYUiuOsYGk38KiGtSTGDR5V3cdyx +# G0tLHBCcdxTBnU8vWpUIKRAmMYIEOzCCBDcCAQEwgYYwcjELMAkGA1UEBhMCVVMx +# FTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNv +# bTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmlu +# ZyBDQQIQCjSHIb+9FkHaGapmaAdBYDAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIB +# DDEKMAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEE +# AYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUUFBK7LxW+S38 +# 8WJoN3L0eETG8B4wDQYJKoZIhvcNAQEBBQAEggEAWhLCRsNgjRzmu0KISjje8282 +# iUD1ylg09M91yh/Hgg9qXEjPEzdyZDOjHom3zSRaTP2MRbmyLoOhvdNmSq2dU2oy +# OwZ/0N/3fMO54cATtlglPge0wZZE9ZkRqVycMcWD3MxwWnJ3ertn1B2AtEa4zQOk +# 930ObSFaJ+qZFODbmzcaImFkFpnOPNosJL9VwbyB4qmwbQ5+o1MURyS1nOcaTSO+ +# Yt1pvAXsxjNx3dGWEznzbFRfqceOc0jHg39waAFUkFbhM674RH2wPEW5k4HmdDD/ +# vanoTccxaTs7qw16TRXCaMSXhTBl+k19xxj18H4l2TwLGyj1I5HidScLmfoywaGC +# Ag8wggILBgkqhkiG9w0BCQYxggH8MIIB+AIBATB2MGIxCzAJBgNVBAYTAlVTMRUw +# EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +# ITAfBgNVBAMTGERpZ2lDZXJ0IEFzc3VyZWQgSUQgQ0EtMQIQAwGaAjr/WLFr1tXq +# 5hfwZjAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkq +# hkiG9w0BCQUxDxcNMjAxMDIyMDk0NTQyWjAjBgkqhkiG9w0BCQQxFgQU+s8pi93V +# XECKwrkDmxfQCciSdxswDQYJKoZIhvcNAQEBBQAEggEAcyol9GAIzsB1pT5W7kUN +# 74+S/K6TI6lxGjFPau5saaQ8QTWC+qYTtSFDwgby7Cpyf/HhxI8FCv5BGzxLGNPI +# SxUS+ds3eCMCoVzjASPeeSKiDMz36HAjvjifFuP2GonrcOpaOU12wmdRrw1lJ/aD +# FTMwIAAXdLlfIXJof1B2e3kxlh4SUurQN2VZuRjlgtcAbxYCc1OZyepFuCRW0HKZ +# 0VhD7rYF5U2Nya/6qLP1JYocPw9/yphouyvAaXP1JK0Bmmbx1cjU7pD1FBBZnaXp +# Uh9sOAwljewEd2XoM4oRNQHeMNuCGMNeVcRFM+grtHoe22cNQJmw6eQH5oHbT6B/ +# Gg== +# SIG # End signature block