# This file was created from a script.
const
toLowerRanges = [
0x00041, 0x0005A, 532,
0x000C0, 0x000D6, 532,
0x000D8, 0x000DE, 532,
0x00189, 0x0018A, 705,
0x001B1, 0x001B2, 717,
0x00388, 0x0038A, 537,
0x0038E, 0x0038F, 563,
0x00391, 0x003A1, 532,
0x003A3, 0x003AB, 532,
0x003FD, 0x003FF, 370,
0x00400, 0x0040F, 580,
0x00410, 0x0042F, 532,
0x00531, 0x00556, 548,
0x010A0, 0x010C5, 7764,
0x013A0, 0x013EF, 39364,
0x013F0, 0x013F5, 508,
0x01C90, 0x01CBA, -2508,
0x01CBD, 0x01CBF, -2508,
0x01F08, 0x01F0F, 492,
0x01F18, 0x01F1D, 492,
0x01F28, 0x01F2F, 492,
0x01F38, 0x01F3F, 492,
0x01F48, 0x01F4D, 492,
0x01F68, 0x01F6F, 492,
0x01F88, 0x01F8F, 492,
0x01F98, 0x01F9F, 492,
0x01FA8, 0x01FAF, 492,
0x01FB8, 0x01FB9, 492,
0x01FBA, 0x01FBB, 426,
0x01FC8, 0x01FCB, 414,
0x01FD8, 0x01FD9, 492,
0x01FDA, 0x01FDB, 400,
0x01FE8, 0x01FE9, 492,
0x01FEA, 0x01FEB, 388,
0x01FF8, 0x01FF9, 372,
0x01FFA, 0x01FFB, 374,
0x02C00, 0x02C2E, 548,
0x02C7E, 0x02C7F, -10315,
0x0FF21, 0x0FF3A, 532,
0x10400, 0x10427, 540,
0x104B0, 0x104D3, 540,
0x10C80, 0x10CB2, 564,
0x118A0, 0x118BF, 532,
0x16E40, 0x16E5F, 532,
0x1E900, 0x1E921, 534,
]
toLowerSinglets = [
0x00100, 501,
0x00102, 501,
0x00104, 501,
0x00106, 501,
0x00108, 501,
0x0010A, 501,
0x0010C, 501,
0x0010E, 501,
0x00110, 501,
0x00112, 501,
0x00114, 501,
0x00116, 501,
0x00118, 501,
0x0011A, 501,
0x0011C, 501,
0x0011E, 501,
0x00120, 501,
0x00122, 501,
0x00124, 501,
0x00126, 501,
0x00128, 501,
0x0012A, 501,
0x0012C, 501,
0x0012E, 501,
0x00130, 301,
0x00132, 501,
0x00134, 501,
0x00136, 501,
0x00139, 501,
0x0013B, 501,
0x0013D, 501,
0x0013F, 501,
0x00141, 501,
0x00143, 501,
0x00145, 501,
0x00147, 501,
0x0014A, 501,
0x0014C, 501,
0x0014E, 501,
0x00150, 501,
0x00152, 501,
0x00154, 501,
0x00156, 501,
0x00158, 501,
0x0015A, 501,
0x0015C, 501,
0x0015E, 501,
0x00160, 501,
0x00162, 501,
0x00164, 501,
0x00166, 501,
0x00168, 501,
0x0016A, 501,
0x0016C, 501,
0x0016E, 501,
0x00170, 501,
0x00172, 501,
0x00174, 501,
0x00176, 501,
0x00178, 379,
0x00179, 501,
0x0017B, 501,
0x0017D, 501,
0x00181, 710,
0x00182, 501,
0x00184, 501,
0x00186, 706,
0x00187, 501,
0x0018B, 501,
0x0018E, 579,
0x0018F, 702,
0x00190, 703,
0x00191, 501,
0x00193, 705,
0x00194, 707,
0x00196, 711,
0x00197, 709,
0x00198, 501,
0x0019C, 711,
0x0019D, 713,
0x0019F, 714,
0x001A0, 501,
0x001A2, 501,
0x001A4, 501,
0x001A6, 718,
0x001A7, 501,
0x001A9, 718,
0x001AC, 501,
0x001AE, 718,
0x001AF, 501,
0x001B3, 501,
0x001B5, 501,
0x001B7, 719,
0x001B8, 501,
0x001BC, 501,
0x001C4, 502,
0x001C5, 501,
0x001C7, 502,
0x001C8, 501,
0x001CA, 502,
0x001CB, 501,
0x001CD, 501,
0x001CF, 501,
0x001D1, 501,
0x001D3, 501,
0x001D5, 501,
0x001D7, 501,
0x001D9, 501,
0x001DB, 501,
0x001DE, 501,
0x001E0, 501,
0x001E2, 501,
0x001E4, 501,
0x001E6, 501,
0x001E8, 501,
0x001EA, 501,
0x001EC, 501,
0x001EE, 501,
0x001F1, 502,
0x001F2, 501,
0x001F4, 501,
0x001F6, 403,
0x001F7, 444,
0x001F8, 501,
0x001FA, 501,
0x001FC, 501,
0x001FE, 501,
0x00200, 501,
0x00202, 501,
0x00204, 501,
0x00206, 501,
0x00208, 501,
0x0020A, 501,
0x0020C, 501,
0x0020E, 501,
0x00210, 501,
0x00212, 501,
0x00214, 501,
0x00216, 501,
0x00218, 501,
0x0021A, 501,
0x0021C, 501,
0x0021E, 501,
0x00220, 370,
0x00222, 501,
0x00224, 501,
0x00226, 501,
0x00228, 501,
0x0022A, 501,
0x0022C, 501,
0x0022E, 501,
0x00230, 501,
0x00232, 501,
0x0023A, 11295,
0x0023B, 501,
0x0023D, 337,
0x0023E, 11292,
0x00241, 501,
0x00243, 305,
0x00244, 569,
0x00245, 571,
0x00246, 501,
0x00248, 501,
0x0024A, 501,
0x0024C, 501,
0x0024E, 501,
0x00370, 501,
0x00372, 501,
0x00376, 501,
0x0037F, 616,
0x00386, 538,
0x0038C, 564,
0x003CF, 508,
0x003D8, 501,
0x003DA, 501,
0x003DC, 501,
0x003DE, 501,
0x003E0, 501,
0x003E2, 501,
0x003E4, 501,
0x003E6, 501,
0x003E8, 501,
0x003EA, 501,
0x003EC, 501,
0x003EE, 501,
0x003F4, 440,
0x003F7, 501,
0x003F9, 493,
0x003FA, 501,
0x00460, 501,
0x00462, 501,
0x00464, 501,
0x00466, 501,
0x00468, 501,
0x0046A, 501,
0x0046C, 501,
0x0046E, 501,
0x00470, 501,
0x00472, 501,
0x00474, 501,
0x00476, 501,
0x00478, 501,
0x0047A, 501,
0x0047C, 501,
0x0047E, 501,
0x00480, 501,
0x0048A, 501,
0x0048C, 501,
0x0048E, 501,
0x00490, 501,
0x00492, 501,
0x00494, 501,
0x00496, 501,
0x00498, 501,
0x0049A, 501,
0x0049C, 501,
0x0049E, 501,
0x004A0, 501,
0x004A2, 501,
0x004A4, 501,
0x004A6, 501,
0x004A8, 501,
0x004AA, 501,
0x004AC, 501,
0x004AE, 501,
0x004B0, 501,
0x004B2, 501,
0x004B4, 501,
0x004B6, 501,
0x004B8, 501,
0x004BA, 501,
0x004BC, 501,
0x004BE, 501,
0x004C0, 515,
0x004C1, 501,
0x004C3, 501,
0x004C5, 501,
0x004C7, 501,
0x004C9, 501,
0x004CB, 501,
0x004CD, 501,
0x004D0, 501,
0x004D2, 501,
0x004D4, 501,
0x004D6, 501,
0x004D8, 501,
0x004DA, 501,
0x004DC, 501,
0x004DE, 501,
0x004E0, 501,
0x004E2, 501,
0x004E4, 501,
0x004E6, 501,
0x004E8, 501,
0x004EA, 501,
0x004EC, 501,
0x004EE, 501,
0x004F0, 501,
0x004F2, 501,
0x004F4, 501,
0x004F6, 501,
0x004F8, 501,
0x004FA, 501,
0x004FC, 501,
0x004FE, 501,
0x00500, 501,
0x00502, 501,
0x00504, 501,
0x00506, 501,
0x00508, 501,
0x0050A, 501,
0x0050C, 501,
0x0050E, 501,
0x00510, 501,
0x00512, 501,
0x00514, 501,
0x00516, 501,
0x00518, 501,
0x0051A, 501,
0x0051C, 501,
0x0051E, 501,
0x00520, 501,
0x00522, 501,
0x00524, 501,
0x00526, 501,
0x00528, 501,
0x0052A, 501,
0x0052C, 501,
0x0052E, 501,
0x010C7, 7764,
0x010CD, 7764,
0x01E00, 501,
0x01E02, 501,
0x01E04, 501,
0x01E06, 501,
0x01E08, 501,
0x01E0A, 501,
0x01E0C, 501,
0x01E0E, 501,
0x01E10, 501,
0x01E12, 501,
0x01E14, 501,
0x01E16, 501,
0x01E18, 501,
0x01E1A, 501,
0x01E1C, 501,
0x01E1E, 501,
0x01E20, 501,
0x01E22, 501,
0x01E24, 501,
0x01E26, 501,
0x01E28, 501,
0x01E2A, 501,
0x01E2C, 501,
0x01E2E, 501,
0x01E30, 501,
0x01E32, 501,
0x01E34, 501,
0x01E36, 501,
0x01E38, 501,
0x01E3A, 501,
0x01E3C, 501,
0x01E3E, 501,
0x01E40, 501,
0x01E42, 501,
0x01E44, 501,
0x01E46, 501,
0x01E48, 501,
0x01E4A, 501,
0x01E4C, 501,
0x01E4E, 501,
0x01E50, 501,
0x01E52, 501,
0x01E54, 501,
0x01E56, 501,
0x01E58, 501,
0x01E5A, 501,
0x01E5C, 501,
0x01E5E, 501,
0x01E60, 501,
0x01E62, 501,
0x01E64, 501,
0x01E66, 501,
0x01E68, 501,
0x01E6A, 501,
0x01E6C, 501,
0x01E6E, 501,
0x01E70, 501,
0x01E72, 501,
0x01E74, 501,
0x01E76, 501,
0x01E78, 501,
0x01E7A, 501,
0x01E7C, 501,
0x01E7E, 501,
0x01E80, 501,
0x01E82, 501,
0x01E84, 501,
0x01E86, 501,
0x01E88, 501,
0x01E8A, 501,
0x01E8C, 501,
0x01E8E, 501,
0x01E90, 501,
0x01E92, 501,
0x01E94, 501,
0x01E9E, -7115,
0x01EA0, 501,
0x01EA2, 501,
0x01EA4, 501,
0x01EA6, 501,
0x01EA8, 501,
0x01EAA, 501,
0x01EAC, 501,
0x01EAE, 501,
0x01EB0, 501,
0x01EB2, 501,
0x01EB4, 501,
0x01EB6, 501,
0x01EB8, 501,
0x01EBA, 501,
0x01EBC, 501,
0x01EBE, 501,
0x01EC0, 501,
0x01EC2, 501,
0x01EC4, 501,
0x01EC6, 501,
0x01EC8, 501,
0x01ECA, 501,
0x01ECC, 501,
0x01ECE, 501,
0x01ED0, 501,
0x01ED2, 501,
0x01ED4, 501,
0x01ED6, 501,
0x01ED8, 501,
0x01EDA, 501,
0x01EDC, 501,
0x01EDE, 501,
0x01EE0, 501,
0x01EE2, 501,
0x01EE4, 501,
0x01EE6, 501,
0x01EE8, 501,
0x01EEA, 501,
0x01EEC, 501,
0x01EEE, 501,
0x01EF0, 501,
0x01EF2, 501,
0x01EF4, 501,
0x01EF6, 501,
0x01EF8, 501,
0x01EFA, 501,
0x01EFC, 501,
0x01EFE, 501,
0x01F59, 492,
0x01F5B, 492,
0x01F5D, 492,
0x01F5F, 492,
0x01FBC, 491,
0x01FCC, 491,
0x01FEC, 493,
0x01FFC, 491,
0x02126, -7017,
0x0212A, -7883,
0x0212B, -7762,
0x02132, 528,
0x02183, 501,
0x02C60, 501,
0x02C62, -10243,
0x02C63, -3314,
0x02C64, -10227,
0x02C67, 501,
0x02C69, 501,
0x02C6B, 501,
0x02C6D, -10280,
0x02C6E, -10249,
0x02C6F, -10283,
0x02C70, -10282,
0x02C72, 501,
0x02C75, 501,
0x02C80, 501,
0x02C82, 501,
0x02C84, 501,
0x02C86, 501,
0x02C88, 501,
0x02C8A, 501,
0x02C8C, 501,
0x02C8E, 501,
0x02C90, 501,
0x02C92, 501,
0x02C94, 501,
0x02C96, 501,
0x02C98, 501,
0x02C9A, 501,
0x02C9C, 501,
0x02C9E, 501,
0x02CA0, 501,
0x02CA2, 501,
0x02CA4, 501,
0x02CA6, 501,
0x02CA8, 501,
0x02CAA, 501,
0x02CAC, 501,
0x02CAE, 501,
0x02CB0, 501,
0x02CB2, 501,
0x02CB4, 501,
0x02CB6, 501,
0x02CB8, 501,
0x02CBA, 501,
0x02CBC, 501,
0x02CBE, 501,
0x02CC0, 501,
0x02CC2, 501,
0x02CC4, 501,
0x02CC6, 501,
0x02CC8, 501,
0x02CCA, 501,
0x02CCC, 501,
0x02CCE, 501,
0x02CD0, 501,
0x02CD2, 501,
0x02CD4, 501,
0x02CD6, 501,
0x02CD8, 501,
0x02CDA, 501,
0x02CDC, 501,
0x02CDE, 501,
0x02CE0, 501,
0x02CE2, 501,
0x02CEB, 501,
0x02CED, 501,
0x02CF2, 501,
0x0A640, 501,
0x0A642, 501,
0x0A644, 501,
0x0A646, 501,
0x0A648, 501,
0x0A64A, 501,
0x0A64C, 501,
0x0A64E, 501,
0x0A650, 501,
0x0A652, 501,
0x0A654, 501,
0x0A656, 501,
0x0A658, 501,
0x0A65A, 501,
0x0A65C, 501,
0x0A65E, 501,
0x0A660, 501,
0x0A662, 501,
0x0A664, 501,
0x0A666, 501,
0x0A668, 501,
0x0A66A, 501,
0x0A66C, 501,
0x0A680, 501,
0x0A682, 501,
0x0A684, 501,
0x0A686, 501,
0x0A688, 501,
0x0A68A, 501,
0x0A68C, 501,
0x0A68E, 501,
0x0A690, 501,
0x0A692, 501,
0x0A694, 501,
0x0A696, 501,
0x0A698, 501,
0x0A69A, 501,
0x0A722, 501,
0x0A724, 501,
0x0A726, 501,
0x0A728, 501,
0x0A72A, 501,
0x0A72C, 501,
0x0A72E, 501,
0x0A732, 501,
0x0A734, 501,
0x0A736, 501,
0x0A738, 501,
0x0A73A, 501,
0x0A73C, 501,
0x0A73E, 501,
0x0A740, 501,
0x0A742, 501,
0x0A744, 501,
0x0A746, 501,
0x0A748, 501,
0x0A74A, 501,
0x0A74C, 501,
0x0A74E, 501,
0x0A750, 501,
0x0A752, 501,
0x0A754, 501,
0x0A756, 501,
0x0A758, 501,
0x0A75A, 501,
0x0A75C, 501,
0x0A75E, 501,
0x0A760, 501,
0x0A762, 501,
0x0A764, 501,
0x0A766, 501,
0x0A768, 501,
0x0A76A, 501,
0x0A76C, 501,
0x0A76E, 501,
0x0A779, 501,
0x0A77B, 501,
0x0A77D, -34832,
0x0A77E, 501,
0x0A780, 501,
0x0A782, 501,
0x0A784, 501,
0x0A786, 501,
0x0A78B, 501,
0x0A78D, -41780,
0x0A790, 501,
0x0A792, 501,
0x0A796, 501,
0x0A798, 501,
0x0A79A, 501,
0x0A79C, 501,
0x0A79E, 501,
0x0A7A0, 501,
0x0A7A2, 501,
0x0A7A4, 501,
0x0A7A6, 501,
0x0A7A8, 501,
0x0A7AA, -41808,
0x0A7AB, -41819,
0x0A7AC, -41815,
0x0A7AD, -41805,
0x0A7AE, -41808,
0x0A7B0, -41758,
0x0A7B1, -41782,
0x0A7B2, -41761,
0x0A7B3, 1428,
0x0A7B4, 501,
0x0A7B6, 501,
0x0A7B8, 501,
0x0A7BA, 501,
0x0A7BC, 501,
0x0A7BE, 501,
0x0A7C2, 501,
0x0A7C4, 452,
0x0A7C5, -41807,
0x0A7C6, -34884,
]
toUpperRanges = [
0x00061, 0x0007A, 468,
0x000E0, 0x000F6, 468,
0x000F8, 0x000FE, 468,
0x0023F, 0x00240, 11315,
0x00256, 0x00257, 295,
0x0028A, 0x0028B, 283,
0x0037B, 0x0037D, 630,
0x003AD, 0x003AF, 463,
0x003B1, 0x003C1, 468,
0x003C3, 0x003CB, 468,
0x003CD, 0x003CE, 437,
0x00430, 0x0044F, 468,
0x00450, 0x0045F, 420,
0x00561, 0x00586, 452,
0x010D0, 0x010FA, 3508,
0x010FD, 0x010FF, 3508,
0x013F8, 0x013FD, 492,
0x01C83, 0x01C84, -5742,
0x01F00, 0x01F07, 508,
0x01F10, 0x01F15, 508,
0x01F20, 0x01F27, 508,
0x01F30, 0x01F37, 508,
0x01F40, 0x01F45, 508,
0x01F60, 0x01F67, 508,
0x01F70, 0x01F71, 574,
0x01F72, 0x01F75, 586,
0x01F76, 0x01F77, 600,
0x01F78, 0x01F79, 628,
0x01F7A, 0x01F7B, 612,
0x01F7C, 0x01F7D, 626,
0x01F80, 0x01F87, 508,
0x01F90, 0x01F97, 508,
0x01FA0, 0x01FA7, 508,
0x01FB0, 0x01FB1, 508,
0x01FD0, 0x01FD1, 508,
0x01FE0, 0x01FE1, 508,
0x02C30, 0x02C5E, 452,
0x02D00, 0x02D25, -6764,
0x0AB70, 0x0ABBF, -38364,
0x0FF41, 0x0FF5A, 468,
0x10428, 0x1044F, 460,
0x104D8, 0x104FB, 460,
0x10CC0, 0x10CF2, 436,
0x118C0, 0x118DF, 468,
0x16E60, 0x16E7F, 468,
0x1E922, 0x1E943, 466,
]
toUpperSinglets = [
0x000B5, 1243,
0x000FF, 621,
0x00101, 499,
0x00103, 499,
0x00105, 499,
0x00107, 499,
0x00109, 499,
0x0010B, 499,
0x0010D, 499,
0x0010F, 499,
0x00111, 499,
0x00113, 499,
0x00115, 499,
0x00117, 499,
0x00119, 499,
0x0011B, 499,
0x0011D, 499,
0x0011F, 499,
0x00121, 499,
0x00123, 499,
0x00125, 499,
0x00127, 499,
0x00129, 499,
0x0012B, 499,
0x0012D, 499,
0x0012F, 499,
0x00131, 268,
0x00133, 499,
0x00135, 499,
0x00137, 499,
0x0013A, 499,
0x0013C, 499,
0x0013E, 499,
0x00140, 499,
0x00142, 499,
0x00144, 499,
0x00146, 499,
0x00148, 499,
0x0014B, 499,
0x0014D, 499,
0x0014F, 499,
0x00151, 499,
0x00153, 499,
0x00155, 499,
0x00157, 499,
0x00159, 499,
0x0015B, 499,
0x0015D, 499,
0x0015F, 499,
0x00161, 499,
0x00163, 499,
0x00165, 499,
0x00167, 499,
0x00169, 499,
0x0016B, 499,
0x0016D, 499,
0x0016F, 499,
0x00171, 499,
0x00173, 499,
0x00175, 499,
0x00177, 499,
0x0017A, 499,
0x0017C, 499,
0x0017E, 499,
0x0017F, 200,
0x00180, 695,
0x00183, 499,
0x00185, 499,
0x00188, 499,
0x0018C, 499,
0x00192, 499,
0x00195, 597,
0x00199, 499,
0x0019A, 663,
0x0019E, 630,
0x001A1, 499,
0x001A3, 499,
0x001A5, 499,
0x001A8, 499,
0x001AD, 499,
0x001B0, 499,
0x001B4, 499,
0x001B6, 499,
0x001B9, 499,
0x001BD, 499,
0x001BF, 556,
0x001C5, 499,
0x001C6, 498,
0x001C8, 499,
0x001C9, 498,
0x001CB, 499,
0x001CC, 498,
0x001CE, 499,
0x001D0, 499,
0x001D2, 499,
0x001D4, 499,
0x001D6, 499,
0x001D8, 499,
0x001DA, 499,
0x001DC, 499,
0x001DD, 421,
0x001DF, 499,
0x001E1, 499,
0x001E3, 499,
0x001E5, 499,
0x001E7, 499,
0x001E9, 499,
0x001EB, 499,
0x001ED, 499,
0x001EF, 499,
0x001F2, 499,
0x001F3, 498,
0x001F5, 499,
0x001F9, 499,
0x001FB, 499,
0x001FD, 499,
0x001FF, 499,
0x00201, 499,
0x00203, 499,
0x00205, 499,
0x00207, 499,
0x00209, 499,
0x0020B, 499,
0x0020D, 499,
0x0020F, 499,
0x00211, 499,
0x00213, 499,
0x00215, 499,
0x00217, 499,
0x00219, 499,
0x0021B, 499,
0x0021D, 499,
0x0021F, 499,
0x00223, 499,
0x00225, 499,
0x00227, 499,
0x00229, 499,
0x0022B, 499,
0x0022D, 499,
0x0022F, 499,
0x00231, 499,
0x00233, 499,
0x0023C, 499,
0x00242, 499,
0x00247, 499,
0x00249, 499,
0x0024B, 499,
0x0024D, 499,
0x0024F, 499,
0x00250, 11283,
0x00251, 11280,
0x00252, 11282,
0x00253, 290,
0x00254, 294,
0x00259, 298,
0x0025B, 297,
0x0025C, 42819,
0x00260, 295,
0x00261, 42815,
0x00263, 293,
0x00265, 42780,
0x00266, 42808,
0x00268, 291,
0x00269, 289,
0x0026A, 42808,
0x0026B, 11243,
0x0026C, 42805,
0x0026F, 289,
0x00271, 11249,
0x00272, 287,
0x00275, 286,
0x0027D, 11227,
0x00280, 282,
0x00282, 42807,
0x00283, 282,
0x00287, 42782,
0x00288, 282,
0x00289, 431,
0x0028C, 429,
0x00292, 281,
0x0029D, 42761,
0x0029E, 42758,
0x00371, 499,
0x00373, 499,
0x00377, 499,
0x003AC, 462,
0x003C2, 469,
0x003CC, 436,
0x003D0, 438,
0x003D1, 443,
0x003D5, 453,
0x003D6, 446,
0x003D7, 492,
0x003D9, 499,
0x003DB, 499,
0x003DD, 499,
0x003DF, 499,
0x003E1, 499,
0x003E3, 499,
0x003E5, 499,
0x003E7, 499,
0x003E9, 499,
0x003EB, 499,
0x003ED, 499,
0x003EF, 499,
0x003F0, 414,
0x003F1, 420,
0x003F2, 507,
0x003F3, 384,
0x003F5, 404,
0x003F8, 499,
0x003FB, 499,
0x00461, 499,
0x00463, 499,
0x00465, 499,
0x00467, 499,
0x00469, 499,
0x0046B, 499,
0x0046D, 499,
0x0046F, 499,
0x00471, 499,
0x00473, 499,
0x00475, 499,
0x00477, 499,
0x00479, 499,
0x0047B, 499,
0x0047D, 499,
0x0047F, 499,
0x00481, 499,
0x0048B, 499,
0x0048D, 499,
0x0048F, 499,
0x00491, 499,
0x00493, 499,
0x00495, 499,
0x00497, 499,
0x00499, 499,
0x0049B, 499,
0x0049D, 499,
0x0049F, 499,
0x004A1, 499,
0x004A3, 499,
0x004A5, 499,
0x004A7, 499,
0x004A9, 499,
0x004AB, 499,
0x004AD, 499,
0x004AF, 499,
0x004B1, 499,
0x004B3, 499,
0x004B5, 499,
0x004B7, 499,
0x004B9, 499,
0x004BB, 499,
0x004BD, 499,
0x004BF, 499,
0x004C2, 499,
0x004C4, 499,
0x004C6, 499,
0x004C8, 499,
0x004CA, 499,
0x004CC, 499,
0x004CE, 499,
0x004CF, 485,
0x004D1, 499,
0x004D3, 499,
0x004D5, 499,
0x004D7, 499,
0x004D9, 499,
0x004DB, 499,
0x004DD, 499,
0x004DF, 499,
0x004E1, 499,
0x004E3, 499,
0x004E5, 499,
0x004E7, 499,
0x004E9, 499,
0x004EB, 499,
0x004ED, 499,
0x004EF, 499,
0x004F1, 499,
0x004F3, 499,
0x004F5, 499,
0x004F7, 499,
0x004F9, 499,
0x004FB, 499,
0x004FD, 499,
0x004FF, 499,
0x00501, 499,
0x00503, 499,
0x00505, 499,
0x00507, 499,
0x00509, 499,
0x0050B, 499,
0x0050D, 499,
0x0050F, 499,
0x00511, 499,
0x00513, 499,
0x00515, 499,
0x00517, 499,
0x00519, 499,
0x0051B, 499,
0x0051D, 499,
0x0051F, 499,
0x00521, 499,
0x00523, 499,
0x00525, 499,
0x00527, 499,
0x00529, 499,
0x0052B, 499,
0x0052D, 499,
0x0052F, 499,
0x01C80, -5754,
0x01C81, -5753,
0x01C82, -5744,
0x01C85, -5743,
0x01C86, -5736,
0x01C87, -5681,
0x01C88, 35766,
0x01D79, 35832,
0x01D7D, 4314,
0x01D8E, 35884,
0x01E01, 499,
0x01E03, 499,
0x01E05, 499,
0x01E07, 499,
0x01E09, 499,
0x01E0B, 499,
0x01E0D, 499,
0x01E0F, 499,
0x01E11, 499,
0x01E13, 499,
0x01E15, 499,
0x01E17, 499,
0x01E19, 499,
0x01E1B, 499,
0x01E1D, 499,
0x01E1F, 499,
0x01E21, 499,
0x01E23, 499,
0x01E25, 499,
0x01E27, 499,
0x01E29, 499,
0x01E2B, 499,
0x01E2D, 499,
0x01E2F, 499,
0x01E31, 499,
0x01E33, 499,
0x01E35, 499,
0x01E37, 499,
0x01E39, 499,
0x01E3B, 499,
0x01E3D, 499,
0x01E3F, 499,
0x01E41, 499,
0x01E43, 499,
0x01E45, 49nx">err.Error())
log.Printf("Using defaults ...\n")
bindConfig()
return
}
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
log.Printf("Config file change detected. Reloading...\n")
bindConfig()
initLogging()
})
bindConfig()
}
func initLogging() {
confObj.Mu.RLock()
if confObj.StdoutLogging {
log.SetOutput(os.Stdout)
} else {
logfile, err := os.OpenFile(confObj.LogFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600)
errLog("Could not open log file: ", err)
// Listen for the signal to close the log file
// in a separate thread. Passing it as an argument
// to prevent race conditions when the config is
// reloaded.
go func(logfile *os.File) {
<-closeLog
log.Printf("Closing log file ...\n\n")
errLog("Could not close log file: ", logfile.Close())
}(logfile)
log.SetOutput(logfile)
}
confObj.Mu.RUnlock()
}
func setConfigDefaults() {
viper.SetDefault("ListenPort", 9001)
viper.SetDefault("LogFile", "getwtxt.log")
viper.SetDefault("DatabasePath", "getwtxt.db")
viper.SetDefault("AssetsDirectory", "assets")
viper.SetDefault("DatabaseType", "leveldb")
viper.SetDefault("StdoutLogging", false)
viper.SetDefault("ReCacheInterval", "1h")
viper.SetDefault("DatabasePushInterval", "5m")
viper.SetDefault("Instance.SiteName", "getwtxt")
viper.SetDefault("Instance.OwnerName", "Anonymous Microblogger")
viper.SetDefault("Instance.Email", "nobody@knows")
viper.SetDefault("Instance.URL", "https://twtxt.example.com")
viper.SetDefault("Instance.Description", "A fast, resilient twtxt registry server written in Go!")
}
func parseConfigFlag() {
if *flagConfFile == "" {
viper.SetConfigName("getwtxt")
viper.SetConfigType("yml")
viper.AddConfigPath(".")
viper.AddConfigPath("/usr/local/getwtxt")
viper.AddConfigPath("/etc")
viper.AddConfigPath("/usr/local/etc")
} else {
path, file := filepath.Split(*flagConfFile)
if path == "" {
path = "."
}
filename := strings.Split(file, ".")
viper.SetConfigName(filename[0])
viper.SetConfigType(filename[1])
viper.AddConfigPath(path)
}
}
func bindConfig() {
confObj.Mu.Lock()
confObj.Port = viper.GetInt("ListenPort")
confObj.LogFile = viper.GetString("LogFile")
confObj.DBType = strings.ToLower(viper.GetString("DatabaseType"))
if *flagDBType != "" {
confObj.DBType = *flagDBType
}
confObj.DBPath = viper.GetString("DatabasePath")
if *flagDBPath != "" {
confObj.DBPath = *flagDBPath
}
log.Printf("Using %v database: %v\n", confObj.DBType, confObj.DBPath)
confObj.AssetsDir = viper.GetString("AssetsDirectory")
if *flagAssets != "" {
confObj.AssetsDir = *flagAssets
}
confObj