perfect_dark/tools/assetmgr/mklang

1166 lines
19 KiB
Python
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
import assetmgr
import json
import os
import re
import sys
def main():
fd = open(sys.argv[1], 'r')
data = fd.read()
fd.close()
basename = os.path.basename(sys.argv[1]).replace('.json', '')
shortname = get_shortname(basename)
rows = json.loads(data)
if sys.argv[2] == 'en':
make_header(rows, shortname)
make_object(rows, basename, sys.argv[2])
def get_shortname(basename):
return re.match(r'^[a-z0-9]+', basename)[0]
def make_header(rows, shortname):
typename = 'l_%s' % shortname
enums = [row['id'] for row in rows]
filename = 'lang/%s.h' % shortname
terminator = 'L_%s_END' % shortname.upper()
start = banks.index(shortname) * 512
assetmgr.write_enums(typename, enums, filename, terminator, start=start)
def make_object(rows, basename, key):
binary = make_binary(rows, key)
zipped = assetmgr.zip(binary)
suffix = {
'en': 'E',
'gb': 'P',
'jp': 'J',
'fr': '_str_f',
'de': '_str_g',
'it': '_str_i',
'es': '_str_s',
}[key]
filename = 'files/L%s%s.o' % (basename, suffix)
assetmgr.write_object(zipped, filename)
def make_binary(rows, key):
if len(rows) == 0:
return (0).to_bytes(16, 'big')
output = bytes()
pos = len([row for row in rows if key in row]) * 4
strings = []
for index, row in enumerate(rows):
if key in row:
if row[key] is None:
output += (0).to_bytes(4, 'big')
else:
output += pos.to_bytes(4, 'big')
if os.environ['ROMID'] == 'jpn-final' and key == 'jp':
string = encode_jp(row[key])
else:
string = row[key].encode('latin_1')
strings.append(string)
pos += assetmgr.align4(len(string) + 1)
for string in strings:
output += string
amount = 4 - (len(string) % 4)
output += (0).to_bytes(amount, 'big')
if len(output) % 16:
amount = 16 - (len(output) % 16)
output += (0).to_bytes(amount, 'big')
return output
"""
The input string is UTF-8, and it needs to be re-encoded to a custom encoding.
A lookup array is used for this.
However, some UTF-8 characters appear multiple types with a different encoding.
For duplicates, we store the character in JSON as something like \habcd where
abcd is the target value in hex.
"""
def encode_jp(string):
outbytes = bytes()
i = 0
while i < len(string):
if string[i] in jpnchars:
outbytes += jpnchars[string[i]].to_bytes(2, 'big')
i += 1;
else:
match = re.match(r'^\\h([a-z0-9]{4})', string[i:])
if match:
dec = int(match[1], 16)
outbytes += dec.to_bytes(2, 'big')
i += 6;
else:
outbytes += ord(string[i]).to_bytes(1, 'big')
i += 1;
return outbytes
banks = [
'',
'ame',
'arch',
'ark',
'ash',
'azt',
'cat',
'cave',
'arec',
'crad',
'cryp',
'dam',
'depo',
'dest',
'dish',
'ear',
'eld',
'imp',
'jun',
'lee',
'len',
'lip',
'lue',
'oat',
'pam',
'pete',
'ref',
'rit',
'run',
'sevb',
'sev',
'sevx',
'sevxb',
'sho',
'silo',
'stat',
'tra',
'wax',
'gun',
'title',
'mpmenu',
'propobj',
'mpweapons',
'options',
'misc',
'uff',
'old',
'ate',
'lam',
'mp1',
'mp2',
'mp3',
'mp4',
'mp5',
'mp6',
'mp7',
'mp8',
'mp9',
'mp10',
'mp11',
'mp12',
'mp13',
'mp14',
'mp15',
'mp16',
'mp17',
'mp18',
'mp19',
'mp20',
]
jpnchars = {
' ': 0x8080,
'': 0x8081,
'': 0x8082,
'': 0x8083,
'': 0x8084,
'': 0x8085,
'': 0x8086,
'': 0x8087,
'': 0x8088,
'': 0x8089,
'': 0x808a,
'': 0x808b,
'': 0x808c,
'': 0x808d,
'': 0x808e,
' ': 0x808f,
'': 0x8090,
'': 0x8091,
'': 0x8092,
'': 0x8093,
'': 0x8094,
'': 0x8095,
'': 0x8096,
'': 0x8097,
'': 0x8098,
'': 0x8099,
'': 0x809a,
'': 0x809b,
'': 0x809c,
'': 0x809d,
'': 0x809e,
'': 0x809f,
'': 0x80a0,
'': 0x80a1,
'': 0x80a2,
'': 0x80a3,
'': 0x80a4,
'': 0x80a5,
'': 0x80a6,
'': 0x80a7,
'': 0x80a8,
'': 0x80a9,
'': 0x80aa,
'': 0x80ab,
'': 0x80ac,
'': 0x80ad,
'': 0x80ae,
'': 0x80af,
'': 0x80b0,
'': 0x80b1,
'': 0x80b2,
'': 0x80b3,
'': 0x80b4,
'': 0x80b5,
'': 0x80b6,
'': 0x80b7,
'': 0x80b8,
'': 0x80b9,
'': 0x80ba,
'': 0x80bb,
'': 0x80bc,
'': 0x80bd,
'': 0x80be,
'': 0x80bf,
'': 0x80c0,
'': 0x80c1,
'': 0x80c2,
'': 0x80c3,
'': 0x80c4,
'': 0x80c5,
'': 0x80c6,
'': 0x80c7,
'': 0x80c8,
'': 0x80c9,
'': 0x80ca,
'': 0x80cb,
'': 0x80cc,
'': 0x80cd,
'': 0x80ce,
'': 0x80cf,
'': 0x80d0,
'': 0x80d1,
'': 0x80d2,
'': 0x80d3,
'': 0x80d4,
'': 0x80d5,
'': 0x80d6,
'': 0x80d7,
'': 0x80d8,
'': 0x80d9,
'': 0x80da,
'': 0x80db,
'': 0x80dc,
'': 0x80dd,
'': 0x80de,
'': 0x80df,
'': 0x80e0,
'': 0x80e1,
'': 0x80e2,
'': 0x80e3,
'': 0x80e4,
'': 0x80e5,
'': 0x80e6,
'': 0x80e7,
'': 0x80e8,
'': 0x80e9,
'': 0x80ea,
'': 0x80eb,
'': 0x80ec,
'': 0x80ed,
'': 0x80ee,
'': 0x80ef,
'': 0x80f0,
'': 0x80f1,
'': 0x80f2,
'': 0x80f3,
'': 0x80f4,
'': 0x80f5,
'': 0x80f6,
'': 0x80f7,
'': 0x80f8,
'': 0x80f9,
'': 0x80fa,
'': 0x80fb,
'': 0x80fc,
'': 0x80fd,
'': 0x80fe,
'': 0x80ff,
'': 0x8180,
'': 0x8181,
'': 0x8182,
'': 0x8183,
'': 0x8184,
'': 0x8185,
'': 0x8186,
'': 0x8187,
'': 0x8188,
'': 0x8189,
'': 0x818a,
'': 0x818b,
'': 0x818c,
'': 0x818d,
'': 0x818e,
'': 0x818f,
'': 0x8190,
'': 0x8191,
'': 0x8192,
'': 0x8193,
'': 0x8194,
'': 0x8195,
'': 0x8196,
'': 0x8197,
'': 0x8198,
'': 0x8199,
'': 0x819a,
'': 0x819b,
'': 0x819c,
'': 0x819d,
'': 0x819e,
'': 0x819f,
'': 0x81a0,
'': 0x81a1,
'': 0x81a2,
'': 0x81a3,
'': 0x81a4,
'': 0x81a5,
'': 0x81a6,
'': 0x81a7,
'': 0x81a8,
'': 0x81a9,
'': 0x81aa,
'': 0x81ab,
'': 0x81ac,
'': 0x81ad,
'': 0x81ae,
'': 0x81af,
'': 0x81b0,
'': 0x81b1,
'': 0x81b2,
'': 0x81b3,
'': 0x81b4,
'': 0x81b5,
'': 0x81b6,
'': 0x81b7,
'': 0x81b8,
'': 0x81b9,
'': 0x81ba,
'': 0x81bb,
'': 0x81bc,
'': 0x81bd,
'': 0x81be,
'': 0x81bf,
'': 0x81c0,
'': 0x81c1,
'': 0x81c2,
'': 0x81c3,
'': 0x81c4,
'': 0x81c5,
'': 0x81c6,
'': 0x81c7,
'': 0x81c8,
'': 0x81c9,
'': 0x81ca,
'': 0x81cb,
'': 0x81cc,
'': 0x81cd,
'': 0x81ce,
'': 0x81cf,
'': 0x81d0,
'': 0x81d1,
'': 0x81d2,
'': 0x81d3,
'': 0x81d4,
'': 0x81d5,
'': 0x81d6,
'': 0x81d7,
'': 0x81d8,
'': 0x81d9,
'': 0x81da,
'': 0x81db,
'': 0x81dc,
'': 0x81dd,
'': 0x81de,
'': 0x81df,
'': 0x81e0,
'': 0x81e1,
'': 0x81e2,
'': 0x81e3,
'': 0x81e4,
'': 0x81e5,
'': 0x81e6,
'': 0x81e7,
'': 0x81e8,
'': 0x81e9,
'': 0x81ea,
'': 0x81eb,
'': 0x81ec,
'': 0x81ed,
'': 0x81ee,
'': 0x81ef,
'': 0x81f0,
'': 0x81f1,
'': 0x81f2,
'': 0x81f3,
'': 0x81f4,
'': 0x81f5,
'': 0x81f6,
'': 0x81f7,
'': 0x81f8,
'': 0x81f9,
'': 0x81fa,
'': 0x81fb,
'': 0x81fc,
'': 0x81fd,
'': 0x81fe,
'': 0x81ff,
'': 0x8280,
'': 0x8281,
'': 0x8282,
'': 0x8283,
'': 0x8284,
'': 0x8285,
'': 0x8286,
'': 0x8287,
'': 0x8288,
'': 0x8289,
'': 0x828a,
'': 0x828b,
'': 0x828c,
'': 0x828d,
'': 0x828e,
'': 0x828f,
'': 0x8290,
'': 0x8291,
'': 0x8292,
'': 0x8293,
'': 0x8294,
'': 0x8295,
'': 0x8296,
'': 0x8297,
'': 0x8298,
'': 0x8299,
'': 0x829a,
'': 0x829b,
'': 0x829c,
'': 0x829d,
'': 0x829e,
'': 0x829f,
'': 0x82a0,
'': 0x82a1,
'': 0x82a2,
'': 0x82a3,
'': 0x82a4,
'': 0x82a5,
'': 0x82a6,
'': 0x82a7,
'': 0x82a8,
'': 0x82a9,
'': 0x82aa,
'': 0x82ab,
'': 0x82ac,
'': 0x82ad,
'': 0x82ae,
'': 0x82af,
'': 0x82b0,
'': 0x82b1,
'': 0x82b2,
'': 0x82b3,
'': 0x82b4,
'': 0x82b5,
'': 0x82b6,
'': 0x82b7,
'': 0x82b8,
'': 0x82b9,
'': 0x82ba,
'': 0x82bb,
'': 0x82bc,
'': 0x82bd,
'': 0x82be,
'': 0x82bf,
'': 0x82c0,
'': 0x82c1,
'': 0x82c2,
'': 0x82c3,
'': 0x82c4,
'': 0x82c5,
'': 0x82c6,
'': 0x82c7,
'': 0x82c8,
'': 0x82c9,
'': 0x82ca,
'': 0x82cb,
'': 0x82cc,
'': 0x82cd,
'': 0x82ce,
'': 0x82cf,
'': 0x82d0,
'': 0x82d1,
'': 0x82d2,
'': 0x82d3,
'': 0x82d4,
'': 0x82d5,
'': 0x82d6,
'': 0x82d7,
'': 0x82d8,
'': 0x82d9,
'': 0x82da,
'': 0x82db,
'': 0x82dc,
'': 0x82dd,
'': 0x82de,
'': 0x82df,
'': 0x82e0,
'': 0x82e1,
'': 0x82e2,
'': 0x82e3,
'': 0x82e4,
'': 0x82e5,
'': 0x82e6,
'': 0x82e7,
'': 0x82e8,
'': 0x82e9,
'': 0x82ea,
'': 0x82eb,
'': 0x82ec,
'': 0x82ed,
'': 0x82ee,
'': 0x82ef,
'': 0x82f0,
'': 0x82f1,
'': 0x82f2,
'': 0x82f3,
'': 0x82f4,
'': 0x82f5,
'': 0x82f6,
'': 0x82f7,
'': 0x82f8,
'使': 0x82f9,
'': 0x82fa,
'': 0x82fb,
'': 0x82fc,
'': 0x82fd,
'': 0x82fe,
'': 0x82ff,
'': 0x8380,
'': 0x8381,
'': 0x8382,
'': 0x8383,
'': 0x8384,
'': 0x8385,
'': 0x8386,
'': 0x8387,
'': 0x8388,
'': 0x8389,
'': 0x838a,
'': 0x838b,
'': 0x838c,
'': 0x838d,
'': 0x838e,
'': 0x838f,
'': 0x8390,
'': 0x8391,
'': 0x8392,
'': 0x8393,
'': 0x8394,
'': 0x8395,
'': 0x8396,
'': 0x8397,
'': 0x8398,
'': 0x8399,
'': 0x839a,
'': 0x839b,
'': 0x839c,
'': 0x839d,
'': 0x839e,
'': 0x839f,
'': 0x83a0,
'': 0x83a1,
'': 0x83a2,
'': 0x83a3,
'': 0x83a4,
'': 0x83a5,
'': 0x83a6,
'': 0x83a7,
'': 0x83a8,
'': 0x83a9,
'': 0x83aa,
'': 0x83ab,
'': 0x83ac,
'': 0x83ad,
'': 0x83ae,
'': 0x83af,
'': 0x83b0,
'': 0x83b1,
'': 0x83b2,
'': 0x83b3,
'': 0x83b4,
'': 0x83b5,
'': 0x83b6,
'': 0x83b7,
'': 0x83b8,
'': 0x83b9,
'': 0x83ba,
'': 0x83bb,
'': 0x83bc,
'': 0x83bd,
'': 0x83be,
'': 0x83bf,
'': 0x83c0,
'': 0x83c1,
'': 0x83c2,
'': 0x83c3,
'': 0x83c4,
'': 0x83c5,
'': 0x83c6,
'': 0x83c7,
'': 0x83c8,
'': 0x83c9,
'': 0x83ca,
'': 0x83cb,
'': 0x83cc,
'': 0x83cd,
'': 0x83ce,
'': 0x83cf,
'': 0x83d0,
'': 0x83d1,
'': 0x83d2,
'': 0x83d3,
'': 0x83d4,
'': 0x83d5,
'': 0x83d6,
'': 0x83d7,
'': 0x83d8,
'': 0x83d9,
'': 0x83da,
'': 0x83db,
'': 0x83dc,
'': 0x83dd,
'': 0x83de,
'': 0x83df,
'': 0x83e0,
'': 0x83e1,
'': 0x83e2,
'': 0x83e3,
'': 0x83e4,
'': 0x83e5,
'': 0x83e6,
'': 0x83e7,
'': 0x83e8,
'': 0x83e9,
'': 0x83ea,
'': 0x83eb,
'': 0x83ec,
'': 0x83ed,
'': 0x83ee,
'': 0x83ef,
'': 0x83f0,
'': 0x83f1,
'': 0x83f2,
'': 0x83f3,
'': 0x83f4,
'': 0x83f5,
'': 0x83f6,
'': 0x83f7,
'': 0x83f8,
'': 0x83f9,
'': 0x83fa,
'': 0x83fb,
'': 0x83fc,
'': 0x83fd,
'': 0x83fe,
'': 0x83ff,
'': 0x8480,
'': 0x8481,
'調': 0x8482,
'': 0x8483,
'': 0x8484,
'': 0x8485,
'': 0x8486,
'': 0x8487,
'': 0x8488,
'': 0x8489,
'': 0x848a,
'': 0x848b,
'': 0x848c,
'': 0x848d,
'': 0x848e,
'': 0x848f,
'': 0x8490,
'': 0x8491,
'': 0x8492,
'': 0x8493,
'': 0x8494,
'': 0x8495,
'': 0x8496,
'': 0x8497,
'': 0x8498,
'': 0x8499,
'': 0x849a,
'': 0x849b,
'': 0x849c,
'': 0x849d,
'': 0x849e,
'': 0x849f,
'': 0x84a0,
'': 0x84a1,
'': 0x84a2,
'': 0x84a3,
'': 0x84a4,
'': 0x84a5,
'': 0x84a6,
'': 0x84a7,
'': 0x84a8,
'': 0x84a9,
'': 0x84aa,
'': 0x84ab,
'': 0x84ac,
'': 0x84ad,
'': 0x84ae,
'': 0x84af,
'': 0x84b0,
'': 0x84b1,
'': 0x84b2,
'': 0x84b3,
'': 0x84b4,
'': 0x84b5,
'': 0x84b6,
'': 0x84b7,
'': 0x84b8,
'': 0x84b9,
'': 0x84ba,
'': 0x84bb,
'': 0x84bc,
'': 0x84bd,
'': 0x84be,
'': 0x84bf,
'': 0x84c0,
'': 0x84c1,
'': 0x84c2,
'': 0x84c3,
'': 0x84c4,
'': 0x84c5,
'': 0x84c6,
'': 0x84c7,
'': 0x84c8,
'': 0x84c9,
'': 0x84ca,
'': 0x84cb,
'': 0x84cc,
'': 0x84cd,
'': 0x84ce,
'': 0x84cf,
'': 0x84d0,
'': 0x84d1,
'': 0x84d2,
'': 0x84d3,
'': 0x84d4,
'': 0x84d5,
'': 0x84d6,
'': 0x84d7,
'': 0x84d8,
'': 0x84d9,
'': 0x84da,
'': 0x84db,
'': 0x84dc,
'': 0x84dd,
'': 0x84de,
'': 0x84df,
'': 0x84e0,
'': 0x84e1,
'': 0x84e2,
'': 0x84e3,
'': 0x84e4,
'': 0x84e5,
'': 0x84e6,
'': 0x84e7,
'': 0x84e8,
'': 0x84e9,
'': 0x84ea,
'': 0x84eb,
'': 0x84ec,
'': 0x84ed,
'': 0x84ee,
'': 0x84ef,
'': 0x84f0,
'': 0x84f1,
'': 0x84f2,
'': 0x84f3,
'': 0x84f4,
'': 0x84f5,
'': 0x84f6,
'': 0x84f7,
'': 0x84f8,
'': 0x84f9,
'': 0x84fa,
'': 0x84fb,
'': 0x84fc,
'': 0x84fd,
'': 0x84fe,
'': 0x84ff,
'': 0x8580,
'': 0x8581,
'': 0x8582,
'': 0x8583,
'': 0x8584,
'': 0x8585,
'': 0x8586,
'': 0x8587,
'': 0x8588,
'': 0x8589,
'': 0x858a,
'': 0x858b,
'': 0x858c,
'': 0x858d,
'': 0x858e,
'': 0x858f,
'': 0x8590,
'': 0x8591,
'': 0x8592,
'': 0x8593,
'': 0x8594,
'': 0x8595,
'': 0x8596,
'': 0x8597,
'': 0x8598,
'': 0x8599,
'': 0x859a,
'': 0x859b,
'': 0x859c,
'': 0x859d,
'': 0x859e,
'': 0x859f,
'': 0x85a0,
'': 0x85a1,
'': 0x85a2,
'': 0x85a3,
'': 0x85a4,
'': 0x85a5,
'': 0x85a6,
'': 0x85a7,
'': 0x85a8,
'': 0x85a9,
'': 0x85aa,
'': 0x85ab,
'': 0x85ac,
'': 0x85ad,
'': 0x85ae,
'': 0x85af,
'': 0x85b0,
'': 0x85b1,
'': 0x85b2,
'': 0x85b3,
'': 0x85b4,
'': 0x85b5,
'': 0x85b6,
'': 0x85b7,
'': 0x85b8,
'': 0x85b9,
'': 0x85ba,
'': 0x85bb,
'': 0x85bc,
'': 0x85bd,
'': 0x85be,
'': 0x85bf,
'': 0x85c0,
'': 0x85c1,
'': 0x85c2,
'': 0x85c3,
'': 0x85c4,
'': 0x85c5,
'': 0x85c6,
'': 0x85c7,
'': 0x85c8,
'': 0x85c9,
'': 0x85ca,
'': 0x85cb,
'': 0x85cc,
'': 0x85cd,
'': 0x85ce,
'': 0x85cf,
'': 0x85d0,
'': 0x85d1,
'': 0x85d2,
'': 0x85d3,
'': 0x85d4,
'': 0x85d5,
'': 0x85d6,
'': 0x85d7,
'': 0x85d8,
'': 0x85d9,
'': 0x85da,
'': 0x85db,
'': 0x85dc,
'': 0x85dd,
'': 0x85de,
'': 0x85df,
'': 0x85e0,
'': 0x85e1,
'': 0x85e2,
'': 0x85e3,
'': 0x85e4,
'': 0x85e5,
'': 0x85e6,
'': 0x85e7,
'': 0x85e8,
'': 0x85e9,
'': 0x85ea,
'': 0x85eb,
'': 0x85ec,
'': 0x85ed,
'': 0x85ee,
'': 0x85ef,
'': 0x85f0,
'': 0x85f1,
'': 0x85f2,
'': 0x85f3,
'': 0x85f4,
'': 0x85f5,
'': 0x85f6,
'': 0x85f7,
'': 0x85f8,
'': 0x85f9,
'': 0x85fa,
'': 0x85fb,
'': 0x85fc,
'': 0x85fd,
'': 0x85fe,
'': 0x85ff,
'': 0x8680,
'': 0x8681,
'': 0x8682,
'': 0x8683,
'': 0x8684,
'': 0x8685,
'殿': 0x8686,
'': 0x8687,
'': 0x8688,
'': 0x8689,
'': 0x868a,
'': 0x868b,
'': 0x868c,
'': 0x868d,
'': 0x868e,
'': 0x868f,
'': 0x8690,
'': 0x8691,
'': 0x8692,
'': 0x8693,
'': 0x8694,
'': 0x8695,
'': 0x8696,
'': 0x8697,
'': 0x8698,
'': 0x8699,
'': 0x869a,
'': 0x869b,
'': 0x869c,
'': 0x869d,
'': 0x869e,
'': 0x869f,
'': 0x86a0,
'': 0x86a1,
'': 0x86a2,
'': 0x86a3,
'': 0x86a4,
'': 0x86a5,
'': 0x86a6,
'': 0x86a7,
'': 0x86a8,
'': 0x86a9,
'': 0x86aa,
'': 0x86ab,
'': 0x86ac,
'': 0x86ad,
'': 0x86ae,
'': 0x86af,
'': 0x86b0,
'': 0x86b1,
'': 0x86b2,
'': 0x86b3,
'': 0x86b4,
'': 0x86b5,
'': 0x86b6,
'': 0x86b7,
'': 0x86b8,
'': 0x86b9,
'': 0x86ba,
'': 0x86bb,
'': 0x86bc,
'': 0x86bd,
'': 0x86be,
'': 0x86bf,
'': 0x86c0,
'': 0x86c1,
'': 0x86c2,
'': 0x86c3,
'': 0x86c4,
'': 0x86c5,
'': 0x86c6,
'': 0x86c7,
'': 0x86c8,
'': 0x86c9,
'': 0x86ca,
'': 0x86cb,
'': 0x86cc,
'': 0x86cd,
'': 0x86ce,
'': 0x86cf,
'': 0x86d0,
'': 0x86d1,
'': 0x86d2,
'': 0x86d3,
'': 0x86d4,
'': 0x86d5,
'': 0x86d6,
'': 0x86d7,
'': 0x86d8,
'': 0x86d9,
'': 0x86da,
'': 0x86db,
'': 0x86dc,
'': 0x86dd,
'': 0x86de,
'': 0x86df,
'': 0x86e0,
'': 0x86e1,
'': 0x86e2,
'': 0x86e3,
'': 0x86e4,
'': 0x86e5,
'': 0x86e6,
'': 0x86e7,
'': 0x86e8,
'': 0x86e9,
'': 0x86ea,
'': 0x86eb,
'': 0x86ec,
'': 0x86ed,
'': 0x86ee,
'退': 0x86ef,
'': 0x86f0,
'': 0x86f1,
'': 0x86f2,
'': 0x86f3,
'': 0x86f4,
'': 0x86f5,
'': 0x86f6,
'': 0x86f7,
'': 0x86f8,
'': 0x86f9,
'': 0x86fa,
'': 0x86fb,
'': 0x86fc,
'': 0x86fd,
'': 0x86fe,
'': 0x86ff,
'': 0x8780,
'': 0x8781,
'': 0x8782,
'': 0x8783,
'': 0x8784,
'': 0x8785,
'': 0x8786,
'': 0x8787,
'': 0x8788,
'': 0x8789,
'': 0x878a,
'': 0x878b,
'': 0x878c,
'': 0x878d,
'': 0x878e,
'': 0x878f,
'': 0x8790,
'': 0x8791,
'': 0x8792,
'': 0x8793,
'': 0x8794,
'': 0x8795,
'': 0x8796,
'': 0x8797,
'': 0x8798,
'': 0x8799,
'': 0x879a,
'': 0x879b,
'': 0x879c,
'': 0x879d,
'': 0x879e,
'': 0x879f,
'': 0x87a0,
'': 0x87a1,
'': 0x87a2,
'': 0x87a3,
'': 0x87a4,
'': 0x87a5,
'': 0x87a6,
'': 0x87a7,
'': 0x87a8,
'便': 0x87a9,
'': 0x87aa,
'': 0x87ab,
'': 0x87ac,
'': 0x87ad,
'': 0x87ae,
'': 0x87af,
'': 0x87b0,
'': 0x87b1,
'姿': 0x87b2,
'': 0x87b3,
'': 0x87b4,
'': 0x87b5,
'': 0x87b6,
'': 0x87b7,
'': 0x87b8,
'': 0x87b9,
'': 0x87ba,
'': 0x87bb,
'': 0x87bc,
'': 0x87bd,
'': 0x87be,
'': 0x87bf,
'': 0x87c0,
'': 0x87c1,
'': 0x87c2,
'': 0x87c3,
'': 0x87c4,
'': 0x87c5,
'': 0x87c6,
'': 0x87c7,
'': 0x87c8,
'': 0x87c9,
'': 0x87ca,
'': 0x87cb,
'': 0x87cc,
'': 0x87cd,
'': 0x87ce,
}
main()