summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornavewindre <boneyaard@gmail.com>2025-11-11 08:11:24 +0100
committernavewindre <boneyaard@gmail.com>2025-11-11 08:11:24 +0100
commitf5e29189f70c5c8532916504a1a22f8c586f6e73 (patch)
tree9bf42144e608260527766e128268b380231ed95b
parent6442494822d12c23cdd609031c4039d3309b64f6 (diff)
new web
-rw-r--r--web/BlackWhiteResult.php21
-rw-r--r--web/ColorResult.php20
-rw-r--r--web/Processor.php103
-rw-r--r--web/Result.php31
-rw-r--r--web/icons/css.pngbin6250 -> 0 bytes
-rw-r--r--web/imgs/good1.jpgbin424444 -> 0 bytes
-rw-r--r--web/imgs/good2.jpgbin131635 -> 0 bytes
-rw-r--r--web/imgs/good3.pngbin1067796 -> 0 bytes
-rw-r--r--web/imgs/good4.jpgbin163927 -> 0 bytes
-rw-r--r--web/imgs/good5.pngbin101000 -> 0 bytes
-rw-r--r--web/imgs/good6.jpgbin25231 -> 0 bytes
-rw-r--r--web/imgs/good7.jpgbin454225 -> 0 bytes
-rw-r--r--web/imgs/good8.jpgbin131065 -> 0 bytes
-rw-r--r--web/index.php180
-rw-r--r--web/minecraft.php300
-rw-r--r--web/package.json32
-rw-r--r--web/src/api.tsx39
-rw-r--r--web/src/ascii-art.tsx148
-rw-r--r--web/src/blog.tsx10
-rw-r--r--web/src/components.tsx259
-rw-r--r--web/src/header.tsx10
-rw-r--r--web/src/home.tsx24
-rw-r--r--web/src/index-page.tsx14
-rw-r--r--web/src/index.html31
-rw-r--r--web/src/jsx.tsx267
-rw-r--r--web/src/pkg.tsx164
-rw-r--r--web/src/sidebar.tsx126
-rw-r--r--web/src/tsconfig.json121
-rw-r--r--web/src/user.tsx6
-rw-r--r--web/src/util.tsx42
-rw-r--r--web/static/fonts/LICENSE.TXT428
-rw-r--r--web/static/fonts/README.NFO45
-rw-r--r--web/static/fonts/README.TXT46
-rw-r--r--web/static/fonts/Web437_ACM_VGA_8x14.woffbin0 -> 9836 bytes
-rw-r--r--web/static/fonts/Web437_ACM_VGA_8x16.woffbin0 -> 9996 bytes
-rw-r--r--web/static/fonts/Web437_ACM_VGA_8x8.woffbin0 -> 9184 bytes
-rw-r--r--web/static/fonts/Web437_ACM_VGA_9x14.woffbin0 -> 9856 bytes
-rw-r--r--web/static/fonts/Web437_ACM_VGA_9x16.woffbin0 -> 10008 bytes
-rw-r--r--web/static/fonts/Web437_ACM_VGA_9x8.woffbin0 -> 9216 bytes
-rw-r--r--web/static/fonts/Web437_AMI_EGA_8x14.woffbin0 -> 9596 bytes
-rw-r--r--web/static/fonts/Web437_AMI_EGA_8x8-2y.woffbin0 -> 9184 bytes
-rw-r--r--web/static/fonts/Web437_AMI_EGA_8x8.woffbin0 -> 8884 bytes
-rw-r--r--web/static/fonts/Web437_AMI_EGA_9x14.woffbin0 -> 9604 bytes
-rw-r--r--web/static/fonts/Web437_AST_PremiumExec.woffbin0 -> 9996 bytes
-rw-r--r--web/static/fonts/Web437_ATI_8x14.woffbin0 -> 9664 bytes
-rw-r--r--web/static/fonts/Web437_ATI_8x16.woffbin0 -> 9848 bytes
-rw-r--r--web/static/fonts/Web437_ATI_8x8-2y.woffbin0 -> 9208 bytes
-rw-r--r--web/static/fonts/Web437_ATI_8x8.woffbin0 -> 8896 bytes
-rw-r--r--web/static/fonts/Web437_ATI_9x14.woffbin0 -> 9696 bytes
-rw-r--r--web/static/fonts/Web437_ATI_9x16.woffbin0 -> 9892 bytes
-rw-r--r--web/static/fonts/Web437_ATI_9x8.woffbin0 -> 8924 bytes
-rw-r--r--web/static/fonts/Web437_ATI_SmallW_6x8.woffbin0 -> 9004 bytes
-rw-r--r--web/static/fonts/Web437_ATT_PC6300-2x.woffbin0 -> 10136 bytes
-rw-r--r--web/static/fonts/Web437_ATT_PC6300.woffbin0 -> 9940 bytes
-rw-r--r--web/static/fonts/Web437_Acer710_CGA-2y.woffbin0 -> 9544 bytes
-rw-r--r--web/static/fonts/Web437_Acer710_CGA.woffbin0 -> 9264 bytes
-rw-r--r--web/static/fonts/Web437_Acer710_Mono.woffbin0 -> 9876 bytes
-rw-r--r--web/static/fonts/Web437_Acer_VGA_8x8-2y.woffbin0 -> 9252 bytes
-rw-r--r--web/static/fonts/Web437_Acer_VGA_8x8.woffbin0 -> 8936 bytes
-rw-r--r--web/static/fonts/Web437_Acer_VGA_9x8.woffbin0 -> 8952 bytes
-rw-r--r--web/static/fonts/Web437_Amstrad_PC-2y.woffbin0 -> 9164 bytes
-rw-r--r--web/static/fonts/Web437_Amstrad_PC.woffbin0 -> 8872 bytes
-rw-r--r--web/static/fonts/Web437_ApricotPortable.woffbin0 -> 9376 bytes
-rw-r--r--web/static/fonts/Web437_ApricotXenC.woffbin0 -> 9928 bytes
-rw-r--r--web/static/fonts/Web437_Apricot_200L-2y.woffbin0 -> 9376 bytes
-rw-r--r--web/static/fonts/Web437_Apricot_200L.woffbin0 -> 9056 bytes
-rw-r--r--web/static/fonts/Web437_Apricot_256L-2y.woffbin0 -> 9848 bytes
-rw-r--r--web/static/fonts/Web437_Apricot_256L.woffbin0 -> 9612 bytes
-rw-r--r--web/static/fonts/Web437_Apricot_Mono.woffbin0 -> 10332 bytes
-rw-r--r--web/static/fonts/Web437_CL_EagleIII_8x16.woffbin0 -> 9876 bytes
-rw-r--r--web/static/fonts/Web437_CL_EagleIII_9x16.woffbin0 -> 9700 bytes
-rw-r--r--web/static/fonts/Web437_CL_EagleII_8x16.woffbin0 -> 9988 bytes
-rw-r--r--web/static/fonts/Web437_CL_EagleII_9x16.woffbin0 -> 9880 bytes
-rw-r--r--web/static/fonts/Web437_CL_Stingray_8x16.woffbin0 -> 10004 bytes
-rw-r--r--web/static/fonts/Web437_CL_Stingray_8x16_bold.woffbin0 -> 9608 bytes
-rw-r--r--web/static/fonts/Web437_CL_Stingray_8x19.woffbin0 -> 10056 bytes
-rw-r--r--web/static/fonts/Web437_CL_Stingray_8x19_bold.woffbin0 -> 9620 bytes
-rw-r--r--web/static/fonts/Web437_CompaqThin_8x14.woffbin0 -> 10400 bytes
-rw-r--r--web/static/fonts/Web437_CompaqThin_8x16.woffbin0 -> 10696 bytes
-rw-r--r--web/static/fonts/Web437_CompaqThin_8x8.woffbin0 -> 9480 bytes
-rw-r--r--web/static/fonts/Web437_Compaq_Port3-2x.woffbin0 -> 10132 bytes
-rw-r--r--web/static/fonts/Web437_Compaq_Port3.woffbin0 -> 9884 bytes
-rw-r--r--web/static/fonts/Web437_Compis.woffbin0 -> 10092 bytes
-rw-r--r--web/static/fonts/Web437_Copam_BIOS-2y.woffbin0 -> 9328 bytes
-rw-r--r--web/static/fonts/Web437_Copam_BIOS.woffbin0 -> 9020 bytes
-rw-r--r--web/static/fonts/Web437_Cordata_PPC-21.woffbin0 -> 11356 bytes
-rw-r--r--web/static/fonts/Web437_Cordata_PPC-400.woffbin0 -> 12148 bytes
-rw-r--r--web/static/fonts/Web437_DG_One-2y.woffbin0 -> 9220 bytes
-rw-r--r--web/static/fonts/Web437_DG_One-2y_bold.woffbin0 -> 9164 bytes
-rw-r--r--web/static/fonts/Web437_DG_One.woffbin0 -> 8888 bytes
-rw-r--r--web/static/fonts/Web437_DG_One_bold.woffbin0 -> 8772 bytes
-rw-r--r--web/static/fonts/Web437_DOS-V_TWN16.woffbin0 -> 10016 bytes
-rw-r--r--web/static/fonts/Web437_DOS-V_TWN19.woffbin0 -> 10068 bytes
-rw-r--r--web/static/fonts/Web437_DOS-V_re_ANK16.woffbin0 -> 11200 bytes
-rw-r--r--web/static/fonts/Web437_DOS-V_re_ANK19.woffbin0 -> 11212 bytes
-rw-r--r--web/static/fonts/Web437_DOS-V_re_ANK24.woffbin0 -> 12792 bytes
-rw-r--r--web/static/fonts/Web437_DOS-V_re_ANK30.woffbin0 -> 13028 bytes
-rw-r--r--web/static/fonts/Web437_DOS-V_re_JPN12.woffbin0 -> 9516 bytes
-rw-r--r--web/static/fonts/Web437_DOS-V_re_JPN16.woffbin0 -> 11432 bytes
-rw-r--r--web/static/fonts/Web437_DOS-V_re_JPN19.woffbin0 -> 11528 bytes
-rw-r--r--web/static/fonts/Web437_DOS-V_re_JPN24.woffbin0 -> 13016 bytes
-rw-r--r--web/static/fonts/Web437_DOS-V_re_JPN30.woffbin0 -> 13248 bytes
-rw-r--r--web/static/fonts/Web437_DOS-V_re_PRC16.woffbin0 -> 11372 bytes
-rw-r--r--web/static/fonts/Web437_DOS-V_re_PRC19.woffbin0 -> 11412 bytes
-rw-r--r--web/static/fonts/Web437_DTK_BIOS-2y.woffbin0 -> 9480 bytes
-rw-r--r--web/static/fonts/Web437_DTK_BIOS.woffbin0 -> 9080 bytes
-rw-r--r--web/static/fonts/Web437_EagleSpCGA_Alt1-2y.woffbin0 -> 9168 bytes
-rw-r--r--web/static/fonts/Web437_EagleSpCGA_Alt1.woffbin0 -> 8840 bytes
-rw-r--r--web/static/fonts/Web437_EagleSpCGA_Alt2-2y.woffbin0 -> 9076 bytes
-rw-r--r--web/static/fonts/Web437_EagleSpCGA_Alt2.woffbin0 -> 8812 bytes
-rw-r--r--web/static/fonts/Web437_EagleSpCGA_Alt3-2y.woffbin0 -> 9584 bytes
-rw-r--r--web/static/fonts/Web437_EagleSpCGA_Alt3.woffbin0 -> 9304 bytes
-rw-r--r--web/static/fonts/Web437_EpsonMGA-2y.woffbin0 -> 9196 bytes
-rw-r--r--web/static/fonts/Web437_EpsonMGA.woffbin0 -> 8908 bytes
-rw-r--r--web/static/fonts/Web437_EpsonMGA_Alt-2y.woffbin0 -> 9680 bytes
-rw-r--r--web/static/fonts/Web437_EpsonMGA_Alt.woffbin0 -> 9392 bytes
-rw-r--r--web/static/fonts/Web437_EpsonMGA_Mono.woffbin0 -> 9720 bytes
-rw-r--r--web/static/fonts/Web437_EuroPC_CGA-2y.woffbin0 -> 9208 bytes
-rw-r--r--web/static/fonts/Web437_EuroPC_CGA.woffbin0 -> 8936 bytes
-rw-r--r--web/static/fonts/Web437_EuroPC_Mono.woffbin0 -> 9908 bytes
-rw-r--r--web/static/fonts/Web437_EverexME_5x8.woffbin0 -> 8376 bytes
-rw-r--r--web/static/fonts/Web437_EverexME_7x8.woffbin0 -> 9048 bytes
-rw-r--r--web/static/fonts/Web437_EverexME_8x16.woffbin0 -> 9828 bytes
-rw-r--r--web/static/fonts/Web437_FMTowns_re_8x16-2x.woffbin0 -> 11304 bytes
-rw-r--r--web/static/fonts/Web437_FMTowns_re_8x16.woffbin0 -> 11052 bytes
-rw-r--r--web/static/fonts/Web437_FMTowns_re_8x8.woffbin0 -> 9432 bytes
-rw-r--r--web/static/fonts/Web437_HP_100LX_10x11.woffbin0 -> 10116 bytes
-rw-r--r--web/static/fonts/Web437_HP_100LX_16x12.woffbin0 -> 11196 bytes
-rw-r--r--web/static/fonts/Web437_HP_100LX_6x8-2x.woffbin0 -> 9020 bytes
-rw-r--r--web/static/fonts/Web437_HP_100LX_6x8.woffbin0 -> 8800 bytes
-rw-r--r--web/static/fonts/Web437_HP_100LX_8x8-2x.woffbin0 -> 9588 bytes
-rw-r--r--web/static/fonts/Web437_HP_100LX_8x8.woffbin0 -> 9264 bytes
-rw-r--r--web/static/fonts/Web437_HP_150_re.woffbin0 -> 10860 bytes
-rw-r--r--web/static/fonts/Web437_IBM_3270pc.woffbin0 -> 9768 bytes
-rw-r--r--web/static/fonts/Web437_IBM_BIOS-2x.woffbin0 -> 9100 bytes
-rw-r--r--web/static/fonts/Web437_IBM_BIOS-2y.woffbin0 -> 9220 bytes
-rw-r--r--web/static/fonts/Web437_IBM_BIOS.woffbin0 -> 8832 bytes
-rw-r--r--web/static/fonts/Web437_IBM_CGA-2y.woffbin0 -> 9212 bytes
-rw-r--r--web/static/fonts/Web437_IBM_CGA.woffbin0 -> 8808 bytes
-rw-r--r--web/static/fonts/Web437_IBM_CGAthin-2y.woffbin0 -> 10028 bytes
-rw-r--r--web/static/fonts/Web437_IBM_CGAthin.woffbin0 -> 9484 bytes
-rw-r--r--web/static/fonts/Web437_IBM_Conv-2x.woffbin0 -> 9720 bytes
-rw-r--r--web/static/fonts/Web437_IBM_Conv-2y.woffbin0 -> 9768 bytes
-rw-r--r--web/static/fonts/Web437_IBM_Conv.woffbin0 -> 9348 bytes
-rw-r--r--web/static/fonts/Web437_IBM_DOS_ISO8-2x.woffbin0 -> 10512 bytes
-rw-r--r--web/static/fonts/Web437_IBM_DOS_ISO8.woffbin0 -> 10288 bytes
-rw-r--r--web/static/fonts/Web437_IBM_DOS_ISO9-2x.woffbin0 -> 10528 bytes
-rw-r--r--web/static/fonts/Web437_IBM_DOS_ISO9.woffbin0 -> 10288 bytes
-rw-r--r--web/static/fonts/Web437_IBM_EGA_8x14-2x.woffbin0 -> 9980 bytes
-rw-r--r--web/static/fonts/Web437_IBM_EGA_8x14.woffbin0 -> 9688 bytes
-rw-r--r--web/static/fonts/Web437_IBM_EGA_8x8-2x.woffbin0 -> 9116 bytes
-rw-r--r--web/static/fonts/Web437_IBM_EGA_8x8.woffbin0 -> 8844 bytes
-rw-r--r--web/static/fonts/Web437_IBM_EGA_9x14-2x.woffbin0 -> 10044 bytes
-rw-r--r--web/static/fonts/Web437_IBM_EGA_9x14.woffbin0 -> 9732 bytes
-rw-r--r--web/static/fonts/Web437_IBM_EGA_9x8-2x.woffbin0 -> 9152 bytes
-rw-r--r--web/static/fonts/Web437_IBM_EGA_9x8.woffbin0 -> 8860 bytes
-rw-r--r--web/static/fonts/Web437_IBM_MDA.woffbin0 -> 9864 bytes
-rw-r--r--web/static/fonts/Web437_IBM_Model30r0-2x.woffbin0 -> 10100 bytes
-rw-r--r--web/static/fonts/Web437_IBM_Model30r0.woffbin0 -> 9844 bytes
-rw-r--r--web/static/fonts/Web437_IBM_Model3x_Alt1.woffbin0 -> 10884 bytes
-rw-r--r--web/static/fonts/Web437_IBM_Model3x_Alt2.woffbin0 -> 10484 bytes
-rw-r--r--web/static/fonts/Web437_IBM_Model3x_Alt3.woffbin0 -> 10612 bytes
-rw-r--r--web/static/fonts/Web437_IBM_Model3x_Alt4.woffbin0 -> 10404 bytes
-rw-r--r--web/static/fonts/Web437_IBM_PGC-2x.woffbin0 -> 10012 bytes
-rw-r--r--web/static/fonts/Web437_IBM_PGC.woffbin0 -> 9760 bytes
-rw-r--r--web/static/fonts/Web437_IBM_PS-55_re.woffbin0 -> 13312 bytes
-rw-r--r--web/static/fonts/Web437_IBM_VGA_8x14-2x.woffbin0 -> 9976 bytes
-rw-r--r--web/static/fonts/Web437_IBM_VGA_8x14.woffbin0 -> 9684 bytes
-rw-r--r--web/static/fonts/Web437_IBM_VGA_8x16-2x.woffbin0 -> 10060 bytes
-rw-r--r--web/static/fonts/Web437_IBM_VGA_8x16.woffbin0 -> 9788 bytes
-rw-r--r--web/static/fonts/Web437_IBM_VGA_9x14-2x.woffbin0 -> 10040 bytes
-rw-r--r--web/static/fonts/Web437_IBM_VGA_9x14.woffbin0 -> 9732 bytes
-rw-r--r--web/static/fonts/Web437_IBM_VGA_9x16-2x.woffbin0 -> 10112 bytes
-rw-r--r--web/static/fonts/Web437_IBM_VGA_9x16.woffbin0 -> 9804 bytes
-rw-r--r--web/static/fonts/Web437_IBM_VGA_9x8-2x.woffbin0 -> 9152 bytes
-rw-r--r--web/static/fonts/Web437_IBM_VGA_9x8.woffbin0 -> 8860 bytes
-rw-r--r--web/static/fonts/Web437_IBM_XGA-AI_12x20.woffbin0 -> 12884 bytes
-rw-r--r--web/static/fonts/Web437_IBM_XGA-AI_12x23.woffbin0 -> 11308 bytes
-rw-r--r--web/static/fonts/Web437_IBM_XGA-AI_7x15.woffbin0 -> 9968 bytes
-rw-r--r--web/static/fonts/Web437_IGS_VGA_8x16.woffbin0 -> 9904 bytes
-rw-r--r--web/static/fonts/Web437_IGS_VGA_9x16.woffbin0 -> 9960 bytes
-rw-r--r--web/static/fonts/Web437_ITT_Xtra-2y.woffbin0 -> 9064 bytes
-rw-r--r--web/static/fonts/Web437_ITT_Xtra.woffbin0 -> 8808 bytes
-rw-r--r--web/static/fonts/Web437_Kaypro2K_G-2y.woffbin0 -> 9884 bytes
-rw-r--r--web/static/fonts/Web437_Kaypro2K_G.woffbin0 -> 9392 bytes
-rw-r--r--web/static/fonts/Web437_LE_Model_D_CGA-2y.woffbin0 -> 9488 bytes
-rw-r--r--web/static/fonts/Web437_LE_Model_D_CGA.woffbin0 -> 9248 bytes
-rw-r--r--web/static/fonts/Web437_LE_Model_D_Mono.woffbin0 -> 9972 bytes
-rw-r--r--web/static/fonts/Web437_MBytePC230_8x16.woffbin0 -> 10220 bytes
-rw-r--r--web/static/fonts/Web437_MBytePC230_CGA-2y.woffbin0 -> 9428 bytes
-rw-r--r--web/static/fonts/Web437_MBytePC230_CGA.woffbin0 -> 9164 bytes
-rw-r--r--web/static/fonts/Web437_MBytePC230_EGA.woffbin0 -> 10120 bytes
-rw-r--r--web/static/fonts/Web437_MBytePC230_Mono.woffbin0 -> 10144 bytes
-rw-r--r--web/static/fonts/Web437_Master_512-2y.woffbin0 -> 9192 bytes
-rw-r--r--web/static/fonts/Web437_Master_512-2y_bold.woffbin0 -> 8476 bytes
-rw-r--r--web/static/fonts/Web437_Master_512-M7.woffbin0 -> 9192 bytes
-rw-r--r--web/static/fonts/Web437_Master_512-M7_bold.woffbin0 -> 8480 bytes
-rw-r--r--web/static/fonts/Web437_Master_512.woffbin0 -> 8916 bytes
-rw-r--r--web/static/fonts/Web437_Master_512_bold.woffbin0 -> 8236 bytes
-rw-r--r--web/static/fonts/Web437_Mindset-2x.woffbin0 -> 9484 bytes
-rw-r--r--web/static/fonts/Web437_Mindset-2y.woffbin0 -> 9452 bytes
-rw-r--r--web/static/fonts/Web437_Mindset.woffbin0 -> 9136 bytes
-rw-r--r--web/static/fonts/Web437_NEC_APC3_8x16-2x.woffbin0 -> 11240 bytes
-rw-r--r--web/static/fonts/Web437_NEC_APC3_8x16.woffbin0 -> 10988 bytes
-rw-r--r--web/static/fonts/Web437_NEC_APC3_8x8-2y.woffbin0 -> 9268 bytes
-rw-r--r--web/static/fonts/Web437_NEC_APC3_8x8.woffbin0 -> 8956 bytes
-rw-r--r--web/static/fonts/Web437_NEC_MultiSpeed-2x.woffbin0 -> 9784 bytes
-rw-r--r--web/static/fonts/Web437_NEC_MultiSpeed-2x_bold.woffbin0 -> 9396 bytes
-rw-r--r--web/static/fonts/Web437_NEC_MultiSpeed.woffbin0 -> 9480 bytes
-rw-r--r--web/static/fonts/Web437_NEC_MultiSpeed_bold.woffbin0 -> 9044 bytes
-rw-r--r--web/static/fonts/Web437_Nix8810_M15.woffbin0 -> 9976 bytes
-rw-r--r--web/static/fonts/Web437_Nix8810_M16.woffbin0 -> 10148 bytes
-rw-r--r--web/static/fonts/Web437_Nix8810_M35-2y.woffbin0 -> 9280 bytes
-rw-r--r--web/static/fonts/Web437_Nix8810_M35.woffbin0 -> 9000 bytes
-rw-r--r--web/static/fonts/Web437_OlivettiThin_8x14.woffbin0 -> 9932 bytes
-rw-r--r--web/static/fonts/Web437_OlivettiThin_8x16.woffbin0 -> 9992 bytes
-rw-r--r--web/static/fonts/Web437_OlivettiThin_9x14.woffbin0 -> 9988 bytes
-rw-r--r--web/static/fonts/Web437_OlivettiThin_9x16.woffbin0 -> 10112 bytes
-rw-r--r--web/static/fonts/Web437_Olivetti_M15-2y.woffbin0 -> 9176 bytes
-rw-r--r--web/static/fonts/Web437_Olivetti_M15.woffbin0 -> 8948 bytes
-rw-r--r--web/static/fonts/Web437_Paradise132_7x16.woffbin0 -> 10020 bytes
-rw-r--r--web/static/fonts/Web437_Paradise132_7x9.woffbin0 -> 8996 bytes
-rw-r--r--web/static/fonts/Web437_Philips_YES_G-2x.woffbin0 -> 9880 bytes
-rw-r--r--web/static/fonts/Web437_Philips_YES_G-2y.woffbin0 -> 9888 bytes
-rw-r--r--web/static/fonts/Web437_Philips_YES_G.woffbin0 -> 9600 bytes
-rw-r--r--web/static/fonts/Web437_Philips_YES_T-2y.woffbin0 -> 9836 bytes
-rw-r--r--web/static/fonts/Web437_Philips_YES_T.woffbin0 -> 9548 bytes
-rw-r--r--web/static/fonts/Web437_PhoenixEGA_8x14.woffbin0 -> 9668 bytes
-rw-r--r--web/static/fonts/Web437_PhoenixEGA_8x16.woffbin0 -> 9816 bytes
-rw-r--r--web/static/fonts/Web437_PhoenixEGA_8x8-2y.woffbin0 -> 9084 bytes
-rw-r--r--web/static/fonts/Web437_PhoenixEGA_8x8.woffbin0 -> 8844 bytes
-rw-r--r--web/static/fonts/Web437_PhoenixEGA_9x14.woffbin0 -> 9720 bytes
-rw-r--r--web/static/fonts/Web437_PhoenixVGA_8x14.woffbin0 -> 9680 bytes
-rw-r--r--web/static/fonts/Web437_PhoenixVGA_8x16.woffbin0 -> 9756 bytes
-rw-r--r--web/static/fonts/Web437_PhoenixVGA_8x8.woffbin0 -> 8856 bytes
-rw-r--r--web/static/fonts/Web437_PhoenixVGA_9x14.woffbin0 -> 9688 bytes
-rw-r--r--web/static/fonts/Web437_PhoenixVGA_9x16.woffbin0 -> 9764 bytes
-rw-r--r--web/static/fonts/Web437_PhoenixVGA_9x8.woffbin0 -> 8888 bytes
-rw-r--r--web/static/fonts/Web437_Phoenix_BIOS-2y.woffbin0 -> 9376 bytes
-rw-r--r--web/static/fonts/Web437_Phoenix_BIOS.woffbin0 -> 9012 bytes
-rw-r--r--web/static/fonts/Web437_Portfolio_6x8.woffbin0 -> 8676 bytes
-rw-r--r--web/static/fonts/Web437_RM_Nimbus-2y.woffbin0 -> 9180 bytes
-rw-r--r--web/static/fonts/Web437_RM_Nimbus.woffbin0 -> 8872 bytes
-rw-r--r--web/static/fonts/Web437_Rainbow100_re_132.woffbin0 -> 9128 bytes
-rw-r--r--web/static/fonts/Web437_Rainbow100_re_40.woffbin0 -> 8960 bytes
-rw-r--r--web/static/fonts/Web437_Rainbow100_re_66.woffbin0 -> 8956 bytes
-rw-r--r--web/static/fonts/Web437_Rainbow100_re_80.woffbin0 -> 9136 bytes
-rw-r--r--web/static/fonts/Web437_Robotron_A7100.woffbin0 -> 9868 bytes
-rw-r--r--web/static/fonts/Web437_STB_AutoEGA_8x14.woffbin0 -> 9744 bytes
-rw-r--r--web/static/fonts/Web437_STB_AutoEGA_9x14.woffbin0 -> 9804 bytes
-rw-r--r--web/static/fonts/Web437_SanyoMBC16-2y.woffbin0 -> 9616 bytes
-rw-r--r--web/static/fonts/Web437_SanyoMBC16.woffbin0 -> 9284 bytes
-rw-r--r--web/static/fonts/Web437_SanyoMBC55x-2y.woffbin0 -> 9096 bytes
-rw-r--r--web/static/fonts/Web437_SanyoMBC55x.woffbin0 -> 8832 bytes
-rw-r--r--web/static/fonts/Web437_SanyoMBC775-2y.woffbin0 -> 9252 bytes
-rw-r--r--web/static/fonts/Web437_SanyoMBC775.woffbin0 -> 8940 bytes
-rw-r--r--web/static/fonts/Web437_SeequaCm-2y.woffbin0 -> 9176 bytes
-rw-r--r--web/static/fonts/Web437_SeequaCm.woffbin0 -> 8884 bytes
-rw-r--r--web/static/fonts/Web437_Sharp_PC3K-2x.woffbin0 -> 9108 bytes
-rw-r--r--web/static/fonts/Web437_Sharp_PC3K.woffbin0 -> 8772 bytes
-rw-r--r--web/static/fonts/Web437_Sharp_PC3K_Alt-2x.woffbin0 -> 9528 bytes
-rw-r--r--web/static/fonts/Web437_Sharp_PC3K_Alt.woffbin0 -> 9264 bytes
-rw-r--r--web/static/fonts/Web437_Siemens_PC-D.woffbin0 -> 9676 bytes
-rw-r--r--web/static/fonts/Web437_Sigma_RM_8x14.woffbin0 -> 9836 bytes
-rw-r--r--web/static/fonts/Web437_Sigma_RM_8x16.woffbin0 -> 9940 bytes
-rw-r--r--web/static/fonts/Web437_Sigma_RM_8x8.woffbin0 -> 9088 bytes
-rw-r--r--web/static/fonts/Web437_Sigma_RM_9x14.woffbin0 -> 9864 bytes
-rw-r--r--web/static/fonts/Web437_Sigma_RM_9x16.woffbin0 -> 9984 bytes
-rw-r--r--web/static/fonts/Web437_Sigma_RM_9x8.woffbin0 -> 9116 bytes
-rw-r--r--web/static/fonts/Web437_SperryPC_8x16.woffbin0 -> 11120 bytes
-rw-r--r--web/static/fonts/Web437_SperryPC_CGA-2y.woffbin0 -> 9716 bytes
-rw-r--r--web/static/fonts/Web437_SperryPC_CGA.woffbin0 -> 9428 bytes
-rw-r--r--web/static/fonts/Web437_Tandy1K-II_200L-2x.woffbin0 -> 9292 bytes
-rw-r--r--web/static/fonts/Web437_Tandy1K-II_200L-2y.woffbin0 -> 9416 bytes
-rw-r--r--web/static/fonts/Web437_Tandy1K-II_200L.woffbin0 -> 8988 bytes
-rw-r--r--web/static/fonts/Web437_Tandy1K-II_225L-2y.woffbin0 -> 9452 bytes
-rw-r--r--web/static/fonts/Web437_Tandy1K-II_225L.woffbin0 -> 9016 bytes
-rw-r--r--web/static/fonts/Web437_Tandy1K-II_Mono.woffbin0 -> 9824 bytes
-rw-r--r--web/static/fonts/Web437_Tandy1K-I_200L-2x.woffbin0 -> 9404 bytes
-rw-r--r--web/static/fonts/Web437_Tandy1K-I_200L-2y.woffbin0 -> 9424 bytes
-rw-r--r--web/static/fonts/Web437_Tandy1K-I_200L.woffbin0 -> 9112 bytes
-rw-r--r--web/static/fonts/Web437_Tandy1K-I_225L-2y.woffbin0 -> 9432 bytes
-rw-r--r--web/static/fonts/Web437_Tandy1K-I_225L.woffbin0 -> 9140 bytes
-rw-r--r--web/static/fonts/Web437_Tandy2K-2x.woffbin0 -> 10196 bytes
-rw-r--r--web/static/fonts/Web437_Tandy2K.woffbin0 -> 9920 bytes
-rw-r--r--web/static/fonts/Web437_Tandy2K_G-2x.woffbin0 -> 10296 bytes
-rw-r--r--web/static/fonts/Web437_Tandy2K_G-TV.woffbin0 -> 9396 bytes
-rw-r--r--web/static/fonts/Web437_Tandy2K_G.woffbin0 -> 10028 bytes
-rw-r--r--web/static/fonts/Web437_TelePC-2y.woffbin0 -> 9824 bytes
-rw-r--r--web/static/fonts/Web437_TelePC.woffbin0 -> 9532 bytes
-rw-r--r--web/static/fonts/Web437_Ti_Pro.woffbin0 -> 10236 bytes
-rw-r--r--web/static/fonts/Web437_ToshibaSat_8x14.woffbin0 -> 9632 bytes
-rw-r--r--web/static/fonts/Web437_ToshibaSat_8x16.woffbin0 -> 9744 bytes
-rw-r--r--web/static/fonts/Web437_ToshibaSat_8x8.woffbin0 -> 9000 bytes
-rw-r--r--web/static/fonts/Web437_ToshibaSat_9x14.woffbin0 -> 9620 bytes
-rw-r--r--web/static/fonts/Web437_ToshibaSat_9x16.woffbin0 -> 9752 bytes
-rw-r--r--web/static/fonts/Web437_ToshibaSat_9x8.woffbin0 -> 9004 bytes
-rw-r--r--web/static/fonts/Web437_ToshibaT300_8x16.woffbin0 -> 11628 bytes
-rw-r--r--web/static/fonts/Web437_ToshibaT300_8x8-2y.woffbin0 -> 9684 bytes
-rw-r--r--web/static/fonts/Web437_ToshibaT300_8x8.woffbin0 -> 9384 bytes
-rw-r--r--web/static/fonts/Web437_ToshibaTxL1_8x16.woffbin0 -> 10032 bytes
-rw-r--r--web/static/fonts/Web437_ToshibaTxL1_8x8.woffbin0 -> 9464 bytes
-rw-r--r--web/static/fonts/Web437_ToshibaTxL2_8x16.woffbin0 -> 10964 bytes
-rw-r--r--web/static/fonts/Web437_ToshibaTxL2_8x8.woffbin0 -> 9948 bytes
-rw-r--r--web/static/fonts/Web437_TridentEarly_8x11.woffbin0 -> 9372 bytes
-rw-r--r--web/static/fonts/Web437_TridentEarly_8x14.woffbin0 -> 9748 bytes
-rw-r--r--web/static/fonts/Web437_TridentEarly_8x16.woffbin0 -> 9964 bytes
-rw-r--r--web/static/fonts/Web437_TridentEarly_8x8.woffbin0 -> 8924 bytes
-rw-r--r--web/static/fonts/Web437_TridentEarly_9x14.woffbin0 -> 9792 bytes
-rw-r--r--web/static/fonts/Web437_TridentEarly_9x16.woffbin0 -> 9980 bytes
-rw-r--r--web/static/fonts/Web437_TridentEarly_9x8.woffbin0 -> 8952 bytes
-rw-r--r--web/static/fonts/Web437_Trident_8x11.woffbin0 -> 9280 bytes
-rw-r--r--web/static/fonts/Web437_Trident_8x14.woffbin0 -> 9692 bytes
-rw-r--r--web/static/fonts/Web437_Trident_8x16.woffbin0 -> 9816 bytes
-rw-r--r--web/static/fonts/Web437_Trident_8x8.woffbin0 -> 8984 bytes
-rw-r--r--web/static/fonts/Web437_Trident_9x14.woffbin0 -> 9728 bytes
-rw-r--r--web/static/fonts/Web437_Trident_9x16.woffbin0 -> 9852 bytes
-rw-r--r--web/static/fonts/Web437_Trident_9x8.woffbin0 -> 9004 bytes
-rw-r--r--web/static/fonts/Web437_TsengEVA_132_6x14.woffbin0 -> 9392 bytes
-rw-r--r--web/static/fonts/Web437_TsengEVA_132_6x8.woffbin0 -> 8788 bytes
-rw-r--r--web/static/fonts/Web437_VTech_BIOS-2y.woffbin0 -> 9916 bytes
-rw-r--r--web/static/fonts/Web437_VTech_BIOS.woffbin0 -> 9380 bytes
-rw-r--r--web/static/fonts/Web437_Verite_8x14.woffbin0 -> 9848 bytes
-rw-r--r--web/static/fonts/Web437_Verite_8x16.woffbin0 -> 9940 bytes
-rw-r--r--web/static/fonts/Web437_Verite_8x8-2y.woffbin0 -> 9344 bytes
-rw-r--r--web/static/fonts/Web437_Verite_8x8.woffbin0 -> 9060 bytes
-rw-r--r--web/static/fonts/Web437_Verite_9x14.woffbin0 -> 9848 bytes
-rw-r--r--web/static/fonts/Web437_Verite_9x16.woffbin0 -> 9940 bytes
-rw-r--r--web/static/fonts/Web437_Verite_9x8.woffbin0 -> 9088 bytes
-rw-r--r--web/static/fonts/Web437_Wang_Pro_Color-2y.woffbin0 -> 9164 bytes
-rw-r--r--web/static/fonts/Web437_Wang_Pro_Color.woffbin0 -> 8920 bytes
-rw-r--r--web/static/fonts/Web437_Wang_Pro_Mono.woffbin0 -> 9824 bytes
-rw-r--r--web/static/fonts/Web437_Wyse700a-2y.woffbin0 -> 11208 bytes
-rw-r--r--web/static/fonts/Web437_Wyse700a.woffbin0 -> 10920 bytes
-rw-r--r--web/static/fonts/Web437_Wyse700b-2y.woffbin0 -> 11192 bytes
-rw-r--r--web/static/fonts/Web437_Wyse700b.woffbin0 -> 10888 bytes
-rw-r--r--web/static/fonts/Web437_Zenith_Z-100.woffbin0 -> 9792 bytes
-rw-r--r--web/static/fonts/Web437_Zenith_Z-100_Alt.woffbin0 -> 9288 bytes
-rw-r--r--web/static/fonts/WebPlus_AST_PremiumExec.woffbin0 -> 22996 bytes
-rw-r--r--web/static/fonts/WebPlus_Amstrad_PC-2y.woffbin0 -> 20984 bytes
-rw-r--r--web/static/fonts/WebPlus_Amstrad_PC.woffbin0 -> 20484 bytes
-rw-r--r--web/static/fonts/WebPlus_Cordata_PPC-21.woffbin0 -> 27860 bytes
-rw-r--r--web/static/fonts/WebPlus_Cordata_PPC-400.woffbin0 -> 30876 bytes
-rw-r--r--web/static/fonts/WebPlus_HP_100LX_10x11.woffbin0 -> 23168 bytes
-rw-r--r--web/static/fonts/WebPlus_HP_100LX_16x12.woffbin0 -> 26132 bytes
-rw-r--r--web/static/fonts/WebPlus_HP_100LX_6x8-2x.woffbin0 -> 20668 bytes
-rw-r--r--web/static/fonts/WebPlus_HP_100LX_6x8.woffbin0 -> 20192 bytes
-rw-r--r--web/static/fonts/WebPlus_HP_100LX_8x8-2x.woffbin0 -> 22424 bytes
-rw-r--r--web/static/fonts/WebPlus_HP_100LX_8x8.woffbin0 -> 21300 bytes
-rw-r--r--web/static/fonts/WebPlus_HP_150_re.woffbin0 -> 26088 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_BIOS-2x.woffbin0 -> 21984 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_BIOS-2y.woffbin0 -> 21836 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_BIOS.woffbin0 -> 21260 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_CGA-2y.woffbin0 -> 20892 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_CGA.woffbin0 -> 20288 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_CGAthin-2y.woffbin0 -> 23472 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_CGAthin.woffbin0 -> 22860 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_EGA_8x14-2x.woffbin0 -> 23340 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_EGA_8x14.woffbin0 -> 22572 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_EGA_8x8-2x.woffbin0 -> 21996 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_EGA_8x8.woffbin0 -> 21276 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_EGA_9x14-2x.woffbin0 -> 23424 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_EGA_9x14.woffbin0 -> 22708 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_EGA_9x8-2x.woffbin0 -> 22032 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_EGA_9x8.woffbin0 -> 21316 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_MDA.woffbin0 -> 23316 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_VGA_8x14-2x.woffbin0 -> 23340 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_VGA_8x14.woffbin0 -> 22572 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_VGA_8x16-2x.woffbin0 -> 23280 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_VGA_8x16.woffbin0 -> 22584 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_VGA_9x14-2x.woffbin0 -> 23424 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_VGA_9x14.woffbin0 -> 22708 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_VGA_9x16-2x.woffbin0 -> 23444 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_VGA_9x16.woffbin0 -> 22712 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_VGA_9x8-2x.woffbin0 -> 22032 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_VGA_9x8.woffbin0 -> 21312 bytes
-rw-r--r--web/static/fonts/WebPlus_IBM_XGA-AI_12x20.woffbin0 -> 31516 bytes
-rw-r--r--web/static/fonts/WebPlus_Rainbow100_re_132.woffbin0 -> 21236 bytes
-rw-r--r--web/static/fonts/WebPlus_Rainbow100_re_40.woffbin0 -> 20868 bytes
-rw-r--r--web/static/fonts/WebPlus_Rainbow100_re_66.woffbin0 -> 20880 bytes
-rw-r--r--web/static/fonts/WebPlus_Rainbow100_re_80.woffbin0 -> 21236 bytes
-rw-r--r--web/static/fonts/WebPlus_Tandy1K-II_200L-2x.woffbin0 -> 22324 bytes
-rw-r--r--web/static/fonts/WebPlus_Tandy1K-II_200L-2y.woffbin0 -> 22196 bytes
-rw-r--r--web/static/fonts/WebPlus_Tandy1K-II_200L.woffbin0 -> 21532 bytes
-rw-r--r--web/static/fonts/WebPlus_Tandy1K-II_225L-2y.woffbin0 -> 22256 bytes
-rw-r--r--web/static/fonts/WebPlus_Tandy1K-II_225L.woffbin0 -> 21596 bytes
-rw-r--r--web/static/fonts/WebPlus_ToshibaSat_8x14.woffbin0 -> 21904 bytes
-rw-r--r--web/static/fonts/WebPlus_ToshibaSat_8x16.woffbin0 -> 22164 bytes
-rw-r--r--web/static/fonts/WebPlus_ToshibaSat_8x8.woffbin0 -> 20708 bytes
-rw-r--r--web/static/fonts/WebPlus_ToshibaSat_9x14.woffbin0 -> 21908 bytes
-rw-r--r--web/static/fonts/WebPlus_ToshibaSat_9x16.woffbin0 -> 22172 bytes
-rw-r--r--web/static/fonts/WebPlus_ToshibaSat_9x8.woffbin0 -> 21048 bytes
-rw-r--r--web/static/fonts/WebPlus_ToshibaTxL1_8x16.woffbin0 -> 24320 bytes
-rw-r--r--web/static/fonts/WebPlus_ToshibaTxL2_8x16.woffbin0 -> 27420 bytes
-rw-r--r--web/static/highlight.css7
-rw-r--r--web/static/main.css607
-rw-r--r--web/static/networkheaven.png (renamed from web/static_elements/networkheaven.png)bin900513 -> 900513 bytes
-rw-r--r--web/static/nh.icobin0 -> 106046 bytes
-rw-r--r--web/static/nh.jpgbin0 -> 10349 bytes
-rw-r--r--web/static/nh.pngbin0 -> 49370 bytes
-rw-r--r--web/static/prompts.json104
-rw-r--r--web/static_elements/f.html2
-rw-r--r--web/static_elements/h.html9
-rw-r--r--web/static_elements/px437_12.ttfbin25960 -> 0 bytes
-rw-r--r--web/static_elements/px437_16.ttfbin32376 -> 0 bytes
-rw-r--r--web/style.css73
-rw-r--r--web/tsconfig.json120
-rw-r--r--web/types/custom.d.ts8
-rw-r--r--web/webpack-dev.config.cjs45
-rw-r--r--web/webpack-prod.config.cjs48
410 files changed, 2751 insertions, 739 deletions
diff --git a/web/BlackWhiteResult.php b/web/BlackWhiteResult.php
deleted file mode 100644
index f687ec6..0000000
--- a/web/BlackWhiteResult.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-/**
- * The black / white or "ascii art" output processor.
- * Transforms the input color values into ascii art characters.
- *
- * (c) 2016 Alex Schenkel
- */
-namespace Img2Ascii;
-require __DIR__ . '/result.php';
-
-class BlackWhiteResult extends Result {
- public $symbols = "@%#*+=-:. ";
-
- protected function gray2ascii($gray) {
- $level = round($gray / 255.0 * (strlen($this->symbols)-1));
- return $this->symbols[(int)min($level,strlen($this->symbols)-1)];
- }
- public function transformValue($value) {
- return $this->gray2ascii($value);
- }
-}
diff --git a/web/ColorResult.php b/web/ColorResult.php
deleted file mode 100644
index 549bda0..0000000
--- a/web/ColorResult.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-/**
- * Transforms an ascii result to a colored HTML representation. Each
- * color value is represented by a single char, but HTML-styled to
- * display the correct color.
- *
- * (c) 2016 Alex Schenkel
- */
-namespace Img2Ascii;
-
-class ColorResult extends Result {
- public $blockChar = '#'; // can also be an HTML entity, e.g. &#x2588;
-
- protected function transformValue($value) {
- $r = floor($value[0]);
- $g = floor($value[1]);
- $b = floor($value[2]);
- return "<span style='color:rgb({$r},{$g},{$b})'>{$this->blockChar}</span>";
- }
-}
diff --git a/web/Processor.php b/web/Processor.php
deleted file mode 100644
index b1bf0bf..0000000
--- a/web/Processor.php
+++ /dev/null
@@ -1,103 +0,0 @@
-<?php
-/**
- * The Processor class processes an image and prepares
- * the color values needed for the ascii output.
- *
- * Its main job is to process each pixel, do color calculations and
- * store an internal color array for later ascii output, which then is done
- * by its helper Result classes.
- *
- * (c) 2016 Alex Schenkel
- */
-namespace Img2Ascii;
-
-class Processor {
- protected $imgPath;
- protected $image;
- protected $imageWidth;
- protected $imageHeight;
-
- protected $result;
-
- public function __construct($pathOrImgres) {
- if (is_file($pathOrImgres)) {
- $this->imgPath = $pathOrImgres;
- $this->image = imagecreatefromstring(file_get_contents($pathOrImgres));
- } else {
- $this->image = $pathOrImgres;
- }
- try {
- $this->imageWidth = imagesx($this->image);
- $this->imageHeight = imagesy($this->image);
- } catch (\Exception $e) {
- throw new \Exception("Image creation failed. Is the given resource a valid image?");
- }
- }
-
- public function asciify($pixelWidth = 10) {
- $charsX = floor($this->imageWidth / $pixelWidth);
- return $this->asciifyToWidth($charsX);
- }
-
- public function asciifyToWidth($charsX) {
- $charsX = (int)$charsX;
- if (!$charsX) $charsX = floor($this->imageWidth / 10);
- $this->result = null;
-
- $blockWidth = $this->imageWidth / (float)$charsX;
- $blockHeight = $blockWidth * 8.0/5.0;
- $blockWidth = max(1,floor($blockWidth));
- $blockHeight = max(1,floor($blockHeight));
-
- $ascii = array();
-
- for ($y = 0; $y < $this->imageHeight; $y += $blockHeight) {
- for ($x = 0; $x < $this->imageWidth; $x += $blockWidth) {
- $value = [0,0,0];
- if ($x === 0) {
- $ascii[$y / $blockHeight] = array();
- }
- $counter = 0;
- for ($innerY = $y; $innerY < $y + $blockHeight; $innerY++) {
- if ($innerY > $this->imageHeight-1) break;
- for ($innerX = $x; $innerX < $x + $blockWidth; $innerX++) {
- if ($innerX > $this->imageWidth-1) break;
- $counter++;
- $rgb = imagecolorat($this->image,$innerX, $innerY);
- $rgb = array($rgb >> 16, $rgb >> 8 & 255, $rgb & 255);
- $value[0] += $rgb[0];
- $value[1] += $rgb[1];
- $value[2] += $rgb[2];
- }
- }
- $value[0] = $value[0] / $counter;
- $value[1] = $value[1] / $counter;
- $value[2] = $value[2] / $counter;
- $ascii[$y / $blockHeight][$x / $blockWidth] = $value;
- }
- }
- $this->result = $ascii;
- return $this;
- }
-
- protected function saturate($ascii) {
- foreach($ascii as $y =>$line) {
- foreach($line as $x => $value) {
- $ascii[$y][$x] = $value[0]*1 + $value[1]*1 + $value[2]*1;
- }
- }
- return $ascii;
- }
-
- public function colorResult($blockChar = '#') {
- $res = new ColorResult($this->result);
- $res->blockChar = $blockChar;
- return $res;
- }
-
- public function result($symbols = "@%#*+=-:. ") {
- $res = new BlackWhiteResult($this->saturate($this->result));
- $res->symbols = $symbols;
- return $res;
- }
-}
diff --git a/web/Result.php b/web/Result.php
deleted file mode 100644
index 52e4c83..0000000
--- a/web/Result.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-/**
- * The basic Result class for the Img2Ascii processor.
- *
- * It defines common output functions for the implementing output
- * transformers.
- *
- * (c) 2016 Alex Schenkel
- */
-namespace Img2Ascii;
-
-class Result {
- public $ascii;
- public function __construct(&$ascii) {
- $this->ascii =& $ascii;
- }
-
- public function writeFile($path, $lineEnding = "\n") {
- $fh = fopen($path,'w');
- foreach($this->ascii as $line) {
- foreach($line as $value) {
- $value = $this->transformValue($value);
- fputs($fh, $value);
- }
- fputs($fh,$lineEnding);
-
- }
- fclose($fh);
- return $this;
- }
-}
diff --git a/web/icons/css.png b/web/icons/css.png
deleted file mode 100644
index 90ccc4f..0000000
--- a/web/icons/css.png
+++ /dev/null
Binary files differ
diff --git a/web/imgs/good1.jpg b/web/imgs/good1.jpg
deleted file mode 100644
index 6a1e742..0000000
--- a/web/imgs/good1.jpg
+++ /dev/null
Binary files differ
diff --git a/web/imgs/good2.jpg b/web/imgs/good2.jpg
deleted file mode 100644
index 32347a4..0000000
--- a/web/imgs/good2.jpg
+++ /dev/null
Binary files differ
diff --git a/web/imgs/good3.png b/web/imgs/good3.png
deleted file mode 100644
index c6679a4..0000000
--- a/web/imgs/good3.png
+++ /dev/null
Binary files differ
diff --git a/web/imgs/good4.jpg b/web/imgs/good4.jpg
deleted file mode 100644
index c8b5fd9..0000000
--- a/web/imgs/good4.jpg
+++ /dev/null
Binary files differ
diff --git a/web/imgs/good5.png b/web/imgs/good5.png
deleted file mode 100644
index 2f9f7e8..0000000
--- a/web/imgs/good5.png
+++ /dev/null
Binary files differ
diff --git a/web/imgs/good6.jpg b/web/imgs/good6.jpg
deleted file mode 100644
index 68c6d45..0000000
--- a/web/imgs/good6.jpg
+++ /dev/null
Binary files differ
diff --git a/web/imgs/good7.jpg b/web/imgs/good7.jpg
deleted file mode 100644
index 01bcd28..0000000
--- a/web/imgs/good7.jpg
+++ /dev/null
Binary files differ
diff --git a/web/imgs/good8.jpg b/web/imgs/good8.jpg
deleted file mode 100644
index 5ae221c..0000000
--- a/web/imgs/good8.jpg
+++ /dev/null
Binary files differ
diff --git a/web/index.php b/web/index.php
deleted file mode 100644
index 5de9665..0000000
--- a/web/index.php
+++ /dev/null
@@ -1,180 +0,0 @@
-<?php header('Content-type: text/html; charset=utf-8');?>
-<?php
-/*
-ini_set('display_errors', '1');
-ini_set('display_startup_errors', '1');
-error_reporting(E_ALL);
-*/
-
-require __DIR__ . '/minecraft.php';
-require __DIR__ . '/blackwhiteresult.php';
-require __DIR__ . '/colorresult.php';
-require __DIR__ . '/processor.php';
-function query_source_server($ip = null, $port = null) {
- // https://stackoverflow.com/questions/33454035/counter-strike-go-server-query
-
- $socket = socket_create(AF_INET, SOCK_DGRAM, 0);
- $result = socket_connect($socket, $ip, $port);
-
- if($result < 0){
- $server['name'] = "UNKNOWN";
- $server['map'] = "Could not connect";
- $server['game'] = "UNKNOWN";
- $server['description'] = "Could not connect";
- $server['players'] = 0;
- $server['playersmax'] = 0;
- $server['bots'] = 0;
- $server['dedicated'] = "x";
- $server['os'] = "x";
- $server['password'] = "x";
- $server['vac'] = "Could not connect";
- $server['ip'] = "X.X.X.X";
- $server['port'] = "00000";
-
- return $server;
- }
-
- // FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69 6E 65 20 51 75 65 72 79 00
- $data = "\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00";
- socket_write($socket, $data, strlen($data));
-
- $out = socket_read($socket, 4096);
-
- $queryData = explode("\x00", substr($out, 6), 5);
-
- $server['name'] = $queryData[0];
- $server['map'] = $queryData[1];
- $server['game'] = $queryData[2];
- $server['description'] = $queryData[3];
- $packet = $queryData[4];
- $app_id = (unpack("S", substr($packet, 0, 2)));
- $app_id = array_pop($app_id);
- $server['players'] = ord(substr($packet, 2, 1));
- $server['playersmax'] = ord(substr($packet, 3, 1));
- $server['bots'] = ord(substr($packet, 4, 1));
- $server['dedicated'] = substr($packet, 5, 1);
- $server['os'] = substr($packet, 6, 1);
- $server['password'] = ord(substr($packet, 7, 1));
- $server['vac'] = ord(substr($packet, 8, 1));
- $server['ip'] = $ip;
- $server['port'] = $port;
-
- if ($server['bots'] > 0){
- $server['players'] = ($server['players'] - $server['bots']);
- }
-
- return $server;
-}
-function query_minecraft_server($ip = null, $port = null) {
- $server['result_valid'] = false;
- try {
- $mq = new MinecraftQuery();
- $mq->Connect($ip, intval($port), 3, true);
- $players = $mq->GetPlayers();
- if ($players == false) $server['players'] = 0;
- else $server['players'] = count($players);
- $info = $mq->GetInfo();
- if ($info == false) return $server;
- $server['version'] = $info['Version'];
- $server['software'] = $info['Software'];
- $server['ip'] = "{$ip}";
- $server['port'] = "{$port}";
- $server['playersmax'] = $info['MaxPlayers'];
- $server['result_valid'] = true;
- } catch (MinecraftQueryException $e) { }
-
-
- return $server;
-}
-
-function generate_status_div($server = null, $demos = true) {
- echo "<div class=\"statusbox\">\n";
- echo "<H4>" . $server['name'] . "</H4>\n";
- echo "<H4>" . $server['ip'] . ":" . $server['port'] . "</H4>\n";
- echo $server['description'] . "\n\n";
- echo $server['map'] . "\n";
- echo "Players: " . $server['players'] . "/" . ($server['playersmax'] - 1) . "\n";
- echo "Bots: " . $server['bots'] . "\n\n";
- if( $demos == true )
- echo "<a href=\"steam://connect/" . $server['ip'] . ":" . $server['port']."\">CONNECT</a>&nbsp;&nbsp;<a href='/demos_css/'>DEMOS</a>";
- else
- echo "<a href=\"steam://connect/" . $server['ip'] . ":" . $server['port']."\">CONNECT</a>";
-
- echo "<hr>";
- echo "</div>\n";
-}
-
-function generate_mc_status_div($server = null) {
-
- echo "<div class=\"statusbox\">\n";
- echo "<H4>~~~ networkheaven.net ~~~</H4>\n";
- echo "<H4>" . $server['ip'] . ":" . $server['port'] . "</H4>\n";
- echo "minecraft\n\n";
- echo "Players: " . $server['players'] . "/" . ($server['playersmax']) . "\n";
- echo "Version: " . $server['version'] . "\n";
- echo "Software: " . $server['software'] . "\n\n";
- echo "<hr>";
- echo "</div>\n";
-}
-
-function gen_ascii() {
- $dirp = './imgs/';
- $imgs = scandir($dirp);
- $imgn = count($imgs);
- $path = $dirp . '' . $imgs[rand(2, $imgn - 1)];
- $processor = new Img2Ascii\Processor($path);
- $res = $processor->asciifyToWidth(45)->result(" .:-=+*#%@");
- foreach($res->ascii as $line) {
- foreach($line as $value) {
- $value = $res->transformValue($value);
- echo ($value);
- }
-
- echo '<br>';
- }
-}
-
-?>
-
-<?php
- echo file_get_contents("static_elements/h.html");
-?>
-
-<div style="margin: 0 auto; width: 820px; height: 880px; border: 1px solid #000000; background-color: #808080;">
- <h1 style="height:48px">
- NETWORKHEAVEN.NET
- </h1>
- <hr style="margin: 0"/>
-
- <div style="float: left; width: 200px; height: 785px; border-right: 1px solid #5B5B66; background-color: #808080; margin: 0 auto; padding: 0">
- <?php
- $serverdata = query_source_server("45.33.90.90", "27015");
- if( $serverdata['playersmax'] > 0 )
- generate_status_div($serverdata);
- $serverdata = query_source_server("107.192.200.138", "27015");
- if( $serverdata['playersmax'] > 0 )
- generate_status_div($serverdata, false);
- $serverdata = query_source_server("107.192.200.138", "27016");
- if( $serverdata['playersmax'] > 0 )
- generate_status_div($serverdata, false);
- $serverdata = query_minecraft_server("45.33.90.90", "25565");
- if( $serverdata['playersmax'] > 0 )
- generate_mc_status_div($serverdata);
- ?>
- </div>
- <div style="float: left; width: 570px; background-color: #808080; padding-left: 30px; margin-top: 20px;">
- <h3>we want to provide an oldschool hassle-free gaming experience</h3>
- <h3>our servers run minimal plugins developed by our own team, aiming only to smooth out vanilla gameplay</h3>
- <pre style="display:block; text-align: center">
- <?php
- gen_ascii();
- ?></pre>
- <h3>we hope you enjoy your stay and have fun!</h3><br>
- <h3><a href="https://steamcommunity.com/groups/networkheaven">STEAM</a><h3>
- </div>
-</div>
-
-
-<?php
- echo file_get_contents("static_elements/f.html");
-?>
diff --git a/web/minecraft.php b/web/minecraft.php
deleted file mode 100644
index 4f9dbc7..0000000
--- a/web/minecraft.php
+++ /dev/null
@@ -1,300 +0,0 @@
-<?php
-
-class MinecraftQuery
-{
- /*
- * Class written by xPaw
- *
- * Website: http://xpaw.me
- * GitHub: https://github.com/xPaw/PHP-Minecraft-Query
- */
-
- const STATISTIC = 0x00;
- const HANDSHAKE = 0x09;
-
- private $Socket;
- private $Players;
- private $Info;
-
- public function Connect( $Ip, $Port = 25565, $Timeout = 3, $ResolveSRV = true )
- {
- if( !is_int( $Timeout ) || $Timeout < 0 )
- {
- throw new \InvalidArgumentException( 'Timeout must be an integer.' );
- }
-
- if( $ResolveSRV )
- {
- $this->ResolveSRV( $Ip, $Port );
- }
-
- $this->Socket = @\fsockopen( 'udp://' . $Ip, (int)$Port, $ErrNo, $ErrStr, (float)$Timeout );
-
- if( $ErrNo || $this->Socket === false )
- {
- throw new MinecraftQueryException( 'Could not create socket: ' . $ErrStr );
- }
-
- \stream_set_timeout( $this->Socket, $Timeout );
- \stream_set_blocking( $this->Socket, true );
-
- try
- {
- $Challenge = $this->GetChallenge( );
-
- $this->GetStatus( $Challenge );
- }
- finally
- {
- \fclose( $this->Socket );
- }
- }
-
- public function ConnectBedrock( $Ip, $Port = 19132, $Timeout = 3, $ResolveSRV = true )
- {
- if( !is_int( $Timeout ) || $Timeout < 0 )
- {
- throw new \InvalidArgumentException( 'Timeout must be an integer.' );
- }
-
- if( $ResolveSRV )
- {
- $this->ResolveSRV( $Ip, $Port );
- }
-
- $this->Socket = @\fsockopen( 'udp://' . $Ip, (int)$Port, $ErrNo, $ErrStr, (float)$Timeout );
-
- if( $ErrNo || $this->Socket === false )
- {
- throw new MinecraftQueryException( 'Could not create socket: ' . $ErrStr );
- }
-
- \stream_set_timeout( $this->Socket, $Timeout );
- \stream_set_blocking( $this->Socket, true );
-
- try
- {
- $this->GetBedrockStatus();
- }
- finally
- {
- \fclose( $this->Socket );
- }
- }
-
- public function GetInfo( )
- {
- return isset( $this->Info ) ? $this->Info : false;
- }
-
- public function GetPlayers( )
- {
- return isset( $this->Players ) ? $this->Players : false;
- }
-
- private function GetChallenge( )
- {
- $Data = $this->WriteData( self :: HANDSHAKE );
-
- if( $Data === false )
- {
- throw new MinecraftQueryException( 'Failed to receive challenge.' );
- }
-
- return \pack( 'N', $Data );
- }
-
- private function GetStatus( $Challenge )
- {
- $Data = $this->WriteData( self :: STATISTIC, $Challenge . \pack( 'c*', 0x00, 0x00, 0x00, 0x00 ) );
-
- if( !$Data )
- {
- throw new MinecraftQueryException( 'Failed to receive status.' );
- }
-
- $Last = '';
- $Info = Array( );
-
- $Data = \substr( $Data, 11 ); // splitnum + 2 int
- $Data = \explode( "\x00\x00\x01player_\x00\x00", $Data );
-
- if( \count( $Data ) !== 2 )
- {
- throw new MinecraftQueryException( 'Failed to parse server\'s response.' );
- }
-
- $Players = \substr( $Data[ 1 ], 0, -2 );
- $Data = \explode( "\x00", $Data[ 0 ] );
-
- // Array with known keys in order to validate the result
- // It can happen that server sends custom strings containing bad things (who can know!)
- $Keys = Array(
- 'hostname' => 'HostName',
- 'gametype' => 'GameType',
- 'version' => 'Version',
- 'plugins' => 'Plugins',
- 'map' => 'Map',
- 'numplayers' => 'Players',
- 'maxplayers' => 'MaxPlayers',
- 'hostport' => 'HostPort',
- 'hostip' => 'HostIp',
- 'game_id' => 'GameName'
- );
-
- foreach( $Data as $Key => $Value )
- {
- if( ~$Key & 1 )
- {
- if( !isset( $Keys[ $Value ] ) )
- {
- $Last = false;
- continue;
- }
-
- $Last = $Keys[ $Value ];
- $Info[ $Last ] = '';
- }
- else if( $Last != false )
- {
- $Info[ $Last ] = mb_convert_encoding( $Value, 'UTF-8' );
- }
- }
-
- // Ints
- $Info[ 'Players' ] = (int)$Info[ 'Players' ];
- $Info[ 'MaxPlayers' ] = (int)$Info[ 'MaxPlayers' ];
- $Info[ 'HostPort' ] = (int)$Info[ 'HostPort' ];
-
- // Parse "plugins", if any
- if( $Info[ 'Plugins' ] )
- {
- $Data = \explode( ": ", $Info[ 'Plugins' ], 2 );
-
- $Info[ 'RawPlugins' ] = $Info[ 'Plugins' ];
- $Info[ 'Software' ] = $Data[ 0 ];
-
- if( \count( $Data ) == 2 )
- {
- $Info[ 'Plugins' ] = \explode( "; ", $Data[ 1 ] );
- }
- }
- else
- {
- $Info[ 'Software' ] = 'Vanilla';
- }
-
- $this->Info = $Info;
-
- if( empty( $Players ) )
- {
- $this->Players = null;
- }
- else
- {
- $this->Players = \explode( "\x00", $Players );
- }
- }
-
- private function GetBedrockStatus( )
- {
- // hardcoded magic https://github.com/facebookarchive/RakNet/blob/1a169895a900c9fc4841c556e16514182b75faf8/Source/RakPeer.cpp#L135
- $OFFLINE_MESSAGE_DATA_ID = \pack( 'c*', 0x00, 0xFF, 0xFF, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0x12, 0x34, 0x56, 0x78 );
-
- $Command = \pack( 'cQ', 0x01, time() ); // DefaultMessageIDTypes::ID_UNCONNECTED_PING + 64bit current time
- $Command .= $OFFLINE_MESSAGE_DATA_ID;
- $Command .= \pack( 'Q', 2 ); // 64bit guid
- $Length = \strlen( $Command );
-
- if( $Length !== \fwrite( $this->Socket, $Command, $Length ) )
- {
- throw new MinecraftQueryException( "Failed to write on socket." );
- }
-
- $Data = \fread( $this->Socket, 4096 );
-
- if( empty( $Data ) )
- {
- throw new MinecraftQueryException( "Failed to read from socket." );
- }
-
- if( $Data[ 0 ] !== "\x1C" ) // DefaultMessageIDTypes::ID_UNCONNECTED_PONG
- {
- throw new MinecraftQueryException( "First byte is not ID_UNCONNECTED_PONG." );
- }
-
- if( \substr( $Data, 17, 16 ) !== $OFFLINE_MESSAGE_DATA_ID )
- {
- throw new MinecraftQueryException( "Magic bytes do not match." );
- }
-
- // TODO: What are the 2 bytes after the magic?
- $Data = \substr( $Data, 35 );
-
- // TODO: If server-name contains a ';' it is not escaped, and will break this parsing
- $Data = \explode( ';', $Data );
-
- $this->Info =
- [
- 'GameName' => $Data[ 0 ] ?? null,
- 'HostName' => $Data[ 1 ] ?? null,
- 'Protocol' => $Data[ 2 ] ?? null,
- 'Version' => $Data[ 3 ] ?? null,
- 'Players' => isset( $Data[ 4 ] ) ? (int)$Data[ 4 ] : 0,
- 'MaxPlayers' => isset( $Data[ 5 ] ) ? (int)$Data[ 5 ] : 0,
- 'ServerId' => $Data[ 6 ] ?? null,
- 'Map' => $Data[ 7 ] ?? null,
- 'GameMode' => $Data[ 8 ] ?? null,
- 'NintendoLimited' => $Data[ 9 ] ?? null,
- 'IPv4Port' => isset( $Data[ 10 ] ) ? (int)$Data[ 10 ] : 0,
- 'IPv6Port' => isset( $Data[ 11 ] ) ? (int)$Data[ 11 ] : 0,
- 'Extra' => $Data[ 12 ] ?? null, // What is this?
- ];
- $this->Players = null;
- }
-
- private function WriteData( $Command, $Append = "" )
- {
- $Command = \pack( 'c*', 0xFE, 0xFD, $Command, 0x01, 0x02, 0x03, 0x04 ) . $Append;
- $Length = \strlen( $Command );
-
- if( $Length !== \fwrite( $this->Socket, $Command, $Length ) )
- {
- throw new MinecraftQueryException( "Failed to write on socket." );
- }
-
- $Data = \fread( $this->Socket, 4096 );
-
- if( $Data === false )
- {
- throw new MinecraftQueryException( "Failed to read from socket." );
- }
-
- if( \strlen( $Data ) < 5 || $Data[ 0 ] != $Command[ 2 ] )
- {
- return false;
- }
-
- return \substr( $Data, 5 );
- }
-
- private function ResolveSRV( &$Address, &$Port )
- {
- if( \ip2long( $Address ) !== false )
- {
- return;
- }
-
- $Record = @\dns_get_record( '_minecraft._tcp.' . $Address, DNS_SRV );
-
- if( empty( $Record ) )
- {
- return;
- }
-
- if( isset( $Record[ 0 ][ 'target' ] ) )
- {
- $Address = $Record[ 0 ][ 'target' ];
- }
- }
-}
diff --git a/web/package.json b/web/package.json
new file mode 100644
index 0000000..4418f02
--- /dev/null
+++ b/web/package.json
@@ -0,0 +1,32 @@
+{
+ "type": "module",
+ "name": "jqueryjsx",
+ "version": "1.0.0",
+ "main": "index.js",
+ "scripts": {
+ "build": "webpack --config webpack-prod.config.cjs",
+ "start": "webpack serve --open --config webpack-dev.config.cjs"
+ },
+ "author": "",
+ "license": "ISC",
+ "description": "",
+ "dependencies": {
+ "@types/jquery": "^3.5.32",
+ "@types/react": "^18.3.12",
+ "copy-webpack-plugin": "^12.0.2",
+ "css-loader": "^7.1.2",
+ "highlight.js": "^11.11.1",
+ "html-webpack-plugin": "^5.6.3",
+ "jquery": "^4.0.0-beta.2",
+ "jsx-runtime": "^1.2.0",
+ "nakedjsx": "^0.17.2",
+ "style-loader": "^4.0.0",
+ "typescript": "^5.6.3"
+ },
+ "devDependencies": {
+ "ts-loader": "^9.5.1",
+ "webpack": "^5.95.0",
+ "webpack-cli": "^5.1.4",
+ "webpack-dev-server": "^5.1.0"
+ }
+}
diff --git a/web/src/api.tsx b/web/src/api.tsx
new file mode 100644
index 0000000..7233d89
--- /dev/null
+++ b/web/src/api.tsx
@@ -0,0 +1,39 @@
+export const url = "https://networkheaven.net";
+
+export interface ReqParams {
+ method: string,
+ body?: string,
+}
+
+export async function post( endpoint: string, body: Object ) {
+ return await req( endpoint, {
+ method: "POST",
+ body: JSON.stringify( body ),
+ } );
+}
+
+export async function req( endpoint: string, params: ReqParams ) {
+ const res = await fetch( `${url}/${endpoint}`, {
+ method: params.method,
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: params.body,
+ } );
+
+ if( !res.ok ) {
+ let json = null;
+ try {
+ json = await res.json();
+ } catch( e: any ) {
+ throw new Error( "error contacting server" );
+ }
+
+ throw new Error( json.msg );
+ }
+
+ const json = await res.json();
+ if( json.status != 'ok' )
+ throw new Error( json.msg );
+ return json;
+}
diff --git a/web/src/ascii-art.tsx b/web/src/ascii-art.tsx
new file mode 100644
index 0000000..a6caefe
--- /dev/null
+++ b/web/src/ascii-art.tsx
@@ -0,0 +1,148 @@
+import * as JSX from "./jsx";
+import $ from "jquery";
+
+export function AsciiArt() {
+ const ret = <div id="ascii-art">
+ { asciiArtStr }
+ </div>;
+
+ setTimeout( doAsciiArt );
+ return ret;
+}
+
+let startTime = 0.0;
+let anim = 0.0;
+
+function animFunc( a: number ) {
+ let ringRadius = anim;
+ let radius = a;
+
+ let dist = ringRadius - radius;
+
+ dist = Math.abs( dist );
+
+ let ret = Math.pow( dist, 0.1 + 0.8 * Math.pow( (anim + 0.5) / 2, 1.6 ) );
+ let remain = ret % 0.12;
+ return ret - remain;
+}
+
+function hexToRgb( hex: string ) {
+ let r = parseInt( hex.slice( 1, 3 ), 16 );
+ let g = parseInt( hex.slice( 3, 5 ), 16 );
+ let b = parseInt( hex.slice( 5, 7 ), 16 );
+ return [ r, g, b ];
+}
+
+function lerpColor( c1: number[], c2: number[], t: number ) {
+ let r1 = c1[0], g1 = c1[1], b1 = c1[2], a1 = c1[3];
+ let r2 = c2[0], g2 = c2[1], b2 = c2[2], a2 = c2[3];
+ let r = r1 + ( r2 - r1 ) * t;
+ let g = g1 + ( g2 - g1 ) * t;
+ let b = b1 + ( b2 - b1 ) * t;
+ let a = a1 + ( a2 - a1 ) * t;
+ return [ Math.round( r ), Math.round( g ), Math.round( b ), Math.round( a ) ];
+}
+
+function getDist( x: number, y: number ) {
+ const x1 = 0.75 - x / 71;
+ const y1 = 0.75 - y / 35;
+ return Math.sqrt( x1 * x1 + y1 * y1 );
+}
+
+let topY = 0;
+
+let isDoingAnim = false;
+function doAsciiArt() {
+ let div = $( "#ascii-art" );
+ if( !div.length ) { isDoingAnim = false; return; }
+ isDoingAnim = true;
+
+ let deltaTime = ( Date.now() - startTime ) * 0.001;
+ startTime = Date.now();
+ anim += .5 * deltaTime;
+
+ if( anim > 2 )
+ anim = -0.5;
+
+ let rootColor = [ 255, 0, 255 ];
+ let innerStr = "";
+ for( let i = 0; i < asciiArtStr.length; ++i ) {
+ let x = i % 71;
+ let y = Math.floor( i / 71 );
+ if( y > topY )
+ topY = y;
+
+
+ if( asciiArtStr[i] == ',' || asciiArtStr[i] == '\t' ) {
+ innerStr += asciiArtStr[i];
+ continue;
+ }
+ if( asciiArtStr[i] == ' ' ) {
+ innerStr += ' ';
+ continue;
+ }
+
+ let dist = getDist( x, y );
+
+ let color = [];
+ if( asciiArtStr[i] == '#' ) {
+ let a = animFunc( dist * 2 );
+ color = lerpColor( rootColor, [255, 255, 255, 1], a );
+ color[3] = Math.max( Math.min( 1, Math.pow( dist, 2 ) + (1.0 - a) ), 0.8 );
+ }
+ else {
+ const t = Math.max( 0.05, 1.0 - animFunc( (dist) * 0.75 ) );
+ if( t < 0.25 ) {
+ color = lerpColor( [255, 255, 255, 255], [255, 189, 255, 255], (t - 0.5) * 2 );
+ }
+ else if( t > 0.5 && t < 0.75 ) {
+ color = lerpColor( [255, 189, 255, 255], [0, 255, 255, 255], (t - 0.5) * 2 );
+ } else {
+ color = lerpColor( [255, 255, 255, 255], [0, 255, 255, 255], (t - 0.5) * 2 );
+ }
+ }
+ // appending string is faster than jsx
+ innerStr += `<span style='color: rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})'>${asciiArtStr[i]}</span>`;
+ }
+
+ div.html( innerStr );
+ setTimeout( doAsciiArt, 85 );
+}
+
+const asciiArtStr = `
+ā£æā£æā£æā£æā£æā£æā£æā£æā£¶ā£¤ā£„ā”€ā €ā¢æā”æā£ā €ā¢†ā”˜ā ¤ā”˜ā  ā¢°ā ƒā”„ā ‚ā „ā €ā €ā €ā €ā”€ā”†ā Œā¢„ā €ā €ā¢ ā”‡ā ‚ā”Œā „ā €ā €ā €ā €ā €ā €ā ”ā£–ā €ā¢ƒā øā €ā øā£Ÿā”„ā ˜ā”½ā”œā”„ā €ā €ā €ā ˆā ¦ā €ā €ā €ā ø
+ā£æā£æā£æā£æā£æā£æā”æā ā ˆā¢»ā”ā£Ÿā£·ā”æā¢ā ¤ā¢€ā ¢ā¢Œā °ā”€ā ‚ā”Ÿā  ā”„ā ˆā €ā €ā£€ā ¤ā ā£°ā Œā”ˆā¢„ā ‚ā””ā£ŗā „ā”‡ā °ā ˆā”„ā¢ƒā °ā¢€ā °ā¢€ā ‚ā¢½ā ‚ā¢¼ā ā” ā „ā£æā”¼ā”€ā ±ā¢¹ā”°ā €ā €ā €ā €ā €ā£†ā €ā €ā €
+ā£æā£æā£æā£æā£æā£æā ā¢„ā  ā¢€ā£¹ā£žā”æā¢ā¢Šā °ā¢€ā Žā”ā¢‚ā ā¢³ā ‹ā “ā ā €ā£ ā žā” ā¢ā£ŗā”‡ā ¤ā¢ā ¢ā ˜ā¢ ā”æā¢°ā”ā „ā¢ƒā”ā¢ˆā °ā¢ˆā °ā¢øā Œā£øā Œā¢ŗā”ā ¤ā¢ˆā£½ā£§ā¢©ā”„ā¢‰ā¢§ā ”ā ‰ā”ā ’ā ¤ā£øā”€ā €ā €
+ā£æā£æā£æā£æā£æā£æā ©ā”ā Œā¢æā”Æā£æā ‡ā”Œā ¢ā¢”ā ˆā””ā ˆā ‚ā ƒā¢¾ā¢ˆā ’ā €ā”“ā¢ā”¾ā ‘ā£øā¢»ā¢€ā ’ā¢ ā ‚ā”‰ā¢¼ā”‡ā¢øā”‡ā Œā „ā”„ā¢ƒā °ā¢ˆā °ā øā”‚ā¢¼ā¢ˆā¢¹ā †ā °ā¢øā¢æā øā”†ā¢·ā¢ˆā øā£„ā ƒā ¤ā¢‰ā”ā Øā£§ā €ā”€
+ā£æā£æā£æā£æā£æā£æā”Ÿā£æā£»ā¢¾ā”·ā£æā ā”„ā¢ƒā †ā ˆā ā ā €ā €ā£¾ā øā €ā¢€ā”‡ā£¼ā ‡ā¢”ā”ā£‡ā ¢ā ˜ā”€ā †ā¢”ā”Žā”‡ā¢ŗā£‡ā ˜ā¢ ā ā Øā”ā¢‚ā ¢ā¢”ā”‡ā ¾ā¢ˆā¢øā”ƒā”˜ā¢¼ā¢øā €ā¢»ā ˆā£‡ā Œā£·ā¢ˆā”ā ‚ā ¤ā¢±ā¢æā €ā ”
+ā£æā£æā£æā£æā£æā£æā£Æā”šā¢§ā”»ā£½ā”ā °ā”ˆā¢„ā ˆā €ā”€ā €ā €ā €ā£æā¢øā¢€ā¢‚ā¢øā”Ÿā”ˆā¢¼ā¢³ā ā¢‚ā”ā †ā”‘ā¢ŗā¢±ā”‡ā£¼ā¢æā ˆā „ā”ˆā ”ā¢ā  ā¢ā¢ŗā”„ā”Ÿā”€ā¢ŗā¢ā”“ā”æā¢øā¢„ā ˆā”‡ā¢ŗā”†ā¢øā”†ā ¤ā¢‰ā °ā¢ā£øā ˆā ”
+ā£æā£æā£æā£æā£æā£æā£æā£·ā ā¢æā£¹ā”‡ā ”ā Œā €ā €ā €ā €ā €ā €ā¢€ā”æā£øā €ā¢‚ā£æā¢ƒā ā”žā”¼ā¢ˆā£„ā£ā£¤ā”“ā”Æā¢¼ā “ā”æā¢¼ā ¾ā ¶ā ¶ā ¶ā£¤ā ‚ā Œā£¹ā¢°ā”‡ā”ā”ā¢øā¢”ā”‡ā”½ā”€ā ‘ā¢³ā ā£·ā €ā¢æā”‡ā Œā”ā ‚ā”½ā¢ˆā”
+ā£æā£æā£æā£æā£æā£æā£æā”ā  ā£„ā£æā „ā €ā €ā €ā €ā €ā”…ā €ā  ā¢ ā”Ÿā£§ā ˆā£°ā£æā €ā£¼ā “ā”—ā¢‰ā ‰ā”ā¢ ā¢·ā ƒā¢øā¢ ā ƒā¢øā£æā €ā¢€ā ‚ā¢øā €ā¢‚ā”ā£¼ā ā£øā ā”ā”œā”‡ā”§ā ¬ā£“ā£¼ā£€ā¢æā¢‡ā¢øā£¹ā €ā €ā”ā ‡ā”ƒā „
+ā£æā£æā£æā£æā£æā£æā£æā£‡ā”·ā Šā¢øā €ā €ā €ā¢ ā£¦ā£„ā ‡ā”ˆā¢ā †ā£æā£§ā ā£½ā”‡ā ā£¾ā¢°ā”‡ā¢‚ā ”ā¢ˆā”ā”žā €ā”¼ā£øā €ā €ā£æā €ā €ā ‚ā£ā ā¢øā¢”ā”Ÿā¢€ā”ā£¼ā¢±ā ā£§ā ā €ā €ā ˆā”Ÿā£»ā ŗā£¤ā£æā”†ā ā €ā”‡ā „ā”ˆ
+ā£æā£æā£æā£æā£æā£æā£æā£æā£„ā ‚ā£æā €ā €ā¢ ā ƒā¢æā££ā ā  ā Œā  ā£æā£æā €ā¢æā ƒā¢Œā£æā øā”‡ā¢€ā¢‚ā”¼ā”¼ā €ā¢€ā¢§ā”Æā „ā”€ā£æā €ā Œā¢°ā”‡ā ˆā£¼ā”æā ā”žā£øā¢‡ā ‡ā¢°ā”Ÿā €ā €ā €ā ˆā”‡ā”ā €ā¢‡ā”Ÿā”§ā£„ā ‚ā”‡ā €ā¢°
+ā£æā£æā£æā£æā£æā”æā¢­ā¢æā£æā£¶ā£»ā”†ā €ā”ā  ā øā”½ā£ā ā”ˆā”ā¢æā£»ā” ā£æā ˆā¢øā”ā£†ā£§ā£¾ā£¾ā£æā£æā£¶ā£¾ā£¾ā£†ā „ā €ā£æā”†ā €ā£øā ā£øā”æā¢ā”žā”•ā”¹ā”Œā €ā£¼ā¢ā ¤ā ¤ā¢€ā£€ā”‡ā”‡ā €ā øā£¼ā”‡ā €ā ‘ā£·ā ˆā£ø
+ā£æā£æā£æā£æā£æā”¹ā¢Žā£—ā”»ā£æā£·ā£‡ā ˜ā£‡ā „ā”ā¢»ā£½ā”†ā ”ā  ā¢¹ā£æā”“ā£æā£“ā£æā£æā£æā£æā”æā£Ÿā£æā¢«ā£Ÿā£ā ‰ā ™ā ›ā ¶ā£æā¢æā €ā”žā¢€ā”Ÿā¢”ā£¾ā Šā£°ā Ÿā €ā£¼ā ƒā£ā£¤ā£“ā£¦ā£¤ā£§ā£‡ā£ ā €ā£æā”‡ā €ā”ā”ā €ā”æ
+ā£æā£æā£æā”Ÿā£§ā£›ā”­ā¢¶ā”™ā£æā¢»ā£æā”„ā¢»ā””ā  ā”ˆā¢§ā¢æā”†ā¢”ā ˆā¢æā£‡ā£·ā£æā”æā ›ā£Æā¢½ā”³ā¢§ā”žā €ā €ā£½ā”€ā €ā €ā €ā ›ā ˜ā »ā¢£ā£žā£“ā Ÿā ā  ā ā €ā ā ā¢øā£æā¢æā£Ÿā æā£æā”æā£æā£·ā£¤ā£øā”‚ā €ā¢øā ƒā¢°ā ‡
+ā£æā£æā”æā£¹ā£§ā”“ā¢¾ā¢·ā”Ÿā¢øā£Æā¢¹ā£·ā”Œā¢»ā£„ā ±ā£Œā ³ā£æā£¦ā ²ā ¾ā£æā£æā£æā ā ˆā£Ÿā Šā¢æā”§ā¢æā ƒā”œā£øā”‡ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā£ā£Ÿā”‘ā¢€ā”»ā”“ā¢·ā ˆā »ā£æā£æā£Ÿā ‹ā”Ÿā¢€ā”Žā „
+ā£æā£æā ³ā£½ā ²ā£ā”æā¢øā”‡ā£øā ™ā£·ā¢ŗā£æā£§ā”»ā£·ā£Œā¢¢ā”™ā¢½ā£·ā£¤ā ˜ā¢§ā ™ā¢¦ā”€ā¢»ā”Œā €ā¢ ā¢ā ’ā¢Æā”€ā €ā €ā €ā €ā €ā”€ā €ā¢€ā €ā¢€ā €ā €ā €ā €ā €ā €ā €ā”ā£·ā£¹ā”ā µā”™ā£ŗā €ā €ā øā£æā£æā£¾ā¢ā”¾ā €ā£²
+ā£æā¢«ā”ā£¾ā¢¹ā£¾ā¢ƒā¢¹ā”‡ā¢¼ā ‚ā£æā£¹ā ‹ā¢‰ā”æā£¾ā£æā£·ā£Œā ²ā£½ā¢æā£æā£®ā£·ā£€ā ˆā €ā ™ā —ā ’ā šā”‹ā ‰ā €ā €ā €ā €ā£ŗā ‚ā €ā €ā¢€ā €ā  ā ā£€ā”€ā ‚ā €ā €ā €ā¢·ā¢ˆā ©ā €ā””ā ²ā ā €ā €ā£øā¢Ÿā£½ā£«ā”Ÿā¢ā£“ā¢
+ā£ā¢·ā£™ā£®ā Ÿā”ā ¢ā¢¼ā”‡ā¢øā”æā¢§ā£Ÿā €ā”‡ā”„ā£¤ā¢©ā¢æā£›ā¢·ā£¤ā£­ā£›ā¢æā£®ā ‰ā ³ā ¦ā£¤ā ā ā””ā¢ˆā¢„ā ”ā …ā”†ā ‚ā €ā €ā”ˆā €ā¢ˆā” ā †ā Øā¢€ā €ā €ā €ā „ā ā ˆā ™ā”²ā¢·ā”¼ā”†ā €ā „ā”ā ā£æā£æā£‹ā£“ā£¾ā¢‹ā£¾
+ā£žā¢ŗā£¼ā ā”ā Œā”ā£æā”‡ā¢øā”‡ā ¼ā£æā €ā¢·ā €ā¢¹ā”†ā£æā”‰ā šā ¶ā£­ā£»ā£æā”Ÿā ¢ā¢„ā¢¤ā¢‡ā”€ā”…ā ¦ā  ā”“ā €ā €ā ā¢ā €ā †ā ƒā „ā –ā ‰ā ‚ā …ā Šā ā¢’ā „ā ā£€ā €ā ‚ā ‰ā£€ā ā”„ā ā ˆā ā¢øā£æā¢«ā£æā”³ā£µā”æā¢æ
+ā£Žā”æā¢¼ā ‚ā”…ā¢Šā ”ā£æā£µā¢ŗā”ā „ā£æā£§ā”ˆā “ā¢Œā ·ā¢¾ā”‡ā¢ā ¢ā¢€ā¢¹ā ‘ā£·ā ˆā” ā ā ¤ā Øā£ā¢ƒā •ā ‹ā”«ā¢—ā ‰ā ˆā”‚ā ā €ā¢‚ā ā¢ā £ā €ā ā €ā ˜ā ’ā „ā “ā¢„ā¢€ā ā ā €ā ā €ā €ā ˆā”æā£¬ā”æā¢£ā”“ā£øā£‡ā¢»
+ā£¾ā£ƒā”Æā¢¼ā£€ā £ā£ˆā£æā”½ā£ŗā ›ā¢ ā ¹ā”»ā£æā£¦ā”€ā ‘ā Ŗā£‡ā ‚ā ”ā”ˆā”¾ā Šā£æā Žā µā ƒā”“ā €ā”€ā ‰ā „ā †ā ā ‰ā €ā ˆā ”ā ‚ā €ā €ā”€ā¢ˆā£€ā Šā£”ā ‚ā €ā”ā ›ā Šā¢ā °ā –ā ƒā €ā ā¢€ā”€ā¢°ā Ÿā”žā ”ā¢ ā¢°ā£æā øā£ø
+ā£æā£æā£³ā¢Æā£æā£æā£æā£·ā£½ā£¹ā”‡ā Œā£·ā¢³ā¢‹ā »ā¢æā£¦ā£€ā”Ÿā”€ā Šā¢°ā”‡ā ‚ā£æā”‡ā  ā ā €ā ā €ā”ā €ā €ā €ā €ā €ā €ā €ā €ā €ā” ā””ā ā €ā ‰ā ¢ā¢€ā €ā €ā €ā €ā ˆā ˆā ā¢€ā  ā Šā €ā ˆā¢ŗā”žā  ā¢ā¢‚ā£Æā”ā µā”˜
+ā£æā£æā”œā£æā£æā£æā£æā£æā¢¾ā£»ā£§ā”‚ā¢¹ā£ā£æā”„ā Œā¢»ā£æā£§ā €ā ”ā£øā  ā ā£¾ā”‡ā €ā €ā €ā €ā €ā ˆā €ā €ā €ā €ā €ā¢€ā” ā ā ā €ā €ā €ā €ā €ā €ā €ā ‰ā «ā£¦ā €ā €ā¢€ā ”ā ā €ā €ā €ā”€ā €ā ™ā¢¦ā¢ā”žā£¼ā”™ā¢¦ā ‘
+ā£æā£æā”½ā£¹ā£æā£æā£æā£æā”Æā£·ā£Æā¢æā£„ā »ā£œā£·ā”ˆā „ā¢»ā£·ā ˆā¢ ā”—ā  ā ā£æā¢øā£„ā €ā €ā €ā €ā €ā €ā¢€ā””ā Šā ‰ā €ā €ā €ā €ā €ā €ā”°ā ‚ā ¤ā£€ā €ā €ā¢€ā£ƒā €ā£°ā ā €ā €ā”“ā¢“ā£§ā €ā”€ā €ā €ā ™ā¢¦ā”ā”ā¢¢ā Œ
+ā”æā£æā£æā£½ā£æā¢æā£æā£æā”·ā££ā¢æā£Æā£»ā¢·ā£½ā¢žā£æā”„ā ‚ā£æā €ā£øā ƒā  ā¢ā£·ā øā”‡ā ‘ā¢¤ā”€ā €ā£ ā žā ā €ā €ā €ā €ā €ā €ā£€ā ”ā €ā €ā €ā €ā ˆā¢§ā”€ā¢æā£æā£¾ā”æā ā” ā¢Šā£“ā£æā¢øā”·ā£„ā£ā €ā¢€ā „ā ™ā “ā §ā£Œ
+ā£æā£·ā£æā£æā£æā£æā£æā£æā”æā£µā¢«ā£·ā£ā£Ÿā£¾ā£»ā£¾ā£æā£†ā¢æā €ā”æā €ā €ā ‚ā£¼ā ā£æā”€ā¢€ā”¼ā ‹ā €ā €ā €ā €ā €ā €ā €ā €ā €ā ˆā ’ā¢„ā”€ā €ā €ā €ā €ā ‘ā ®ā æā ›ā ’ā¢ˆā£“ā£æā£æā”ā”¾ā¢ā ˆā£æā –ā ā €ā €ā €ā €ā €
+ā£æā£æā£æā£æā£æā£æā£æā£æā£æā£³ā£æā£æā£æā£Æā£Ÿā£·ā¢Æā£æā£æā£æā¢°ā ƒā €ā €ā ā¢øā €ā£»ā Ÿā ‹ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā ˆā ²ā „ā”€ā €ā €ā €ā¢€ā£ ā£¾ā£æā£æā£æā£æā£ƒā ‡ā¢‚ā¢”ā ā €ā €ā €ā €ā¢€ā €ā €
+ā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£žā¢¾ā”»ā¢·ā£Æā£æā£¼ā €ā €ā €ā¢€ā”¼ā žā ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā ˆā ²ā£¤ā£€ā”€ā €ā €ā €ā €ā ˆā ¢ā£¤ā£¾ā£æā£æā£æā£æā£æā£æā£æā¢øā  ā”±ā ƒā €ā €ā €ā£ ā£¶ā ‹ā €ā €
+ā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā”æā¢¾ā£½ā£Æā£žā£½ā”Ÿā €ā£ ā ”ā ‹ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā ˆā ™ā æā£·ā£¤ā”€ā €ā €ā €ā €ā ™ā¢æā£æā£æā£æā£æā£·ā£æā¢€ā”œā ā €ā €ā£ ā”žā”±ā ā €ā €ā €
+ā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā¢Æā¢æā£æā£æā£æā£§ā žā ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā ā  ā¢€ā €ā €ā €ā €ā €ā €ā ™ā¢æā£·ā£„ā”€ā €ā €ā €ā ¹ā¢æā£æā£æā£æā£æā”¼ā €ā €ā¢€ā£¾ā£æā”Ÿā €ā €ā €ā €ā €
+ā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā”»ā£žā¢¾ā”¹ā”æā €ā €ā €ā¢€ā”€ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā €ā ‰ā ‚ā¢„ā”€ā €ā €ā£ ā£æā£æā£æā£æā£¦ā£„ā €ā €ā €ā »ā£æā£æā”Ÿā¢€ā €ā£”ā ‚ā¢ŗā£æā”£ā¢€ā¢€ā „ā €ā €
+ā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£Æā£ā£¾ā£æā£§ā¢¶ā”¶ā£æā¢æā£æā£¦ā£¤ā£€ā£€ā£€ā£¤ā£€ā£“ā£¶ā£¤ā£¤ā£„ā”€ā €ā €ā¢€ā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£·ā£„ā €ā¢ ā£¾ā£æā£¾ā”·ā£°ā ‰ā”†ā£¹ā£æā£æā£¶ā£æā£†ā”€ā¢€
+ā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā”žā£Æā¢·ā£ā”æā£½ā£»ā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£¶ā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£·ā£¦ā£½ā£æā”æā •ā ‰ā¢†ā¢±ā¢øā£æā£æā£æā£æā£æā£æā£æ
+ā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£Ÿā”½ā£¾ā£¹ā”žā£·ā”½ā£žā”½ā£Æā¢æā£¹ā¢Æā£æā£æā£æā£æā£Æā£æā”æā£æā£æā£æā£æā£æā£»ā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā”€ā €ā €ā¢Ŗā¢æā£æā£æā£æā£æā£æā£æā£æ
+ā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£Æā”½ā£¶ā¢Æā”½ā£žā£³ā¢Æā”½ā£žā£Æā£½ā¢«ā£æā”Ÿā£æā£»ā¢æā”½ā£æā£æā£æā£æā£»ā£½ā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£·ā”ˆā €ā €ā ¹ā£æā£æā£æā£æā£æā£æā£æ
+ā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£Æā¢·ā£›ā”¾ā£½ā£¹ā”½ā¢¾ā£¹ā ·ā£žā£žā æā£¼ā£æā”˜ā£Æā£¾ā£æā¢æā£¹ā¢Æā£Ÿā”æā£æā¢æā£¾ā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£æā£„ā €ā €ā ˆā »ā£æā£æā£æā£æā£æ
+`;
diff --git a/web/src/blog.tsx b/web/src/blog.tsx
new file mode 100644
index 0000000..9d86657
--- /dev/null
+++ b/web/src/blog.tsx
@@ -0,0 +1,10 @@
+import $ from "jquery";
+import * as JSX from "./jsx";
+import { Page } from "./components";
+import { AsciiArt } from "./ascii-art";
+
+export default function Blog() {
+ return <Page>
+ work in progress (:
+ </Page>
+}
diff --git a/web/src/components.tsx b/web/src/components.tsx
new file mode 100644
index 0000000..ccd8da8
--- /dev/null
+++ b/web/src/components.tsx
@@ -0,0 +1,259 @@
+import $ from "jquery";
+import * as JSX from "./jsx";
+import { Header } from "./header";
+import { Sidebar } from "./sidebar";
+
+const popup_stack = [];
+window.onclick = ( e: Event ) => {
+ if( !e.target ) return;
+
+ if( popup_stack.length > 0 ) {
+ const last = popup_stack[popup_stack.length - 1];
+ if( last.el[0] == e.target || last.el.find( e.target ).length != 0 ) return;
+ e.preventDefault();
+ e.stopPropagation();
+ if( last.fn )
+ last.fn();
+
+ popup_stack.pop();
+ last.el.remove();
+ }
+}
+
+/**
+ * appends an element to the DOM and saves it in the popup stack to be removed.
+**/
+export function addPopup( element: JQuery ) {
+ document.body.appendChild( element[0] );
+ setTimeout( () => popup_stack.push( { el: element, fn: null } ) );
+}
+
+/**
+ * closes the topmost popup
+**/
+export function closePopup() {
+ if( popup_stack.length > 0 ) {
+ const last = popup_stack[popup_stack.length - 1];
+ if( last.fn )
+ last.fn();
+
+ popup_stack.pop();
+ setTimeout( () => last.el.remove() );
+ }
+}
+
+/**
+ * sets a callback that will get executed once the current popup is closed
+ **/
+export function onPopupClosed( fn: Function ) {
+ setTimeout( () => {
+ if( popup_stack.length > 0 ) {
+ popup_stack[popup_stack.length - 1].fn = fn;
+ }
+ } );
+}
+
+/*
+ * accepts "folded" prop
+**/
+export function RolldownListItem( props: any ) {
+ const ret = <div class="rolldown">
+ <div class="rolldown-collapsed-container">
+ <div class="rolldown-icon-container">&gt;</div>
+ <div class="rolldown-collapsed">{props.folded}</div>
+ </div>
+ <div class="rolldown-expanded-container">
+ <div class="rolldown-expanded">{props.children}</div>
+ </div>
+ </div>;
+
+ ret.onclick = () => {
+ $( ret ).toggleClass( "active" );
+ $( ret ).find( ".rolldown-expanded-container" ).toggleClass( 'active' );
+ };
+
+ return ret;
+}
+
+export function Spinner( props: any ) {
+ let spinner_steps = [
+ '/',
+ '-',
+ '\\',
+ '|',
+ '/',
+ '-',
+ '\\',
+ '|'
+ ];
+
+ const id = props.id || '';
+
+ let el = $( <div class="spinner" id={ id } style={ props.style || '' } /> );
+ let i = 0;
+ let loop = () => {
+ el.text( spinner_steps[i++] );
+ if( i > spinner_steps.length )
+ i = 0;
+
+ if( el[0].isConnected )
+ setTimeout( loop, 100 );
+ };
+
+ setTimeout( loop, 100 );
+ return el[0];
+}
+
+/*
+ * accepts title prop
+**/
+export function RolldownList( props: any ) {
+ return <GroupBox title={props.title} style={props.style} innerStyle="margin: 0px; width: 100%">
+ <div class="rolldownlist">
+ { props.children }
+ </div>
+ </GroupBox>
+}
+
+/*
+ * accepts title prop and optional innerStyle
+**/
+export function GroupBox( props: any ) {
+ return <div class="groupbox" id={props.id || ''} style={props.style || ''}>
+ <span class="grouptitle">
+ {props.title}
+ </span>
+ <span class="groupbody" style={props.innerStyle || ''}>
+ {props.children}
+ </span>
+ </div>
+}
+
+export function Page( props: any ) {
+ return <>
+ <Header />
+ <div id="page-main">
+ <Sidebar />
+ <div id="page-main-content">
+ {props.children}
+ </div>
+ </div>
+
+ <BackgroundToggle />
+ </>
+}
+
+export function DropdownItem( props: any ) {
+ return <div class="dropdown-inner" style={ props.style || "" } onclick={ props.onclick || null }>
+ {props.children}
+ </div>
+}
+
+/**
+ * supports innerStyle for styling the actual dropdown picker
+ **/
+export function Dropdown( props: any ) {
+ const children = props.children;
+ let title = props.title;
+ let inline = props.inline;
+ let onchange = props.onchange;
+ let classes = props.class || '';
+ let style = props.style || "";
+ let id = props.id || '';
+ let innerStyle = props.innerStyle || "";
+
+ const showItems = ( e: Event ) => {
+ e.preventDefault();
+ const target = $( e.target as HTMLElement );
+
+ const newDropdown = $( <div class="dropdown-wrapper" style={ innerStyle }>
+ { children.map( ( child: HTMLElement ) => {
+ if( !child.onclick ) child.onclick = onchange; return child;
+ } ) }
+ </div> );
+ target.parent().append( newDropdown[0] );
+ setTimeout( () => popup_stack.push( { el: newDropdown, fn: null } ) );
+ }
+
+ if( inline ) {
+ return <button class={ 'dropdown' + ' ' + classes } style={ style } onclick={ showItems } id={ id }>
+ { title }
+ </button>
+ }
+ else {
+ return <>
+ <label>{ title }</label>
+ <button class={ 'dropdown' + ' ' + classes } style={ style } onclick={ showItems } id={ id }>
+ </button>
+ </>
+ }
+}
+
+export function OkPopup( props: any ) {
+ const children = props.children;
+ const classes = props.class || '';
+ const style = props.style || '';
+ const id = props.id || '';
+
+ const onclick = ( e: Event ) => {
+ e.preventDefault();
+ e.stopPropagation();
+ if( props.onclick )
+ props.onclick();
+
+ closePopup();
+ }
+
+ return <div class={ "popup-msg " + classes } id={ id } style={ style }>
+ { children }
+ <div style="display: flex; justify-content: center">
+ <button onclick={ onclick }>Ok</button>
+ </div>
+ </div>
+}
+
+export function OkCancelPopup( props: any ) {
+ const children = props.children;
+ const classes = props.class || '';
+ const style = props.style || '';
+ const id = props.id || '';
+
+ const onclick = ( e: Event ) => {
+ e.preventDefault();
+ e.stopPropagation();
+ if( props.onclick )
+ props.onclick();
+
+ closePopup();
+ }
+
+ const oncancel = ( e: Event ) => {
+ e.preventDefault();
+ e.stopPropagation();
+
+ closePopup();
+ }
+
+ return <div class={ "popup-msg " + classes } id={ id } style={ style }>
+ { children }
+ <div style="display: flex; justify-content: center">
+ <button onclick={ onclick } style="margin-right: 10px">Ok</button>
+ <button onclick={ oncancel }>Cancel</button>
+ </div>
+ </div>
+}
+
+export function BackgroundToggle() {
+ const toggleBackground = () => {
+ const main = $( "#page-main" );
+ if( main.css( "display" ) == "none" ) {
+ main.css( "display", "" );
+ } else {
+ main.css( "display", "none" );
+ }
+ }
+
+ return <div id="background-toggle" onclick={ toggleBackground }>
+ show background
+ </div>
+}
diff --git a/web/src/header.tsx b/web/src/header.tsx
new file mode 100644
index 0000000..94906c0
--- /dev/null
+++ b/web/src/header.tsx
@@ -0,0 +1,10 @@
+import $ from 'jquery';
+import * as JSX from './jsx';
+
+export function Header( props: any ) {
+ return <div class="border-wrapper" style="z-index: 1">
+ <div class="header">
+ networkheaven.net
+ </div>
+ </div>
+}
diff --git a/web/src/home.tsx b/web/src/home.tsx
new file mode 100644
index 0000000..77404fd
--- /dev/null
+++ b/web/src/home.tsx
@@ -0,0 +1,24 @@
+import $ from "jquery";
+import * as JSX from "./jsx";
+import { Page } from "./components";
+import { AsciiArt } from "./ascii-art";
+
+export default function Home() {
+ return <Page>
+ <div class="page-title">
+ <h3 style="font-family: JPN24; font-size: 25px; width: min-content" class="gradient">NETWORKHEAVEN</h3>
+ </div>
+ <hr />
+ <div style="width: 100%; display: flex; justify-content: center">
+ <div style="text-align: left; width: 75%">
+ <h4 style="font-family: JPN16; font-size: 17px; font-weight: normal; margin-bottom: 0px;">
+ hi, im aura and this is my website.
+ <br />
+ i will add more stuff when i have time
+ </h4>
+ </div>
+ </div>
+ <AsciiArt />
+ <h3 style="font-family: JPN19; font-size: 20px"><a href="https://steamcommunity.com/groups/networkheaven">STEAM</a></h3>
+ </Page>;
+}
diff --git a/web/src/index-page.tsx b/web/src/index-page.tsx
new file mode 100644
index 0000000..4b7ce1c
--- /dev/null
+++ b/web/src/index-page.tsx
@@ -0,0 +1,14 @@
+import * as JSX from "./jsx";
+import Home from "./home";
+import Blog from "./blog";
+import Pkgs from "./pkg";
+
+JSX.addRoute( "/", () => <Home /> );
+JSX.addRoute( "/blog", () => <Blog /> );
+JSX.addRoute( "/pkg", () => <Pkgs /> );
+JSX.addRoute( "/pkg/*", () => <Pkgs /> );
+
+window.onpopstate = JSX.onPopState;
+
+const url = new URL( window.location.href );
+JSX.navigateParams( url.pathname, url.searchParams.entries() );
diff --git a/web/src/index.html b/web/src/index.html
new file mode 100644
index 0000000..a5500e4
--- /dev/null
+++ b/web/src/index.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8">
+ <meta name="description" content=" ">
+ <meta name="viewport" content="width=device-width,user-scalable=no">
+ <title>networkheaven.net</title>
+ <link rel="stylesheet" href="/static/main.css">
+ <link href="/static/highlight.css" rel="preload" as="style" onload="this.rel='stylesheet'">
+ <link rel="apple-touch-icon" href="/static/nh.ico">
+ <link rel="icon" href="/static/nh.ico" type="image/png">
+ <link rel="shortcut icon" href="/static/nh.ico" type="image/png">
+ </head>
+ <body>
+ <div id="moneyjsx-root">
+ <div id="homepage" style="padding-top: 0px">
+ <noscript>
+ <!--- for browsers with noscript !--->
+ <div id="ascii-art">
+
+ </div>
+ <h3 style="margin-top: 5px;">networkheaven.net</h3>
+ <div>
+ you need javascript to use this website
+ </div>
+ </noscript>
+ </div>
+ </div>
+ </body>
+</html>
+
diff --git a/web/src/jsx.tsx b/web/src/jsx.tsx
new file mode 100644
index 0000000..98ca440
--- /dev/null
+++ b/web/src/jsx.tsx
@@ -0,0 +1,267 @@
+import $ from 'jquery';
+const assetAttributeNames = new Set( ['data', 'srcset', 'src', 'href'] );
+
+export interface Route {
+ path: string,
+ component: Function,
+ wildcard: boolean
+};
+
+const routes: Route[] = [];
+let err404page = "/";
+let rootId = "moneyjsx-root";
+let onprenavigate: Function = () => {};
+let onpostnavigate: Function = () => {};
+
+function routeForPath( route: string ) : Function | null {
+ if( !routes[route] ) {
+ for( let key of Object.keys( routes ) ) {
+ const r = routes[key];
+
+ if( r.wildcard ) {
+ if( route.slice( 0, r.path.length ) == r.path ) {
+ return r.component;
+ }
+ }
+ }
+
+ return null;
+ } else return routes[route].component;
+}
+
+/**
+ * sets the id of the element to be replaced by the navigator
+ **/
+export function setRootId( rootId: string ) {
+ rootId = rootId;
+}
+
+/**
+ * adds a route component to the routes list
+ * the component function must return either a jquery or a DOM element
+ **/
+export function addRoute( name: string, component: Function ) {
+ let path = name;
+ let wildcard = false;
+ if( path[path.length - 1] === "*" ) {
+ console.log( "name" );
+ path = path.substring( 0, path.length - 1 );
+ wildcard = true;
+ }
+
+ routes[path] = { path, component, wildcard };
+}
+
+/**
+ * sets the route for a 404 page
+ **/
+export function set404Route( name: string ) {
+ err404page = name;
+}
+
+/**
+ * sets the callback that will get called when a route changes
+ **/
+export function onPreNavigate( callback: Function ) {
+ onprenavigate = callback;
+}
+
+/**
+ * sets the callback that will get called when a route changes
+ **/
+export function onPostNavigate( callback: Function ) {
+ onpostnavigate = callback;
+}
+
+/**
+ * replaces the root element with the route component
+ **/
+export function navigate( route: string ) {
+ console.log( route );
+ let url = new URL( window.location.href );
+ let cb = routeForPath( route );
+ url.pathname = route;
+ if( !cb )
+ return navigate( err404page );
+
+ window.history.pushState( {}, null, url.href );
+
+ onprenavigate();
+ const el = $( cb() );
+
+ $( `#${rootId}` ).children().remove();
+ $( `#${rootId}` ).append( el );
+ onpostnavigate();
+}
+
+/**
+ * navigate with params. see: navigate
+ **/
+export function navigateParams( route: string, params: any ) {
+ let url = new URL( window.location.href );
+ let uparams = new URLSearchParams( params );
+ url.pathname = route;
+ url.search = uparams.toString();
+ let cb = routeForPath( route );
+ if( !cb )
+ return navigate( err404page );
+
+ window.history.pushState( {}, null, url.href );
+
+ onprenavigate();
+ const el = $( cb() );
+
+ $( `#${rootId}` ).children().remove();
+ $( `#${rootId}` ).append( el );
+ onpostnavigate();
+}
+
+/**
+ * wrapper for history.pushState
+ **/
+export function pushParams( params: any ) {
+ const url = new URL( window.location.href );
+ url.search = new URLSearchParams( params ).toString();
+
+ window.history.pushState( {}, null, url.href );
+}
+
+/**
+ * navigates without adding a history entry
+ * useful for e.g. re-rendering a page after waiting for a data callback
+**/
+export function navigateParamsSilent( route: string, params: any ) {
+ let url = new URL( window.location.href );
+ let uparams = new URLSearchParams( params );
+ url.pathname = route;
+ url.search = uparams.toString();
+ let cb = routeForPath( route );
+ if( !cb )
+ return navigateSilent( err404page );
+
+ onprenavigate();
+ const el = $( cb() );
+
+ $( `#${rootId}` ).children().remove();
+ $( `#${rootId}` ).append( el );
+ onpostnavigate();
+}
+
+/**
+ * see: navigateParamsSilent
+ **/
+export function navigateSilent( route: string ) {
+ let url = new URL( window.location.href );
+ url.pathname = route;
+ let cb = routeForPath( route );
+ if( !cb )
+ return navigateSilent( err404page );
+
+ onprenavigate();
+ const el = $( cb() );
+
+ $( `#${rootId}` ).children().remove();
+ $( `#${rootId}` ).append( el );
+ onpostnavigate();
+}
+
+/**
+ * action when the back button is pressed
+**/
+export function onPopState() {
+ let url = new URL( window.location.href );
+ let uparams = new URLSearchParams( url.searchParams );
+ url.search = uparams.toString();
+ let cb = routeForPath( url.pathname );
+ if( !cb )
+ return navigateSilent( err404page );
+
+ onprenavigate();
+ const el = $( cb() );
+
+ $( `#${rootId}` ).children().remove();
+ $( `#${rootId}` ).append( el );
+ onpostnavigate();
+}
+
+export function getRoutes() : Route[] {
+ return routes;
+}
+
+
+// internal stuff below
+
+const originalAppendChild = Element.prototype.appendChild;
+Element.prototype.appendChild = function( child: any ) {
+ if( Array.isArray( child ) ) {
+ for( const childArrayMember of child )
+ this.appendChild( childArrayMember );
+
+ return child;
+ }
+ else if( typeof child === 'string' ) {
+ return originalAppendChild.call( this, document.createTextNode( child ) );
+ }
+ else if( child ) {
+ return originalAppendChild.call( this, child );
+ }
+};
+
+export function createElement( tag: any, props: any, ...children: any ) {
+ props = props || {};
+
+ if( typeof tag === "function" ) {
+ props.children = children;
+ return tag( props );
+ }
+
+ if( tag === 'raw-content' ) {
+ const dummy = document.createElement( 'div' );
+ dummy.innerHTML = props.content;
+ return [...dummy.children];
+ }
+
+ const element = document.createElement( tag );
+
+ for( const [name, value] of Object.entries( props ) ) {
+ if( name.startsWith( 'on' ) ) {
+ const lowercaseName = name.toLowerCase();
+
+ if( lowercaseName in window ) {
+ element.addEventListener( lowercaseName.substring(2 ), value );
+ continue;
+ }
+ }
+
+ if( name == 'ref' ) {
+ ( value as any ).current = element;
+ continue;
+ }
+
+ if( value === false )
+ continue;
+
+ if( value === true ) {
+ element.setAttribute( name, '' );
+ continue;
+ }
+
+ if( assetAttributeNames.has( name ) ) {
+ if( typeof value === 'string' ) {
+ element.setAttribute( name, value );
+ }
+ continue;
+ }
+
+ element.setAttribute( name, value );
+ };
+
+ for( const child of children )
+ element.appendChild( child );
+
+ return element;
+}
+
+export function createFragment( props: any ) {
+ return props.children;
+}
diff --git a/web/src/pkg.tsx b/web/src/pkg.tsx
new file mode 100644
index 0000000..70e75c6
--- /dev/null
+++ b/web/src/pkg.tsx
@@ -0,0 +1,164 @@
+import $ from "jquery";
+import * as JSX from "./jsx";
+import { Page, Spinner } from "./components";
+import { sizeHumanReadable } from "./util";
+
+function downloadFile( file: string ) {
+ const a = document.createElement( "a" );
+ a.href = "https://networkheaven.net/pkgs/";
+ a.download = "string";
+ a.click();
+ a.remove();
+}
+
+function urlForHref( href: string, isdir: boolean ) {
+ const url = new URL( window.location.href );
+ if( isdir ) {
+ const path = url.pathname;
+ if( path.endsWith( '/' ) ) {
+ return path + href;
+ }
+ return path + "/" + href;
+ }
+
+ let searchParams = url.searchParams.toString();
+ searchParams = searchParams.slice( searchParams.indexOf( '/' ) );
+ searchParams = searchParams.slice( searchParams.indexOf( '/' ) );
+ return "https://networkheaven.net/pkgs" + searchParams + "/" + href;
+}
+
+interface PkgEntry {
+ name: string;
+ date: string;
+ time: string;
+ size: string;
+ isdir: boolean;
+}
+
+function entryFromLine( line: string ): PkgEntry | null {
+ const isdir = line[line.length - 1] == '-';
+ const name = line.slice( 0, line.indexOf( " " ) );
+ if( name == ".." ) return null;
+ if( !name )
+ return null;
+ let date = '';
+ let time = '';
+ let size = ''
+
+ if( !isdir ) {
+ let end = line.lastIndexOf( " " );
+ size = line.slice( end + 1 );
+ date = line.slice( line.indexOf( " " ) + 1, end );
+ end = date.indexOf( " " );
+ const datetime = date.slice( date.search( /[0-9]/ ) );
+ end = datetime.indexOf( ' ' );
+ date = datetime.slice( 0, end );
+ time = datetime.slice( end + 1 );
+ time = time.slice( 0, time.indexOf( " " ) );
+ } else {
+ let start = line.search( /[0-9]/ )
+ date = line.slice( start );
+ let end = date.indexOf( " " );
+ date = date.slice( 0, end );
+ time = line.slice( start + end + 1, line.length - 1 );
+ time = time.slice( 0, time.indexOf( " " ) );
+ }
+
+ return { name, date, time, size, isdir };
+}
+
+async function getEntries(): Promise<PkgEntry[]> {
+ const url = new URL( window.location.href );
+ const href = url.pathname.split( "/pkg" )[1];
+
+ const packages = await fetch( "https://networkheaven.net/pkgs/" + href );
+ const text = await packages.text();
+
+ const pkgBody = $( <div /> );
+ pkgBody.html( text );
+ pkgBody.html( pkgBody.find( "body" ).html() );
+ const pre = pkgBody.find( "pre" )[0].innerText;
+
+ const ret = [];
+ console.log( url.pathname );
+ if( !url.pathname.endsWith( "/pkg/" ) && !url.pathname.endsWith( "/pkg" ) ) {
+ ret.push({
+ name: '../',
+ date: ' ',
+ time: ' ',
+ size: '',
+ isdir: true
+ } );
+ }
+
+ const lines = pre.split( "\n" );
+ for( const line of lines ) {
+ if( !line.length )
+ continue;
+
+ const entry = entryFromLine( line );
+ console.log( entry );
+ if( entry )
+ ret.push( entry );
+ }
+
+ return ret;
+}
+
+function back() {
+ const url = new URL( window.location.href );
+ if( url.pathname.endsWith( "/" ) )
+ url.pathname = url.pathname.slice( 0, -1 );
+ url.pathname = url.pathname.slice( 0, url.pathname.lastIndexOf( "/" ) );
+ JSX.navigate( url.pathname );
+}
+
+function PackageEntry( props: any ) {
+ console.log( props );
+ const entry = props.entry as PkgEntry;
+ console.log( urlForHref( entry.name, entry.isdir ) );
+ return <tr>
+ <td>
+ { entry.name == "../" &&
+ <a href='#' onclick={ () => back() } class="package-entry-link">
+ ../yes
+ </a> }
+ { entry.name != "../" &&
+ <a href='#' onclick={ () => JSX.navigate( urlForHref( entry.name, entry.isdir ) ) } class="package-entry-link">
+ {entry.name}
+ </a> }
+ </td>
+ <td><span class="package-entry-date">{entry.date}</span></td>
+ <td><span class="package-entry-time">{entry.time}</span></td>
+ <td>{ !entry.isdir && <span>{ sizeHumanReadable( parseInt( entry.size ) ) }</span> }</td>
+ </tr>
+}
+
+export default function Pkgs() {
+ setTimeout( async () => {
+ try {
+ const entries = await getEntries();
+ const target = $( "#package-entries" ).find( "table" );
+ $( "#package-entries" ).find( ".spinner" ).remove();
+ for( const entry of entries ) {
+ target.append( <PackageEntry entry={entry} /> );
+ }
+
+ } catch( e ) {
+ console.log( e );
+ }
+
+ } );
+
+ return <Page>
+ <div style="display: flex; justify-content: center">
+ <h3 style="font-family: JPN24; font-size: 25px; width: min-content" class="gradient">PACKAGE&nbsp;REPOSITORY</h3>
+ </div>
+ <hr />
+
+ <div id="package-entries">
+ <table style="width: 90%;" />
+ <Spinner />
+ </div>
+ </Page>
+}
diff --git a/web/src/sidebar.tsx b/web/src/sidebar.tsx
new file mode 100644
index 0000000..a1b3ad7
--- /dev/null
+++ b/web/src/sidebar.tsx
@@ -0,0 +1,126 @@
+import $ from 'jquery';
+import * as JSX from './jsx';
+
+var interval = null;
+
+function cacheWeather( result: any ) {
+ const timestamp = new Date().getTime();
+
+ localStorage.setItem( "weather", JSON.stringify( result ) );
+ localStorage.setItem( "weather_timestamp", timestamp.toString() );
+}
+
+function getWeatherCache() {
+ const timestamp = localStorage.getItem( "weather_timestamp" );
+ if( !timestamp )
+ return null;
+
+ if( parseInt( timestamp ) + 60 * 60 * 1000 < new Date().getTime() ) {
+ localStorage.removeItem( "weather" );
+ localStorage.removeItem( "weather_timestamp" );
+ return null;
+ }
+
+ try {
+ const res = JSON.parse( localStorage.getItem( "weather" ) );
+ return res;
+ } catch( e ) {
+ console.log( e );
+ return null;
+ }
+}
+
+async function updateWeather() {
+ let weather = getWeatherCache();
+ if( !weather ) {
+ weather = await fetch(
+ "https://api.open-meteo.com/v1/forecast?latitude=35.0647937&longitude=137.1784597&current=temperature_2m,wind_speed_10m,relative_humidity_2m"
+ )
+
+ weather = await weather.json();
+ cacheWeather( weather );
+ }
+
+ $( "#temp" ).text( weather.current.temperature_2m );
+ $( "#wind" ).text( weather.current.wind_speed_10m );
+ $( "#humi" ).text( weather.current.relative_humidity_2m );
+
+ setTimeout( updateWeather, 60 * 60 * 1000 );
+}
+
+function Weather() {
+ setTimeout( updateWeather );
+ const weather = getWeatherCache();
+ if( weather && weather.current ) {
+ const temp = weather.current.temperature_2m;
+ const wind = weather.current.wind_speed_10m;
+ const humi = weather.current.relative_humidity_2m;
+ return <div id="weather">
+ <div class="sidebar-row"><h4>weather in </h4> <h4>ę„›ēŸ„ēœŒć€ę—„ęœ¬:</h4></div>
+ <div class="sidebar-row"><h4>temperature:</h4><h4><span id="temp">{temp.toString()} </span>°C</h4></div>
+ <div class="sidebar-row"><h4>wind speed:</h4><h4><span id="wind">{wind.toString()}</span>km/h</h4></div>
+ <div class="sidebar-row"><h4>humidity:</h4><h4><span id="humi">{humi.toString()}</span>%</h4></div>
+ </div>
+ }
+
+ return <div id="weather">
+ <div class="sidebar-row"><h4>weather in </h4> <h4>ę„›ēŸ„ēœŒć€ę—„ęœ¬:</h4></div>
+ <div class="sidebar-row"><h4>temperature:</h4><h4><span id="temp">--</span>°C</h4></div>
+ <div class="sidebar-row"><h4>wind speed:</h4><h4><span id="wind">--</span>km/h</h4></div>
+ <div class="sidebar-row"><h4>humidity:</h4><h4><span id="humi">--</span>%</h4></div>
+ </div>
+}
+
+export function Sidebar() {
+ if( interval == null ) {
+ interval = setInterval( () => {
+ $( "#time" ).text( new Date().toLocaleTimeString() );
+ $( "#date" ).text( new Date().toLocaleDateString() );
+ }, 1000 );
+ }
+
+ return <div id="sidebar">
+ <div><h3>information</h3></div>
+ <hr/>
+ <div class="sidebar-row"><h4>current time: </h4><h4><span id="time">{new Date().toLocaleTimeString()}</span></h4></div>
+ <div class="sidebar-row"><h4>today: </h4><h4><span id="date">{new Date().toLocaleDateString()}</span></h4></div>
+ <Weather />
+ <div style="margin-top: 15px"><h3>links</h3></div>
+ <hr/>
+ <div class="sidebar-row">
+ <h4>
+ <a class="nogradient" style="margin-bottom: 0" href="#" onclick={ () => JSX.navigate( "/" ) }>
+ homepage
+ </a>
+ </h4>
+ </div>
+ <div class="sidebar-row" style="margin-top: -18px">
+ <h4>
+ <a class="nogradient" href="#" onclick={ () => JSX.navigate( "/pkg" ) }>
+ slackware packages
+ </a>
+ </h4>
+ </div>
+ <div class="sidebar-row" style="margin-top: -18px">
+ <h4>
+ <a class="nogradient" href="#" onclick={ () => JSX.navigate( "/blog" ) }>
+ blog entries
+ </a>
+ </h4>
+ </div>
+ <div class="sidebar-row" style="margin-top: -18px">
+ <h4>
+ <a class="nogradient" href="https://steamcommunity.com/groups/networkheaven">
+ steam
+ </a>
+ </h4>
+ </div>
+ <div class="sidebar-row" style="margin-top: -18px">
+ <h4>
+ <a class="nogradient" href="https://git.networkheaven.net">
+ git
+ </a>
+ </h4>
+ </div>
+ </div>
+}
diff --git a/web/src/tsconfig.json b/web/src/tsconfig.json
new file mode 100644
index 0000000..b964594
--- /dev/null
+++ b/web/src/tsconfig.json
@@ -0,0 +1,121 @@
+{
+ "compilerOptions": {
+ /* Visit https://aka.ms/tsconfig to read more about this file */
+
+ /* Projects */
+ // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
+ // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
+ // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
+ // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
+ // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
+ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
+ "moduleResolution": "node",
+ /* Language and Environment */
+ "target": "es2020", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
+ "lib": [
+ "ES2017",
+ "DOM",
+ "DOM.Iterable",
+ "ScriptHost"
+ ],
+ // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
+ "jsx": "react", /* Specify what JSX code is generated. */
+ // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
+ // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
+ "jsxFactory": "JSX.createElement",
+ "jsxFragmentFactory": "JSX.createFragment",
+ // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
+ // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
+ // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
+ // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
+ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
+
+ /* Modules */
+ "module": "es2020", /* Specify what module code is generated. */
+ // "rootDir": "./", /* Specify the root folder within your source files. */
+ // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
+ "baseUrl": ".",
+ "paths": {
+ "*": ["types/*"]
+ }, /* Specify a set of entries that re-map imports to additional lookup locations. */
+ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
+ "typeRoots": [
+ "./node_modules/@types",
+ "./types"
+ ], /* Specify multiple folders that act like './node_modules/@types'. */
+ // "types": [], /* Specify type package names to be included without being referenced in a source file. */
+ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
+ // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
+ // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
+ // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
+ // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
+ // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
+ // "noUncheckedSideEffectImports": true, /* Check side effect imports. */
+ // "resolveJsonModule": true, /* Enable importing .json files. */
+ // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
+ // "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
+
+ /* JavaScript Support */
+ "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
+ "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
+ // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
+
+ /* Emit */
+ // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
+ // "declarationMap": true, /* Create sourcemaps for d.ts files. */
+ // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
+ "sourceMap": true, /* Create source map files for emitted JavaScript files. */
+ // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
+ // "noEmit": true, /* Disable emitting files from a compilation. */
+ // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
+ // "outDir": "./", /* Specify an output folder for all emitted files. */
+ // "removeComments": true, /* Disable emitting comments. */
+ // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
+ // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
+ // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
+ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
+ // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
+ // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
+ // "newLine": "crlf", /* Set the newline character for emitting files. */
+ // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
+ // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
+ // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
+ // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
+ // "declarationDir": "./", /* Specify the output directory for generated declaration files. */
+
+ /* Interop Constraints */
+ // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
+ // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
+ // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */
+ // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
+ "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
+ // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
+ "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
+
+ /* Type Checking */
+ "strict": true, /* Enable all strict type-checking options. */
+ "noImplicitAny": false, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
+ "strictNullChecks": false, /* When type checking, take into account 'null' and 'undefined'. */
+ "strictFunctionTypes": false, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
+ "strictBindCallApply": false, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
+ "strictPropertyInitialization": false, /* Check for class properties that are declared but not set in the constructor. */
+ "strictBuiltinIteratorReturn": false, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */
+ "noImplicitThis": false, /* Enable error reporting when 'this' is given the type 'any'. */
+ // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
+ // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
+ // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
+ // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
+ // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
+ // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
+ // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
+ // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
+ // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
+ // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
+ // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
+ // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
+
+ /* Completeness */
+ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
+ "skipLibCheck": true /* Skip type checking all .d.ts files. */
+ }
+}
diff --git a/web/src/user.tsx b/web/src/user.tsx
new file mode 100644
index 0000000..d909d9e
--- /dev/null
+++ b/web/src/user.tsx
@@ -0,0 +1,6 @@
+import $ from 'jquery';
+
+import * as JSX from './jsx';
+import * as api from './api';
+
+
diff --git a/web/src/util.tsx b/web/src/util.tsx
new file mode 100644
index 0000000..1b1ccc0
--- /dev/null
+++ b/web/src/util.tsx
@@ -0,0 +1,42 @@
+export function escapeHtml( html: string ) {
+ const entityMap = {
+ '&': '&amp;',
+ '<': '&lt;',
+ '>': '&gt;',
+ '"': '&quot;',
+ "'": '&#39;',
+ '/': '&#x2F;',
+ '`': '&#x60;',
+ '=': '&#x3D;'
+ };
+
+ return String( html ).replace( /[&<>"'`=\/]/g, ( s ) => {
+ return entityMap[s];
+ } );
+}
+
+export function parseJWT( token: string ) : any {
+ const parts = token.split( '.' );
+ let encoded = parts[1];
+ encoded = encoded.replace(/-/g, '+').replace(/_/g, '/');
+ const pad = encoded.length % 4;
+ if( pad === 1 )
+ throw new Error( 'what the fuck' );
+ if( pad > 1 )
+ encoded += new Array( 5 - pad ).join( '=' );
+
+ const payload = JSON.parse( atob( encoded ) );
+ return payload;
+}
+
+export function sizeHumanReadable( size: number ) {
+ if( size < 1024 )
+ return size + ' B';
+ else if( size < 1024 * 1024 )
+ return ( size / 1024 ).toFixed( 2 ) + ' KB';
+ else if( size < 1024 * 1024 * 1024 )
+ return ( size / 1024 / 1024 ).toFixed( 2 ) + ' MB';
+ else
+ return ( size / 1024 / 1024 / 1024 ).toFixed( 2 ) + ' GB';
+}
+
diff --git a/web/static/fonts/LICENSE.TXT b/web/static/fonts/LICENSE.TXT
new file mode 100644
index 0000000..fd662a7
--- /dev/null
+++ b/web/static/fonts/LICENSE.TXT
@@ -0,0 +1,428 @@
+Attribution-ShareAlike 4.0 International
+
+=======================================================================
+
+Creative Commons Corporation ("Creative Commons") is not a law firm and
+does not provide legal services or legal advice. Distribution of
+Creative Commons public licenses does not create a lawyer-client or
+other relationship. Creative Commons makes its licenses and related
+information available on an "as-is" basis. Creative Commons gives no
+warranties regarding its licenses, any material licensed under their
+terms and conditions, or any related information. Creative Commons
+disclaims all liability for damages resulting from their use to the
+fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and
+conditions that creators and other rights holders may use to share
+original works of authorship and other material subject to copyright
+and certain other rights specified in the public license below. The
+following considerations are for informational purposes only, are not
+exhaustive, and do not form part of our licenses.
+
+ Considerations for licensors: Our public licenses are
+ intended for use by those authorized to give the public
+ permission to use material in ways otherwise restricted by
+ copyright and certain other rights. Our licenses are
+ irrevocable. Licensors should read and understand the terms
+ and conditions of the license they choose before applying it.
+ Licensors should also secure all rights necessary before
+ applying our licenses so that the public can reuse the
+ material as expected. Licensors should clearly mark any
+ material not subject to the license. This includes other CC-
+ licensed material, or material used under an exception or
+ limitation to copyright. More considerations for licensors:
+ wiki.creativecommons.org/Considerations_for_licensors
+
+ Considerations for the public: By using one of our public
+ licenses, a licensor grants the public permission to use the
+ licensed material under specified terms and conditions. If
+ the licensor's permission is not necessary for any reason--for
+ example, because of any applicable exception or limitation to
+ copyright--then that use is not regulated by the license. Our
+ licenses grant only permissions under copyright and certain
+ other rights that a licensor has authority to grant. Use of
+ the licensed material may still be restricted for other
+ reasons, including because others have copyright or other
+ rights in the material. A licensor may make special requests,
+ such as asking that all changes be marked or described.
+ Although not required by our licenses, you are encouraged to
+ respect those requests where reasonable. More_considerations
+ for the public:
+ wiki.creativecommons.org/Considerations_for_licensees
+
+=======================================================================
+
+Creative Commons Attribution-ShareAlike 4.0 International Public
+License
+
+By exercising the Licensed Rights (defined below), You accept and agree
+to be bound by the terms and conditions of this Creative Commons
+Attribution-ShareAlike 4.0 International Public License ("Public
+License"). To the extent this Public License may be interpreted as a
+contract, You are granted the Licensed Rights in consideration of Your
+acceptance of these terms and conditions, and the Licensor grants You
+such rights in consideration of benefits the Licensor receives from
+making the Licensed Material available under these terms and
+conditions.
+
+
+Section 1 -- Definitions.
+
+ a. Adapted Material means material subject to Copyright and Similar
+ Rights that is derived from or based upon the Licensed Material
+ and in which the Licensed Material is translated, altered,
+ arranged, transformed, or otherwise modified in a manner requiring
+ permission under the Copyright and Similar Rights held by the
+ Licensor. For purposes of this Public License, where the Licensed
+ Material is a musical work, performance, or sound recording,
+ Adapted Material is always produced where the Licensed Material is
+ synched in timed relation with a moving image.
+
+ b. Adapter's License means the license You apply to Your Copyright
+ and Similar Rights in Your contributions to Adapted Material in
+ accordance with the terms and conditions of this Public License.
+
+ c. BY-SA Compatible License means a license listed at
+ creativecommons.org/compatiblelicenses, approved by Creative
+ Commons as essentially the equivalent of this Public License.
+
+ d. Copyright and Similar Rights means copyright and/or similar rights
+ closely related to copyright including, without limitation,
+ performance, broadcast, sound recording, and Sui Generis Database
+ Rights, without regard to how the rights are labeled or
+ categorized. For purposes of this Public License, the rights
+ specified in Section 2(b)(1)-(2) are not Copyright and Similar
+ Rights.
+
+ e. Effective Technological Measures means those measures that, in the
+ absence of proper authority, may not be circumvented under laws
+ fulfilling obligations under Article 11 of the WIPO Copyright
+ Treaty adopted on December 20, 1996, and/or similar international
+ agreements.
+
+ f. Exceptions and Limitations means fair use, fair dealing, and/or
+ any other exception or limitation to Copyright and Similar Rights
+ that applies to Your use of the Licensed Material.
+
+ g. License Elements means the license attributes listed in the name
+ of a Creative Commons Public License. The License Elements of this
+ Public License are Attribution and ShareAlike.
+
+ h. Licensed Material means the artistic or literary work, database,
+ or other material to which the Licensor applied this Public
+ License.
+
+ i. Licensed Rights means the rights granted to You subject to the
+ terms and conditions of this Public License, which are limited to
+ all Copyright and Similar Rights that apply to Your use of the
+ Licensed Material and that the Licensor has authority to license.
+
+ j. Licensor means the individual(s) or entity(ies) granting rights
+ under this Public License.
+
+ k. Share means to provide material to the public by any means or
+ process that requires permission under the Licensed Rights, such
+ as reproduction, public display, public performance, distribution,
+ dissemination, communication, or importation, and to make material
+ available to the public including in ways that members of the
+ public may access the material from a place and at a time
+ individually chosen by them.
+
+ l. Sui Generis Database Rights means rights other than copyright
+ resulting from Directive 96/9/EC of the European Parliament and of
+ the Council of 11 March 1996 on the legal protection of databases,
+ as amended and/or succeeded, as well as other essentially
+ equivalent rights anywhere in the world.
+
+ m. You means the individual or entity exercising the Licensed Rights
+ under this Public License. Your has a corresponding meaning.
+
+
+Section 2 -- Scope.
+
+ a. License grant.
+
+ 1. Subject to the terms and conditions of this Public License,
+ the Licensor hereby grants You a worldwide, royalty-free,
+ non-sublicensable, non-exclusive, irrevocable license to
+ exercise the Licensed Rights in the Licensed Material to:
+
+ a. reproduce and Share the Licensed Material, in whole or
+ in part; and
+
+ b. produce, reproduce, and Share Adapted Material.
+
+ 2. Exceptions and Limitations. For the avoidance of doubt, where
+ Exceptions and Limitations apply to Your use, this Public
+ License does not apply, and You do not need to comply with
+ its terms and conditions.
+
+ 3. Term. The term of this Public License is specified in Section
+ 6(a).
+
+ 4. Media and formats; technical modifications allowed. The
+ Licensor authorizes You to exercise the Licensed Rights in
+ all media and formats whether now known or hereafter created,
+ and to make technical modifications necessary to do so. The
+ Licensor waives and/or agrees not to assert any right or
+ authority to forbid You from making technical modifications
+ necessary to exercise the Licensed Rights, including
+ technical modifications necessary to circumvent Effective
+ Technological Measures. For purposes of this Public License,
+ simply making modifications authorized by this Section 2(a)
+ (4) never produces Adapted Material.
+
+ 5. Downstream recipients.
+
+ a. Offer from the Licensor -- Licensed Material. Every
+ recipient of the Licensed Material automatically
+ receives an offer from the Licensor to exercise the
+ Licensed Rights under the terms and conditions of this
+ Public License.
+
+ b. Additional offer from the Licensor -- Adapted Material.
+ Every recipient of Adapted Material from You
+ automatically receives an offer from the Licensor to
+ exercise the Licensed Rights in the Adapted Material
+ under the conditions of the Adapter's License You apply.
+
+ c. No downstream restrictions. You may not offer or impose
+ any additional or different terms or conditions on, or
+ apply any Effective Technological Measures to, the
+ Licensed Material if doing so restricts exercise of the
+ Licensed Rights by any recipient of the Licensed
+ Material.
+
+ 6. No endorsement. Nothing in this Public License constitutes or
+ may be construed as permission to assert or imply that You
+ are, or that Your use of the Licensed Material is, connected
+ with, or sponsored, endorsed, or granted official status by,
+ the Licensor or others designated to receive attribution as
+ provided in Section 3(a)(1)(A)(i).
+
+ b. Other rights.
+
+ 1. Moral rights, such as the right of integrity, are not
+ licensed under this Public License, nor are publicity,
+ privacy, and/or other similar personality rights; however, to
+ the extent possible, the Licensor waives and/or agrees not to
+ assert any such rights held by the Licensor to the limited
+ extent necessary to allow You to exercise the Licensed
+ Rights, but not otherwise.
+
+ 2. Patent and trademark rights are not licensed under this
+ Public License.
+
+ 3. To the extent possible, the Licensor waives any right to
+ collect royalties from You for the exercise of the Licensed
+ Rights, whether directly or through a collecting society
+ under any voluntary or waivable statutory or compulsory
+ licensing scheme. In all other cases the Licensor expressly
+ reserves any right to collect such royalties.
+
+
+Section 3 -- License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the
+following conditions.
+
+ a. Attribution.
+
+ 1. If You Share the Licensed Material (including in modified
+ form), You must:
+
+ a. retain the following if it is supplied by the Licensor
+ with the Licensed Material:
+
+ i. identification of the creator(s) of the Licensed
+ Material and any others designated to receive
+ attribution, in any reasonable manner requested by
+ the Licensor (including by pseudonym if
+ designated);
+
+ ii. a copyright notice;
+
+ iii. a notice that refers to this Public License;
+
+ iv. a notice that refers to the disclaimer of
+ warranties;
+
+ v. a URI or hyperlink to the Licensed Material to the
+ extent reasonably practicable;
+
+ b. indicate if You modified the Licensed Material and
+ retain an indication of any previous modifications; and
+
+ c. indicate the Licensed Material is licensed under this
+ Public License, and include the text of, or the URI or
+ hyperlink to, this Public License.
+
+ 2. You may satisfy the conditions in Section 3(a)(1) in any
+ reasonable manner based on the medium, means, and context in
+ which You Share the Licensed Material. For example, it may be
+ reasonable to satisfy the conditions by providing a URI or
+ hyperlink to a resource that includes the required
+ information.
+
+ 3. If requested by the Licensor, You must remove any of the
+ information required by Section 3(a)(1)(A) to the extent
+ reasonably practicable.
+
+ b. ShareAlike.
+
+ In addition to the conditions in Section 3(a), if You Share
+ Adapted Material You produce, the following conditions also apply.
+
+ 1. The Adapter's License You apply must be a Creative Commons
+ license with the same License Elements, this version or
+ later, or a BY-SA Compatible License.
+
+ 2. You must include the text of, or the URI or hyperlink to, the
+ Adapter's License You apply. You may satisfy this condition
+ in any reasonable manner based on the medium, means, and
+ context in which You Share Adapted Material.
+
+ 3. You may not offer or impose any additional or different terms
+ or conditions on, or apply any Effective Technological
+ Measures to, Adapted Material that restrict exercise of the
+ rights granted under the Adapter's License You apply.
+
+
+Section 4 -- Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that
+apply to Your use of the Licensed Material:
+
+ a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+ to extract, reuse, reproduce, and Share all or a substantial
+ portion of the contents of the database;
+
+ b. if You include all or a substantial portion of the database
+ contents in a database in which You have Sui Generis Database
+ Rights, then the database in which You have Sui Generis Database
+ Rights (but not its individual contents) is Adapted Material,
+
+ including for purposes of Section 3(b); and
+ c. You must comply with the conditions in Section 3(a) if You Share
+ all or a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not
+replace Your obligations under this Public License where the Licensed
+Rights include other Copyright and Similar Rights.
+
+
+Section 5 -- Disclaimer of Warranties and Limitation of Liability.
+
+ a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
+ EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
+ AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
+ ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
+ IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
+ WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
+ ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+ KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
+ ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
+
+ b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
+ TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
+ NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
+ INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
+ COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
+ USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
+ DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
+ IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+ c. The disclaimer of warranties and limitation of liability provided
+ above shall be interpreted in a manner that, to the extent
+ possible, most closely approximates an absolute disclaimer and
+ waiver of all liability.
+
+
+Section 6 -- Term and Termination.
+
+ a. This Public License applies for the term of the Copyright and
+ Similar Rights licensed here. However, if You fail to comply with
+ this Public License, then Your rights under this Public License
+ terminate automatically.
+
+ b. Where Your right to use the Licensed Material has terminated under
+ Section 6(a), it reinstates:
+
+ 1. automatically as of the date the violation is cured, provided
+ it is cured within 30 days of Your discovery of the
+ violation; or
+
+ 2. upon express reinstatement by the Licensor.
+
+ For the avoidance of doubt, this Section 6(b) does not affect any
+ right the Licensor may have to seek remedies for Your violations
+ of this Public License.
+
+ c. For the avoidance of doubt, the Licensor may also offer the
+ Licensed Material under separate terms or conditions or stop
+ distributing the Licensed Material at any time; however, doing so
+ will not terminate this Public License.
+
+ d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+ License.
+
+
+Section 7 -- Other Terms and Conditions.
+
+ a. The Licensor shall not be bound by any additional or different
+ terms or conditions communicated by You unless expressly agreed.
+
+ b. Any arrangements, understandings, or agreements regarding the
+ Licensed Material not stated herein are separate from and
+ independent of the terms and conditions of this Public License.
+
+
+Section 8 -- Interpretation.
+
+ a. For the avoidance of doubt, this Public License does not, and
+ shall not be interpreted to, reduce, limit, restrict, or impose
+ conditions on any use of the Licensed Material that could lawfully
+ be made without permission under this Public License.
+
+ b. To the extent possible, if any provision of this Public License is
+ deemed unenforceable, it shall be automatically reformed to the
+ minimum extent necessary to make it enforceable. If the provision
+ cannot be reformed, it shall be severed from this Public License
+ without affecting the enforceability of the remaining terms and
+ conditions.
+
+ c. No term or condition of this Public License will be waived and no
+ failure to comply consented to unless expressly agreed to by the
+ Licensor.
+
+ d. Nothing in this Public License constitutes or may be interpreted
+ as a limitation upon, or waiver of, any privileges and immunities
+ that apply to the Licensor or You, including from the legal
+ processes of any jurisdiction or authority.
+
+
+=======================================================================
+
+Creative Commons is not a party to its public
+licenses. Notwithstanding, Creative Commons may elect to apply one of
+its public licenses to material it publishes and in those instances
+will be considered the ā€œLicensor.ā€ The text of the Creative Commons
+public licenses is dedicated to the public domain under the CC0 Public
+Domain Dedication. Except for the limited purpose of indicating that
+material is shared under a Creative Commons public license or as
+otherwise permitted by the Creative Commons policies published at
+creativecommons.org/policies, Creative Commons does not authorize the
+use of the trademark "Creative Commons" or any other trademark or logo
+of Creative Commons without its prior written consent including,
+without limitation, in connection with any unauthorized modifications
+to any of its public licenses or any other arrangements,
+understandings, or agreements concerning use of licensed material. For
+the avoidance of doubt, this paragraph does not form part of the
+public licenses.
+
+Creative Commons may be contacted at creativecommons.org.
+
diff --git a/web/static/fonts/README.NFO b/web/static/fonts/README.NFO
new file mode 100644
index 0000000..f09ee43
--- /dev/null
+++ b/web/static/fonts/README.NFO
@@ -0,0 +1,45 @@
+
+ _ Ä --- Ä _ Ä --- Ä
+ .ł" ,Ā, ~=Ņ_ .ł. .ł" ~=Ņ_
+ . . .OZZZOø ^g, . .žų~ųž. ^%· .s%ZOæ
+ ` Ą¦qZp¦' ųł `Z, ` _.,ś `gZæ ł:ZZ|
+ _Āg%%oc, ~ _., ` ŌZ; _.,Ā©y%Z=-:ś .s%Z%L, `OZZYi%gĀ_
+ jOZZ˜˜ZZOLś jOZZ˜Ŗ, `Zb _.Ā©y%ZZZZZZZZ%=:ł jZZZZZZZb `ZZZZ˜ZZZb
+ łZZ?~ ~\ZZZ| |›ZZZZO\ ś?Z.ł%˜ZZZZZZ¦*Źü^ų"`' /ZZ¦"~"¦ZZ\ łT ~!ZZ“
+ Z6f łZZZOłś|ZZZ^ZZi ]Z1ś:-":ZZZ' _. łOZ/ \ZZL : |6Z'
+ . `ZZŖ._ ~"^Z| łZZZ;\ZZ ĘZµ ś›ZZZś _Ā%ZZś l%! .oZo, ]ZZśł _ŅZZ' .
+ , ~^Ź*Ź^~.Z›śśZZZl ZZĀZZ1 ś łZZZZł ^¦!ZZł :=l dZZZb łZZ| ~^"~
+ ł g%ZZZśśZZZZ `ZZZų : śZZZZ: łlZZ| ł;ł :ZZZF śZZ| .'
+ ~Ä_ śZZZZ| łZZZZ ĄZZ˜' ł ?ZZZ! :ZZ³ś śł "¦" dZgś _Ä~
+ ~"^ :ZZZOłł|ZZZ! `^' ' `ZZZ ś¦ZZ: ś ./ZZf śÄ--`~
+ OZZZł jZ¦Ź~ `. _ _. . ~^¦L, YZZZZOzzĀĀ śł:=CO/
+ -V! j¦Ź^~ . ~-ŗł-~ . `^ʦZ˜ZF'śł:%CG' . O R G
+ ~Ä_ T _Ä~ ~' '^"~
+ ~"Ķ=|=Ķ"~
+ ł p r e s e n t s
+ ś
+
+
+ The Ultimate Oldschool PC Font Pack
+
+ < http://int10h.org/oldschool-pc-fonts/ >
+
+ v2.2 // 2020-11-21
+
+ ------------------------------------------------------------------------
+
+ For documentation see the 'docs' folder or these pages:
+
+ Readme: < http://int10h.org/oldschool-pc-fonts/readme/ >
+
+ Font list: < http://int10h.org/oldschool-pc-fonts/fontlist/ >
+
+ ------------------------------------------------------------------------
+
+ The Ultimate Oldschool PC Font Pack is licensed under a Creative Commons
+ Attribution-ShareAlike 4.0 International License.
+
+ You should have received a copy of the license along with this work. If
+ not, see < http://creativecommons.org/licenses/by-sa/4.0/ >.
+
+ (c) 2016-2020 VileR
diff --git a/web/static/fonts/README.TXT b/web/static/fonts/README.TXT
new file mode 100644
index 0000000..02b06ef
--- /dev/null
+++ b/web/static/fonts/README.TXT
@@ -0,0 +1,46 @@
+
+ _ ─ --- ─ _ ─ --- ─
+ .āˆ™" ,┬, ~=ā•„_ .āˆ™. .āˆ™" ~=ā•„_
+ . . .OZZZOā•• ^g, . .■°~°■. ^%ā•– .s%ZO┐
+ ` └ªqZpĀŖ' Ā°āˆ™ `Z, ` _.,Ā· `gZ┐ āˆ™:ZZ|
+ _┬g%%oc, ~ _., ` ā•˜Z; _.,ā”¬āŒy%Z=-:Ā· .s%Z%L, `OZZYi%g┬_
+ jOZZÿÿZZOLĀ· jOZZÿ¬, `Zb _.ā”¬āŒy%ZZZZZZZZ%=:āˆ™ jZZZZZZZb `ZZZZĆæZZZb
+ āˆ™ZZ?~ ~\ZZZ| |Ā¢ZZZZO\ Ā·?Z.āˆ™%ĆæZZZZZZĀŖ*╩ⁿ^°"`' /ZZĀŖ"~"ĀŖZZ\ āˆ™T ~!ZZ┤
+ Z6f āˆ™ZZZOāˆ™Ā·|ZZZ^ZZi ]Z1Ā·:-":ZZZ' _. āˆ™OZ/ \ZZL : |6Z'
+ . `ZZ¬._ ~"^Z| āˆ™ZZZ;\ZZ ā•žZā•” Ā·Ā¢ZZZĀ· _┬%ZZĀ· l%! .oZo, ]ZZĀ·āˆ™ _ā•„ZZ' .
+ , ~^ā•©*ā•©^~.Z¢··ZZZl ZZ┬ZZ1 Ā· āˆ™ZZZZāˆ™ ^ĀŖ!ZZāˆ™ :=l dZZZb āˆ™ZZ| ~^"~
+ āˆ™ g%ZZZĀ·Ā·ZZZZ `Ā„ZZZ° : Ā·ZZZZ: āˆ™lZZ| āˆ™;āˆ™ :ZZZF Ā·ZZ| .'
+ ~─_ Ā·ZZZZ| āˆ™ZZZZ ā””ZZĆæ' āˆ™ ?ZZZ! :ZZ│· Ā·āˆ™ "ĀŖ" dZgĀ· _─~
+ ~"^ :ZZZOāˆ™āˆ™|ZZZ! `^' ' `Ā„ZZZ Ā·ĀŖZZ: Ā· ./ZZf ·─--`~
+ OZZZāˆ™ jZĀŖā•©~ `. _ _. . ~^ĀŖL, YZZZZOzz┬┬ Ā·āˆ™:=CO/
+ -V! jĀŖā•©^~ . ~-ā•‘āˆ™-~ . `^ā•©ĀŖZ„ÿZF'Ā·āˆ™:%CG' . O R G
+ ~─_ T _─~ ~' '^"~
+ ~"═=|=═"~
+ āˆ™ p r e s e n t s
+ Ā·
+
+
+ The Ultimate Oldschool PC Font Pack
+
+ < http://int10h.org/oldschool-pc-fonts/ >
+
+ v2.2 // 2020-11-21
+
+ ------------------------------------------------------------------------
+
+ For documentation see the 'docs' folder or these pages:
+
+ Readme: < http://int10h.org/oldschool-pc-fonts/readme/ >
+
+ Font list: < http://int10h.org/oldschool-pc-fonts/fontlist/ >
+
+ ------------------------------------------------------------------------
+
+ The Ultimate Oldschool PC Font Pack is licensed under a Creative Commons
+ Attribution-ShareAlike 4.0 International License.
+
+ You should have received a copy of the license along with this work. If
+ not, see < http://creativecommons.org/licenses/by-sa/4.0/ >.
+
+ (c) 2016-2020 VileR
+
diff --git a/web/static/fonts/Web437_ACM_VGA_8x14.woff b/web/static/fonts/Web437_ACM_VGA_8x14.woff
new file mode 100644
index 0000000..9f44664
--- /dev/null
+++ b/web/static/fonts/Web437_ACM_VGA_8x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ACM_VGA_8x16.woff b/web/static/fonts/Web437_ACM_VGA_8x16.woff
new file mode 100644
index 0000000..b828c2b
--- /dev/null
+++ b/web/static/fonts/Web437_ACM_VGA_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ACM_VGA_8x8.woff b/web/static/fonts/Web437_ACM_VGA_8x8.woff
new file mode 100644
index 0000000..acfebfa
--- /dev/null
+++ b/web/static/fonts/Web437_ACM_VGA_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ACM_VGA_9x14.woff b/web/static/fonts/Web437_ACM_VGA_9x14.woff
new file mode 100644
index 0000000..c388f41
--- /dev/null
+++ b/web/static/fonts/Web437_ACM_VGA_9x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ACM_VGA_9x16.woff b/web/static/fonts/Web437_ACM_VGA_9x16.woff
new file mode 100644
index 0000000..9f7f85f
--- /dev/null
+++ b/web/static/fonts/Web437_ACM_VGA_9x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ACM_VGA_9x8.woff b/web/static/fonts/Web437_ACM_VGA_9x8.woff
new file mode 100644
index 0000000..7b82f03
--- /dev/null
+++ b/web/static/fonts/Web437_ACM_VGA_9x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_AMI_EGA_8x14.woff b/web/static/fonts/Web437_AMI_EGA_8x14.woff
new file mode 100644
index 0000000..385f625
--- /dev/null
+++ b/web/static/fonts/Web437_AMI_EGA_8x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_AMI_EGA_8x8-2y.woff b/web/static/fonts/Web437_AMI_EGA_8x8-2y.woff
new file mode 100644
index 0000000..0073dbd
--- /dev/null
+++ b/web/static/fonts/Web437_AMI_EGA_8x8-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_AMI_EGA_8x8.woff b/web/static/fonts/Web437_AMI_EGA_8x8.woff
new file mode 100644
index 0000000..69e5483
--- /dev/null
+++ b/web/static/fonts/Web437_AMI_EGA_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_AMI_EGA_9x14.woff b/web/static/fonts/Web437_AMI_EGA_9x14.woff
new file mode 100644
index 0000000..37813dd
--- /dev/null
+++ b/web/static/fonts/Web437_AMI_EGA_9x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_AST_PremiumExec.woff b/web/static/fonts/Web437_AST_PremiumExec.woff
new file mode 100644
index 0000000..9613ecf
--- /dev/null
+++ b/web/static/fonts/Web437_AST_PremiumExec.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ATI_8x14.woff b/web/static/fonts/Web437_ATI_8x14.woff
new file mode 100644
index 0000000..bc1a987
--- /dev/null
+++ b/web/static/fonts/Web437_ATI_8x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ATI_8x16.woff b/web/static/fonts/Web437_ATI_8x16.woff
new file mode 100644
index 0000000..c782766
--- /dev/null
+++ b/web/static/fonts/Web437_ATI_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ATI_8x8-2y.woff b/web/static/fonts/Web437_ATI_8x8-2y.woff
new file mode 100644
index 0000000..a2098f8
--- /dev/null
+++ b/web/static/fonts/Web437_ATI_8x8-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ATI_8x8.woff b/web/static/fonts/Web437_ATI_8x8.woff
new file mode 100644
index 0000000..7984412
--- /dev/null
+++ b/web/static/fonts/Web437_ATI_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ATI_9x14.woff b/web/static/fonts/Web437_ATI_9x14.woff
new file mode 100644
index 0000000..a8f1153
--- /dev/null
+++ b/web/static/fonts/Web437_ATI_9x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ATI_9x16.woff b/web/static/fonts/Web437_ATI_9x16.woff
new file mode 100644
index 0000000..1f017ab
--- /dev/null
+++ b/web/static/fonts/Web437_ATI_9x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ATI_9x8.woff b/web/static/fonts/Web437_ATI_9x8.woff
new file mode 100644
index 0000000..c53ff48
--- /dev/null
+++ b/web/static/fonts/Web437_ATI_9x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ATI_SmallW_6x8.woff b/web/static/fonts/Web437_ATI_SmallW_6x8.woff
new file mode 100644
index 0000000..479d653
--- /dev/null
+++ b/web/static/fonts/Web437_ATI_SmallW_6x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ATT_PC6300-2x.woff b/web/static/fonts/Web437_ATT_PC6300-2x.woff
new file mode 100644
index 0000000..9d633b5
--- /dev/null
+++ b/web/static/fonts/Web437_ATT_PC6300-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ATT_PC6300.woff b/web/static/fonts/Web437_ATT_PC6300.woff
new file mode 100644
index 0000000..c7cb2c4
--- /dev/null
+++ b/web/static/fonts/Web437_ATT_PC6300.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Acer710_CGA-2y.woff b/web/static/fonts/Web437_Acer710_CGA-2y.woff
new file mode 100644
index 0000000..74d7126
--- /dev/null
+++ b/web/static/fonts/Web437_Acer710_CGA-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Acer710_CGA.woff b/web/static/fonts/Web437_Acer710_CGA.woff
new file mode 100644
index 0000000..07fddbc
--- /dev/null
+++ b/web/static/fonts/Web437_Acer710_CGA.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Acer710_Mono.woff b/web/static/fonts/Web437_Acer710_Mono.woff
new file mode 100644
index 0000000..c6cf32c
--- /dev/null
+++ b/web/static/fonts/Web437_Acer710_Mono.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Acer_VGA_8x8-2y.woff b/web/static/fonts/Web437_Acer_VGA_8x8-2y.woff
new file mode 100644
index 0000000..0422518
--- /dev/null
+++ b/web/static/fonts/Web437_Acer_VGA_8x8-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Acer_VGA_8x8.woff b/web/static/fonts/Web437_Acer_VGA_8x8.woff
new file mode 100644
index 0000000..d13fa7b
--- /dev/null
+++ b/web/static/fonts/Web437_Acer_VGA_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Acer_VGA_9x8.woff b/web/static/fonts/Web437_Acer_VGA_9x8.woff
new file mode 100644
index 0000000..36c1e47
--- /dev/null
+++ b/web/static/fonts/Web437_Acer_VGA_9x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Amstrad_PC-2y.woff b/web/static/fonts/Web437_Amstrad_PC-2y.woff
new file mode 100644
index 0000000..2a8593f
--- /dev/null
+++ b/web/static/fonts/Web437_Amstrad_PC-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Amstrad_PC.woff b/web/static/fonts/Web437_Amstrad_PC.woff
new file mode 100644
index 0000000..89f7b01
--- /dev/null
+++ b/web/static/fonts/Web437_Amstrad_PC.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ApricotPortable.woff b/web/static/fonts/Web437_ApricotPortable.woff
new file mode 100644
index 0000000..3b562f5
--- /dev/null
+++ b/web/static/fonts/Web437_ApricotPortable.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ApricotXenC.woff b/web/static/fonts/Web437_ApricotXenC.woff
new file mode 100644
index 0000000..a2cde2a
--- /dev/null
+++ b/web/static/fonts/Web437_ApricotXenC.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Apricot_200L-2y.woff b/web/static/fonts/Web437_Apricot_200L-2y.woff
new file mode 100644
index 0000000..e4bf1f3
--- /dev/null
+++ b/web/static/fonts/Web437_Apricot_200L-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Apricot_200L.woff b/web/static/fonts/Web437_Apricot_200L.woff
new file mode 100644
index 0000000..5329aee
--- /dev/null
+++ b/web/static/fonts/Web437_Apricot_200L.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Apricot_256L-2y.woff b/web/static/fonts/Web437_Apricot_256L-2y.woff
new file mode 100644
index 0000000..710985f
--- /dev/null
+++ b/web/static/fonts/Web437_Apricot_256L-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Apricot_256L.woff b/web/static/fonts/Web437_Apricot_256L.woff
new file mode 100644
index 0000000..ef73b30
--- /dev/null
+++ b/web/static/fonts/Web437_Apricot_256L.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Apricot_Mono.woff b/web/static/fonts/Web437_Apricot_Mono.woff
new file mode 100644
index 0000000..e1041a3
--- /dev/null
+++ b/web/static/fonts/Web437_Apricot_Mono.woff
Binary files differ
diff --git a/web/static/fonts/Web437_CL_EagleIII_8x16.woff b/web/static/fonts/Web437_CL_EagleIII_8x16.woff
new file mode 100644
index 0000000..f0e9430
--- /dev/null
+++ b/web/static/fonts/Web437_CL_EagleIII_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_CL_EagleIII_9x16.woff b/web/static/fonts/Web437_CL_EagleIII_9x16.woff
new file mode 100644
index 0000000..1866e81
--- /dev/null
+++ b/web/static/fonts/Web437_CL_EagleIII_9x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_CL_EagleII_8x16.woff b/web/static/fonts/Web437_CL_EagleII_8x16.woff
new file mode 100644
index 0000000..342cdc6
--- /dev/null
+++ b/web/static/fonts/Web437_CL_EagleII_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_CL_EagleII_9x16.woff b/web/static/fonts/Web437_CL_EagleII_9x16.woff
new file mode 100644
index 0000000..38e8b1d
--- /dev/null
+++ b/web/static/fonts/Web437_CL_EagleII_9x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_CL_Stingray_8x16.woff b/web/static/fonts/Web437_CL_Stingray_8x16.woff
new file mode 100644
index 0000000..94dc555
--- /dev/null
+++ b/web/static/fonts/Web437_CL_Stingray_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_CL_Stingray_8x16_bold.woff b/web/static/fonts/Web437_CL_Stingray_8x16_bold.woff
new file mode 100644
index 0000000..78cb4fc
--- /dev/null
+++ b/web/static/fonts/Web437_CL_Stingray_8x16_bold.woff
Binary files differ
diff --git a/web/static/fonts/Web437_CL_Stingray_8x19.woff b/web/static/fonts/Web437_CL_Stingray_8x19.woff
new file mode 100644
index 0000000..1781f2f
--- /dev/null
+++ b/web/static/fonts/Web437_CL_Stingray_8x19.woff
Binary files differ
diff --git a/web/static/fonts/Web437_CL_Stingray_8x19_bold.woff b/web/static/fonts/Web437_CL_Stingray_8x19_bold.woff
new file mode 100644
index 0000000..da422df
--- /dev/null
+++ b/web/static/fonts/Web437_CL_Stingray_8x19_bold.woff
Binary files differ
diff --git a/web/static/fonts/Web437_CompaqThin_8x14.woff b/web/static/fonts/Web437_CompaqThin_8x14.woff
new file mode 100644
index 0000000..c448c58
--- /dev/null
+++ b/web/static/fonts/Web437_CompaqThin_8x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_CompaqThin_8x16.woff b/web/static/fonts/Web437_CompaqThin_8x16.woff
new file mode 100644
index 0000000..7914e4c
--- /dev/null
+++ b/web/static/fonts/Web437_CompaqThin_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_CompaqThin_8x8.woff b/web/static/fonts/Web437_CompaqThin_8x8.woff
new file mode 100644
index 0000000..62772df
--- /dev/null
+++ b/web/static/fonts/Web437_CompaqThin_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Compaq_Port3-2x.woff b/web/static/fonts/Web437_Compaq_Port3-2x.woff
new file mode 100644
index 0000000..a859b9f
--- /dev/null
+++ b/web/static/fonts/Web437_Compaq_Port3-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Compaq_Port3.woff b/web/static/fonts/Web437_Compaq_Port3.woff
new file mode 100644
index 0000000..b96d4e5
--- /dev/null
+++ b/web/static/fonts/Web437_Compaq_Port3.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Compis.woff b/web/static/fonts/Web437_Compis.woff
new file mode 100644
index 0000000..44721a2
--- /dev/null
+++ b/web/static/fonts/Web437_Compis.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Copam_BIOS-2y.woff b/web/static/fonts/Web437_Copam_BIOS-2y.woff
new file mode 100644
index 0000000..1a301bf
--- /dev/null
+++ b/web/static/fonts/Web437_Copam_BIOS-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Copam_BIOS.woff b/web/static/fonts/Web437_Copam_BIOS.woff
new file mode 100644
index 0000000..1c51092
--- /dev/null
+++ b/web/static/fonts/Web437_Copam_BIOS.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Cordata_PPC-21.woff b/web/static/fonts/Web437_Cordata_PPC-21.woff
new file mode 100644
index 0000000..bab8c7b
--- /dev/null
+++ b/web/static/fonts/Web437_Cordata_PPC-21.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Cordata_PPC-400.woff b/web/static/fonts/Web437_Cordata_PPC-400.woff
new file mode 100644
index 0000000..5f95c1b
--- /dev/null
+++ b/web/static/fonts/Web437_Cordata_PPC-400.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DG_One-2y.woff b/web/static/fonts/Web437_DG_One-2y.woff
new file mode 100644
index 0000000..5ebc340
--- /dev/null
+++ b/web/static/fonts/Web437_DG_One-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DG_One-2y_bold.woff b/web/static/fonts/Web437_DG_One-2y_bold.woff
new file mode 100644
index 0000000..38a7339
--- /dev/null
+++ b/web/static/fonts/Web437_DG_One-2y_bold.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DG_One.woff b/web/static/fonts/Web437_DG_One.woff
new file mode 100644
index 0000000..9bee64f
--- /dev/null
+++ b/web/static/fonts/Web437_DG_One.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DG_One_bold.woff b/web/static/fonts/Web437_DG_One_bold.woff
new file mode 100644
index 0000000..a887854
--- /dev/null
+++ b/web/static/fonts/Web437_DG_One_bold.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DOS-V_TWN16.woff b/web/static/fonts/Web437_DOS-V_TWN16.woff
new file mode 100644
index 0000000..4a9692a
--- /dev/null
+++ b/web/static/fonts/Web437_DOS-V_TWN16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DOS-V_TWN19.woff b/web/static/fonts/Web437_DOS-V_TWN19.woff
new file mode 100644
index 0000000..3ebeeb5
--- /dev/null
+++ b/web/static/fonts/Web437_DOS-V_TWN19.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DOS-V_re_ANK16.woff b/web/static/fonts/Web437_DOS-V_re_ANK16.woff
new file mode 100644
index 0000000..a61193e
--- /dev/null
+++ b/web/static/fonts/Web437_DOS-V_re_ANK16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DOS-V_re_ANK19.woff b/web/static/fonts/Web437_DOS-V_re_ANK19.woff
new file mode 100644
index 0000000..6842296
--- /dev/null
+++ b/web/static/fonts/Web437_DOS-V_re_ANK19.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DOS-V_re_ANK24.woff b/web/static/fonts/Web437_DOS-V_re_ANK24.woff
new file mode 100644
index 0000000..a54c6ad
--- /dev/null
+++ b/web/static/fonts/Web437_DOS-V_re_ANK24.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DOS-V_re_ANK30.woff b/web/static/fonts/Web437_DOS-V_re_ANK30.woff
new file mode 100644
index 0000000..623d973
--- /dev/null
+++ b/web/static/fonts/Web437_DOS-V_re_ANK30.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DOS-V_re_JPN12.woff b/web/static/fonts/Web437_DOS-V_re_JPN12.woff
new file mode 100644
index 0000000..04ea332
--- /dev/null
+++ b/web/static/fonts/Web437_DOS-V_re_JPN12.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DOS-V_re_JPN16.woff b/web/static/fonts/Web437_DOS-V_re_JPN16.woff
new file mode 100644
index 0000000..6c91b6e
--- /dev/null
+++ b/web/static/fonts/Web437_DOS-V_re_JPN16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DOS-V_re_JPN19.woff b/web/static/fonts/Web437_DOS-V_re_JPN19.woff
new file mode 100644
index 0000000..48f154d
--- /dev/null
+++ b/web/static/fonts/Web437_DOS-V_re_JPN19.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DOS-V_re_JPN24.woff b/web/static/fonts/Web437_DOS-V_re_JPN24.woff
new file mode 100644
index 0000000..a77aca7
--- /dev/null
+++ b/web/static/fonts/Web437_DOS-V_re_JPN24.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DOS-V_re_JPN30.woff b/web/static/fonts/Web437_DOS-V_re_JPN30.woff
new file mode 100644
index 0000000..3073f72
--- /dev/null
+++ b/web/static/fonts/Web437_DOS-V_re_JPN30.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DOS-V_re_PRC16.woff b/web/static/fonts/Web437_DOS-V_re_PRC16.woff
new file mode 100644
index 0000000..4ddf047
--- /dev/null
+++ b/web/static/fonts/Web437_DOS-V_re_PRC16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DOS-V_re_PRC19.woff b/web/static/fonts/Web437_DOS-V_re_PRC19.woff
new file mode 100644
index 0000000..322c960
--- /dev/null
+++ b/web/static/fonts/Web437_DOS-V_re_PRC19.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DTK_BIOS-2y.woff b/web/static/fonts/Web437_DTK_BIOS-2y.woff
new file mode 100644
index 0000000..14c9926
--- /dev/null
+++ b/web/static/fonts/Web437_DTK_BIOS-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_DTK_BIOS.woff b/web/static/fonts/Web437_DTK_BIOS.woff
new file mode 100644
index 0000000..7a1cbaf
--- /dev/null
+++ b/web/static/fonts/Web437_DTK_BIOS.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EagleSpCGA_Alt1-2y.woff b/web/static/fonts/Web437_EagleSpCGA_Alt1-2y.woff
new file mode 100644
index 0000000..15a696b
--- /dev/null
+++ b/web/static/fonts/Web437_EagleSpCGA_Alt1-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EagleSpCGA_Alt1.woff b/web/static/fonts/Web437_EagleSpCGA_Alt1.woff
new file mode 100644
index 0000000..a2af2d5
--- /dev/null
+++ b/web/static/fonts/Web437_EagleSpCGA_Alt1.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EagleSpCGA_Alt2-2y.woff b/web/static/fonts/Web437_EagleSpCGA_Alt2-2y.woff
new file mode 100644
index 0000000..cfee97a
--- /dev/null
+++ b/web/static/fonts/Web437_EagleSpCGA_Alt2-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EagleSpCGA_Alt2.woff b/web/static/fonts/Web437_EagleSpCGA_Alt2.woff
new file mode 100644
index 0000000..dbfdce7
--- /dev/null
+++ b/web/static/fonts/Web437_EagleSpCGA_Alt2.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EagleSpCGA_Alt3-2y.woff b/web/static/fonts/Web437_EagleSpCGA_Alt3-2y.woff
new file mode 100644
index 0000000..c7562a7
--- /dev/null
+++ b/web/static/fonts/Web437_EagleSpCGA_Alt3-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EagleSpCGA_Alt3.woff b/web/static/fonts/Web437_EagleSpCGA_Alt3.woff
new file mode 100644
index 0000000..3ac1dfe
--- /dev/null
+++ b/web/static/fonts/Web437_EagleSpCGA_Alt3.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EpsonMGA-2y.woff b/web/static/fonts/Web437_EpsonMGA-2y.woff
new file mode 100644
index 0000000..31f04fb
--- /dev/null
+++ b/web/static/fonts/Web437_EpsonMGA-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EpsonMGA.woff b/web/static/fonts/Web437_EpsonMGA.woff
new file mode 100644
index 0000000..3139daf
--- /dev/null
+++ b/web/static/fonts/Web437_EpsonMGA.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EpsonMGA_Alt-2y.woff b/web/static/fonts/Web437_EpsonMGA_Alt-2y.woff
new file mode 100644
index 0000000..4680e93
--- /dev/null
+++ b/web/static/fonts/Web437_EpsonMGA_Alt-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EpsonMGA_Alt.woff b/web/static/fonts/Web437_EpsonMGA_Alt.woff
new file mode 100644
index 0000000..0616ea7
--- /dev/null
+++ b/web/static/fonts/Web437_EpsonMGA_Alt.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EpsonMGA_Mono.woff b/web/static/fonts/Web437_EpsonMGA_Mono.woff
new file mode 100644
index 0000000..4b132bf
--- /dev/null
+++ b/web/static/fonts/Web437_EpsonMGA_Mono.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EuroPC_CGA-2y.woff b/web/static/fonts/Web437_EuroPC_CGA-2y.woff
new file mode 100644
index 0000000..ef56d5d
--- /dev/null
+++ b/web/static/fonts/Web437_EuroPC_CGA-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EuroPC_CGA.woff b/web/static/fonts/Web437_EuroPC_CGA.woff
new file mode 100644
index 0000000..89b84ac
--- /dev/null
+++ b/web/static/fonts/Web437_EuroPC_CGA.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EuroPC_Mono.woff b/web/static/fonts/Web437_EuroPC_Mono.woff
new file mode 100644
index 0000000..2692893
--- /dev/null
+++ b/web/static/fonts/Web437_EuroPC_Mono.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EverexME_5x8.woff b/web/static/fonts/Web437_EverexME_5x8.woff
new file mode 100644
index 0000000..1a84a60
--- /dev/null
+++ b/web/static/fonts/Web437_EverexME_5x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EverexME_7x8.woff b/web/static/fonts/Web437_EverexME_7x8.woff
new file mode 100644
index 0000000..5b4c9d4
--- /dev/null
+++ b/web/static/fonts/Web437_EverexME_7x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_EverexME_8x16.woff b/web/static/fonts/Web437_EverexME_8x16.woff
new file mode 100644
index 0000000..1a47ea4
--- /dev/null
+++ b/web/static/fonts/Web437_EverexME_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_FMTowns_re_8x16-2x.woff b/web/static/fonts/Web437_FMTowns_re_8x16-2x.woff
new file mode 100644
index 0000000..1424b2a
--- /dev/null
+++ b/web/static/fonts/Web437_FMTowns_re_8x16-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_FMTowns_re_8x16.woff b/web/static/fonts/Web437_FMTowns_re_8x16.woff
new file mode 100644
index 0000000..702078a
--- /dev/null
+++ b/web/static/fonts/Web437_FMTowns_re_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_FMTowns_re_8x8.woff b/web/static/fonts/Web437_FMTowns_re_8x8.woff
new file mode 100644
index 0000000..526cb89
--- /dev/null
+++ b/web/static/fonts/Web437_FMTowns_re_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_HP_100LX_10x11.woff b/web/static/fonts/Web437_HP_100LX_10x11.woff
new file mode 100644
index 0000000..223e168
--- /dev/null
+++ b/web/static/fonts/Web437_HP_100LX_10x11.woff
Binary files differ
diff --git a/web/static/fonts/Web437_HP_100LX_16x12.woff b/web/static/fonts/Web437_HP_100LX_16x12.woff
new file mode 100644
index 0000000..2eaa62e
--- /dev/null
+++ b/web/static/fonts/Web437_HP_100LX_16x12.woff
Binary files differ
diff --git a/web/static/fonts/Web437_HP_100LX_6x8-2x.woff b/web/static/fonts/Web437_HP_100LX_6x8-2x.woff
new file mode 100644
index 0000000..3c48c55
--- /dev/null
+++ b/web/static/fonts/Web437_HP_100LX_6x8-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_HP_100LX_6x8.woff b/web/static/fonts/Web437_HP_100LX_6x8.woff
new file mode 100644
index 0000000..5d6069c
--- /dev/null
+++ b/web/static/fonts/Web437_HP_100LX_6x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_HP_100LX_8x8-2x.woff b/web/static/fonts/Web437_HP_100LX_8x8-2x.woff
new file mode 100644
index 0000000..87304c6
--- /dev/null
+++ b/web/static/fonts/Web437_HP_100LX_8x8-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_HP_100LX_8x8.woff b/web/static/fonts/Web437_HP_100LX_8x8.woff
new file mode 100644
index 0000000..f60db64
--- /dev/null
+++ b/web/static/fonts/Web437_HP_100LX_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_HP_150_re.woff b/web/static/fonts/Web437_HP_150_re.woff
new file mode 100644
index 0000000..3eaaf6d
--- /dev/null
+++ b/web/static/fonts/Web437_HP_150_re.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_3270pc.woff b/web/static/fonts/Web437_IBM_3270pc.woff
new file mode 100644
index 0000000..fb9cd72
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_3270pc.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_BIOS-2x.woff b/web/static/fonts/Web437_IBM_BIOS-2x.woff
new file mode 100644
index 0000000..c5fe090
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_BIOS-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_BIOS-2y.woff b/web/static/fonts/Web437_IBM_BIOS-2y.woff
new file mode 100644
index 0000000..860baf5
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_BIOS-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_BIOS.woff b/web/static/fonts/Web437_IBM_BIOS.woff
new file mode 100644
index 0000000..9daecb3
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_BIOS.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_CGA-2y.woff b/web/static/fonts/Web437_IBM_CGA-2y.woff
new file mode 100644
index 0000000..5967b6f
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_CGA-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_CGA.woff b/web/static/fonts/Web437_IBM_CGA.woff
new file mode 100644
index 0000000..fe8f17a
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_CGA.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_CGAthin-2y.woff b/web/static/fonts/Web437_IBM_CGAthin-2y.woff
new file mode 100644
index 0000000..99bd14a
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_CGAthin-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_CGAthin.woff b/web/static/fonts/Web437_IBM_CGAthin.woff
new file mode 100644
index 0000000..c7efcf1
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_CGAthin.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_Conv-2x.woff b/web/static/fonts/Web437_IBM_Conv-2x.woff
new file mode 100644
index 0000000..6ffe99d
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_Conv-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_Conv-2y.woff b/web/static/fonts/Web437_IBM_Conv-2y.woff
new file mode 100644
index 0000000..9c07239
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_Conv-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_Conv.woff b/web/static/fonts/Web437_IBM_Conv.woff
new file mode 100644
index 0000000..656f15a
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_Conv.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_DOS_ISO8-2x.woff b/web/static/fonts/Web437_IBM_DOS_ISO8-2x.woff
new file mode 100644
index 0000000..f40721f
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_DOS_ISO8-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_DOS_ISO8.woff b/web/static/fonts/Web437_IBM_DOS_ISO8.woff
new file mode 100644
index 0000000..d5b9bac
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_DOS_ISO8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_DOS_ISO9-2x.woff b/web/static/fonts/Web437_IBM_DOS_ISO9-2x.woff
new file mode 100644
index 0000000..e5f89ee
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_DOS_ISO9-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_DOS_ISO9.woff b/web/static/fonts/Web437_IBM_DOS_ISO9.woff
new file mode 100644
index 0000000..fe3eda9
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_DOS_ISO9.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_EGA_8x14-2x.woff b/web/static/fonts/Web437_IBM_EGA_8x14-2x.woff
new file mode 100644
index 0000000..77b7fef
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_EGA_8x14-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_EGA_8x14.woff b/web/static/fonts/Web437_IBM_EGA_8x14.woff
new file mode 100644
index 0000000..84efc99
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_EGA_8x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_EGA_8x8-2x.woff b/web/static/fonts/Web437_IBM_EGA_8x8-2x.woff
new file mode 100644
index 0000000..63de4fb
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_EGA_8x8-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_EGA_8x8.woff b/web/static/fonts/Web437_IBM_EGA_8x8.woff
new file mode 100644
index 0000000..35506d2
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_EGA_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_EGA_9x14-2x.woff b/web/static/fonts/Web437_IBM_EGA_9x14-2x.woff
new file mode 100644
index 0000000..c301231
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_EGA_9x14-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_EGA_9x14.woff b/web/static/fonts/Web437_IBM_EGA_9x14.woff
new file mode 100644
index 0000000..e70ffa2
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_EGA_9x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_EGA_9x8-2x.woff b/web/static/fonts/Web437_IBM_EGA_9x8-2x.woff
new file mode 100644
index 0000000..05a30bd
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_EGA_9x8-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_EGA_9x8.woff b/web/static/fonts/Web437_IBM_EGA_9x8.woff
new file mode 100644
index 0000000..1e77b7e
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_EGA_9x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_MDA.woff b/web/static/fonts/Web437_IBM_MDA.woff
new file mode 100644
index 0000000..677f562
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_MDA.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_Model30r0-2x.woff b/web/static/fonts/Web437_IBM_Model30r0-2x.woff
new file mode 100644
index 0000000..1d5c9db
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_Model30r0-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_Model30r0.woff b/web/static/fonts/Web437_IBM_Model30r0.woff
new file mode 100644
index 0000000..0756047
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_Model30r0.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_Model3x_Alt1.woff b/web/static/fonts/Web437_IBM_Model3x_Alt1.woff
new file mode 100644
index 0000000..de87cb1
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_Model3x_Alt1.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_Model3x_Alt2.woff b/web/static/fonts/Web437_IBM_Model3x_Alt2.woff
new file mode 100644
index 0000000..b088d34
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_Model3x_Alt2.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_Model3x_Alt3.woff b/web/static/fonts/Web437_IBM_Model3x_Alt3.woff
new file mode 100644
index 0000000..6f647d0
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_Model3x_Alt3.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_Model3x_Alt4.woff b/web/static/fonts/Web437_IBM_Model3x_Alt4.woff
new file mode 100644
index 0000000..26b82bc
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_Model3x_Alt4.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_PGC-2x.woff b/web/static/fonts/Web437_IBM_PGC-2x.woff
new file mode 100644
index 0000000..e0b4aaa
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_PGC-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_PGC.woff b/web/static/fonts/Web437_IBM_PGC.woff
new file mode 100644
index 0000000..23a07a1
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_PGC.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_PS-55_re.woff b/web/static/fonts/Web437_IBM_PS-55_re.woff
new file mode 100644
index 0000000..09cfd77
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_PS-55_re.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_VGA_8x14-2x.woff b/web/static/fonts/Web437_IBM_VGA_8x14-2x.woff
new file mode 100644
index 0000000..60529c8
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_VGA_8x14-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_VGA_8x14.woff b/web/static/fonts/Web437_IBM_VGA_8x14.woff
new file mode 100644
index 0000000..79c2b66
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_VGA_8x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_VGA_8x16-2x.woff b/web/static/fonts/Web437_IBM_VGA_8x16-2x.woff
new file mode 100644
index 0000000..894dc88
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_VGA_8x16-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_VGA_8x16.woff b/web/static/fonts/Web437_IBM_VGA_8x16.woff
new file mode 100644
index 0000000..1f1508d
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_VGA_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_VGA_9x14-2x.woff b/web/static/fonts/Web437_IBM_VGA_9x14-2x.woff
new file mode 100644
index 0000000..1b1184f
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_VGA_9x14-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_VGA_9x14.woff b/web/static/fonts/Web437_IBM_VGA_9x14.woff
new file mode 100644
index 0000000..3cea8b2
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_VGA_9x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_VGA_9x16-2x.woff b/web/static/fonts/Web437_IBM_VGA_9x16-2x.woff
new file mode 100644
index 0000000..34cdcf8
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_VGA_9x16-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_VGA_9x16.woff b/web/static/fonts/Web437_IBM_VGA_9x16.woff
new file mode 100644
index 0000000..8ff3510
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_VGA_9x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_VGA_9x8-2x.woff b/web/static/fonts/Web437_IBM_VGA_9x8-2x.woff
new file mode 100644
index 0000000..0a5b0c2
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_VGA_9x8-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_VGA_9x8.woff b/web/static/fonts/Web437_IBM_VGA_9x8.woff
new file mode 100644
index 0000000..a79352d
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_VGA_9x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_XGA-AI_12x20.woff b/web/static/fonts/Web437_IBM_XGA-AI_12x20.woff
new file mode 100644
index 0000000..dab7e96
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_XGA-AI_12x20.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_XGA-AI_12x23.woff b/web/static/fonts/Web437_IBM_XGA-AI_12x23.woff
new file mode 100644
index 0000000..d9e764d
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_XGA-AI_12x23.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IBM_XGA-AI_7x15.woff b/web/static/fonts/Web437_IBM_XGA-AI_7x15.woff
new file mode 100644
index 0000000..6faa01f
--- /dev/null
+++ b/web/static/fonts/Web437_IBM_XGA-AI_7x15.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IGS_VGA_8x16.woff b/web/static/fonts/Web437_IGS_VGA_8x16.woff
new file mode 100644
index 0000000..6e0104b
--- /dev/null
+++ b/web/static/fonts/Web437_IGS_VGA_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_IGS_VGA_9x16.woff b/web/static/fonts/Web437_IGS_VGA_9x16.woff
new file mode 100644
index 0000000..8521543
--- /dev/null
+++ b/web/static/fonts/Web437_IGS_VGA_9x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ITT_Xtra-2y.woff b/web/static/fonts/Web437_ITT_Xtra-2y.woff
new file mode 100644
index 0000000..af66678
--- /dev/null
+++ b/web/static/fonts/Web437_ITT_Xtra-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ITT_Xtra.woff b/web/static/fonts/Web437_ITT_Xtra.woff
new file mode 100644
index 0000000..37e10f6
--- /dev/null
+++ b/web/static/fonts/Web437_ITT_Xtra.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Kaypro2K_G-2y.woff b/web/static/fonts/Web437_Kaypro2K_G-2y.woff
new file mode 100644
index 0000000..9e5b7aa
--- /dev/null
+++ b/web/static/fonts/Web437_Kaypro2K_G-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Kaypro2K_G.woff b/web/static/fonts/Web437_Kaypro2K_G.woff
new file mode 100644
index 0000000..de7a0e9
--- /dev/null
+++ b/web/static/fonts/Web437_Kaypro2K_G.woff
Binary files differ
diff --git a/web/static/fonts/Web437_LE_Model_D_CGA-2y.woff b/web/static/fonts/Web437_LE_Model_D_CGA-2y.woff
new file mode 100644
index 0000000..a34026e
--- /dev/null
+++ b/web/static/fonts/Web437_LE_Model_D_CGA-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_LE_Model_D_CGA.woff b/web/static/fonts/Web437_LE_Model_D_CGA.woff
new file mode 100644
index 0000000..6d7e05a
--- /dev/null
+++ b/web/static/fonts/Web437_LE_Model_D_CGA.woff
Binary files differ
diff --git a/web/static/fonts/Web437_LE_Model_D_Mono.woff b/web/static/fonts/Web437_LE_Model_D_Mono.woff
new file mode 100644
index 0000000..a464a1d
--- /dev/null
+++ b/web/static/fonts/Web437_LE_Model_D_Mono.woff
Binary files differ
diff --git a/web/static/fonts/Web437_MBytePC230_8x16.woff b/web/static/fonts/Web437_MBytePC230_8x16.woff
new file mode 100644
index 0000000..14ed558
--- /dev/null
+++ b/web/static/fonts/Web437_MBytePC230_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_MBytePC230_CGA-2y.woff b/web/static/fonts/Web437_MBytePC230_CGA-2y.woff
new file mode 100644
index 0000000..ba95952
--- /dev/null
+++ b/web/static/fonts/Web437_MBytePC230_CGA-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_MBytePC230_CGA.woff b/web/static/fonts/Web437_MBytePC230_CGA.woff
new file mode 100644
index 0000000..a5cc805
--- /dev/null
+++ b/web/static/fonts/Web437_MBytePC230_CGA.woff
Binary files differ
diff --git a/web/static/fonts/Web437_MBytePC230_EGA.woff b/web/static/fonts/Web437_MBytePC230_EGA.woff
new file mode 100644
index 0000000..c896ad5
--- /dev/null
+++ b/web/static/fonts/Web437_MBytePC230_EGA.woff
Binary files differ
diff --git a/web/static/fonts/Web437_MBytePC230_Mono.woff b/web/static/fonts/Web437_MBytePC230_Mono.woff
new file mode 100644
index 0000000..6d9ea1e
--- /dev/null
+++ b/web/static/fonts/Web437_MBytePC230_Mono.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Master_512-2y.woff b/web/static/fonts/Web437_Master_512-2y.woff
new file mode 100644
index 0000000..0622dde
--- /dev/null
+++ b/web/static/fonts/Web437_Master_512-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Master_512-2y_bold.woff b/web/static/fonts/Web437_Master_512-2y_bold.woff
new file mode 100644
index 0000000..3c75008
--- /dev/null
+++ b/web/static/fonts/Web437_Master_512-2y_bold.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Master_512-M7.woff b/web/static/fonts/Web437_Master_512-M7.woff
new file mode 100644
index 0000000..750bb88
--- /dev/null
+++ b/web/static/fonts/Web437_Master_512-M7.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Master_512-M7_bold.woff b/web/static/fonts/Web437_Master_512-M7_bold.woff
new file mode 100644
index 0000000..74e54fe
--- /dev/null
+++ b/web/static/fonts/Web437_Master_512-M7_bold.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Master_512.woff b/web/static/fonts/Web437_Master_512.woff
new file mode 100644
index 0000000..e37dd6f
--- /dev/null
+++ b/web/static/fonts/Web437_Master_512.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Master_512_bold.woff b/web/static/fonts/Web437_Master_512_bold.woff
new file mode 100644
index 0000000..d3be3bc
--- /dev/null
+++ b/web/static/fonts/Web437_Master_512_bold.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Mindset-2x.woff b/web/static/fonts/Web437_Mindset-2x.woff
new file mode 100644
index 0000000..792b938
--- /dev/null
+++ b/web/static/fonts/Web437_Mindset-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Mindset-2y.woff b/web/static/fonts/Web437_Mindset-2y.woff
new file mode 100644
index 0000000..7536e50
--- /dev/null
+++ b/web/static/fonts/Web437_Mindset-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Mindset.woff b/web/static/fonts/Web437_Mindset.woff
new file mode 100644
index 0000000..8401df9
--- /dev/null
+++ b/web/static/fonts/Web437_Mindset.woff
Binary files differ
diff --git a/web/static/fonts/Web437_NEC_APC3_8x16-2x.woff b/web/static/fonts/Web437_NEC_APC3_8x16-2x.woff
new file mode 100644
index 0000000..a6977d8
--- /dev/null
+++ b/web/static/fonts/Web437_NEC_APC3_8x16-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_NEC_APC3_8x16.woff b/web/static/fonts/Web437_NEC_APC3_8x16.woff
new file mode 100644
index 0000000..cb06dd7
--- /dev/null
+++ b/web/static/fonts/Web437_NEC_APC3_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_NEC_APC3_8x8-2y.woff b/web/static/fonts/Web437_NEC_APC3_8x8-2y.woff
new file mode 100644
index 0000000..8efe53a
--- /dev/null
+++ b/web/static/fonts/Web437_NEC_APC3_8x8-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_NEC_APC3_8x8.woff b/web/static/fonts/Web437_NEC_APC3_8x8.woff
new file mode 100644
index 0000000..06728ce
--- /dev/null
+++ b/web/static/fonts/Web437_NEC_APC3_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_NEC_MultiSpeed-2x.woff b/web/static/fonts/Web437_NEC_MultiSpeed-2x.woff
new file mode 100644
index 0000000..69d4399
--- /dev/null
+++ b/web/static/fonts/Web437_NEC_MultiSpeed-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_NEC_MultiSpeed-2x_bold.woff b/web/static/fonts/Web437_NEC_MultiSpeed-2x_bold.woff
new file mode 100644
index 0000000..16688dd
--- /dev/null
+++ b/web/static/fonts/Web437_NEC_MultiSpeed-2x_bold.woff
Binary files differ
diff --git a/web/static/fonts/Web437_NEC_MultiSpeed.woff b/web/static/fonts/Web437_NEC_MultiSpeed.woff
new file mode 100644
index 0000000..8028efd
--- /dev/null
+++ b/web/static/fonts/Web437_NEC_MultiSpeed.woff
Binary files differ
diff --git a/web/static/fonts/Web437_NEC_MultiSpeed_bold.woff b/web/static/fonts/Web437_NEC_MultiSpeed_bold.woff
new file mode 100644
index 0000000..38e0287
--- /dev/null
+++ b/web/static/fonts/Web437_NEC_MultiSpeed_bold.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Nix8810_M15.woff b/web/static/fonts/Web437_Nix8810_M15.woff
new file mode 100644
index 0000000..b452fbf
--- /dev/null
+++ b/web/static/fonts/Web437_Nix8810_M15.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Nix8810_M16.woff b/web/static/fonts/Web437_Nix8810_M16.woff
new file mode 100644
index 0000000..45f2b56
--- /dev/null
+++ b/web/static/fonts/Web437_Nix8810_M16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Nix8810_M35-2y.woff b/web/static/fonts/Web437_Nix8810_M35-2y.woff
new file mode 100644
index 0000000..2c564f3
--- /dev/null
+++ b/web/static/fonts/Web437_Nix8810_M35-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Nix8810_M35.woff b/web/static/fonts/Web437_Nix8810_M35.woff
new file mode 100644
index 0000000..433bac3
--- /dev/null
+++ b/web/static/fonts/Web437_Nix8810_M35.woff
Binary files differ
diff --git a/web/static/fonts/Web437_OlivettiThin_8x14.woff b/web/static/fonts/Web437_OlivettiThin_8x14.woff
new file mode 100644
index 0000000..96a3803
--- /dev/null
+++ b/web/static/fonts/Web437_OlivettiThin_8x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_OlivettiThin_8x16.woff b/web/static/fonts/Web437_OlivettiThin_8x16.woff
new file mode 100644
index 0000000..9a6c9d7
--- /dev/null
+++ b/web/static/fonts/Web437_OlivettiThin_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_OlivettiThin_9x14.woff b/web/static/fonts/Web437_OlivettiThin_9x14.woff
new file mode 100644
index 0000000..b43b457
--- /dev/null
+++ b/web/static/fonts/Web437_OlivettiThin_9x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_OlivettiThin_9x16.woff b/web/static/fonts/Web437_OlivettiThin_9x16.woff
new file mode 100644
index 0000000..8686839
--- /dev/null
+++ b/web/static/fonts/Web437_OlivettiThin_9x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Olivetti_M15-2y.woff b/web/static/fonts/Web437_Olivetti_M15-2y.woff
new file mode 100644
index 0000000..41b83b2
--- /dev/null
+++ b/web/static/fonts/Web437_Olivetti_M15-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Olivetti_M15.woff b/web/static/fonts/Web437_Olivetti_M15.woff
new file mode 100644
index 0000000..212a1a8
--- /dev/null
+++ b/web/static/fonts/Web437_Olivetti_M15.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Paradise132_7x16.woff b/web/static/fonts/Web437_Paradise132_7x16.woff
new file mode 100644
index 0000000..2470eed
--- /dev/null
+++ b/web/static/fonts/Web437_Paradise132_7x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Paradise132_7x9.woff b/web/static/fonts/Web437_Paradise132_7x9.woff
new file mode 100644
index 0000000..3c6c103
--- /dev/null
+++ b/web/static/fonts/Web437_Paradise132_7x9.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Philips_YES_G-2x.woff b/web/static/fonts/Web437_Philips_YES_G-2x.woff
new file mode 100644
index 0000000..ca1e9df
--- /dev/null
+++ b/web/static/fonts/Web437_Philips_YES_G-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Philips_YES_G-2y.woff b/web/static/fonts/Web437_Philips_YES_G-2y.woff
new file mode 100644
index 0000000..d6c2808
--- /dev/null
+++ b/web/static/fonts/Web437_Philips_YES_G-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Philips_YES_G.woff b/web/static/fonts/Web437_Philips_YES_G.woff
new file mode 100644
index 0000000..09a7767
--- /dev/null
+++ b/web/static/fonts/Web437_Philips_YES_G.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Philips_YES_T-2y.woff b/web/static/fonts/Web437_Philips_YES_T-2y.woff
new file mode 100644
index 0000000..ecba3fd
--- /dev/null
+++ b/web/static/fonts/Web437_Philips_YES_T-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Philips_YES_T.woff b/web/static/fonts/Web437_Philips_YES_T.woff
new file mode 100644
index 0000000..fdc0c83
--- /dev/null
+++ b/web/static/fonts/Web437_Philips_YES_T.woff
Binary files differ
diff --git a/web/static/fonts/Web437_PhoenixEGA_8x14.woff b/web/static/fonts/Web437_PhoenixEGA_8x14.woff
new file mode 100644
index 0000000..56bf74c
--- /dev/null
+++ b/web/static/fonts/Web437_PhoenixEGA_8x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_PhoenixEGA_8x16.woff b/web/static/fonts/Web437_PhoenixEGA_8x16.woff
new file mode 100644
index 0000000..6ff3f0c
--- /dev/null
+++ b/web/static/fonts/Web437_PhoenixEGA_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_PhoenixEGA_8x8-2y.woff b/web/static/fonts/Web437_PhoenixEGA_8x8-2y.woff
new file mode 100644
index 0000000..8bb59df
--- /dev/null
+++ b/web/static/fonts/Web437_PhoenixEGA_8x8-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_PhoenixEGA_8x8.woff b/web/static/fonts/Web437_PhoenixEGA_8x8.woff
new file mode 100644
index 0000000..9609a47
--- /dev/null
+++ b/web/static/fonts/Web437_PhoenixEGA_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_PhoenixEGA_9x14.woff b/web/static/fonts/Web437_PhoenixEGA_9x14.woff
new file mode 100644
index 0000000..1222a9d
--- /dev/null
+++ b/web/static/fonts/Web437_PhoenixEGA_9x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_PhoenixVGA_8x14.woff b/web/static/fonts/Web437_PhoenixVGA_8x14.woff
new file mode 100644
index 0000000..5ac2522
--- /dev/null
+++ b/web/static/fonts/Web437_PhoenixVGA_8x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_PhoenixVGA_8x16.woff b/web/static/fonts/Web437_PhoenixVGA_8x16.woff
new file mode 100644
index 0000000..9ac9959
--- /dev/null
+++ b/web/static/fonts/Web437_PhoenixVGA_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_PhoenixVGA_8x8.woff b/web/static/fonts/Web437_PhoenixVGA_8x8.woff
new file mode 100644
index 0000000..80bef7d
--- /dev/null
+++ b/web/static/fonts/Web437_PhoenixVGA_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_PhoenixVGA_9x14.woff b/web/static/fonts/Web437_PhoenixVGA_9x14.woff
new file mode 100644
index 0000000..0aaf954
--- /dev/null
+++ b/web/static/fonts/Web437_PhoenixVGA_9x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_PhoenixVGA_9x16.woff b/web/static/fonts/Web437_PhoenixVGA_9x16.woff
new file mode 100644
index 0000000..644d6fb
--- /dev/null
+++ b/web/static/fonts/Web437_PhoenixVGA_9x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_PhoenixVGA_9x8.woff b/web/static/fonts/Web437_PhoenixVGA_9x8.woff
new file mode 100644
index 0000000..0d85e6d
--- /dev/null
+++ b/web/static/fonts/Web437_PhoenixVGA_9x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Phoenix_BIOS-2y.woff b/web/static/fonts/Web437_Phoenix_BIOS-2y.woff
new file mode 100644
index 0000000..e849ae8
--- /dev/null
+++ b/web/static/fonts/Web437_Phoenix_BIOS-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Phoenix_BIOS.woff b/web/static/fonts/Web437_Phoenix_BIOS.woff
new file mode 100644
index 0000000..75a0b5e
--- /dev/null
+++ b/web/static/fonts/Web437_Phoenix_BIOS.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Portfolio_6x8.woff b/web/static/fonts/Web437_Portfolio_6x8.woff
new file mode 100644
index 0000000..6f39add
--- /dev/null
+++ b/web/static/fonts/Web437_Portfolio_6x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_RM_Nimbus-2y.woff b/web/static/fonts/Web437_RM_Nimbus-2y.woff
new file mode 100644
index 0000000..e6f5173
--- /dev/null
+++ b/web/static/fonts/Web437_RM_Nimbus-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_RM_Nimbus.woff b/web/static/fonts/Web437_RM_Nimbus.woff
new file mode 100644
index 0000000..12aac90
--- /dev/null
+++ b/web/static/fonts/Web437_RM_Nimbus.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Rainbow100_re_132.woff b/web/static/fonts/Web437_Rainbow100_re_132.woff
new file mode 100644
index 0000000..43de2a2
--- /dev/null
+++ b/web/static/fonts/Web437_Rainbow100_re_132.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Rainbow100_re_40.woff b/web/static/fonts/Web437_Rainbow100_re_40.woff
new file mode 100644
index 0000000..e7203cf
--- /dev/null
+++ b/web/static/fonts/Web437_Rainbow100_re_40.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Rainbow100_re_66.woff b/web/static/fonts/Web437_Rainbow100_re_66.woff
new file mode 100644
index 0000000..b1d0884
--- /dev/null
+++ b/web/static/fonts/Web437_Rainbow100_re_66.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Rainbow100_re_80.woff b/web/static/fonts/Web437_Rainbow100_re_80.woff
new file mode 100644
index 0000000..19b6dbb
--- /dev/null
+++ b/web/static/fonts/Web437_Rainbow100_re_80.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Robotron_A7100.woff b/web/static/fonts/Web437_Robotron_A7100.woff
new file mode 100644
index 0000000..03e311d
--- /dev/null
+++ b/web/static/fonts/Web437_Robotron_A7100.woff
Binary files differ
diff --git a/web/static/fonts/Web437_STB_AutoEGA_8x14.woff b/web/static/fonts/Web437_STB_AutoEGA_8x14.woff
new file mode 100644
index 0000000..7f88003
--- /dev/null
+++ b/web/static/fonts/Web437_STB_AutoEGA_8x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_STB_AutoEGA_9x14.woff b/web/static/fonts/Web437_STB_AutoEGA_9x14.woff
new file mode 100644
index 0000000..5b51b23
--- /dev/null
+++ b/web/static/fonts/Web437_STB_AutoEGA_9x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_SanyoMBC16-2y.woff b/web/static/fonts/Web437_SanyoMBC16-2y.woff
new file mode 100644
index 0000000..9da6d1e
--- /dev/null
+++ b/web/static/fonts/Web437_SanyoMBC16-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_SanyoMBC16.woff b/web/static/fonts/Web437_SanyoMBC16.woff
new file mode 100644
index 0000000..966c868
--- /dev/null
+++ b/web/static/fonts/Web437_SanyoMBC16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_SanyoMBC55x-2y.woff b/web/static/fonts/Web437_SanyoMBC55x-2y.woff
new file mode 100644
index 0000000..a3fb0cb
--- /dev/null
+++ b/web/static/fonts/Web437_SanyoMBC55x-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_SanyoMBC55x.woff b/web/static/fonts/Web437_SanyoMBC55x.woff
new file mode 100644
index 0000000..38203b6
--- /dev/null
+++ b/web/static/fonts/Web437_SanyoMBC55x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_SanyoMBC775-2y.woff b/web/static/fonts/Web437_SanyoMBC775-2y.woff
new file mode 100644
index 0000000..39ed8fa
--- /dev/null
+++ b/web/static/fonts/Web437_SanyoMBC775-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_SanyoMBC775.woff b/web/static/fonts/Web437_SanyoMBC775.woff
new file mode 100644
index 0000000..4daa0a8
--- /dev/null
+++ b/web/static/fonts/Web437_SanyoMBC775.woff
Binary files differ
diff --git a/web/static/fonts/Web437_SeequaCm-2y.woff b/web/static/fonts/Web437_SeequaCm-2y.woff
new file mode 100644
index 0000000..d099ecd
--- /dev/null
+++ b/web/static/fonts/Web437_SeequaCm-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_SeequaCm.woff b/web/static/fonts/Web437_SeequaCm.woff
new file mode 100644
index 0000000..e598bc3
--- /dev/null
+++ b/web/static/fonts/Web437_SeequaCm.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Sharp_PC3K-2x.woff b/web/static/fonts/Web437_Sharp_PC3K-2x.woff
new file mode 100644
index 0000000..57e9047
--- /dev/null
+++ b/web/static/fonts/Web437_Sharp_PC3K-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Sharp_PC3K.woff b/web/static/fonts/Web437_Sharp_PC3K.woff
new file mode 100644
index 0000000..8ba5b50
--- /dev/null
+++ b/web/static/fonts/Web437_Sharp_PC3K.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Sharp_PC3K_Alt-2x.woff b/web/static/fonts/Web437_Sharp_PC3K_Alt-2x.woff
new file mode 100644
index 0000000..932d65b
--- /dev/null
+++ b/web/static/fonts/Web437_Sharp_PC3K_Alt-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Sharp_PC3K_Alt.woff b/web/static/fonts/Web437_Sharp_PC3K_Alt.woff
new file mode 100644
index 0000000..32759f1
--- /dev/null
+++ b/web/static/fonts/Web437_Sharp_PC3K_Alt.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Siemens_PC-D.woff b/web/static/fonts/Web437_Siemens_PC-D.woff
new file mode 100644
index 0000000..8865075
--- /dev/null
+++ b/web/static/fonts/Web437_Siemens_PC-D.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Sigma_RM_8x14.woff b/web/static/fonts/Web437_Sigma_RM_8x14.woff
new file mode 100644
index 0000000..626a260
--- /dev/null
+++ b/web/static/fonts/Web437_Sigma_RM_8x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Sigma_RM_8x16.woff b/web/static/fonts/Web437_Sigma_RM_8x16.woff
new file mode 100644
index 0000000..de40fdf
--- /dev/null
+++ b/web/static/fonts/Web437_Sigma_RM_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Sigma_RM_8x8.woff b/web/static/fonts/Web437_Sigma_RM_8x8.woff
new file mode 100644
index 0000000..d87ce1a
--- /dev/null
+++ b/web/static/fonts/Web437_Sigma_RM_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Sigma_RM_9x14.woff b/web/static/fonts/Web437_Sigma_RM_9x14.woff
new file mode 100644
index 0000000..cf7e8c5
--- /dev/null
+++ b/web/static/fonts/Web437_Sigma_RM_9x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Sigma_RM_9x16.woff b/web/static/fonts/Web437_Sigma_RM_9x16.woff
new file mode 100644
index 0000000..83b19c7
--- /dev/null
+++ b/web/static/fonts/Web437_Sigma_RM_9x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Sigma_RM_9x8.woff b/web/static/fonts/Web437_Sigma_RM_9x8.woff
new file mode 100644
index 0000000..10f4346
--- /dev/null
+++ b/web/static/fonts/Web437_Sigma_RM_9x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_SperryPC_8x16.woff b/web/static/fonts/Web437_SperryPC_8x16.woff
new file mode 100644
index 0000000..4b92b23
--- /dev/null
+++ b/web/static/fonts/Web437_SperryPC_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_SperryPC_CGA-2y.woff b/web/static/fonts/Web437_SperryPC_CGA-2y.woff
new file mode 100644
index 0000000..22fd7fb
--- /dev/null
+++ b/web/static/fonts/Web437_SperryPC_CGA-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_SperryPC_CGA.woff b/web/static/fonts/Web437_SperryPC_CGA.woff
new file mode 100644
index 0000000..f3c629d
--- /dev/null
+++ b/web/static/fonts/Web437_SperryPC_CGA.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Tandy1K-II_200L-2x.woff b/web/static/fonts/Web437_Tandy1K-II_200L-2x.woff
new file mode 100644
index 0000000..aa5daa6
--- /dev/null
+++ b/web/static/fonts/Web437_Tandy1K-II_200L-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Tandy1K-II_200L-2y.woff b/web/static/fonts/Web437_Tandy1K-II_200L-2y.woff
new file mode 100644
index 0000000..8b973f6
--- /dev/null
+++ b/web/static/fonts/Web437_Tandy1K-II_200L-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Tandy1K-II_200L.woff b/web/static/fonts/Web437_Tandy1K-II_200L.woff
new file mode 100644
index 0000000..2bc34fa
--- /dev/null
+++ b/web/static/fonts/Web437_Tandy1K-II_200L.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Tandy1K-II_225L-2y.woff b/web/static/fonts/Web437_Tandy1K-II_225L-2y.woff
new file mode 100644
index 0000000..261d4de
--- /dev/null
+++ b/web/static/fonts/Web437_Tandy1K-II_225L-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Tandy1K-II_225L.woff b/web/static/fonts/Web437_Tandy1K-II_225L.woff
new file mode 100644
index 0000000..b7c45f8
--- /dev/null
+++ b/web/static/fonts/Web437_Tandy1K-II_225L.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Tandy1K-II_Mono.woff b/web/static/fonts/Web437_Tandy1K-II_Mono.woff
new file mode 100644
index 0000000..4c11e44
--- /dev/null
+++ b/web/static/fonts/Web437_Tandy1K-II_Mono.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Tandy1K-I_200L-2x.woff b/web/static/fonts/Web437_Tandy1K-I_200L-2x.woff
new file mode 100644
index 0000000..e52ddd0
--- /dev/null
+++ b/web/static/fonts/Web437_Tandy1K-I_200L-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Tandy1K-I_200L-2y.woff b/web/static/fonts/Web437_Tandy1K-I_200L-2y.woff
new file mode 100644
index 0000000..eec2274
--- /dev/null
+++ b/web/static/fonts/Web437_Tandy1K-I_200L-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Tandy1K-I_200L.woff b/web/static/fonts/Web437_Tandy1K-I_200L.woff
new file mode 100644
index 0000000..cdc9196
--- /dev/null
+++ b/web/static/fonts/Web437_Tandy1K-I_200L.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Tandy1K-I_225L-2y.woff b/web/static/fonts/Web437_Tandy1K-I_225L-2y.woff
new file mode 100644
index 0000000..6c8e2c1
--- /dev/null
+++ b/web/static/fonts/Web437_Tandy1K-I_225L-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Tandy1K-I_225L.woff b/web/static/fonts/Web437_Tandy1K-I_225L.woff
new file mode 100644
index 0000000..c7d6dbb
--- /dev/null
+++ b/web/static/fonts/Web437_Tandy1K-I_225L.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Tandy2K-2x.woff b/web/static/fonts/Web437_Tandy2K-2x.woff
new file mode 100644
index 0000000..8b2f99c
--- /dev/null
+++ b/web/static/fonts/Web437_Tandy2K-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Tandy2K.woff b/web/static/fonts/Web437_Tandy2K.woff
new file mode 100644
index 0000000..04634bf
--- /dev/null
+++ b/web/static/fonts/Web437_Tandy2K.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Tandy2K_G-2x.woff b/web/static/fonts/Web437_Tandy2K_G-2x.woff
new file mode 100644
index 0000000..bf62bb3
--- /dev/null
+++ b/web/static/fonts/Web437_Tandy2K_G-2x.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Tandy2K_G-TV.woff b/web/static/fonts/Web437_Tandy2K_G-TV.woff
new file mode 100644
index 0000000..213bc99
--- /dev/null
+++ b/web/static/fonts/Web437_Tandy2K_G-TV.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Tandy2K_G.woff b/web/static/fonts/Web437_Tandy2K_G.woff
new file mode 100644
index 0000000..ec4dd96
--- /dev/null
+++ b/web/static/fonts/Web437_Tandy2K_G.woff
Binary files differ
diff --git a/web/static/fonts/Web437_TelePC-2y.woff b/web/static/fonts/Web437_TelePC-2y.woff
new file mode 100644
index 0000000..3f1da5d
--- /dev/null
+++ b/web/static/fonts/Web437_TelePC-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_TelePC.woff b/web/static/fonts/Web437_TelePC.woff
new file mode 100644
index 0000000..bb25c9c
--- /dev/null
+++ b/web/static/fonts/Web437_TelePC.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Ti_Pro.woff b/web/static/fonts/Web437_Ti_Pro.woff
new file mode 100644
index 0000000..1d8fb0e
--- /dev/null
+++ b/web/static/fonts/Web437_Ti_Pro.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ToshibaSat_8x14.woff b/web/static/fonts/Web437_ToshibaSat_8x14.woff
new file mode 100644
index 0000000..2e05675
--- /dev/null
+++ b/web/static/fonts/Web437_ToshibaSat_8x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ToshibaSat_8x16.woff b/web/static/fonts/Web437_ToshibaSat_8x16.woff
new file mode 100644
index 0000000..99735df
--- /dev/null
+++ b/web/static/fonts/Web437_ToshibaSat_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ToshibaSat_8x8.woff b/web/static/fonts/Web437_ToshibaSat_8x8.woff
new file mode 100644
index 0000000..92e9dc2
--- /dev/null
+++ b/web/static/fonts/Web437_ToshibaSat_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ToshibaSat_9x14.woff b/web/static/fonts/Web437_ToshibaSat_9x14.woff
new file mode 100644
index 0000000..6c6dab6
--- /dev/null
+++ b/web/static/fonts/Web437_ToshibaSat_9x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ToshibaSat_9x16.woff b/web/static/fonts/Web437_ToshibaSat_9x16.woff
new file mode 100644
index 0000000..482da55
--- /dev/null
+++ b/web/static/fonts/Web437_ToshibaSat_9x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ToshibaSat_9x8.woff b/web/static/fonts/Web437_ToshibaSat_9x8.woff
new file mode 100644
index 0000000..1c19f2d
--- /dev/null
+++ b/web/static/fonts/Web437_ToshibaSat_9x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ToshibaT300_8x16.woff b/web/static/fonts/Web437_ToshibaT300_8x16.woff
new file mode 100644
index 0000000..2a93b1f
--- /dev/null
+++ b/web/static/fonts/Web437_ToshibaT300_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ToshibaT300_8x8-2y.woff b/web/static/fonts/Web437_ToshibaT300_8x8-2y.woff
new file mode 100644
index 0000000..c809330
--- /dev/null
+++ b/web/static/fonts/Web437_ToshibaT300_8x8-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ToshibaT300_8x8.woff b/web/static/fonts/Web437_ToshibaT300_8x8.woff
new file mode 100644
index 0000000..3b8d7f1
--- /dev/null
+++ b/web/static/fonts/Web437_ToshibaT300_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ToshibaTxL1_8x16.woff b/web/static/fonts/Web437_ToshibaTxL1_8x16.woff
new file mode 100644
index 0000000..f900627
--- /dev/null
+++ b/web/static/fonts/Web437_ToshibaTxL1_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ToshibaTxL1_8x8.woff b/web/static/fonts/Web437_ToshibaTxL1_8x8.woff
new file mode 100644
index 0000000..cbd7cec
--- /dev/null
+++ b/web/static/fonts/Web437_ToshibaTxL1_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ToshibaTxL2_8x16.woff b/web/static/fonts/Web437_ToshibaTxL2_8x16.woff
new file mode 100644
index 0000000..f7e5c74
--- /dev/null
+++ b/web/static/fonts/Web437_ToshibaTxL2_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_ToshibaTxL2_8x8.woff b/web/static/fonts/Web437_ToshibaTxL2_8x8.woff
new file mode 100644
index 0000000..a472b0b
--- /dev/null
+++ b/web/static/fonts/Web437_ToshibaTxL2_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_TridentEarly_8x11.woff b/web/static/fonts/Web437_TridentEarly_8x11.woff
new file mode 100644
index 0000000..5474176
--- /dev/null
+++ b/web/static/fonts/Web437_TridentEarly_8x11.woff
Binary files differ
diff --git a/web/static/fonts/Web437_TridentEarly_8x14.woff b/web/static/fonts/Web437_TridentEarly_8x14.woff
new file mode 100644
index 0000000..97daa2e
--- /dev/null
+++ b/web/static/fonts/Web437_TridentEarly_8x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_TridentEarly_8x16.woff b/web/static/fonts/Web437_TridentEarly_8x16.woff
new file mode 100644
index 0000000..5e71f0e
--- /dev/null
+++ b/web/static/fonts/Web437_TridentEarly_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_TridentEarly_8x8.woff b/web/static/fonts/Web437_TridentEarly_8x8.woff
new file mode 100644
index 0000000..e116dd3
--- /dev/null
+++ b/web/static/fonts/Web437_TridentEarly_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_TridentEarly_9x14.woff b/web/static/fonts/Web437_TridentEarly_9x14.woff
new file mode 100644
index 0000000..293de0a
--- /dev/null
+++ b/web/static/fonts/Web437_TridentEarly_9x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_TridentEarly_9x16.woff b/web/static/fonts/Web437_TridentEarly_9x16.woff
new file mode 100644
index 0000000..37d82a0
--- /dev/null
+++ b/web/static/fonts/Web437_TridentEarly_9x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_TridentEarly_9x8.woff b/web/static/fonts/Web437_TridentEarly_9x8.woff
new file mode 100644
index 0000000..3ff88db
--- /dev/null
+++ b/web/static/fonts/Web437_TridentEarly_9x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Trident_8x11.woff b/web/static/fonts/Web437_Trident_8x11.woff
new file mode 100644
index 0000000..d5d52b1
--- /dev/null
+++ b/web/static/fonts/Web437_Trident_8x11.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Trident_8x14.woff b/web/static/fonts/Web437_Trident_8x14.woff
new file mode 100644
index 0000000..98576fa
--- /dev/null
+++ b/web/static/fonts/Web437_Trident_8x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Trident_8x16.woff b/web/static/fonts/Web437_Trident_8x16.woff
new file mode 100644
index 0000000..708258c
--- /dev/null
+++ b/web/static/fonts/Web437_Trident_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Trident_8x8.woff b/web/static/fonts/Web437_Trident_8x8.woff
new file mode 100644
index 0000000..8a7a2bd
--- /dev/null
+++ b/web/static/fonts/Web437_Trident_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Trident_9x14.woff b/web/static/fonts/Web437_Trident_9x14.woff
new file mode 100644
index 0000000..3446e73
--- /dev/null
+++ b/web/static/fonts/Web437_Trident_9x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Trident_9x16.woff b/web/static/fonts/Web437_Trident_9x16.woff
new file mode 100644
index 0000000..da3a894
--- /dev/null
+++ b/web/static/fonts/Web437_Trident_9x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Trident_9x8.woff b/web/static/fonts/Web437_Trident_9x8.woff
new file mode 100644
index 0000000..adb4b74
--- /dev/null
+++ b/web/static/fonts/Web437_Trident_9x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_TsengEVA_132_6x14.woff b/web/static/fonts/Web437_TsengEVA_132_6x14.woff
new file mode 100644
index 0000000..c90423a
--- /dev/null
+++ b/web/static/fonts/Web437_TsengEVA_132_6x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_TsengEVA_132_6x8.woff b/web/static/fonts/Web437_TsengEVA_132_6x8.woff
new file mode 100644
index 0000000..6042cf1
--- /dev/null
+++ b/web/static/fonts/Web437_TsengEVA_132_6x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_VTech_BIOS-2y.woff b/web/static/fonts/Web437_VTech_BIOS-2y.woff
new file mode 100644
index 0000000..3207a4d
--- /dev/null
+++ b/web/static/fonts/Web437_VTech_BIOS-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_VTech_BIOS.woff b/web/static/fonts/Web437_VTech_BIOS.woff
new file mode 100644
index 0000000..7585b4e
--- /dev/null
+++ b/web/static/fonts/Web437_VTech_BIOS.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Verite_8x14.woff b/web/static/fonts/Web437_Verite_8x14.woff
new file mode 100644
index 0000000..a02281a
--- /dev/null
+++ b/web/static/fonts/Web437_Verite_8x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Verite_8x16.woff b/web/static/fonts/Web437_Verite_8x16.woff
new file mode 100644
index 0000000..00424a9
--- /dev/null
+++ b/web/static/fonts/Web437_Verite_8x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Verite_8x8-2y.woff b/web/static/fonts/Web437_Verite_8x8-2y.woff
new file mode 100644
index 0000000..316c481
--- /dev/null
+++ b/web/static/fonts/Web437_Verite_8x8-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Verite_8x8.woff b/web/static/fonts/Web437_Verite_8x8.woff
new file mode 100644
index 0000000..e6a3f67
--- /dev/null
+++ b/web/static/fonts/Web437_Verite_8x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Verite_9x14.woff b/web/static/fonts/Web437_Verite_9x14.woff
new file mode 100644
index 0000000..3c4c0bb
--- /dev/null
+++ b/web/static/fonts/Web437_Verite_9x14.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Verite_9x16.woff b/web/static/fonts/Web437_Verite_9x16.woff
new file mode 100644
index 0000000..c9da6f7
--- /dev/null
+++ b/web/static/fonts/Web437_Verite_9x16.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Verite_9x8.woff b/web/static/fonts/Web437_Verite_9x8.woff
new file mode 100644
index 0000000..ae2181c
--- /dev/null
+++ b/web/static/fonts/Web437_Verite_9x8.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Wang_Pro_Color-2y.woff b/web/static/fonts/Web437_Wang_Pro_Color-2y.woff
new file mode 100644
index 0000000..b3306bd
--- /dev/null
+++ b/web/static/fonts/Web437_Wang_Pro_Color-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Wang_Pro_Color.woff b/web/static/fonts/Web437_Wang_Pro_Color.woff
new file mode 100644
index 0000000..500f461
--- /dev/null
+++ b/web/static/fonts/Web437_Wang_Pro_Color.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Wang_Pro_Mono.woff b/web/static/fonts/Web437_Wang_Pro_Mono.woff
new file mode 100644
index 0000000..3e9162d
--- /dev/null
+++ b/web/static/fonts/Web437_Wang_Pro_Mono.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Wyse700a-2y.woff b/web/static/fonts/Web437_Wyse700a-2y.woff
new file mode 100644
index 0000000..8bf060d
--- /dev/null
+++ b/web/static/fonts/Web437_Wyse700a-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Wyse700a.woff b/web/static/fonts/Web437_Wyse700a.woff
new file mode 100644
index 0000000..e1a8e6c
--- /dev/null
+++ b/web/static/fonts/Web437_Wyse700a.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Wyse700b-2y.woff b/web/static/fonts/Web437_Wyse700b-2y.woff
new file mode 100644
index 0000000..9003597
--- /dev/null
+++ b/web/static/fonts/Web437_Wyse700b-2y.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Wyse700b.woff b/web/static/fonts/Web437_Wyse700b.woff
new file mode 100644
index 0000000..d3ae560
--- /dev/null
+++ b/web/static/fonts/Web437_Wyse700b.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Zenith_Z-100.woff b/web/static/fonts/Web437_Zenith_Z-100.woff
new file mode 100644
index 0000000..4fd99a2
--- /dev/null
+++ b/web/static/fonts/Web437_Zenith_Z-100.woff
Binary files differ
diff --git a/web/static/fonts/Web437_Zenith_Z-100_Alt.woff b/web/static/fonts/Web437_Zenith_Z-100_Alt.woff
new file mode 100644
index 0000000..21f8c33
--- /dev/null
+++ b/web/static/fonts/Web437_Zenith_Z-100_Alt.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_AST_PremiumExec.woff b/web/static/fonts/WebPlus_AST_PremiumExec.woff
new file mode 100644
index 0000000..ea95d23
--- /dev/null
+++ b/web/static/fonts/WebPlus_AST_PremiumExec.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_Amstrad_PC-2y.woff b/web/static/fonts/WebPlus_Amstrad_PC-2y.woff
new file mode 100644
index 0000000..f0af92f
--- /dev/null
+++ b/web/static/fonts/WebPlus_Amstrad_PC-2y.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_Amstrad_PC.woff b/web/static/fonts/WebPlus_Amstrad_PC.woff
new file mode 100644
index 0000000..a89bd9c
--- /dev/null
+++ b/web/static/fonts/WebPlus_Amstrad_PC.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_Cordata_PPC-21.woff b/web/static/fonts/WebPlus_Cordata_PPC-21.woff
new file mode 100644
index 0000000..486cbb9
--- /dev/null
+++ b/web/static/fonts/WebPlus_Cordata_PPC-21.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_Cordata_PPC-400.woff b/web/static/fonts/WebPlus_Cordata_PPC-400.woff
new file mode 100644
index 0000000..b36d384
--- /dev/null
+++ b/web/static/fonts/WebPlus_Cordata_PPC-400.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_HP_100LX_10x11.woff b/web/static/fonts/WebPlus_HP_100LX_10x11.woff
new file mode 100644
index 0000000..be23ce0
--- /dev/null
+++ b/web/static/fonts/WebPlus_HP_100LX_10x11.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_HP_100LX_16x12.woff b/web/static/fonts/WebPlus_HP_100LX_16x12.woff
new file mode 100644
index 0000000..58c37c7
--- /dev/null
+++ b/web/static/fonts/WebPlus_HP_100LX_16x12.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_HP_100LX_6x8-2x.woff b/web/static/fonts/WebPlus_HP_100LX_6x8-2x.woff
new file mode 100644
index 0000000..0e12806
--- /dev/null
+++ b/web/static/fonts/WebPlus_HP_100LX_6x8-2x.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_HP_100LX_6x8.woff b/web/static/fonts/WebPlus_HP_100LX_6x8.woff
new file mode 100644
index 0000000..d259282
--- /dev/null
+++ b/web/static/fonts/WebPlus_HP_100LX_6x8.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_HP_100LX_8x8-2x.woff b/web/static/fonts/WebPlus_HP_100LX_8x8-2x.woff
new file mode 100644
index 0000000..8258270
--- /dev/null
+++ b/web/static/fonts/WebPlus_HP_100LX_8x8-2x.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_HP_100LX_8x8.woff b/web/static/fonts/WebPlus_HP_100LX_8x8.woff
new file mode 100644
index 0000000..f2dca01
--- /dev/null
+++ b/web/static/fonts/WebPlus_HP_100LX_8x8.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_HP_150_re.woff b/web/static/fonts/WebPlus_HP_150_re.woff
new file mode 100644
index 0000000..dc2ec33
--- /dev/null
+++ b/web/static/fonts/WebPlus_HP_150_re.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_BIOS-2x.woff b/web/static/fonts/WebPlus_IBM_BIOS-2x.woff
new file mode 100644
index 0000000..ffce1c5
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_BIOS-2x.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_BIOS-2y.woff b/web/static/fonts/WebPlus_IBM_BIOS-2y.woff
new file mode 100644
index 0000000..c46cbd1
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_BIOS-2y.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_BIOS.woff b/web/static/fonts/WebPlus_IBM_BIOS.woff
new file mode 100644
index 0000000..a519221
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_BIOS.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_CGA-2y.woff b/web/static/fonts/WebPlus_IBM_CGA-2y.woff
new file mode 100644
index 0000000..6998020
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_CGA-2y.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_CGA.woff b/web/static/fonts/WebPlus_IBM_CGA.woff
new file mode 100644
index 0000000..a76d503
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_CGA.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_CGAthin-2y.woff b/web/static/fonts/WebPlus_IBM_CGAthin-2y.woff
new file mode 100644
index 0000000..92df543
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_CGAthin-2y.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_CGAthin.woff b/web/static/fonts/WebPlus_IBM_CGAthin.woff
new file mode 100644
index 0000000..cf5ebf6
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_CGAthin.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_EGA_8x14-2x.woff b/web/static/fonts/WebPlus_IBM_EGA_8x14-2x.woff
new file mode 100644
index 0000000..b7808fd
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_EGA_8x14-2x.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_EGA_8x14.woff b/web/static/fonts/WebPlus_IBM_EGA_8x14.woff
new file mode 100644
index 0000000..9bc7e08
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_EGA_8x14.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_EGA_8x8-2x.woff b/web/static/fonts/WebPlus_IBM_EGA_8x8-2x.woff
new file mode 100644
index 0000000..3013cec
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_EGA_8x8-2x.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_EGA_8x8.woff b/web/static/fonts/WebPlus_IBM_EGA_8x8.woff
new file mode 100644
index 0000000..bb39e9f
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_EGA_8x8.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_EGA_9x14-2x.woff b/web/static/fonts/WebPlus_IBM_EGA_9x14-2x.woff
new file mode 100644
index 0000000..6e25b86
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_EGA_9x14-2x.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_EGA_9x14.woff b/web/static/fonts/WebPlus_IBM_EGA_9x14.woff
new file mode 100644
index 0000000..9d81c45
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_EGA_9x14.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_EGA_9x8-2x.woff b/web/static/fonts/WebPlus_IBM_EGA_9x8-2x.woff
new file mode 100644
index 0000000..46885b2
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_EGA_9x8-2x.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_EGA_9x8.woff b/web/static/fonts/WebPlus_IBM_EGA_9x8.woff
new file mode 100644
index 0000000..0077442
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_EGA_9x8.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_MDA.woff b/web/static/fonts/WebPlus_IBM_MDA.woff
new file mode 100644
index 0000000..45639b5
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_MDA.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_VGA_8x14-2x.woff b/web/static/fonts/WebPlus_IBM_VGA_8x14-2x.woff
new file mode 100644
index 0000000..47cffd4
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_VGA_8x14-2x.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_VGA_8x14.woff b/web/static/fonts/WebPlus_IBM_VGA_8x14.woff
new file mode 100644
index 0000000..d1ee1c9
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_VGA_8x14.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_VGA_8x16-2x.woff b/web/static/fonts/WebPlus_IBM_VGA_8x16-2x.woff
new file mode 100644
index 0000000..a589f63
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_VGA_8x16-2x.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_VGA_8x16.woff b/web/static/fonts/WebPlus_IBM_VGA_8x16.woff
new file mode 100644
index 0000000..466064d
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_VGA_8x16.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_VGA_9x14-2x.woff b/web/static/fonts/WebPlus_IBM_VGA_9x14-2x.woff
new file mode 100644
index 0000000..8746fdc
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_VGA_9x14-2x.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_VGA_9x14.woff b/web/static/fonts/WebPlus_IBM_VGA_9x14.woff
new file mode 100644
index 0000000..44cce3e
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_VGA_9x14.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_VGA_9x16-2x.woff b/web/static/fonts/WebPlus_IBM_VGA_9x16-2x.woff
new file mode 100644
index 0000000..f0ffd03
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_VGA_9x16-2x.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_VGA_9x16.woff b/web/static/fonts/WebPlus_IBM_VGA_9x16.woff
new file mode 100644
index 0000000..969fb65
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_VGA_9x16.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_VGA_9x8-2x.woff b/web/static/fonts/WebPlus_IBM_VGA_9x8-2x.woff
new file mode 100644
index 0000000..45326ef
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_VGA_9x8-2x.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_VGA_9x8.woff b/web/static/fonts/WebPlus_IBM_VGA_9x8.woff
new file mode 100644
index 0000000..44cd4df
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_VGA_9x8.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_IBM_XGA-AI_12x20.woff b/web/static/fonts/WebPlus_IBM_XGA-AI_12x20.woff
new file mode 100644
index 0000000..ff642ee
--- /dev/null
+++ b/web/static/fonts/WebPlus_IBM_XGA-AI_12x20.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_Rainbow100_re_132.woff b/web/static/fonts/WebPlus_Rainbow100_re_132.woff
new file mode 100644
index 0000000..c553760
--- /dev/null
+++ b/web/static/fonts/WebPlus_Rainbow100_re_132.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_Rainbow100_re_40.woff b/web/static/fonts/WebPlus_Rainbow100_re_40.woff
new file mode 100644
index 0000000..c316398
--- /dev/null
+++ b/web/static/fonts/WebPlus_Rainbow100_re_40.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_Rainbow100_re_66.woff b/web/static/fonts/WebPlus_Rainbow100_re_66.woff
new file mode 100644
index 0000000..123af39
--- /dev/null
+++ b/web/static/fonts/WebPlus_Rainbow100_re_66.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_Rainbow100_re_80.woff b/web/static/fonts/WebPlus_Rainbow100_re_80.woff
new file mode 100644
index 0000000..4feb241
--- /dev/null
+++ b/web/static/fonts/WebPlus_Rainbow100_re_80.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_Tandy1K-II_200L-2x.woff b/web/static/fonts/WebPlus_Tandy1K-II_200L-2x.woff
new file mode 100644
index 0000000..b95844e
--- /dev/null
+++ b/web/static/fonts/WebPlus_Tandy1K-II_200L-2x.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_Tandy1K-II_200L-2y.woff b/web/static/fonts/WebPlus_Tandy1K-II_200L-2y.woff
new file mode 100644
index 0000000..766fdf5
--- /dev/null
+++ b/web/static/fonts/WebPlus_Tandy1K-II_200L-2y.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_Tandy1K-II_200L.woff b/web/static/fonts/WebPlus_Tandy1K-II_200L.woff
new file mode 100644
index 0000000..a40ea22
--- /dev/null
+++ b/web/static/fonts/WebPlus_Tandy1K-II_200L.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_Tandy1K-II_225L-2y.woff b/web/static/fonts/WebPlus_Tandy1K-II_225L-2y.woff
new file mode 100644
index 0000000..2e376dc
--- /dev/null
+++ b/web/static/fonts/WebPlus_Tandy1K-II_225L-2y.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_Tandy1K-II_225L.woff b/web/static/fonts/WebPlus_Tandy1K-II_225L.woff
new file mode 100644
index 0000000..226bfe4
--- /dev/null
+++ b/web/static/fonts/WebPlus_Tandy1K-II_225L.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_ToshibaSat_8x14.woff b/web/static/fonts/WebPlus_ToshibaSat_8x14.woff
new file mode 100644
index 0000000..54c3b46
--- /dev/null
+++ b/web/static/fonts/WebPlus_ToshibaSat_8x14.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_ToshibaSat_8x16.woff b/web/static/fonts/WebPlus_ToshibaSat_8x16.woff
new file mode 100644
index 0000000..1ac5866
--- /dev/null
+++ b/web/static/fonts/WebPlus_ToshibaSat_8x16.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_ToshibaSat_8x8.woff b/web/static/fonts/WebPlus_ToshibaSat_8x8.woff
new file mode 100644
index 0000000..dc45c25
--- /dev/null
+++ b/web/static/fonts/WebPlus_ToshibaSat_8x8.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_ToshibaSat_9x14.woff b/web/static/fonts/WebPlus_ToshibaSat_9x14.woff
new file mode 100644
index 0000000..3eac7ac
--- /dev/null
+++ b/web/static/fonts/WebPlus_ToshibaSat_9x14.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_ToshibaSat_9x16.woff b/web/static/fonts/WebPlus_ToshibaSat_9x16.woff
new file mode 100644
index 0000000..b324de1
--- /dev/null
+++ b/web/static/fonts/WebPlus_ToshibaSat_9x16.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_ToshibaSat_9x8.woff b/web/static/fonts/WebPlus_ToshibaSat_9x8.woff
new file mode 100644
index 0000000..ac2722c
--- /dev/null
+++ b/web/static/fonts/WebPlus_ToshibaSat_9x8.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_ToshibaTxL1_8x16.woff b/web/static/fonts/WebPlus_ToshibaTxL1_8x16.woff
new file mode 100644
index 0000000..686cea5
--- /dev/null
+++ b/web/static/fonts/WebPlus_ToshibaTxL1_8x16.woff
Binary files differ
diff --git a/web/static/fonts/WebPlus_ToshibaTxL2_8x16.woff b/web/static/fonts/WebPlus_ToshibaTxL2_8x16.woff
new file mode 100644
index 0000000..0526002
--- /dev/null
+++ b/web/static/fonts/WebPlus_ToshibaTxL2_8x16.woff
Binary files differ
diff --git a/web/static/highlight.css b/web/static/highlight.css
new file mode 100644
index 0000000..faa5d4d
--- /dev/null
+++ b/web/static/highlight.css
@@ -0,0 +1,7 @@
+/*!
+ Theme: Synth Midnight Terminal Dark
+ Author: Michaƫl Ball (http://github.com/michael-ball/)
+ License: ~ MIT (or more permissive) [via base16-schemes-source]
+ Maintainer: @highlightjs/core-team
+ Version: 2021.09.0
+*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#c1c3c4;background:#050608}.hljs ::selection,.hljs::selection{background-color:#28292a;color:#c1c3c4}.hljs-comment{color:#474849}.hljs-tag{color:#a3a5a6}.hljs-operator,.hljs-punctuation,.hljs-subst{color:#c1c3c4}.hljs-operator{opacity:.7}.hljs-bullet,.hljs-deletion,.hljs-name,.hljs-selector-tag,.hljs-template-variable,.hljs-variable{color:#b53b50}.hljs-attr,.hljs-link,.hljs-literal,.hljs-number,.hljs-symbol,.hljs-variable.constant_{color:#ea770d}.hljs-class .hljs-title,.hljs-title,.hljs-title.class_{color:#c9d364}.hljs-strong{font-weight:700;color:#c9d364}.hljs-addition,.hljs-code,.hljs-string,.hljs-title.class_.inherited__{color:#06ea61}.hljs-built_in,.hljs-doctag,.hljs-keyword.hljs-atrule,.hljs-quote,.hljs-regexp{color:#42fff9}.hljs-attribute,.hljs-function .hljs-title,.hljs-section,.hljs-title.function_,.ruby .hljs-property{color:#03aeff}.diff .hljs-meta,.hljs-keyword,.hljs-template-tag,.hljs-type{color:#ea5ce2}.hljs-emphasis{color:#ea5ce2;font-style:italic}.hljs-meta,.hljs-meta .hljs-keyword,.hljs-meta .hljs-string{color:#cd6320}.hljs-meta .hljs-keyword,.hljs-meta-keyword{font-weight:700} \ No newline at end of file
diff --git a/web/static/main.css b/web/static/main.css
new file mode 100644
index 0000000..cf1821f
--- /dev/null
+++ b/web/static/main.css
@@ -0,0 +1,607 @@
+:root {
+ --back: #888;
+ --front: #E76969;
+ --green: #69E769;
+ --site-font: JPN16;
+ --gradient: linear-gradient(90deg,rgba(255, 100, 255, 1) 0%, rgba(0, 255, 255, 1) 100%);
+}
+
+@font-face {
+ font-family: Terminal;
+ src: url( /static/fonts/Web437_IBM_PGC.woff )
+}
+
+@font-face {
+ font-family: JPN12;
+ src: url( /static/fonts/Web437_DOS-V_re_JPN12.woff )
+}
+
+@font-face {
+ font-family: JPN16;
+ src: url( /static/fonts/Web437_DOS-V_re_JPN16.woff )
+}
+
+
+@font-face {
+ font-family: JPN19;
+ src: url( /static/fonts/Web437_DOS-V_re_JPN19.woff )
+}
+
+@font-face {
+ font-family: JPN24;
+ src: url( /static/fonts/Web437_DOS-V_re_JPN24.woff )
+}
+
+@font-face {
+ font-family: JPN30;
+ src: url( /static/fonts/Web437_DOS-V_re_JPN30.woff )
+}
+
+#moneyjsx-root {
+ display: flex;
+ flex-direction: column;
+ padding: 0;
+ margin: 0;
+}
+input[type="radio"] {
+ appearance: none;
+ background-color: var( --back );
+ margin: 0;
+ font: inherit;
+ color: #888;
+ width: 1em;
+ height: 1em;
+ border: 0.15em solid currentColor;
+ border-radius: 50%;
+ display: grid;
+ place-content: center;
+}
+
+input[type="radio"]::before {
+ content: "";
+ width: 0.75em;
+ height: 0.75em;
+ border-radius: 50%;
+ transform: scale(0);
+ transition: 120ms transform ease-in-out;
+ box-shadow: inset 1em 1em var(--front);
+}
+
+input[type="radio"]:checked::before {
+ transform: scale(1);
+}
+
+.border-wrapper {
+ justify-content: center;
+ flex-direction: row;
+ align-self: center;
+ position: relative;
+ display: flex;
+ width: 100%;
+ background: var(--gradient);
+ padding: 1px 1px 1px 1px;
+ margin: 0px;
+}
+
+.header {
+ width: calc(100% - 2px);
+ background: var(--back);
+ font-family: JPN24;
+ font-size: 26px;
+ height: 38px;
+ display: flex;
+ flex-direction: row;
+}
+
+code {
+ font-family: Code;
+ font-size: 12px;
+ white-space: pre-wrap;
+}
+
+html, body {
+ height: 100%;
+ overflow: auto;
+}
+
+input {
+ background-color: #222;
+ border: 1px solid var(--front);
+ color: #888;
+ font-family: Code;
+}
+
+button {
+ cursor: pointer;
+ border: 1px solid var(--front);
+ background-color: #222;
+ color: #fff;
+ font-size: 16px;
+ font-family: var( --site-font );
+}
+
+textarea {
+ border: 1px solid var( --front );
+ background-color: #222;
+ color: white;
+}
+
+hr {
+ border-top: 1px solid #aaa;
+ background: #ccc;
+ height: 1px;
+ width: calc( 100% - 2px );
+}
+
+a {
+ text-decoration: none;
+ background: var( --gradient );
+ background-clip: border-box;
+ text-decoration: underline;
+ -webkit-text-fill-color: transparent;
+ -webkit-background-clip: text;
+ color: #c6a6ff;
+}
+
+
+a:hover {
+ cursor: pointer;
+ color: #fff;
+ background: var( --gradient );
+ background-clip: border-box;
+ text-decoration: underline;
+ -webkit-text-fill-color: transparent;
+ -webkit-background-clip: text;
+ text-decoration: underline;
+}
+
+.gradient {
+ background: var( --gradient );
+ background-clip: border-box;
+ -webkit-text-fill-color: transparent;
+ -webkit-background-clip: text;
+}
+
+.nogradient {
+ -webkit-text-fill-color: white;
+ -webkit-background-clip: text;
+ background: none;
+}
+
+a.nogradient {
+ margin-bottom: 0px;
+ text-decoration: none;
+}
+
+a.nogradient:hover {
+ text-decoration: underline;
+}
+
+a.nogradient::after {
+ content:'.';
+ -webkit-text-fill-color: transparent;
+ color: transparent;
+ width:calc( 100% - 7px );
+ display:inline-block;
+ z-index: 2;
+ height: 1px;
+ margin-top: -2px;
+ background: #30e8bf;
+ padding: 0;
+ background: var( --gradient );
+}
+
+a.nogradient:hover::after {
+ background: none;
+}
+
+
+body {
+ background-color: var( --back );
+ background-image: url( "/static/networkheaven.png" );
+ font-family: var( --site-font );
+ font-smooth: never !important;
+ background-position: center;
+ background-size: cover;
+ flex-direction: column;
+ display: flex;
+ color: #fff;
+ margin: 0;
+}
+
+
+#page-main {
+ flex-direction: row;
+ justify-content: center;
+ align-items: initial;
+ text-align: center;
+ padding: 30px 0 0;
+ overflow-x: clip;
+ display: flex;
+ width: 100%;
+ z-index: 0;
+ margin: 0;
+ margin-bottom: 30px;
+}
+
+#page-main-content {
+ width: 800px;
+ min-width: 600px;
+ background: var( --back );
+ border-left: 1px solid #ccc;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #888;
+ border-bottom: 1px solid #222;
+}
+
+
+.red { color: #e96969; }
+.black { color: #212325; }
+.green { color: #10bb10; }
+.btn_close { background: #ccc; }
+
+
+
+#sidebar {
+ width: 230px;
+ height: 100%;
+ margin-right: 20px;
+ text-align: left;
+ background: var( --back );
+ border-left: 1px solid #ccc;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #888;
+ border-bottom: 1px solid #222;
+}
+
+#sidebar h3 {
+ margin-top: 8px;
+ margin-bottom: 8px;
+ background: var( --gradient );
+ background-clip: border-box;
+ text-decoration: none;
+ -webkit-text-fill-color: transparent;
+ -webkit-background-clip: text;
+ width: fit-content;
+ font-family: JPN24;
+ font-size: 24px;
+ margin-left: 4px;
+}
+
+#sidebar h4 {
+ margin-top: 0px;
+ margin-bottom: 0px;
+ width: fit-content;
+ font-family: JPN16;
+ font-size: 17px;
+ margin-left: 4px;
+}
+
+
+.sidebar-row {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-between;
+ padding-right: 4px;
+}
+
+.page-title {
+ display: flex;
+ justify-content: center
+}
+
+.page-title h3 {
+ margin-top: 15px;
+ margin-bottom: 6px;
+}
+
+@media( max-width: 1100px ) {
+ #page-main-content {
+ width: calc( 100% - 20px ) !important;
+ min-width: unset !important;
+ margin-right: 20px !important;
+ margin-left: 0 !important;
+ };
+
+ #sidebar {
+ margin-left: 20px;
+ }
+
+ .page-title h3 {
+ margin-top: 8px;
+ margin-bottom: 0px;
+ }
+
+ .page-title {
+ height: 35px;
+ }
+
+ #sidebar h3 {
+ margin-top: 8px;
+ margin-bottom: 8px;
+ background: var( --gradient );
+ background-clip: border-box;
+ text-decoration: none;
+ -webkit-text-fill-color: transparent;
+ -webkit-background-clip: text;
+ width: fit-content;
+ font-family: JPN24;
+ font-size: 24px;
+ margin-left: 4px;
+ }
+
+ #sidebar h4 {
+ font-family: JPN12 !important;
+ font-size: 13px !important;
+ }
+
+ .sidebar-row {
+ margin-bottom: 6px;
+ }
+
+ #ascii-art {
+ font-size: 7px !important;
+ }
+}
+
+@media( max-width: 740px ) {
+ #sidebar {
+ width: 200px !important;
+ }
+
+ #sidebar h4 {
+ font-size: 10px !important;
+ }
+
+ #sidebar h3 {
+ font-size: 20px !important;
+ }
+
+ .sidebar-row {
+ margin-bottom: 10px !important;
+ }
+
+ #ascii-art {
+ font-size: 6px !important;
+ }
+}
+
+#ascii-art {
+ white-space: pre-wrap;
+ font-family: Code;
+ font-size: 12px;
+ overflow:clip;
+ padding-top: 5px;
+}
+
+#ascii-art span {
+ padding: 0;
+ margin: 0;
+}
+
+.groupbox {
+ border: 1px solid var( --front );
+ background-color: var( --back );
+ justify-content: flex-start;
+ align-items: flex-start;
+ flex-direction: column;
+ height: fit-content;
+ min-height: 25px;
+ min-width: 333px; /* may need to change this for mobile */
+ max-width: 600px;
+ display: flex;
+ margin: 5px;
+ z-index: 1;
+ flex: 1;
+}
+.groupbox > .grouptitle {
+ background-color: var( --back );
+ font-family: inherit;
+ position: relative;
+ margin: 0 0 -15px; /* stupid hardcode, but its: ( title font height - 4 ) * -1 */
+ padding: 0px 5px;
+ font-size: 18px;
+ z-index: 2;
+ top: -9px;
+ left: 5px;
+}
+.groupbody {
+ width: calc( 100% - 5px );
+ height: calc( 100% - 5px );
+ text-align: left;
+ margin: 5px;
+}
+
+#popup-msgbox {
+ display: none;
+ justify-content: center;
+ align-items: center;
+ position: absolute;
+ left: 50%;
+ min-width: 250px;
+ border: 1px solid var( --front );
+ background: var( --back );
+ min-height: 120px;
+ top: 45vh;
+ transform: translate( -50%, -50% );
+}
+
+
+.dropdown {
+ background-color: var( --back );
+ border-color: var( --front );
+ text-align: center;
+ color: #888;
+ height: 24px;
+ color: #fff;
+}
+
+.dropdown-wrapper {
+ border: 2px inset var( --front );
+ background-color: var( --back );
+ justify-content: space-evenly;
+ flex-direction: column;
+ align-items: center;
+ position: absolute;
+ width: 256px;
+ z-index: 10;
+ margin-left: 10px;
+}
+
+.dropdown-inner {
+ height: 30px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: space-evenly;
+ border-bottom: 1px solid #333;
+ cursor: pointer;
+}
+
+.rolldownlist {
+ height: fit-content;
+ position: relative;
+ width: 100%;
+ padding: 0;
+ margin: 0;
+}
+
+.rolldown {
+ transition: background-color 0.3s ease-in-out;
+ border-bottom: 1px solid #E76969;
+ justify-content: space-between;
+ flex-direction: column;
+ display: flex;
+ height: auto;
+ width: 100%;
+}
+
+.rolldown:nth-of-type( 1 ) { margin-top: -5px; }
+.rolldown:nth-last-of-type( 1 ) { border-bottom: none; }
+.rolldown:hover { cursor: pointer; }
+
+.rolldown-collapsed-container {
+ overflow: hidden;
+ padding: 10px;
+ display: flex;
+ height: auto;
+ width: 100%;
+}
+
+.rolldown-collapsed {
+ float: left;
+ padding: 0;
+}
+
+.rolldown-expanded-container {
+ text-align: center;
+ overflow: hidden;
+ transition: max-height 0.3s linear;
+ max-height: 0px;
+ margin: 0;
+ padding: 0;
+}
+
+.rolldown-expanded-container.active {
+ display: flex !important;
+ max-height: 200px;
+ height: auto;
+}
+
+.rolldown-expanded {
+ margin: 20px;
+}
+
+.rolldown-expanded a { color: white; }
+
+.rolldown-icon-container {
+ margin-right: 15px;
+ position: relative;
+ float: left;
+ height: fit-content;
+}
+
+.rolldown.active .rolldown-icon-container {
+ transform: rotate( 90deg );
+}
+
+.popup {
+ border: 1px solid var( --front );
+ background-color: var( --back );
+ box-shadow: 1px 1px 2px black;
+ justify-content: center;
+ align-items: center;
+ align-self: center;
+ flex-direction: column;
+ position: absolute;
+ max-height: 888px;
+ max-width: 600px;
+ min-width: 300px;
+ display: flex;
+ padding: 20px;
+ z-index: 5;
+ width: 85%;
+ top: 50%;
+ left: 50%;
+ transform: translate( -50%, -50% );
+}
+
+.popup-msg {
+ border: 1px solid var( --front );
+ background-color: var( --back );
+ box-shadow: 1px 1px 2px black;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ z-index: 1000;
+ padding: 10px;
+ display: flex;
+ flex-direction: column;
+}
+
+.column {
+ display: flex;
+ flex-direction: column;
+}
+
+#background-toggle {
+ position: absolute;
+
+ bottom: 0px;
+ right: 0px;
+ background: #888;
+ border-left: 1px solid #ccc;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #888;
+ border-bottom: 1px solid #222;
+}
+
+#package-entries {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ justify-content: center;
+ align-items: center;
+}
+
+#package-entries table {
+ text-align: right;
+}
+
+#package-entries table tr td:first-child {
+ text-align: left !important;
+}
+
+.package-entry {
+ display: flex;
+ width: 80%;
+
+ justify-content: space-between;
+}
+
+.package-entry-date,
+.package-entry-time {
+ padding: 0 10px;
+}
diff --git a/web/static_elements/networkheaven.png b/web/static/networkheaven.png
index 97c2cf5..97c2cf5 100644
--- a/web/static_elements/networkheaven.png
+++ b/web/static/networkheaven.png
Binary files differ
diff --git a/web/static/nh.ico b/web/static/nh.ico
new file mode 100644
index 0000000..dca5438
--- /dev/null
+++ b/web/static/nh.ico
Binary files differ
diff --git a/web/static/nh.jpg b/web/static/nh.jpg
new file mode 100644
index 0000000..f8d65bb
--- /dev/null
+++ b/web/static/nh.jpg
Binary files differ
diff --git a/web/static/nh.png b/web/static/nh.png
new file mode 100644
index 0000000..fa8d531
--- /dev/null
+++ b/web/static/nh.png
Binary files differ
diff --git a/web/static/prompts.json b/web/static/prompts.json
new file mode 100644
index 0000000..b121306
--- /dev/null
+++ b/web/static/prompts.json
@@ -0,0 +1,104 @@
+{
+ "prompts": [
+ "how do i fix a slow pc?",
+ "explain quantum computing in simple terms.",
+ "what is the best pizza topping?",
+ "recommend me a sci-fi movie.",
+ "how do i make a website?",
+ "tell me a fun fact.",
+ "what is the meaning of life?",
+ "how can i learn programming fast?",
+ "suggest a book to read.",
+ "who is elon musk?",
+ "explain blockchain.",
+ "what is the capital of japan?",
+ "give me a random joke.",
+ "what is 42 in binary?",
+ "what is the best coding language to learn?",
+ "how do you make coffee?",
+ "explain the concept of ai.",
+ "what is the weather today?",
+ "who won the last world cup?",
+ "tell me about black holes.",
+ "how do i become a millionaire?",
+ "best way to learn guitar?",
+ "what is love?",
+ "tell me about spacex.",
+ "give me a motivational quote.",
+ "explain recursion.",
+ "who is the president of the usa?",
+ "define cryptocurrency.",
+ "how to start a startup?",
+ "tell me a cool fact about space.",
+ "what are the benefits of meditation?",
+ "explain 5g technology.",
+ "suggest a new hobby.",
+ "how do i improve my memory?",
+ "what is 2+2?",
+ "what is a deep learning model?",
+ "who is albert einstein?",
+ "how can i become more productive?",
+ "what is the best anime series?",
+ "explain the stock market.",
+ "who invented the internet?",
+ "what are some good productivity hacks?",
+ "tell me a mystery fact.",
+ "what is dark matter?",
+ "how do i invest in stocks?",
+ "what is a good workout routine?",
+ "explain how electricity works.",
+ "give me a funny meme idea.",
+ "what is the history of bitcoin?",
+ "how do i write a resume?",
+ "recommend a good tv series.",
+ "explain the theory of relativity.",
+ "how do i quit a bad habit?",
+ "tell me something weird.",
+ "how can i become rich?",
+ "explain how nuclear energy works.",
+ "what is the healthiest diet?",
+ "how to deal with stress?",
+ "tell me about mars.",
+ "what is machine learning?",
+ "give me a random trivia.",
+ "how does ai work?",
+ "what is the best way to relax?",
+ "tell me something inspirational.",
+ "who invented computers?",
+ "explain string theory.",
+ "what is the biggest animal in the ocean?",
+ "how do i make friends?",
+ "tell me a conspiracy theory.",
+ "what is the fastest car in the world?",
+ "explain schrodinger's cat.",
+ "what is the best way to sleep better?",
+ "who wrote the bible?",
+ "how do i code in python?",
+ "what is the longest river in the world?",
+ "how does the brain work?",
+ "tell me about the moon landing.",
+ "what is quantum physics?",
+ "how to create a business plan?",
+ "what is an nft?",
+ "explain evolution.",
+ "how do i save money?",
+ "who is stephen hawking?",
+ "what is the best smartphone?",
+ "what are black holes?",
+ "how does the universe end?",
+ "tell me about tesla.",
+ "how do vaccines work?",
+ "what is consciousness?",
+ "explain time travel theories.",
+ "what is the best way to learn math?",
+ "how does google work?",
+ "what is augmented reality?",
+ "how do i boost my immune system?",
+ "what is the best travel destination?",
+ "tell me about dinosaurs.",
+ "explain the big bang.",
+ "how do satellites stay in orbit?",
+ "what is the difference between ai and ml?",
+ "how do i write a novel?"
+ ]
+} \ No newline at end of file
diff --git a/web/static_elements/f.html b/web/static_elements/f.html
deleted file mode 100644
index 308b1d0..0000000
--- a/web/static_elements/f.html
+++ /dev/null
@@ -1,2 +0,0 @@
-</body>
-</html>
diff --git a/web/static_elements/h.html b/web/static_elements/h.html
deleted file mode 100644
index 5ca6896..0000000
--- a/web/static_elements/h.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!doctype html>
-<html>
-<head>
-<meta charset="utf-8">
-<link rel="stylesheet" href="style.css">
-<title>NETWORKHEAVEN</title>
-</head>
-
-<body>
diff --git a/web/static_elements/px437_12.ttf b/web/static_elements/px437_12.ttf
deleted file mode 100644
index f5ef3a3..0000000
--- a/web/static_elements/px437_12.ttf
+++ /dev/null
Binary files differ
diff --git a/web/static_elements/px437_16.ttf b/web/static_elements/px437_16.ttf
deleted file mode 100644
index 84db77b..0000000
--- a/web/static_elements/px437_16.ttf
+++ /dev/null
Binary files differ
diff --git a/web/style.css b/web/style.css
deleted file mode 100644
index c235155..0000000
--- a/web/style.css
+++ /dev/null
@@ -1,73 +0,0 @@
-@font-face {
- font-family: "Px437 DOS/V re. JPN12";
- src: url("static_elements/px437_12.ttf");
-}
-
-@font-face {
- font-family: "Px437 DOS/V re. JPN16";
- src: url("static_elements/px437_16.ttf");
-}
-
-body {
- background-image: url("static_elements/networkheaven.png");
- /*background-image: linear-gradient(to right, purple , #008F8F);*/
- background-repeat: no-repeat;
- background-size: cover;
- text-shadow: 0px 0px 1px rgba(255,0,0,0);
- font-smooth: never;
- -webkit-font-smoothing : none;
-}
-
-h1 {
- text-align: center;
- font-family: "Px437 DOS/V re. JPN16", monospace;
- color: white;
- font-size: 32px;
-}
-
-h3 {
- text-align: center;
- font-family: "Px437 DOS/V re. JPN16", monospace;
- font-size: 16px;
- color: white;
- margin: 0%;
-}
-
-h4 {
- text-align: center;
- font-family: "Px437 DOS/V re. JPN12", monospace;
- font-size: 12px;
- color: white;
- margin: 0%;
-}
-
-pre {
- font-family: monospace;
- font-size: 12px;
- color: white;
-}
-
-a {
- background: linear-gradient(to right, #FF00FF, #00FFFF);
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- text-decoration:none;
- font-weight: bold;
- font-size: 16px;
- font-family: "Px437 DOS/V re. JPN16", monospace;
-}
-
-hr {
- color: rgb(128, 128, 128);
-}
-
-.statusbox {
- font-family: monospace;
- font-size: 10px;
- text-align: center;
- color: white;
- display: table;
- margin-right: auto;
- margin-left: auto;
- white-space: pre-wrap;
-}
diff --git a/web/tsconfig.json b/web/tsconfig.json
new file mode 100644
index 0000000..f2f29fc
--- /dev/null
+++ b/web/tsconfig.json
@@ -0,0 +1,120 @@
+{
+ "compilerOptions": {
+ /* Visit https://aka.ms/tsconfig to read more about this file */
+
+ /* Projects */
+ // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
+ // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
+ // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
+ // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
+ // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
+ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
+ "moduleResolution": "bundler",
+ "target": "es2020",
+ "lib": [
+ "ES2017",
+ "DOM",
+ "DOM.Iterable",
+ "ScriptHost"
+ ],
+ // "lib": [],
+ "jsx": "react",
+ // "experimentalDecorators": true,
+ // "emitDecoratorMetadata": true,
+ "jsxFactory": "JSX.createElement",
+ "jsxFragmentFactory": "JSX.createFragment",
+ // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
+ // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
+ // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
+ // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
+ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
+
+ /* Modules */
+ "module": "es2020", /* Specify what module code is generated. */
+ // "rootDir": "./", /* Specify the root folder within your source files. */
+ // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
+ "baseUrl": ".",
+ "paths": {
+ "*": ["types/*"]
+ }, /* Specify a set of entries that re-map imports to additional lookup locations. */
+ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
+ "typeRoots": [
+ "./node_modules/@types",
+ "./types"
+ ], /* Specify multiple folders that act like './node_modules/@types'. */
+ // "types": [], /* Specify type package names to be included without being referenced in a source file. */
+ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
+ // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
+ // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
+ // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
+ // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
+ // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
+ // "noUncheckedSideEffectImports": true, /* Check side effect imports. */
+ // "resolveJsonModule": true, /* Enable importing .json files. */
+ // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
+ // "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
+
+ /* JavaScript Support */
+ "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
+ //"checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
+ // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
+
+ /* Emit */
+ // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
+ // "declarationMap": true, /* Create sourcemaps for d.ts files. */
+ // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
+ "sourceMap": true, /* Create source map files for emitted JavaScript files. */
+ // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
+ // "noEmit": true, /* Disable emitting files from a compilation. */
+ // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
+ // "outDir": "./", /* Specify an output folder for all emitted files. */
+ // "removeComments": true, /* Disable emitting comments. */
+ // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
+ // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
+ // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
+ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
+ // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
+ // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
+ // "newLine": "crlf", /* Set the newline character for emitting files. */
+ // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
+ // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
+ // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
+ // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
+ // "declarationDir": "./", /* Specify the output directory for generated declaration files. */
+
+ /* Interop Constraints */
+ // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
+ // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
+ // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */
+ // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
+ "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
+ // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
+ "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
+
+ /* Type Checking */
+ "strict": true, /* Enable all strict type-checking options. */
+ "noImplicitAny": false, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
+ "strictNullChecks": false, /* When type checking, take into account 'null' and 'undefined'. */
+ "strictFunctionTypes": false, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
+ "strictBindCallApply": false, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
+ "strictPropertyInitialization": false, /* Check for class properties that are declared but not set in the constructor. */
+ "strictBuiltinIteratorReturn": false, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */
+ "noImplicitThis": false, /* Enable error reporting when 'this' is given the type 'any'. */
+ // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
+ // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
+ // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
+ // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
+ // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
+ // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
+ // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
+ // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
+ // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
+ // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
+ // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
+ // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
+
+ /* Completeness */
+ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
+ "skipLibCheck": true /* Skip type checking all .d.ts files. */
+ }
+}
diff --git a/web/types/custom.d.ts b/web/types/custom.d.ts
new file mode 100644
index 0000000..b7f740e
--- /dev/null
+++ b/web/types/custom.d.ts
@@ -0,0 +1,8 @@
+declare namespace JSX {
+ type Element = any;
+ type ElementClass = any;
+ interface IntrinsicElements {
+ [elemName: string]: any;
+ }
+}
+
diff --git a/web/webpack-dev.config.cjs b/web/webpack-dev.config.cjs
new file mode 100644
index 0000000..4fa4b07
--- /dev/null
+++ b/web/webpack-dev.config.cjs
@@ -0,0 +1,45 @@
+const path = require('path');
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+const CopyWebpackPlugin = require('copy-webpack-plugin');
+
+module.exports = {
+ mode: 'development',
+ entry: './src/index-page.tsx',
+ module: {
+ rules: [
+ {
+ test: /\.tsx?$/,
+ use: {
+ loader: 'ts-loader',
+ options: {
+ compilerOptions: {
+ module: 'es2020'
+ }
+ }
+ },
+ exclude: /node_modules/,
+ }
+ ],
+ },
+ resolve: {
+ extensions: ['.tsx', '.jsx', ".js"],
+ },
+ output: {
+ filename: 'bundle.js',
+ path: path.resolve(__dirname, 'dist')
+ },
+ plugins: [
+ new HtmlWebpackPlugin({
+ template: './src/index.html',
+ }),
+ new CopyWebpackPlugin({
+ patterns: [
+ { from: './static/**' }
+ ]
+ })
+ ],
+ devServer: {
+ historyApiFallback: true,
+ port: 9000,
+ },
+};
diff --git a/web/webpack-prod.config.cjs b/web/webpack-prod.config.cjs
new file mode 100644
index 0000000..e850468
--- /dev/null
+++ b/web/webpack-prod.config.cjs
@@ -0,0 +1,48 @@
+const path = require('path');
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+const CopyWebpackPlugin = require('copy-webpack-plugin');
+
+module.exports = {
+ mode: 'production',
+ entry: './src/index-page.tsx',
+ module: {
+ rules: [
+ {
+ test: /\.tsx?$/,
+ use: {
+ loader: 'ts-loader',
+ options: {
+ compilerOptions: {
+ module: 'es2020'
+ }
+ }
+ },
+ exclude: /node_modules/,
+ }
+ ],
+ },
+ resolve: {
+ alias: {
+ jquery: "jquery/slim"
+ },
+ extensions: ['.tsx', '.jsx', ".js"],
+ },
+ output: {
+ filename: 'bundle.js',
+ path: path.resolve(__dirname, 'dist'),
+ },
+ plugins: [
+ new HtmlWebpackPlugin({
+ template: './src/index.html',
+ }),
+ new CopyWebpackPlugin({
+ patterns: [
+ { from: './static/**' }
+ ]
+ })
+ ],
+ devServer: {
+ historyApiFallback: true,
+ port: 9000,
+ },
+};