From b29a1f6aedba588a820676c132f78b8ef49914ae Mon Sep 17 00:00:00 2001 From: pcnick Date: Tue, 23 Nov 2021 22:45:51 +0800 Subject: [PATCH 01/10] Anime Link Libary: feature modular function PathChar, replace special char in path string MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 功能函式模組化 * 取代路徑中特殊字元 --- PathChar.psd1 | Bin 0 -> 4738 bytes PathChar.psm1 | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 PathChar.psd1 create mode 100644 PathChar.psm1 diff --git a/PathChar.psd1 b/PathChar.psd1 new file mode 100644 index 0000000000000000000000000000000000000000..61ff9d323e5bf5a0fb54de1d67d806a85b7e3da6 GIT binary patch literal 4738 zcmcgwUrd`-6u%=u1_SXyx9rJpBXiwcp<{FErUo3tPT-dQVcoJy(?1_=p|oB9!Ekjj z8v+a?F_WQ-n)qf+jM2o0We@sb_OL{KGSO_&==S0gHPOsv2Jv^k%cWo8>nOn(^8Mj{ z=brOB=lssO_jci*23E&vSOZhow*I!9!gjK5=3{9VW`}Y4SP~-&%V+89)#;k4%GgIe zVuqZzJ@aU$a`Ygi5-h-CEQ0&MqE@|3mo0Xdq?(xp*Iw3yi|);ApH7-)w6K@85jnf+ z+}4>*-O~Eq?DaR}qxo!A;3mH^Ot?1tr+M>CmyO;p^jpIf7Mkf`ar~uO7w$opVNs^S z`m?xJ`q&8UDK-c^JBuunUDBG*T9bQ1-tjBLLbqP$G3ZTVb_8}}OBO7w5q>tV(AcE@ z8OUc9MA^xX09OPE#mv-V6cj{04lD^R4-w|qkQ>PhZ(5j%?J7cT%8c8ZdKf=`eutyr z0sVJnm?HB6>tRP(+Y(mFMl(AAdw%vb>tkl%@?nhL_T#w^ml^!#0QL@{LED*Eeh?mTSo-?K9N9}i=oBcobwrk8QL?^~hGY%Ysy3Fnl z-5M&T$DQ}sY6g;{5B3on(vyIOB;p?es`L^j6MWi*|0Gk3ncavlLQ{*sI#j#x7{6gV zkzu^bQ8Td1QDHH*-s1lzaLM+bV;;=?I`I4JgrEVM+JHR;dxRpf#0420V_odx*knG- zLiHXX!MqqU6K6xvL%gClVx$v3so+i&qmOvM3KD~*RU;{59^Vf^xz-PHZ-1R@@5ueE zTY)Qh+~cL z@d$I_tsP$kdxs#AMAuYsSJ^4(jA(B`jQGJ(1vA4KqYMv1R`xUEVsOA}ABnybzQccU z)`1a5xmDQTvwdUMWOc}@iVh~YNBxn*V%h-9e-{P9PQ5n(XT9U9z*42@C<3+ zlX#B-3q_UWO{mdM^l_@i|1&PaYB~PP?kXy>XZ(S5_}FKmYZ1b}?bHU#arDRoY=fm0 z9tH8Xf3Z_j^t<6x95JE#PigsY#YjNQa~h)oL?Wa4ZQKo-oT^>g?{d^GeCgddM`L08 z5AKiCuO1g`wyZe^H0pV!U%`k~v@Wh(NsMe%zpmQz*|yvrUP^bX=8+1YY3+(=9+qpt z z+<7>y_>D1?IhojE5UjIplk=LzS&+q}=dJxji z%87g_?CSJPOft0%S_7yA(j3>itLVSRj9A$Z#Yu#CyTNl~!sKRr=(P?``#@0@bUG^Z zC4DV)BJNZprFzj8$344|_I#GKQ+JR)v_lhRZ#9i$lb?3?&h+6-XLJ%Or}A6;`r7~E z^ksf^`Yr4qw$A+KoFDb_O6TLQA$xVG)SjcoZ_0G=to>W9dzkr|S7^RG{j_Pl%!i0v zpM5bFo)B@PRWX9y6!ke3Iix4ai1n#(E>ti^e{?QdT}nzfV21mIDf7peU~@jZwLf@< zJi5f`tvd99!{q)xSHm}r)O$bdHS_la+jEp#fllg?PtxZCz7TRNG3rlaQcgZeURdtn z6M>omibW6d)48~sNjdo>dCD`fGzJ?gq$xha)=pi&k~8E}SlZ~ZhCBEnbj?q4-;I=G zP3%hgVTn5CTCDxd!xPfC&F+Jz%dvJ8R_N5c7CSO?#A`a=sE9vBhC>r^Mx3K%9ORSY zQA)maG;^3mGmBX!_}ZO&&OSvz>nb(80_56zjUx*V~yy;BtyS|1hYre7Gu`e!a$wH2K3i3KW Date: Sat, 27 Nov 2021 18:11:20 +0800 Subject: [PATCH 02/10] Anime Link Libary: main program replace feature with function PathChar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 主程式功能置換為 function PathChar --- Animelibk.ps1 | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/Animelibk.ps1 b/Animelibk.ps1 index 9ade618..3527450 100644 --- a/Animelibk.ps1 +++ b/Animelibk.ps1 @@ -5,6 +5,8 @@ [switch] $Force, [switch] $Sub ) +Import-Module -Name ($PSScriptRoot + "\PathChar.psd1") +Edit-PathChar $Path #$TargetName = "俺だけ入れる隠しダンジョン〜こっそり鍛えて世界最強〜"; $TargetName = "" #$DestinName = "真の仲間" @@ -62,20 +64,22 @@ function Get-StandName { $File = $(if ($FileObj.GetType().Name -eq 'FileInfo') { $FileObj } else { - Get-Item -Path $($FileObj -replace '([\[\]])', '`$1') + Get-Item -Path $(Edit-PathChar $FileObj) }) # 因應檔名不同而設定多組正規方式 $Result = @($( #$($TestName[-1] -match "\[([^\]]*)\]\[(\d{1,2})\]") #$($File.Name -match "[\[\s]([^\]]*?)(?:[\]\[\-\s]+)(\d{1,2})[\]\s]") - $($File.Name -match "[\[\s](?\b[^\]]*\b)(?:[\]\[\-\s]+)(?\d{1,2})(?:[vV]\d|FIN|END)?[\]\s]") + #$($File.Name -match "[\[\s](?\b[^\]]*\b)(?:[\]\[\-\s]+)(?\d{1,2})(?:[vV]\d|FIN|END)?[\]\s]") + $($($File.Name -replace "\[(DVD|HDTV|BD)rip\]", '') -match "[\[\s](?\b[^\]]*\b)(?:[\]\[\-\s]+)(?\d{1,2})(?:_?[vV]\d|FIN|END)?[\]\s]") #$($TestName[-1] -match "[\[\s](?[^\]]*?)(?:[\]\[\-\s]+)(?\d{1,2})(?:[vV]\d)?[\]\s]") ) | % { if ($_) { $Matches }}) # 檔名分析測試用 # $Pathes = @( -# "L:\Anime\200910 聖剣の刀鍛冶(聖劍鍛造師)\[DMG][The Sacred Blacksmith][01-12 END][848x480][BIG5]\[DMG][The Sacred Blacksmith][04V2][848x480][BIG5].rmvb" +# "L:\Anime\200910 聖剣の刀鍛冶(聖劍鍛造師)\[DMG][The Sacred Blacksmith][01-12 END][848x480][BIG5]\[DMG][The Sacred Blacksmith][04V2][848x480][BIG5].rmvb" +# "L:\Anime\201104 星空へ架かる橋(架向星空之橋)\[AngelSub][Hoshizora e Kakaru Hashi][BDRip][Vol.01][1920x1080][TW_BIG5][x264_FLAC]\[AngelSub][Hoshizora e Kakaru Hashi][BDRip][01][1920x1080][BIG5][x264_FLAC].mkv" # "H:\Anime\201901 盾の勇者の成り上がり\[LKSUB][Tate no Yuusha no Nariagari][01-25][GB][720P][MP4]\[LKSUB][Tate no Yuusha no Nariagari][01][GB][720P].mp4" # "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" # "L:\Anime\200910 アスラクライン II(機巧魔神)\[DMG][Asura Cryin2][01-13 END][848x480][BIG5][RMVB]\[DMG][Asura Cryin 2][01][848x480][Big5].rmvb" @@ -84,7 +88,7 @@ function Get-StandName { # $TestName = @($Pathes | % {$_.Split("\\")[-1]}) # $Result = @( $TestName | % { @( #$($_ -match "\[([^\]]*)\]\[(\d{1,2})\]") -# $($_ -match "[\[\s](?\b[^\]]*\b)(?:[\]\[\-\s]+)(?\d{1,2})(?:[vV]\d|FIN|END)?[\]\s]") +# $($($_ -replace "\[(DVD|HDTV|BD)rip\]", '') -match "[\[\s](?\b[^\]]*\b)(?:[\]\[\-\s]+)(?\d{1,2})(?:[vV]\d|FIN|END)?[\]\s]") # ) | % { if ($_) { $Matches }}}) # Write-Output $Result # $Matches @@ -144,11 +148,11 @@ $StructPathObj = @{ # 運作模式 if ($Single) { # 單集模式 - $List = @(Get-Item -Path $($Path -replace '([\[\]])', '`$1')) + $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 } elseif ($Sub) { - $List = @(Get-Item -Path $($Path -replace '([\[\]])', '`$1')) + $List = @(Get-Item -Path $(Edit-PathChar $Path)) $BuildList = $List | select $FileObj, $StructPathObj, $NewNameObj | ? {$_.File.Extension -in @(".ass", ".ssa")} } @@ -156,7 +160,7 @@ $ENDResult = $BuildList | % { $Command = @{ ItemType = 'HardLink' Path = $("{0}\{1}" -f $_.StructPath, $_.NewName.newFullName) - Target = $($_.File.Fullname -replace '([\[\]])', '`$1') + Target = $(Edit-PathChar $_.File.Fullname) } #try { if (New-Item @Command) { @@ -176,8 +180,8 @@ exit 0; # SIG # Begin signature block # MIIFxwYJKoZIhvcNAQcCoIIFuDCCBbQCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR -# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU8mPuUodwDIN2Q4E0vUnnZGUG -# r4GgggNSMIIDTjCCAjagAwIBAgIQdMnAQ4BDAo9Lgfn+QeDdhjANBgkqhkiG9w0B +# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUDqcimTh1uRkBM2wZ3oxWPCw2 +# SQ+gggNSMIIDTjCCAjagAwIBAgIQdMnAQ4BDAo9Lgfn+QeDdhjANBgkqhkiG9w0B # AQUFADAqMRMwEQYDVQQDDApOaWNrIENoYW5nMRMwEQYDVQQKDAplYXJpY2sub3Jn # MB4XDTIxMTAzMTEwMDI1MVoXDTIyMTAzMTEwMjI1MVowMzEiMCAGCSqGSIb3DQEJ # ARYTcGNuaWNrMTAwQGdtYWlsLmNvbTENMAsGA1UEAwwETmljazCCASIwDQYJKoZI @@ -198,11 +202,11 @@ exit 0; # AgEBMD4wKjETMBEGA1UEAwwKTmljayBDaGFuZzETMBEGA1UECgwKZWFyaWNrLm9y # ZwIQdMnAQ4BDAo9Lgfn+QeDdhjAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEK # MAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3 -# AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUs/WMayHdj7voQ+1i -# xWSLfdeejpcwDQYJKoZIhvcNAQEBBQAEggEAsgkEEH0srYtf8UzIuYMmWBaDEa2t -# xC3bcCkuP+FFqln47A8bA3zEMvp69Ox9+bJIzSDsoeT/lEqKxPYt/JS+JgIYg5op -# o1DjvzzTo6rGvpOW/cFTcoaP8tKoXWeRGjAD0lex06tiqMio49wOrsY/m4RGW13c -# tQvdLGJTFWD7ovFAfC14BE7Fl3WMLwljD70DuWistL7fYm3bspj2cJTFjiIDWmML -# xDCx7sVyGBF5krwJB3DefO5Dq006ANCMU94gpSwQzOUFN6ZYvufa8EniaHYUhI+9 -# 6Z+pEHvR+MOwT6LA6F0pe7Vel8O2bGmRTaH8+K9mj6r/JOky1ZcFebKDzg== +# AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUZ98/I+dj0JylJtNV +# 6S37dg5/QPEwDQYJKoZIhvcNAQEBBQAEggEABCrG4XNbnCRBIlDyHFCXMJ4vucsD +# p4roqcdLmtM/g75EEus9h/qXMF/CLbc3BDbSEHGXnEk2OO3MN7+HWUudbAxvBfUE +# z8xTGSNCoNgWhPmEj859OOCu5i7Y1XIEkF89v5nPOzblTMesSdm44FQaBtrC1bHM +# z0dx+mnz0Zak7MzWkXUnyIeoKc2vM4eGlR/pBxXO7n5ycp70lL5rRWX9eVTT4r96 +# dW7ZUpL9Gwcq0PHLNg7rFgUmLSkMO3jUiIat0DBSJGkzUfVUhfpIPkG77auVLJKR +# YdfUqFL+zrq6GhSrKsD7cz5GC4I9RuaFuykGDqW6aZ93PSRlXxmw32GVvQ== # SIG # End signature block From 8203ed5cc61b76ca3d3c8c47e54a5acd6f225a5d Mon Sep 17 00:00:00 2001 From: pcnick Date: Thu, 2 Dec 2021 08:12:04 +0800 Subject: [PATCH 03/10] Get-NameRegex: finish multiregex search Episode number, test anchor to split file name --- NameRegex.ps1 | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 NameRegex.ps1 diff --git a/NameRegex.ps1 b/NameRegex.ps1 new file mode 100644 index 0000000..5c55a25 --- /dev/null +++ b/NameRegex.ps1 @@ -0,0 +1,44 @@ +function Get-NameRegex { + param( + $Str, + $Regex + ) + # Regex 可輸入複數個 + Write-Host $Str + $Regex | % { + $key = if ($_ -match "\(\?\<(.*?)\>") { $Matches[1] } + if (-not($key)) { Write-Error "$_ 沒有定義(?)" } + if ($Str -match $_ -and($key)) { + $Result = @{ + $key = $Matches[$key] + anchor = $Matches[0] + } + $LR = $Str -split $Result["anchor"] + $Result.Add("L", $LR[0]) + $Result.Add("R", $LR[1]) + $Result + } + } +} + +$Pathes = @( + "L:\Anime\201110 WORKING’!!\[#CHAT RUMBLE#][WORKING’!!][01-13 END][BIG5][x264_aac][1280x720]\[#CHAT RUMBLE#][WORKING’!!][13][BIG5][x264_aac][1280x720][11C6E807].mp4" + "L:\Anime\200910 にゃんこい!(貓願三角戀)\[DMG][Nyan Koi!][01-12 END][848x480][BIG5]\[DMG][Nyan Koi!][12 end][848x480][BIG5].rmvb" + "L:\Anime\200910 聖剣の刀鍛冶(聖劍鍛造師)\[DMG][The Sacred Blacksmith][01-12 END][848x480][BIG5]\[DMG][The Sacred Blacksmith][04V2][848x480][BIG5].rmvb" + "L:\Anime\201104 星空へ架かる橋(架向星空之橋)\[AngelSub][Hoshizora e Kakaru Hashi][BDRip][Vol.01][1920x1080][TW_BIG5][x264_FLAC]\[AngelSub][Hoshizora e Kakaru Hashi][BDRip][01][1920x1080][BIG5][x264_FLAC].mkv" + "H:\Anime\201901 盾の勇者の成り上がり\[LKSUB][Tate no Yuusha no Nariagari][01-25][GB][720P][MP4]\[LKSUB][Tate no Yuusha no Nariagari][01][GB][720P].mp4" + "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" + "L:\Anime\200910 アスラクライン II(機巧魔神)\[DMG][Asura Cryin2][01-13 END][848x480][BIG5][RMVB]\[DMG][Asura Cryin 2][01][848x480][Big5].rmvb" + "H:\Data\Downloads\異世界食堂\[Lilith-Raws] Isekai Shokudou S02 - 06 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4].mp4" +) +$TestName = @($Pathes | % {$_.Split("\\")[-1]}) + +$Str = $TestName[0] +$Regex = @( + "S\d{2}[\s\-]+E?(?\d{2})" + "[\[\b\s](?\d{2})[\s_]?(?:[vV]\d|END|FIN)[\]\b\s]" + "\[(?\d{1,2})\]" + #"\d" +) + +$TestName | % { Get-NameRegex $_ -Regex $Regex } \ No newline at end of file From c38a1e79170c8da93973cee11e9b709d0e78cbfb Mon Sep 17 00:00:00 2001 From: pcnick Date: Fri, 3 Dec 2021 00:03:49 +0800 Subject: [PATCH 04/10] Get-NameRegex: finish anchor split file name, and return Hash object. --- NameRegex.ps1 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NameRegex.ps1 b/NameRegex.ps1 index 5c55a25..acdf21e 100644 --- a/NameRegex.ps1 +++ b/NameRegex.ps1 @@ -11,9 +11,10 @@ if ($Str -match $_ -and($key)) { $Result = @{ $key = $Matches[$key] - anchor = $Matches[0] + # 將錨定字串中的特殊字元轉換為一般字串 + Anchor = $Matches[0] -replace "([\[\]\(\)])", '\$1' } - $LR = $Str -split $Result["anchor"] + $LR = $Str -split $Result["Anchor"] $Result.Add("L", $LR[0]) $Result.Add("R", $LR[1]) $Result From 094e1aeca70ac47c22e6d15381139cffedb8bd76 Mon Sep 17 00:00:00 2001 From: pcnick Date: Fri, 3 Dec 2021 00:16:23 +0800 Subject: [PATCH 05/10] Get-NameRegex: exist key tag in regex string , merge into one. --- NameRegex.ps1 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/NameRegex.ps1 b/NameRegex.ps1 index acdf21e..8d1f5ab 100644 --- a/NameRegex.ps1 +++ b/NameRegex.ps1 @@ -6,8 +6,11 @@ # Regex 可輸入複數個 Write-Host $Str $Regex | % { - $key = if ($_ -match "\(\?\<(.*?)\>") { $Matches[1] } - if (-not($key)) { Write-Error "$_ 沒有定義(?)" } + $key = if ($_ -match "\(\?\<(.*?)\>") { + $Matches[1] + } else { + Write-Error "$_ 沒有定義(?)" + } if ($Str -match $_ -and($key)) { $Result = @{ $key = $Matches[$key] From 9496b184a916c78c13d65091feb141c29c19ae4f Mon Sep 17 00:00:00 2001 From: pcnick Date: Fri, 3 Dec 2021 00:23:10 +0800 Subject: [PATCH 06/10] Get-NameRegex: add switch End, return Hash object include only regex TAG target. --- NameRegex.ps1 | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/NameRegex.ps1 b/NameRegex.ps1 index 8d1f5ab..cb47255 100644 --- a/NameRegex.ps1 +++ b/NameRegex.ps1 @@ -1,7 +1,8 @@ function Get-NameRegex { param( $Str, - $Regex + $Regex, + [switch] $End ) # Regex 可輸入複數個 Write-Host $Str @@ -17,9 +18,11 @@ # 將錨定字串中的特殊字元轉換為一般字串 Anchor = $Matches[0] -replace "([\[\]\(\)])", '\$1' } - $LR = $Str -split $Result["Anchor"] - $Result.Add("L", $LR[0]) - $Result.Add("R", $LR[1]) + if (-not($End)) { + $LR = $Str -split $Result["Anchor"] + $Result.Add("L", $LR[0]) + $Result.Add("R", $LR[1]) + } else { $Result.Remove("Anchor") } $Result } } @@ -45,4 +48,11 @@ $Regex = @( #"\d" ) -$TestName | % { Get-NameRegex $_ -Regex $Regex } \ No newline at end of file +$RS1 = $TestName | % { Get-NameRegex $_ -Regex $Regex } +$RS1 + +$NameRegex = @( + "[\[\b\s](?[^\[\]]*)[\]\b\s]?$" +) + +$RS1 | % { Get-NameRegex $_["L"] -Regex $NameRegex -End } \ No newline at end of file From 404b4d41a30d42d82efcb684c85237e7ee617686 Mon Sep 17 00:00:00 2001 From: pcnick Date: Sat, 4 Dec 2021 23:50:50 +0800 Subject: [PATCH 07/10] Get-NameRegex: finish parameter Exclude feature, modify process code to scriptblock for recurse --- NameRegex.ps1 | 58 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/NameRegex.ps1 b/NameRegex.ps1 index cb47255..d609753 100644 --- a/NameRegex.ps1 +++ b/NameRegex.ps1 @@ -2,30 +2,49 @@ param( $Str, $Regex, + $Exclude, [switch] $End ) - # Regex 可輸入複數個 - Write-Host $Str - $Regex | % { - $key = if ($_ -match "\(\?\<(.*?)\>") { - $Matches[1] - } else { - Write-Error "$_ 沒有定義(?)" - } - if ($Str -match $_ -and($key)) { - $Result = @{ - $key = $Matches[$key] - # 將錨定字串中的特殊字元轉換為一般字串 - Anchor = $Matches[0] -replace "([\[\]\(\)])", '\$1' + # 查詢 Regex 字串中定義的 TAG,並將其作為 Scriptblock + $Keyfind = { + process{ + if ($_ -match "\(\?\<(.*?)\>") { + $Matches[1] + } else { + Write-Error "$_ 沒有定義(?)" } - if (-not($End)) { - $LR = $Str -split $Result["Anchor"] + } + } + + # 將原函式轉為 Scriptblock,以方便 Exclude 功能遞迴呼叫 + $InnerScrip = { + # 取用管線傳入的 hash 進行 match + process { + $Key = $_["Regex"] | &$Keyfind + if ($_["Target"] -match $_["Regex"]) { + $Result = @{ + $Key = $Matches[$Key] + # 將錨定字串中的特殊字元轉換為一般字串 + Anchor = $Matches[0] -replace "([\[\]\(\)])", '\$1' + } + $LR = $_["Target"] -split $Result["Anchor"] $Result.Add("L", $LR[0]) $Result.Add("R", $LR[1]) - } else { $Result.Remove("Anchor") } - $Result + # 對 Anchor 結果,以 $Exclude 進行比對,符合則加入剩餘字串重新 match + if ($Exclude -and($Result["Anchor"] -match $Exclude)) { + $Result.Add("Regex", $_["Regex"]) + $Result.Add("Target", $Result["L"]) + return $Result | &$InnerScrip + } + # 結尾模式,僅輸出符合 TAGKEY 的 hash + if ($End) { return @{ $Key = $Result[$Key] } } else { return $Result } + } } } + + #Write-Host $Str + # Regex 可輸入複數個 + $Regex | % { @{ Target = $Str; Regex = $_; } } | &$InnerScrip } $Pathes = @( @@ -40,7 +59,7 @@ $Pathes = @( ) $TestName = @($Pathes | % {$_.Split("\\")[-1]}) -$Str = $TestName[0] +$Str = $TestName[3] $Regex = @( "S\d{2}[\s\-]+E?(?\d{2})" "[\[\b\s](?\d{2})[\s_]?(?:[vV]\d|END|FIN)[\]\b\s]" @@ -55,4 +74,5 @@ $NameRegex = @( "[\[\b\s](?[^\[\]]*)[\]\b\s]?$" ) -$RS1 | % { Get-NameRegex $_["L"] -Regex $NameRegex -End } \ No newline at end of file +$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) + $_ } \ No newline at end of file From 7f61ac2b556cb7de6aa4a01e6dfbb95c4f0b848b Mon Sep 17 00:00:00 2001 From: pcnick Date: Sun, 5 Dec 2021 13:12:04 +0800 Subject: [PATCH 08/10] Get-NameRegex: Covert into module file --- NameRegex.ps1 => NameRegex.psm1 | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename NameRegex.ps1 => NameRegex.psm1 (100%) diff --git a/NameRegex.ps1 b/NameRegex.psm1 similarity index 100% rename from NameRegex.ps1 rename to NameRegex.psm1 From 41f38997544f957f89c992f427836ffd9c0a8d5a Mon Sep 17 00:00:00 2001 From: pcnick Date: Sun, 5 Dec 2021 14:24:06 +0800 Subject: [PATCH 09/10] Get-NameRegex: Publish NameRegex v0.1.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 發佈 0.1.0 * 使用 RegEx TAG 進行比對,將結果以 TAG 為 Key 值,回傳 Hash 物件 * 以比對到的 TAG 為錨點,對字串進行分割並放入 Hash,以便後續比對 * -Regex: 可以 Array 傳入多個比對式,回傳適當結果 * -Exclude: 對比到的結果進行排除,直到比對不成功 * -End: 結尾模式,僅輸出符合 TAG 的 Hash 物件 --- NameRegex.psd1 | Bin 0 -> 4572 bytes NameRegex.psm1 | 32 +++----------------------------- 2 files changed, 3 insertions(+), 29 deletions(-) create mode 100644 NameRegex.psd1 diff --git a/NameRegex.psd1 b/NameRegex.psd1 new file mode 100644 index 0000000000000000000000000000000000000000..c88caf6a03eeefe7168f4ef27ce46cd7582215be GIT binary patch literal 4572 zcmb_gU2IcT96v0XV`FnZCSJUweCGBA2f5-QbtU$gB0<8NPG2+e+he1D0@=i6rf81b<1^jk}+v*brh-*o(OI zVr+)*3B=usuOuyPlV#GIOIzYQLY~RXV?w)D>mg{4LplOW(Si*VYlgOF#9FGcCGe*& zmsVI0bFc&OECL^eWTIeoKQs-)qki?9SM^+jJTWNWe}t1@s7quT)WlF$DU(e%X2k%L>DjE)?%id{E+RgW4-sMz77?6#q31c@d93DZMTPRj+WEo z%DJs|gYk(+gX9hAi9tgg`47RXWWgr`5WEe)BvMO}-Hb0nQ=7LoRKNH%zivH}V!Xy) zH@MASWzx6a=Ka=p!TP>^0oeVF44z#e%KD_}uJqpypd&ravkEY#?RCyah+xEjX@Rt({(8SxxoPK-M6MKJ3qX2ije z3L}52O#VTOZG7mx@E!iEqX8AwtBu0`o(pCz@!F6jAQ-3#@@8nFj0JFCuD|jqB%ZkS z$yr0{VxHyya&=85`ffWEaLazy1vaJiuv&kGrb_&h+#x*coqQx2KJgNFQS@j(|Nv|8TF*x9nSd>qHfQeea=P2G zLK3hy48|RTMPiOhEf`!UoVOg+U>}OX$f?4ji=G>xtcniUiaZwa<d;zyV~A!*Q#~gbIi^OodV4Q~8$B!8>rfFgjJ26WHY>N8ou(RI ziYdA~jg}G|=xH_b8sED|JGt0h{QTM%aWSI1tUs-6;=}+juHA8zuX=X+qDL@Oi{l>9 zv|wxWRGBWt;)(Mf7D`wxfrW|s#jE*6`$?-IwIgRpxsL9)JL3}C7$5h|Z9tDB4?BSRsJfcu{)OT^fE{B@&1tcpZeOx9Sn8z$j-ho- zd$c6*w>p1Iwdr}TwI*s_sn?PhL}v1*#{!gzLqHGp?|yY%QqBHrCbrlcoU4tWbm&Fh zu5v~{yjzWj)O8%Fm%^^h%tj?r&Cu#o&kV%4#IAyW_4BZt55*pzu)oHAeahfseDtkO zPWvmdD(KWv*K2@7(|P zBj?E{%@>wC`IN72kaE$B`gGmzW^$f<(tN5jp){(lh+Z{6!q!#|Ur7o16qeSyE#XeS z53KoV=KJwVtchL80PNBJ<6*4*!oyQCw)L*P$1AaR5LW0k`Y?86L-#V(*Aeo5Hgmez4|5_x~bLud(_9F)W5)HI^wP?*0{txgkfsL!5 literal 0 HcmV?d00001 diff --git a/NameRegex.psm1 b/NameRegex.psm1 index d609753..81ca2a8 100644 --- a/NameRegex.psm1 +++ b/NameRegex.psm1 @@ -47,32 +47,6 @@ $Regex | % { @{ Target = $Str; Regex = $_; } } | &$InnerScrip } -$Pathes = @( - "L:\Anime\201110 WORKING’!!\[#CHAT RUMBLE#][WORKING’!!][01-13 END][BIG5][x264_aac][1280x720]\[#CHAT RUMBLE#][WORKING’!!][13][BIG5][x264_aac][1280x720][11C6E807].mp4" - "L:\Anime\200910 にゃんこい!(貓願三角戀)\[DMG][Nyan Koi!][01-12 END][848x480][BIG5]\[DMG][Nyan Koi!][12 end][848x480][BIG5].rmvb" - "L:\Anime\200910 聖剣の刀鍛冶(聖劍鍛造師)\[DMG][The Sacred Blacksmith][01-12 END][848x480][BIG5]\[DMG][The Sacred Blacksmith][04V2][848x480][BIG5].rmvb" - "L:\Anime\201104 星空へ架かる橋(架向星空之橋)\[AngelSub][Hoshizora e Kakaru Hashi][BDRip][Vol.01][1920x1080][TW_BIG5][x264_FLAC]\[AngelSub][Hoshizora e Kakaru Hashi][BDRip][01][1920x1080][BIG5][x264_FLAC].mkv" - "H:\Anime\201901 盾の勇者の成り上がり\[LKSUB][Tate no Yuusha no Nariagari][01-25][GB][720P][MP4]\[LKSUB][Tate no Yuusha no Nariagari][01][GB][720P].mp4" - "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" - "L:\Anime\200910 アスラクライン II(機巧魔神)\[DMG][Asura Cryin2][01-13 END][848x480][BIG5][RMVB]\[DMG][Asura Cryin 2][01][848x480][Big5].rmvb" - "H:\Data\Downloads\異世界食堂\[Lilith-Raws] Isekai Shokudou S02 - 06 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4].mp4" -) -$TestName = @($Pathes | % {$_.Split("\\")[-1]}) - -$Str = $TestName[3] -$Regex = @( - "S\d{2}[\s\-]+E?(?\d{2})" - "[\[\b\s](?\d{2})[\s_]?(?:[vV]\d|END|FIN)[\]\b\s]" - "\[(?\d{1,2})\]" - #"\d" -) - -$RS1 = $TestName | % { Get-NameRegex $_ -Regex $Regex } -$RS1 - -$NameRegex = @( - "[\[\b\s](?[^\[\]]*)[\]\b\s]?$" -) - -$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) + $_ } \ No newline at end of file +# 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) + $_ } \ No newline at end of file From 210f2065e15bf2fb13261d1685b54658215d9bed Mon Sep 17 00:00:00 2001 From: pcnick Date: Mon, 6 Dec 2021 23:39:15 +0800 Subject: [PATCH 10/10] Anime Link Libary: update main program, and remove useless codes. --- Animelibk.ps1 | 79 ++++++++++++++------------------------------------ NameRegex.psm1 | 35 +++++++++++++++++++++- 2 files changed, 56 insertions(+), 58 deletions(-) diff --git a/Animelibk.ps1 b/Animelibk.ps1 index 3527450..d4778a1 100644 --- a/Animelibk.ps1 +++ b/Animelibk.ps1 @@ -6,6 +6,7 @@ [switch] $Sub ) Import-Module -Name ($PSScriptRoot + "\PathChar.psd1") +Import-Module -Name ($PSScriptRoot + "\NameRegex.psd1") Edit-PathChar $Path #$TargetName = "俺だけ入れる隠しダンジョン〜こっそり鍛えて世界最強〜"; $TargetName = "" @@ -44,8 +45,6 @@ $WorkData $Seasons_TC = "", "第一季", "第二季", "第三季", "第四季", "第五季" $Year = @($($JsonPath -replace '.*\\((?\d{4})?(?\d{2})?).*$', '${Y}'), $(get-date -Format 'yyyy')) | ? {-not([string]::IsNullOrEmpty($_))} | Select -First 1 -#$($JsonPath -replace '.*\\((?\d{4})?(?\d{2})?).*$', '${Y}'); - # 取得目標資料夾是否存在,不存在建立資料夾,並取得資料夾物件 $LinkPath = "{2}\{0}\{1}" -f $WorkData.DestinName, $Seasons_TC[$WorkData.Season], $Index $LinkDir = $(if (-not(Test-Path -Path "$LinkPath*")) { @@ -66,61 +65,27 @@ function Get-StandName { } else { Get-Item -Path $(Edit-PathChar $FileObj) }) - + # 因應檔名不同而設定多組正規方式 - $Result = @($( - #$($TestName[-1] -match "\[([^\]]*)\]\[(\d{1,2})\]") - #$($File.Name -match "[\[\s]([^\]]*?)(?:[\]\[\-\s]+)(\d{1,2})[\]\s]") - #$($File.Name -match "[\[\s](?\b[^\]]*\b)(?:[\]\[\-\s]+)(?\d{1,2})(?:[vV]\d|FIN|END)?[\]\s]") - $($($File.Name -replace "\[(DVD|HDTV|BD)rip\]", '') -match "[\[\s](?\b[^\]]*\b)(?:[\]\[\-\s]+)(?\d{1,2})(?:_?[vV]\d|FIN|END)?[\]\s]") - #$($TestName[-1] -match "[\[\s](?[^\]]*?)(?:[\]\[\-\s]+)(?\d{1,2})(?:[vV]\d)?[\]\s]") - ) | % { if ($_) { $Matches }}) + $EpisodeRegex = @( + "S\d{2}[\s\-]+E?(?\d{2})" + "[\[\b\s](?\d{2})[\s_]?(?:[vV]\d|END|FIN)[\]\b\s]" + "\[(?\d{1,2})\w{2}\]" + "\[(?\d{1,2})\]" + ) + + $NameRegex = @( + "[\[\b\s](?[^\[\]]*)[\]\b\s]$" + ) - # 檔名分析測試用 -# $Pathes = @( -# "L:\Anime\200910 聖剣の刀鍛冶(聖劍鍛造師)\[DMG][The Sacred Blacksmith][01-12 END][848x480][BIG5]\[DMG][The Sacred Blacksmith][04V2][848x480][BIG5].rmvb" -# "L:\Anime\201104 星空へ架かる橋(架向星空之橋)\[AngelSub][Hoshizora e Kakaru Hashi][BDRip][Vol.01][1920x1080][TW_BIG5][x264_FLAC]\[AngelSub][Hoshizora e Kakaru Hashi][BDRip][01][1920x1080][BIG5][x264_FLAC].mkv" -# "H:\Anime\201901 盾の勇者の成り上がり\[LKSUB][Tate no Yuusha no Nariagari][01-25][GB][720P][MP4]\[LKSUB][Tate no Yuusha no Nariagari][01][GB][720P].mp4" -# "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" -# "L:\Anime\200910 アスラクライン II(機巧魔神)\[DMG][Asura Cryin2][01-13 END][848x480][BIG5][RMVB]\[DMG][Asura Cryin 2][01][848x480][Big5].rmvb" -# "H:\Data\Downloads\異世界食堂\[Lilith-Raws] Isekai Shokudou S02 - 06 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4].mp4" -# ) -# $TestName = @($Pathes | % {$_.Split("\\")[-1]}) -# $Result = @( $TestName | % { @( - #$($_ -match "\[([^\]]*)\]\[(\d{1,2})\]") -# $($($_ -replace "\[(DVD|HDTV|BD)rip\]", '') -match "[\[\s](?\b[^\]]*\b)(?:[\]\[\-\s]+)(?\d{1,2})(?:[vV]\d|FIN|END)?[\]\s]") -# ) | % { if ($_) { $Matches }}}) -# Write-Output $Result -# $Matches + $Result = $File.Name | % { Get-NameRegex $_ -Regex $EpisodeRegex } | % { $(Get-NameRegex $_["L"] -Regex $NameRegex -Exclude "(BD|DVD|HDTV)RIP" -End) + $_ } - - # OLD Edition - #$File.Name -match "\[([^\]]*)\]\[(\d{1,2})\]" | Out-Null - #$Matches - #$newName = "{0} S{3:00}E{1}{2}" -f $Matches[1], $Matches[2], $File.Extension, $Season; - #$newName = "{0} S{3:00}E{1}{2}" -f $Result[1], $Result[2], $File.Extension, $WorkData.Season; - # 建立回傳資料物件,以方便後續資料處理。 $OutputData = "" | Select newName, Season, Episode, newFullName; $OutputData.newName = $Result.Name; $OutputData.Season = $WorkData.Season; $OutputData.Episode = [int] $Result.Episode; $OutputData.newFullName = "{0} S{3:00}E{1}{4}{2}" -f $Result.Name, $Result.Episode, $File.Extension, $WorkData.Season, $(if($Sub) {".default"}); - #$OutputData | ConvertTo-Json; - - # Type 2,在輸出顯示上,此型態建立較傾向 Hash,而上面 select 建立的,較偏向 pscustomobject - #$OutputData2 = @{ - # newName = $Result[1]; - # Season = [int] $WorkData.Season; - # Episode = [int] $Result[2]; - # newFullName = "{0} S{3:00}E{1}{2}" -f $Result[1], $Result[2], $File.Extension, $WorkData.Season; - #}; - #$OutputData2 | ConvertTo-Json; - - #Write-Output $File; - #Write-Output $File.Name; - #Write-Output $newName; - #return $newName; return $OutputData; } @@ -180,8 +145,8 @@ exit 0; # SIG # Begin signature block # MIIFxwYJKoZIhvcNAQcCoIIFuDCCBbQCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR -# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUDqcimTh1uRkBM2wZ3oxWPCw2 -# SQ+gggNSMIIDTjCCAjagAwIBAgIQdMnAQ4BDAo9Lgfn+QeDdhjANBgkqhkiG9w0B +# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUoj6O9AeGdF5M/FWDj5z18zw0 +# 4JqgggNSMIIDTjCCAjagAwIBAgIQdMnAQ4BDAo9Lgfn+QeDdhjANBgkqhkiG9w0B # AQUFADAqMRMwEQYDVQQDDApOaWNrIENoYW5nMRMwEQYDVQQKDAplYXJpY2sub3Jn # MB4XDTIxMTAzMTEwMDI1MVoXDTIyMTAzMTEwMjI1MVowMzEiMCAGCSqGSIb3DQEJ # ARYTcGNuaWNrMTAwQGdtYWlsLmNvbTENMAsGA1UEAwwETmljazCCASIwDQYJKoZI @@ -202,11 +167,11 @@ exit 0; # AgEBMD4wKjETMBEGA1UEAwwKTmljayBDaGFuZzETMBEGA1UECgwKZWFyaWNrLm9y # ZwIQdMnAQ4BDAo9Lgfn+QeDdhjAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEK # MAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3 -# AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUZ98/I+dj0JylJtNV -# 6S37dg5/QPEwDQYJKoZIhvcNAQEBBQAEggEABCrG4XNbnCRBIlDyHFCXMJ4vucsD -# p4roqcdLmtM/g75EEus9h/qXMF/CLbc3BDbSEHGXnEk2OO3MN7+HWUudbAxvBfUE -# z8xTGSNCoNgWhPmEj859OOCu5i7Y1XIEkF89v5nPOzblTMesSdm44FQaBtrC1bHM -# z0dx+mnz0Zak7MzWkXUnyIeoKc2vM4eGlR/pBxXO7n5ycp70lL5rRWX9eVTT4r96 -# dW7ZUpL9Gwcq0PHLNg7rFgUmLSkMO3jUiIat0DBSJGkzUfVUhfpIPkG77auVLJKR -# YdfUqFL+zrq6GhSrKsD7cz5GC4I9RuaFuykGDqW6aZ93PSRlXxmw32GVvQ== +# AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUZh3cBrwgHvdFbQwV +# WcdOMvw1legwDQYJKoZIhvcNAQEBBQAEggEAGR0QzX3t1drjorcTh759QopFrvNd +# bb9VtZx5OJsLD8/v4YuNBB0IYT+03OSK7jWyIyH5OEj/jTn/Uj1WG37vu/GDdsmm +# dp/3PWziGclgh0QrJmZjQPavqFXHpUrRCIQqT2J9Er4zMf95zWEu1Zsgpb/DNJqu +# 4gz5d7Yn+wllud0DuOiQDwz9fpSz+lgMhMybqR+wsW8ROLvzCuTHJaNvKffm7vFG +# NjbwZccH9xULGbAakX6H2lbcaMqGlkLYVkP3FRmk2zTG+qR4jxHzYhsttKb2ClSt +# L2qRWv7KJCPnw4RpFx/+L9buDHH25QERiINEOPF/pfpqHhaENTolaUe7vg== # SIG # End signature block diff --git a/NameRegex.psm1 b/NameRegex.psm1 index 81ca2a8..4020d82 100644 --- a/NameRegex.psm1 +++ b/NameRegex.psm1 @@ -49,4 +49,37 @@ # 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) + $_ } \ No newline at end of file +# $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