ruby-robotの夢

cygwin-ruby,qgisの達人を目指す奮闘記

Google翻訳の使い方と注意(1)

仕事がら、翻訳をよく使う。
中でも、PDFが多い。
PDFの中身を上手く翻訳するのは、結構手間がかかる。
有料サービスは多いが、今時点で、追加出費無しで、最適な方法を考えてみた。

とはいっても、MS-Officeとacrobat-DC Standardは導入済みである。
Google Cloud Translate APIも導入済み。(ただし、50万文字/日以上の有料にはしたくない。)
対象は、英語を中心にその他欧州語である。

Google翻訳サイトの文字張り付け

 サイトに文字を入れて翻訳。は誰でも知っている当たり前な方法だ。
 結果をワードに貼る。
 これは、5000文字まで。
 チョットした文書を翻訳するとなると、すぐに数万文字だ。
 PDFからコピーしたテキストを張り付けると、改行も入る。
 目次だけでも、膨大なスペース文字や、・・・とか、---とかある。

 ×:手でやったら結構大変な作業になる。
 少なくとも、前処理として、エディタで一括でできることはやるとしても、
 これは原始的な方法である。

②テキストフィルタ+Word

 1)Python-PyPDF2でテキストを取り出す。改行をスペースでつなぐ。
  ただし、行頭大文字とか、セクション記号、末尾文字が「.」では改行を残す。
  不要なスペース等を取り除く。そこそこ考えることがある。
  このコード(現在は機能は乏しい)を下に紹介する。
 2)これをワードに張り付ける。それをMS-translateする。
 
 □:文章だけの場合は、そこそこ楽である。ただ、MS-Translateは少し劣る。

Python+PDF+Googleドキュメント翻訳

 1)②の1)に同じ
 2)テキストを、sakura-editor(UTFエディタ)からPDFに出力する。
 3)原文テキストPDFを、Google翻訳サイトのドキュメント翻訳にアップして、翻訳PDFを受け取る。
 4)翻訳テキストPDFをwordに張り付ける。
 Googleのドキュメント翻訳は、1MBまで。という制限があるが、

 △:さすがにかなり楽である。文章だけのPDFなので、1MBは、100万文字以上に相当し、
 大量の翻訳を簡単にしてくれる。
 しかし、図やレイアウトは無いので、図を読むときは、苦労する。

AcrobatでPDF分割-Googleドキュメント翻訳

 ドキュメント翻訳は、1MBまでなので、レイアウト付きPDFを1MBに分割してやるものだ。
 1)Acrobatで、事前に容量圧縮した上で、
  「ページ整理」-「分割」-「ファイルサイズ分割」-「1MB」で、
  自動的に分割してくれる。有難い
 2)分割した原文レイアウト付きPDFの文書をGoogleドキュメント翻訳にアップして、翻訳PDFを受け取る。
 3)PDFをAcrobatで結合してワード出力

 〇:レイアウトの調整は必要であるが、すばらしい。
 1MBなので、容量大きいと、大変になるが、これがよさそうだ。
 
 Python-Seleniumが使えると、自動化できるのだが。(今の環境では使えない)
 ここで、Googleのドキュメント翻訳はかなりの精度だと思うが、
 ワードで体裁を整えていると、変なことに気づいた。
 なぜか、行間隔が揃わない。
 揃わないところをよく見ると、ところどころ、フォントの異なる文字がある。
 行、流、年、路、・・・この文字を、打ち直してみると、解消する。
 全部合わせると、1/100くらいの頻度か。これを手で治すのは大変だ。
 調べてみると、UTFのCJK互換漢字というものだそうだ。日本語もあるが、大陸・半島の様々な漢字が含まれるようだ。
 FE30~FE4F CJK Compatibility Forms CJK互換形
Unicode 区画一覧 Unicode Blocks
 
 ワードVBAで、互換漢字から通常漢字に変換することにした。
これを変換する方法を書いたものが見当たらない。

www.tamasoft.co.jp
 に出てくる互換漢字の文字を 画像出力して、それを日本語にOCR読み取りすると、
 対応する通常文字が分かるだろう。
 acrobatで読み取った。そのデータを下に示そう。
 しかし、これでもまだ例外が残っていた。
⾼ 12220 0x2fbc 普通でない
高 39640 0x9ad8
⽤ 12132 0x2f64 普通でない
用 29992 0x7528

これらは、CJK互換漢字補助というらしい。
先に言ってよ~。
CJK互換漢字補助 - Wikipedia

さらに、これだけではない。
翻訳のぶれ、丁寧体も常体に変えたい。
結構大変だ。

pythonテキストフィルタコード

<||
VBA文字変換コード
>|vb|
Sub conv_cjk_gokan()
  normls = Array(12539, 12539, 12539, 12539, 32716, 26356, 36554, 36067, 28369, 20018, 21477, 40372, 36655, 22865, 37329, 21083, 22856, 22136, 30178, 36493, _
    35207, 34746, 35064, 36889, 27005, 27931, 28889, 28889, 33853, 37226, 30053, 32996, 21365, 27396, 27396, 34349, 40478, 23888, 28651, 34253, _
    27323, 25289, 33050, 34829, 24266, 26391, 28010, 29436, 37070, 26463, 20919, 21218, 29136, 27347, 29179, 24942, 32769, 34214, 34396, 36335, _
    38706, 39791, 40442, 32209, 32209, 32209, 33713, 37682, 40575, 35542, 32894, 24324, 31840, 32894, 29282, 33948, 36034, 38647, 22696, 23649, _
    27387, 28057, 28431, 32047, 31968, 26194, 21202, 32907, 20956, 20940, 32190, 32190, 33777, 38517, 35712, 25711, 27005, 35582, 20025, 23527, _
    24594, 29575, 30064, 21271, 25773, 20415, 24489, 19981, 27852, 25975, 32034, 21442, 22622, 30465, 33865, 35500, 27578, 36784, 27784, 25342, _
    33509, 25504, 30053, 20142, 38632, 28092, 26753, 31975, 33391, 35538, 37327, 21169, 21570, 22899, 24235, 26053, 28670, 30959, 38291, 40599, _
    40599, 40654, 21147, 26278, 27508, 27508, 24180, 24976, 25080, 25754, 28451, 29001, 36899, 23395, 32244, 32879, 25711, 34030, 36899, 37676, _
    21015, 21155, 21693, 28872, 35010, 35500, 24265, 24565, 25467, 27530, 31806, 39234, 20196, 22238, 23527, 23994, 24604, 29618, 34722, 29618, _
    37428, 37428, 38646, 30590, 38936, 20363, 31150, 31150, 38583, 24746, 20102, 20698, 23534, 23615, 26009, 27005, 29134, 30274, 34044, 36988, _
    40845, 30050, 38498, 21129, 19985, 26611, 27969, 28316, 29705, 30041, 30827, 32016, 39006, 20845, 35672, 38520, 20523, 35028, 20523, 36650, _
    24459, 24900, 26647, 29575, 38477, 21033, 21519, 23653, 26131, 26446, 26792, 27877, 29702, 30178, 32633, 35023, 35041, 37324, 38626, 21311, _
    28346, 21533, 29136, 38563, 34349, 38563, 40023, 40607, 26519, 28107, 33256, 31435, 31520, 31890, 21536, 28814, 35672, 20160, 33590, 21050, _
    20999, 24230, 25299, 31958, 23429, 27934, 26292, 36667, 34892, 38477, 35211, 24275, 20960, 27579, 38617, 35029, 22618, 23822, 30555, 26786, _
    26771, 29013, 29482, 30406, 36555, 32051, 35443, 24133, 38742, 31934, 21033, 34276, 33870, 34521, 35576, 36211, 36820, 36920, 37117, 37502, _
    34394, 24184, 38346, 39151, 39164, 39208, 40372, 12539, 20398, 20711, 20813, 21193, 21220, 21329, 21917, 22022, 22120, 22592, 22696, 23652, _
    20013, 24724, 24936, 24974, 25074, 25935, 26082, 26257, 26676, 28023, 28186, 28450, 29038, 12510, 29730, 30865, 31038, 31049, 31048, 31056, _
    31062, 31069, 31117, 31118, 31296, 31361, 31680, 32244, 32121, 32321, 32626, 32773, 33261, 20219, 19985, 33879, 35088, 35222, 35585, 35641, _
    36051, 26371, 36947, 36920, 38627, 38911, 38971, 24693, 29013, 33304, 12539, 12539, 12539, 12539, 12539, 12539, 12539, 12539, 12539, 12539)

  istt = Selection.Start
  s_range = Selection.Range
  nlen = Len(s_range)
  i_gokan0 = 63740
  For j = 1 To Len(s_range)
    moji = Mid(s_range, j, 1)
    iutf = AscW(moji)
    If iutf < 0 Then
      iutf = iutf + 65536
    End If
    If (iutf >= i_gokan0 And iutf < 64120) Then
        jutf = normls(iutf - i_gokan0)
        nrm = ChrW(jutf)
        ActiveDocument.Range(istt + j - 1, istt + j).Text = nrm
    End If
  Next
End Sub

<||
 
互換文字⇒通常文字テーブル作成
(OCRの結果を少し直したが、完全ではない) 
>|python|
#CJK互換漢字
gokanstr="""63740豈更車賈滑串句龜龜契金喇奈懶癩羅
63760蘿螺裸邏樂洛烙珞落酪駱亂卵欄爛蘭鸞嵐濫藍
63780襤拉臘蠟廊朗浪狼郎來冷勞擄櫓爐盧老蘆虜路
63800露魯鷺碌祿綠菉錄鹿論壟弄籠聾牢磊賂雷壘屢
63820樓淚漏累縷陋勒肋凜凌稜綾菱陵讀拏樂諾丹寧
63840怒率異北磻便復不泌數索參塞省葉說殺辰沈拾
63860若掠略亮兩凉梁糧良諒量勵呂女廬旅濾礪閭驪
63880麗黎力曆歷轢年憐戀撚漣煉璉秊練聯輦蓮連鍊
63900列劣咽烈裂說廉念捻殮簾獵令囹寧嶺怜玲瑩羚
63920聆鈴零靈領例禮醴隸惡了僚寮尿料樂燎療蓼遼
63940龍暈阮劉杻柳流溜琉留硫紐類六戮陸倫崙淪輪
63960律慄栗率隆利吏履易李梨泥理痢罹裏裡里離匿
63980溺吝燐璘藺隣鱗麟林淋臨立笠粒狀炙識什茶刺
64000切度拓糖宅洞暴輻行降見廓兀嗀﨎﨏塚﨑晴﨓
64020﨔凞猪益礼神祥福靖精羽﨟蘒﨡諸﨣﨤逸都﨧
64040﨨﨩飯飼館鶴郞隷侮僧免勉勤卑喝嘆器塀墨層
64060屮悔慨憎懲敏既暑梅海渚漢煮爫琢碑社祉祈祐
64080祖祝禍禎穀突節練縉繁署者臭艹艹著褐視謁謹
64100賓贈辶逸難響頻恵𤋮舘﩮﩯並况全侀充冀勇勺
"""
#OCR通常漢字
normlstr="""63740・・・・翌更車賣滑串句鶴輯契金剛奈噸痢躍
63760覇螺裸這楽洛烙烙落酪略胤卵欄欄蘭鸞嵐濫藍
63780檻拉脚蠍廊朗浪狼郎束冷勢燐櫓燻慮老薦虜路
63800露魯鷺緑緑緑莱録鹿論聾弄籠聾牢蒜賂雷墨屡
63820櫻涙漏累糠晒勒肋凜凌綾綾菱陵讀摯楽諾丹寧
63840怒率異北播便復不泌敷索参塞省葉説殺辰沈拾
63860若掠略亮雨涼梁糧良諒量励呂女庫旅濾磯間麗
63880麗黎力暦歴歴年憐懸撚漣煉連季練聯摯蓮連錬
63900列劣咽烈裂説廉念捻殊簾饂令回寧嶺怜玲螢玲
63920鈴鈴零睾領例禮禮隷悪了僚寮尿料楽燎療蓼遼
63940龍畢院劉丑柳流溜琉留硫紐類六識陸倫裔倫輪
63960律慄栗率降利吏履易李梨泥理痢罹裏裡里離匿
63980溺吝燐隣蘭隣鱗麟林淋臨立笠粒吠炎識什茶刺
64000切度拓糖宅洞暴輻行降見廓几殻雙裕塚崎睛梢
64020梓煕猪盆軋紳詳幅靖精利藤葎蛙諸赳返逸都鉾
64040虚幸闊飯飼館鶴・侮僧免勉勤卑喝嘆器塀墨層
64060中悔慨憎懲敏既暑栴海渚漢煮マ琢碑社祉祈祐
64080祖祝禍禎穀突節練絹繁署者臭任丑著褐視謁謹
64100賓會道逸難響頻恵煕舘・・・・・・・・・・
"""
import numpy as np
gokans=np.array(list(gokanstr)).reshape(-1,26).tolist()
normls=np.array(list(normlstr)).reshape(-1,26).tolist()
gokans=list(x[5:25] for x in gokans )
normls=list(x[5:25] for x in normls )

dic={} #変換テーブル
fo=open("Txt/knj_cjk_gokan.txt","w")
print("CJK互換漢字⇒通常漢字",file=fo)
print("互換コード,互換文字,通常コード,通常文字".split(","),file=fo)
for i in range(len(gokans)):
    gs=gokans[i]
    ns=normls[i]
    print(i,gs,ns)
    for j in range(len(gs)):
        g=gs[j]
        n=ns[j]
        dic[g]=n  
        print(ord(g),g,ord(n),n,file=fo)
fo.close
>||
CJK互換漢字に対応した通常漢字のコードリストを示す。(改善の余地あり)
12539 12539 12539 12539 32716 26356 36554 36067 28369 20018
21477 40372 36655 22865 37329 21083 22856 22136 30178 36493
35207 34746 35064 36889 27005 27931 28889 28889 33853 37226
30053 32996 21365 27396 27396 34349 40478 23888 28651 34253
27323 25289 33050 34829 24266 26391 28010 29436 37070 26463
20919 21218 29136 27347 29179 24942 32769 34214 34396 36335
38706 39791 40442 32209 32209 32209 33713 37682 40575 35542
32894 24324 31840 32894 29282 33948 36034 38647 22696 23649
27387 28057 28431 32047 31968 26194 21202 32907 20956 20940
32190 32190 33777 38517 35712 25711 27005 35582 20025 23527
24594 29575 30064 21271 25773 20415 24489 19981 27852 25975
32034 21442 22622 30465 33865 35500 27578 36784 27784 25342
33509 25504 30053 20142 38632 28092 26753 31975 33391 35538
37327 21169 21570 22899 24235 26053 28670 30959 38291 40599
40599 40654 21147 26278 27508 27508 24180 24976 25080 25754
28451 29001 36899 23395 32244 32879 25711 34030 36899 37676
21015 21155 21693 28872 35010 35500 24265 24565 25467 27530
31806 39234 20196 22238 23527 23994 24604 29618 34722 29618
37428 37428 38646 30590 38936 20363 31150 31150 38583 24746
20102 20698 23534 23615 26009 27005 29134 30274 34044 36988
40845 30050 38498 21129 19985 26611 27969 28316 29705 30041
30827 32016 39006 20845 35672 38520 20523 35028 20523 36650
24459 24900 26647 29575 38477 21033 21519 23653 26131 26446
26792 27877 29702 30178 32633 35023 35041 37324 38626 21311
28346 21533 29136 38563 34349 38563 40023 40607 26519 28107
33256 31435 31520 31890 21536 28814 35672 20160 33590 21050
20999 24230 25299 31958 23429 27934 26292 36667 34892 38477
35211 24275 20960 27579 38617 35029 22618 23822 30555 26786
26771 29013 29482 30406 36555 32051 35443 24133 38742 31934
21033 34276 33870 34521 35576 36211 36820 36920 37117 37502
34394 24184 38346 39151 39164 39208 40372 12539 20398 20711
20813 21193 21220 21329 21917 22022 22120 22592 22696 23652
20013 24724 24936 24974 25074 25935 26082 26257 26676 28023
28186 28450 29038 12510 29730 30865 31038 31049 31048 31056
31062 31069 31117 31118 31296 31361 31680 32244 32121 32321
32626 32773 33261 20219 19985 33879 35088 35222 35585 35641
36051 26371 36947 36920 38627 38911 38971 24693 29013 33304
12539 12539 12539 12539 12539 12539 12539 12539 12539 12539


**CJK互換漢字補助
ブロック
CJK互換漢字補助(CJKCompatibilityIdeographsSupplement)[1][2]
0123456789ABCDEF
U+2F80x丽丸乁𠄢你侮侻倂偺備僧像㒞𠘺免兔
U+2F81x兤具𠔜㒹內再𠕋冗冤仌冬况𩇟凵刃㓟
U+2F82x刻剆割剷㔕勇勉勤勺包匆北卉卑博即
U+2F83x卽卿卿卿𠨬灰及叟𠭣叫叱吆咞吸呈周
U+2F84x咢哶唐啓啣善善喙喫喳嗂圖嘆圗噑噴
U+2F85x切壮城埴堍型堲報墬𡓤売壷夆多夢奢
U+2F86x𡚨𡛪姬娛娧姘婦㛮㛼嬈嬾嬾𡧈寃寘寧
U+2F87x寳𡬘寿将当尢㞁屠屮峀岍𡷤嵃𡷦嵮嵫
U+2F88x嵼巡巢㠯巽帨帽幩㡢𢆃㡼庰庳庶廊𪎒
U+2F89x廾𢌱𢌱舁弢弢㣇𣊸𦇚形彫㣣徚忍志忹
U+2F8Ax悁㤺㤜悔𢛔惇慈慌慎慌慺憎憲憤憯懞
U+2F8Bx懲懶成戛扝抱拔捐𢬌挽拼捨掃揤𢯱搢
U+2F8Cx揅掩㨮摩摾撝摷㩬敏敬𣀊旣書晉㬙暑
U+2F8Dx㬈㫤冒冕最暜肭䏙朗望朡杞杓𣏃㭉柺
U+2F8Ex枅桒梅𣑭梎栟椔㮝楂榣槪檨𣚣櫛㰘次
U+2F8Fx𣢧歔㱎歲殟殺殻𣪍𡴋𣫺汎𣲼沿泍汧洖
U+2F90x派海流浩浸涅𣴞洴港湮㴳滋滇𣻑淹潮
U+2F91x𣽞𣾎濆瀹瀞瀛㶖灊災灷炭𠔥煅𤉣熜𤎫
U+2F92x爨爵牐𤘈犀犕𤜵𤠔獺王㺬玥㺸㺸瑇瑜
U+2F93x瑱璅瓊㼛甤𤰶甾𤲒異𢆟瘐𤾡𤾸𥁄㿼䀈
U+2F94x直𥃳𥃲𥄙𥄳眞真真睊䀹瞋䁆䂖𥐝硎碌
U+2F95x磌䃣𥘦祖𥚚𥛅福秫䄯穀穊穏𥥼𥪧𥪧竮
U+2F96x䈂𥮫篆築䈧𥲀糒䊠糨糣紀𥾆絣䌁緇縂
U+2F97x繅䌴𦈨𦉇䍙𦋙罺𦌾羕翺者𦓚𦔣聠𦖨聰
U+2F98x𣍟䏕育脃䐋脾媵𦞧𦞵𣎓𣎜舁舄辞䑫芑
U+2F99x芋芝劳花芳芽苦𦬼若茝荣莭茣莽菧著
U+2F9Ax荓菊菌菜𦰶𦵫𦳕䔫蓱蓳蔖𧏊蕤𦼬䕝䕡
U+2F9Bx𦾱𧃒䕫虐虜虧虩蚩蚈蜎蛢蝹蜨蝫螆䗗
U+2F9Cx蟡蠁䗹衠衣𧙧裗裞䘵裺㒻𧢮𧥦䚾䛇誠
U+2F9Dx諭變豕𧲨貫賁贛起𧼯𠠄跋趼跰𠣞軔輸
U+2F9Ex𨗒𨗭邔郱鄑𨜮鄛鈸鋗鋘鉼鏹鐕𨯺開䦕
U+2F9Fx閷𨵷䧦雃嶲霣𩅅𩈚䩮䩶韠𩐊䪲𩒖頋頋
U+2FA0x頩𩖶飢䬳餩馧駂駾䯎𩬰鬒鱀鳽䳎䳭鵧
U+2FA1x𪃎䳸𪄅𪈎𪊑麻䵖黹黾鼅鼏鼖鼻𪘀  
これを通常漢字に置き換えたもの。変なところもあるが、まあよい。
U+2F80x     年          免
U+2F81x      再    冬     
U+2F82x   割     勺       
U+2F83x    卿           周
U+2F84x       善         
U+2F85x   城             
U+2F86x   姫          冤  
U+2F87x    将            
U+2F88x     巽           
U+2F89x          形彫     
U+2F8Ax       慈     憲   
U+2F8Bx   成   抜         
U+2F8Cx                 
U+2F8Dx    晏            
U+2F8Ex  栞   杵    概     
U+2F8Fx             沿   
U+2F90x    浩       滋   潮
U+2F91x           炭     
U+2F92x 霙爵              
U+2F93x                 
U+2F94x      員 真        
U+2F95x                 
U+2F96x             絣   
U+2F97x                 
U+2F98x                 
U+2F99x      芽          
U+2F9Ax                 
U+2F9Bx                 
U+2F9Cx                 
U+2F9Dx 諭             靱輸
U+2F9Ex                 
U+2F9Fx     裏           
U+2FA0x                 
U+2FA1x               
部首漢字
2F00⼀⼁⼂⼃⼄⼅⼆⼇⼈⼉⼊⼋⼌⼍⼎⼏
2F10⼐⼑⼒⼓⼔⼕⼖⼗⼘⼙⼚⼛⼜⼝⼞⼟
2F20⼠⼡⼢⼣⼤⼥⼦⼧⼨⼩⼪⼫⼬⼭⼮⼯
2F30⼰⼱⼲⼳⼴⼵⼶⼷⼸⼹⼺⼻⼼⼽⼾⼿
2F40⽀⽁⽂⽃⽄⽅⽆⽇⽈⽉⽊⽋⽌⽍⽎⽏
2F50⽐⽑⽒⽓⽔⽕⽖⽗⽘⽙⽚⽛⽜⽝⽞⽟                                           
2F60⽠⽡⽢⽣⽤⽥⽦⽧⽨⽩⽪⽫⽬⽭⽮⽯
2F70⽰⽱⽲⽳⽴⽵⽶⽷⽸⽹⽺⽻⽼⽽⽾⽿
2F80⾀⾁⾂⾃⾄⾅⾆⾇⾈⾉⾊⾋⾌⾍⾎⾏
2F90⾐⾑⾒⾓⾔⾕⾖⾗⾘⾙⾚⾛⾜⾝⾞⾟
2FA0⾠⾡⾢⾣⾤⾥⾦⾧⾨⾩⾪⾫⾬⾭⾮⾯
2FB0⾰⾱⾲⾳⾴⾵⾶⾷⾸⾹⾺⾻⾼⾽⾾⾿
2FC0⿀⿁⿂⿃⿄⿅⿆⿇⿈⿉⿊⿋⿌⿍⿎⿏
2FD0⿐⿑⿒⿓⿔⿕          
通常文字
2F0O-|\ノ乙」ニ一人几入八口ワン几
2F10u刀力勺ヒココ十トロ「ム又口口土
2F20士又又夕大女子ウ寸小尤戸出山川エ
2F30己巾干壱「延升代弓ヨ三イ心伐戸手
2F40支支文斗斤方元日曰月木欠止夕又母
2F50比毛氏汽水火爪父交丹片牙牛犬玄玉
2F60瓜瓦甘生用田疋病発白皮皿自矛矢石
2F70示内禾穴立竹米糸缶閲羊羽老而未耳
2F80律肉臣自至臼舌舛舟艮色草虎虫血行
2F90衣商見角言谷豆家剪貝赤走足身車辛
2FA0辰足邑酉釆里金長門阜衷佳雨冑非面
2FB0革粛韮音頁風飛食首香馬骨高髪門琶
2FC0畠鬼魚鳥歯鹿菱麻黄黍黒誉亀鼎鼓鼠

65293 65372 65340 12494 20057 12301 12491 19968 20154 20960 20837 20843 21475 12527 12531 20960 65365 20992 21147 21242 
12498 12467 12467 21313 12488 12525 12300 12512 21448 21475 21475 22303 22763 21448 21448 22805 22823 22899 23376 12454 
23544 23567 23588 25144 20986 23665 24029 12456 24049 24062 24178 22769 12300 24310 21319 20195 24339 12520 19977 12452 
24515 20240 25144 25163 25903 25903 25991 26007 26020 26041 20803 26085 26352 26376 26408 27424 27490 22805 21448 27597 
27604 27611 27663 27773 27700 28779 29226 29238 20132 20025 29255 29273 29275 29356 29572 29577 29916 29926 29976 29983 
29992 30000 30091 30149 30330 30333 30382 30399 33258 30683 30690 30707 31034 20869 31166 31348 31435 31481 31859 31992 
32566 38322 32650 32701 32769 32780 26410 32819 24459 32905 33251 33258 33267 33276 33292 33307 33311 33390 33394 33609 
34382 34411 34880 34892 34915 21830 35211 35282 35328 35895 35910 23478 21098 35997 36196 36208 36275 36523 36554 36763 
36784 36275 37009 37193 37318 37324 37329 38263 38272 38428 34935 20339 38632 20881 38750 38754 38761 31899 38894 38899 
38913 39080 39131 39135 39318 39321 39340 39592 39640 39658 38272 29750 30048 39740 39770 40165 27503 40575 33777 40635 
40644 40653 40658 35465 20096 40718 40723 40736 40763 25998 27503 40845 20096 26371 12288 12288 12288 12288 12288 12288