Compare commits

...

11 Commits

Author SHA1 Message Date
pcnick d26ad2b65e 修正因路徑引發的檔案資料夾取得錯誤問題 1 month ago
pcnick e31505173a 依目標檔案位置變更目錄 1 year ago
pcnick ebc972ba16 修正規則檔路徑錯誤 2 years ago
pcnick 1862772fdf 運行模式修正 2 years ago
pcnick de3298579e 修正規則檔路徑錯誤 2 years ago
pcnick 780e8d1d2f 運作模式新增視輸入檔案屬性進行連續處理 2 years ago
pcnick 51dae0f48e 以參數彈性設定資料檔外部化 2 years ago
pcnick 274c93c72f 正規表示設定與指令檔分離,方便出錯時修改 2 years ago
pcnick 555e3a828f Merge tag 'v0.2.2' into develop 4 years ago
pcnick 3f506e4872 Merge tag 'v0.2.1' into develop 4 years ago
pcnick d96757e39a Merge tag 'v0.2.0' into develop 4 years ago
  1. 137
      Animelibk.ps1
  2. 39
      NameRegex.psm1
  3. BIN
      PathChar.psd1
  4. 46
      PathChar.psm1

137
Animelibk.ps1

@ -1,9 +1,13 @@
param(
$Path,
$Index = "H:\AnimeLib",
$VarConfig,
$RecorDB = "animelibk.ini",
$Include = @(".rmvb", ".mp4", ".mkv", ".avi", ".ass", ".ssa"),
[switch] $Single,
[switch] $Force,
[switch] $Sub
[switch] $Sub,
[switch] $testrun
)
Import-Module -Name ($PSScriptRoot + "\PathChar.psd1")
Import-Module -Name ($PSScriptRoot + "\NameRegex.psd1")
@ -13,16 +17,54 @@ $TargetName = ""
#$DestinName = "真の仲間"
Write-Output $Path
#$Index = "L:\AnimeLib"
# scriptblock 減少重複
$RegexpSet = {
# 全域化
# 因應檔名不同而設定多組正規方式
Set-Variable -Name "EpisodeRegex" -Scope global -Value @(
"(?:S\d{2})?[\s]?-[\s]E?(?<Episode>\d{2})"
"[\[\b\s](?<Episode>\d{2})[\s_]?(?:[vV]\d|END|FIN)[\]\b\s]"
"\[(?<Episode>\d{1,2})\D{2}\]"
"\[(?<Episode>\d{1,2})\]"
)
Set-Variable -Name "NameRegex" -Scope global -Value @(
"[\[\b\s](?<Name>[^\[\]]*)[\]\b\s]?$"
)
}
if ($VarConfig) {
if (Test-Path $PSScriptRoot\$VarConfig) {
$T = Get-Content -Encoding UTF8 $PSScriptRoot\$VarConfig | % { $H = @{} ; $S = $null} {
if ($_ -match "^\[(?<T>\w*)\]" ) {
$S = $Matches["T"]
$H.add($S, @())
} elseif ($_ -match ".+" ) {
$H[$S] = $H[$S] + @($_ -replace '"', '')
}
} { $H ; Clear-Variable -Name "H"}
$T.GetEnumerator() | % { Set-Variable -Name $_.name -Value $_.value}
} else {
&$RegexpSet
$EpisodeRegex | % {"[EpisodeRegex]"}{ """$_""" }{""} | Out-File -Encoding UTF8 $PSScriptRoot\$VarConfig
$NameRegex | % {"[NameRegex]"}{ """$_""" } | Out-File -Encoding UTF8 -Append $PSScriptRoot\$VarConfig
}
} else {
&$RegexpSet
}
#$Path = "L:\Anime\202001 ネコぱら\[Nekomoe kissaten][Nekopara][01-12][BDRip][1080p][CHT]\[Nekomoe kissaten][Nekopara][12][1080p][CHT].mp4"
#$Path = "L:\Anime\202004 ストライク・ザ・ブラッド OVA IV\[Suzu-Kaze][Strike_the_Blood_IV_OVA][01-12FIN][BDRip_1080P][HEVC_YUV420P10]\[Suzu-Kaze] Strike the Blood IV 12FIN [BDRip 1920x1080 HEVC YUV420P10 FLAC].mkv"
#$Path = "H:\Anime\201901 盾の勇者の成り上がり\[LKSUB][Tate no Yuusha no Nariagari][01-25][GB][720P][MP4]\[LKSUB][Tate no Yuusha no Nariagari][01][GB][720P].mp4"
#$Path = "H:\Data\Downloads\因為不是真正的夥伴而被逐出勇者隊伍\[Shin no Nakama][01][BIG5][1080P].mp4"
$JsonPath = $("$Index\Anime\* $TargetName", $($Path -replace '(.*\\[^\[\\\]]*)\\\[.*', '$1') | ? {Test-Path $_})
$WorkData = $(if (Test-Path "$JsonPath\animelibk.json") {
Get-Content "$JsonPath\animelibk.json" | ConvertFrom-Json
$JsonPath = "$Index\Anime\* $TargetName", $($Path -replace '(.*\\[^\[\\\]]*)\\\[.*', '$1') | ? {Test-Path $_}
if ($RecorDB -notmatch ":") { $RecorDB = "$JsonPath\$RecorDB" }
$WorkData = $(if (Test-Path $RecorDB) {
Get-Content $RecorDB | ConvertFrom-Json
} else {
"" | select ID, WorkName, TargetName, DestinName, Season, Episode
"" | Select-Object ID, WorkName, TargetName, DestinName, Season, Episode
})
$RecorDB
# 確認資料狀態,缺少則進行物件資料建立
if (-not($WorkData.WorkName)) {
@ -42,11 +84,27 @@ if (-not($WorkData.Episode)) {
}
$WorkData
$Seasons_TC = "", "第一季", "第二季", "第三季", "第四季", "第五季"
#$Seasons_TC = "", "第一季", "第二季", "第三季", "第四季", "第五季"
$Seasons_TC = "", "Seasons 1", "Seasons 2", "Seasons 3", "Seasons 4", "Seasons 5"
$Lang = @{
Season = "Season {0:00}"
}
$Year = @($($JsonPath -replace '.*\\((?<Y>\d{4})?(?<M>\d{2})?).*$', '${Y}'), $(get-date -Format 'yyyy')) | ? {-not([string]::IsNullOrEmpty($_))} | Select -First 1
# 依目標檔案位置變更磁碟代號
$TargetDrive = Split-Path -Path $JsonPath -Qualifier
if (Split-Path -Path $Index -IsAbsolute) {
if ($Index -notmatch $TargetDrive) {
$Index2 = Join-Path -Path $TargetDrive -ChildPath (Split-Path -Path $Index -noQualifier)
} else {
$Index2 = $Index
}
} else {
$Index2 = Join-Path $TargetDrive $Index
}
Write-Host $Index2
# 取得目標資料夾是否存在,不存在建立資料夾,並取得資料夾物件
$LinkPath = "{2}\{0}\{1}" -f $WorkData.DestinName, $Seasons_TC[$WorkData.Season], $Index
$LinkPath = "{2}\{0}\{1}" -f $WorkData.DestinName, $($Lang["Season"] -f $WorkData.Season), $Index2
$LinkDir = $(if (-not(Test-Path -Path "$LinkPath*")) {
New-Item -Path "$LinkPath ($Year)" -ItemType Directory -Force
} else {
@ -66,19 +124,7 @@ function Get-StandName {
Get-Item -Path $(Edit-PathChar $FileObj)
})
# 因應檔名不同而設定多組正規方式
$EpisodeRegex = @(
"(?:S\d{2})?[\s]?-[\s]E?(?<Episode>\d{2})"
"[\[\b\s](?<Episode>\d{2})[\s_]?(?:[vV]\d|END|FIN)[\]\b\s]"
"\[(?<Episode>\d{1,2})\w{2}\]"
"\[(?<Episode>\d{1,2})\]"
)
$NameRegex = @(
"[\[\b\s](?<Name>[^\[\]]*)[\]\b\s]?$"
)
$Result = $File.Name | % { Get-NameRegex $_ -Regex $EpisodeRegex } | % { $(Get-NameRegex $_["L"] -Regex $NameRegex -Exclude "(BD|DVD|HDTV)RIP" -End) + $_ } | Select -First 1
$Result = $File.Name | % { Get-NameRegex $_ -Regex $EpisodeRegex } | % { $(Get-NameRegex $_["L"] -Regex $NameRegex -Exclude "(BD|DVD|HDTV)RIP|BIG5" -End) + $_ } | Select -First 1
# 建立回傳資料物件,以方便後續資料處理。
$OutputData = "" | Select newName, Season, Episode, newFullName;
@ -115,17 +161,25 @@ if ($Single) {
# 單集模式
$List = @(Get-Item -Path $(Edit-PathChar $Path))
$BuildList = $List | select $FileObj, $StructPathObj, $NewNameObj | ? {$_.NewName.Episode -notin $WorkData.Episode}
#$BuildList | ? {$_.NewName.Episode -notin $WorkData.Episode} | Format-List
#$BuildList | ? {$_.NewName.Episode -notin $WorkData.Episode} | Format-List
} elseif ($Sub) {
$List = @(Get-Item -Path $(Edit-PathChar $Path))
$BuildList = $List | select $FileObj, $StructPathObj, $NewNameObj | ? {$_.File.Extension -in @(".ass", ".ssa")}
} elseif ($testrun) {
$List = @(Edit-PathChar $Path | Get-Item | ? { $_.GetType().Name -eq "FileInfo" }) +
@(Edit-PathChar $Path | Get-Item | ? { $_.GetType().Name -eq "DirectoryInfo" } | % { $_.GetFiles() })
$BuildList = $List | select $FileObj, $StructPathObj, $NewNameObj
if ($Include -ne "") { $BuildList = $BuildList | ? {$_.File.Extension -in $Include} }
if (-not($Force)) { $BuildList = $BuildList | ? {$_.NewName.Episode -notin $WorkData.Episode} }
} else {
exit 0;
}
$ENDResult = $BuildList | % {
$Command = @{
ItemType = 'HardLink'
Path = $("{0}\{1}" -f $_.StructPath, $_.NewName.newFullName)
Target = $(Edit-PathChar $_.File.Fullname)
Target = $(Edit-PathChar $_.File.Fullname -nowlid)
}
#try {
if (New-Item @Command) {
@ -138,40 +192,5 @@ $ENDResult = $BuildList | % {
#$ENDResult
#$ENDResult.gettype();
if (-not($Sub)) { $ENDResult | % { if ($_.Episode) { $WorkData.Episode += $_.Episode }}}
$WorkData | ConvertTo-Json | Out-File -Encoding "UTF8" "$JsonPath\animelibk.json"
$WorkData | ConvertTo-Json | Out-File -Encoding "UTF8" $RecorDB
exit 0;
##### 以下試寫或測試用 #####
# SIG # Begin signature block
# MIIFxwYJKoZIhvcNAQcCoIIFuDCCBbQCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUnaUT7B6+atzTGRJLSX59DzPX
# fjGgggNSMIIDTjCCAjagAwIBAgIQdMnAQ4BDAo9Lgfn+QeDdhjANBgkqhkiG9w0B
# AQUFADAqMRMwEQYDVQQDDApOaWNrIENoYW5nMRMwEQYDVQQKDAplYXJpY2sub3Jn
# MB4XDTIxMTAzMTEwMDI1MVoXDTIyMTAzMTEwMjI1MVowMzEiMCAGCSqGSIb3DQEJ
# ARYTcGNuaWNrMTAwQGdtYWlsLmNvbTENMAsGA1UEAwwETmljazCCASIwDQYJKoZI
# hvcNAQEBBQADggEPADCCAQoCggEBAMEnEk3/5rkEMibDbbfOXQaerk5xXSJmY8gf
# FAVUbrGfjzYHcRsPRzdb/pstcZGS2XUCoX2a57lQhACStns9dXeYfWhzNeAiSEAy
# iaJzUj5ELcH5TzT+mjeJQX6upeHOexO1TmtuM6mugpl9SvNQFqbQXlPHHmoLE3OC
# UzzjEC0AkHkcSiLdqtmSbRmaomcDMbtJgZHUciWE/p6mmAbpv2R4rdKSYSiI8UsE
# UclzkeTNrYKmJNiM0R+X1LyZVY6HAHN8dR3tjBnEPYoPxRAz4d2FEajvumzosNUr
# ni9LROnRxQXa048ZcsNArNZDQXe+Rc+PWhzbqHhy8rBllgZ08XkCAwEAAaNnMGUw
# DgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMB8GA1UdIwQYMBaA
# FBXyUrhn78ppKe7GRmHS6vbsNae/MB0GA1UdDgQWBBRs5+Yfb/14jwpjUNpTUuR1
# 759t9TANBgkqhkiG9w0BAQUFAAOCAQEACSL1BqUcrqh+bBqr5rQ5mArCVxsBW92r
# HenPY48dKdhGgMODtxuo7osZLk7Il+aXhAsvNTSfmc92H5eDXFqZ565jm8r6FF1C
# f1oKxznmtxd4oyXflCRqBz+OGuXLq8dG9gWT7OisKWe0hifSMGaZ9afpNeiFLuD1
# GSGk5E0W+bUyezCmjOdNWYIW452brt8rJS21WWVVvrsGjgJoTdsoAkFek8OEm82+
# 1UR7xZOHybLvi8N0gvD+UFlVvcv6pmgUqaz5DS7J2si75Xj9pThE6/bPu/fkpc53
# gMbleXNaqXIKeJTbI5hi2crlKyXBe/GfuK0Tv+06S1sL32VAs1VwmjGCAd8wggHb
# AgEBMD4wKjETMBEGA1UEAwwKTmljayBDaGFuZzETMBEGA1UECgwKZWFyaWNrLm9y
# ZwIQdMnAQ4BDAo9Lgfn+QeDdhjAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEK
# MAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3
# AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUEzAOjNkB8uaWsHtC
# RUzsrJzTfYMwDQYJKoZIhvcNAQEBBQAEggEAnvzVdQvGridnk2wdfYs8SjLEZYhc
# K3b7zpo5sNczj/zEFSsCskDik+oJ7p+vRszo7WGNt2/vJsbFPsIROYkxzV5UdgZR
# BDTpQhcRLPSdw6kipbKk1MPD6nmpCqQ1BdsvALJH8BXxr8UlaYZMhLiUS8dVx1Vh
# Cr4zTBc1nmHf/QdLlNyHieCdCqwLam87yN03u9NXDqearWwP+Zh/58I+qCQjs3sU
# coB9S7DCjoMp0NCpntohLkB2ZyLXdfbQM4bNUqQra5bcZAUAx6pPaDucCAqVbTtY
# fhXHdsfH9i1gd2TQUYkMBW59QwWy3EyeC5eKkBO+aQUj+85PH8DQftKFsg==
# SIG # End signature block

39
NameRegex.psm1

@ -44,42 +44,5 @@
#Write-Host $Str
# Regex 可輸入複數個
$Regex | % { @{ Target = $Str; Regex = $_; } } | &$InnerScrip
$Regex | ForEach-Object { @{ Target = $Str; Regex = $_; } } | &$InnerScrip
}
# Example
# $RS1 | % { Get-NameRegex $_["L"] -Regex $NameRegex -Exclude "(BD|DVD|HDTV)RIP" -End }
# $TestName | % { Get-NameRegex $_ -Regex $Regex } | % { $(Get-NameRegex $_["L"] -Regex $NameRegex -Exclude "(BD|DVD|HDTV)RIP" -End) + $_ }
# SIG # Begin signature block
# MIIFxwYJKoZIhvcNAQcCoIIFuDCCBbQCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU2SfubhaWpugweGH+53eZ/igq
# VQOgggNSMIIDTjCCAjagAwIBAgIQdMnAQ4BDAo9Lgfn+QeDdhjANBgkqhkiG9w0B
# AQUFADAqMRMwEQYDVQQDDApOaWNrIENoYW5nMRMwEQYDVQQKDAplYXJpY2sub3Jn
# MB4XDTIxMTAzMTEwMDI1MVoXDTIyMTAzMTEwMjI1MVowMzEiMCAGCSqGSIb3DQEJ
# ARYTcGNuaWNrMTAwQGdtYWlsLmNvbTENMAsGA1UEAwwETmljazCCASIwDQYJKoZI
# hvcNAQEBBQADggEPADCCAQoCggEBAMEnEk3/5rkEMibDbbfOXQaerk5xXSJmY8gf
# FAVUbrGfjzYHcRsPRzdb/pstcZGS2XUCoX2a57lQhACStns9dXeYfWhzNeAiSEAy
# iaJzUj5ELcH5TzT+mjeJQX6upeHOexO1TmtuM6mugpl9SvNQFqbQXlPHHmoLE3OC
# UzzjEC0AkHkcSiLdqtmSbRmaomcDMbtJgZHUciWE/p6mmAbpv2R4rdKSYSiI8UsE
# UclzkeTNrYKmJNiM0R+X1LyZVY6HAHN8dR3tjBnEPYoPxRAz4d2FEajvumzosNUr
# ni9LROnRxQXa048ZcsNArNZDQXe+Rc+PWhzbqHhy8rBllgZ08XkCAwEAAaNnMGUw
# DgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMB8GA1UdIwQYMBaA
# FBXyUrhn78ppKe7GRmHS6vbsNae/MB0GA1UdDgQWBBRs5+Yfb/14jwpjUNpTUuR1
# 759t9TANBgkqhkiG9w0BAQUFAAOCAQEACSL1BqUcrqh+bBqr5rQ5mArCVxsBW92r
# HenPY48dKdhGgMODtxuo7osZLk7Il+aXhAsvNTSfmc92H5eDXFqZ565jm8r6FF1C
# f1oKxznmtxd4oyXflCRqBz+OGuXLq8dG9gWT7OisKWe0hifSMGaZ9afpNeiFLuD1
# GSGk5E0W+bUyezCmjOdNWYIW452brt8rJS21WWVVvrsGjgJoTdsoAkFek8OEm82+
# 1UR7xZOHybLvi8N0gvD+UFlVvcv6pmgUqaz5DS7J2si75Xj9pThE6/bPu/fkpc53
# gMbleXNaqXIKeJTbI5hi2crlKyXBe/GfuK0Tv+06S1sL32VAs1VwmjGCAd8wggHb
# AgEBMD4wKjETMBEGA1UEAwwKTmljayBDaGFuZzETMBEGA1UECgwKZWFyaWNrLm9y
# ZwIQdMnAQ4BDAo9Lgfn+QeDdhjAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEK
# MAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3
# AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUoqQp8TNHQrFdDrpM
# 6+iDq3QvqIUwDQYJKoZIhvcNAQEBBQAEggEApo8NtKRWXRdAxdmJMSYorrOWC1ra
# NaN0N3UbhQKTAjbN3sYP4oZmOiEftQn5Ot0JztpYAb29Ge//R+0EGQR69IoGMgr0
# X5toFyWFle3ddKu3swsFv9dJI4vYSW1Pce13kBdp+2a7hCF/6kS1aYDLEdEYhcwq
# 8rqRSNtr73Ro00eMVSm72GRv709ouWK5jCqCPq6r/7O4UZvyiqyF4Oq8fZDAsWlK
# Tc5zLTtnaIysgvAZm7izn0oSD/kLx6hv7wGNp7yVSUkNq7a7qu34Brs5eQtZyblj
# JbZPtDYY0++t5xgHskpigkAVej3B1TkNg1rH1EJ49JX10yeIq7JEMS4u8Q==
# SIG # End signature block

BIN
PathChar.psd1

Binary file not shown.

46
PathChar.psm1

@ -1,41 +1,17 @@
function Edit-PathChar {
param(
$Str,
$Char = "[\[\]]"
$Char = "[\[\]]",
[switch] $nowlid
)
$Str -replace "(${Char})", '`$1'
if($nowlid) {
$fstr = "(${Char})"
$rstr = '`$1'
} else {
$fstr = "${Char}+"
$rstr = '*'
}
$Str -replace $fstr, $rstr
}
# SIG # Begin signature block
# MIIFxwYJKoZIhvcNAQcCoIIFuDCCBbQCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUNYO6iFH1B+kW/b06vFyGuFhF
# TYSgggNSMIIDTjCCAjagAwIBAgIQdMnAQ4BDAo9Lgfn+QeDdhjANBgkqhkiG9w0B
# AQUFADAqMRMwEQYDVQQDDApOaWNrIENoYW5nMRMwEQYDVQQKDAplYXJpY2sub3Jn
# MB4XDTIxMTAzMTEwMDI1MVoXDTIyMTAzMTEwMjI1MVowMzEiMCAGCSqGSIb3DQEJ
# ARYTcGNuaWNrMTAwQGdtYWlsLmNvbTENMAsGA1UEAwwETmljazCCASIwDQYJKoZI
# hvcNAQEBBQADggEPADCCAQoCggEBAMEnEk3/5rkEMibDbbfOXQaerk5xXSJmY8gf
# FAVUbrGfjzYHcRsPRzdb/pstcZGS2XUCoX2a57lQhACStns9dXeYfWhzNeAiSEAy
# iaJzUj5ELcH5TzT+mjeJQX6upeHOexO1TmtuM6mugpl9SvNQFqbQXlPHHmoLE3OC
# UzzjEC0AkHkcSiLdqtmSbRmaomcDMbtJgZHUciWE/p6mmAbpv2R4rdKSYSiI8UsE
# UclzkeTNrYKmJNiM0R+X1LyZVY6HAHN8dR3tjBnEPYoPxRAz4d2FEajvumzosNUr
# ni9LROnRxQXa048ZcsNArNZDQXe+Rc+PWhzbqHhy8rBllgZ08XkCAwEAAaNnMGUw
# DgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMB8GA1UdIwQYMBaA
# FBXyUrhn78ppKe7GRmHS6vbsNae/MB0GA1UdDgQWBBRs5+Yfb/14jwpjUNpTUuR1
# 759t9TANBgkqhkiG9w0BAQUFAAOCAQEACSL1BqUcrqh+bBqr5rQ5mArCVxsBW92r
# HenPY48dKdhGgMODtxuo7osZLk7Il+aXhAsvNTSfmc92H5eDXFqZ565jm8r6FF1C
# f1oKxznmtxd4oyXflCRqBz+OGuXLq8dG9gWT7OisKWe0hifSMGaZ9afpNeiFLuD1
# GSGk5E0W+bUyezCmjOdNWYIW452brt8rJS21WWVVvrsGjgJoTdsoAkFek8OEm82+
# 1UR7xZOHybLvi8N0gvD+UFlVvcv6pmgUqaz5DS7J2si75Xj9pThE6/bPu/fkpc53
# gMbleXNaqXIKeJTbI5hi2crlKyXBe/GfuK0Tv+06S1sL32VAs1VwmjGCAd8wggHb
# AgEBMD4wKjETMBEGA1UEAwwKTmljayBDaGFuZzETMBEGA1UECgwKZWFyaWNrLm9y
# ZwIQdMnAQ4BDAo9Lgfn+QeDdhjAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEK
# MAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3
# AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUKm04xcPD1eiw5sak
# B7XvBOA0ywIwDQYJKoZIhvcNAQEBBQAEggEAMYVlNEthdr1G6iogbkFpgKpPV+Wh
# z6M5HObyzETBVKkq34Lue9RqAK01ON4wFyaGsVHnSvSRA+JmZmWBmVeEEKi0LL00
# /jrm+3BExMrslnOJP6I7t/sG+jfONZ9QoM1ms/E3nlWrTrkrvQ0gLJXMwaF7msal
# PZ1gICVGg14SFtGslsy6b8YZ9a0VUnN9JBODbT/DTqpyBVm3552e9oJ2hu0kPz5A
# lbkvREPC0HRVxLXWpWfP8NaR1EClbZB6pjTmwiVtKOtb0QSfpK0bjzCqsR42qKDc
# 4FWVXf+Jl7eGQ7uKzfnlzRVzds5ymAgHGUMWon/naWMCKm6p/RTxFAVAYA==
# SIG # End signature block

Loading…
Cancel
Save