From 3b6cd783cbf58ed762df8cb7d927ae56eb1832ff Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sat, 28 May 2022 09:23:23 +0100 Subject: [PATCH 01/14] Don't allow modems to be used in adventure mode This (along with computer locking) should be Good Enough for BlanketCon. --- .../computercraft/shared/peripheral/modem/wired/TileCable.java | 2 +- .../shared/peripheral/modem/wired/TileWiredModemFull.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileCable.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileCable.java index eefb53109..e7d34fbb1 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileCable.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileCable.java @@ -262,7 +262,7 @@ private void refreshPeripheral() @Override public ActionResultType onActivate( PlayerEntity player, Hand hand, BlockRayTraceResult hit ) { - if( player.isCrouching() ) return ActionResultType.PASS; + if( player.isCrouching() || !player.mayBuild() ) return ActionResultType.PASS; if( !canAttachPeripheral() ) return ActionResultType.FAIL; if( getLevel().isClientSide ) return ActionResultType.SUCCESS; diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileWiredModemFull.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileWiredModemFull.java index e807ce499..34963cc1b 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileWiredModemFull.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileWiredModemFull.java @@ -199,6 +199,7 @@ private void refreshPeripheral( @Nonnull Direction facing ) @Override public ActionResultType onActivate( PlayerEntity player, Hand hand, BlockRayTraceResult hit ) { + if( player.isCrouching() || !player.mayBuild() ) return ActionResultType.PASS; if( getLevel().isClientSide ) return ActionResultType.SUCCESS; // On server, we interacted if a peripheral was found From 3f0704624efc67e8f23254fdef828fd9cb3803fc Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Mon, 30 May 2022 13:36:36 +0100 Subject: [PATCH 02/14] Fix location of DFPWM test --- .../client/sound/DfpwmStreamTest.java | 38 ++++++++++++++++++ .../client/sound/DfpwmStreamTest.java | 40 ------------------- 2 files changed, 38 insertions(+), 40 deletions(-) create mode 100644 src/test/java/dan200/computercraft/client/sound/DfpwmStreamTest.java delete mode 100644 src/test/kotlin/dan200/computercraft/client/sound/DfpwmStreamTest.java diff --git a/src/test/java/dan200/computercraft/client/sound/DfpwmStreamTest.java b/src/test/java/dan200/computercraft/client/sound/DfpwmStreamTest.java new file mode 100644 index 000000000..b15693779 --- /dev/null +++ b/src/test/java/dan200/computercraft/client/sound/DfpwmStreamTest.java @@ -0,0 +1,38 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.client.sound; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import org.junit.jupiter.api.Test; + +import java.nio.ByteBuffer; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class DfpwmStreamTest +{ + @Test + public void testDecodesBytes() + { + DfpwmStream stream = new DfpwmStream(); + + ByteBuf input = ByteBufAllocator.DEFAULT.buffer(); + input.writeBytes( new byte[] { 43, -31, 33, 44, 30, -16, -85, 23, -3, -55, 46, -70, 68, -67, 74, -96, -68, 16, 94, -87, -5, 87, 11, -16, 19, 92, 85, -71, 126, 5, -84, 64, 17, -6, 85, -11, -1, -87, -12, 1, 85, -56, 33, -80, 82, 104, -93, 17, 126, 23, 91, -30, 37, -32, 117, -72, -58, 11, -76, 19, -108, 86, -65, -10, -1, -68, -25, 10, -46, 85, 124, -54, 15, -24, 43, -94, 117, 63, -36, 15, -6, 88, 87, -26, -83, 106, 41, 13, -28, -113, -10, -66, 119, -87, -113, 68, -55, 40, -107, 62, 20, 72, 3, -96, 114, -87, -2, 39, -104, 30, 20, 42, 84, 24, 47, 64, 43, 61, -35, 95, -65, 42, 61, 42, -50, 4, -9, 81 } ); + stream.push( input ); + + ByteBuffer buffer = stream.read( 2048 + 1 ); + assertEquals( 2048, buffer.remaining(), "Must have read 1024 bytes" ); + + byte[] decoded = new byte[] { 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, -1, -2, -2, -1, 0, 1, 0, -1, -3, -5, -5, -5, -7, -9, -11, -11, -9, -9, -9, -9, -10, -12, -12, -10, -8, -6, -6, -8, -10, -12, -14, -16, -18, -17, -15, -12, -9, -6, -3, -2, -2, -2, -2, -2, -2, 0, 3, 6, 7, 7, 7, 4, 1, 1, 1, 1, 3, 5, 7, 9, 12, 15, 15, 12, 12, 12, 9, 9, 11, 12, 12, 14, 16, 17, 17, 17, 14, 11, 11, 11, 10, 12, 14, 14, 13, 13, 10, 9, 9, 7, 5, 4, 4, 4, 4, 4, 6, 8, 10, 10, 10, 10, 10, 10, 10, 9, 8, 8, 8, 7, 6, 4, 2, 0, 0, 0, 0, 0, -1, -1, 0, 1, 3, 3, 3, 3, 2, 0, -2, -2, -2, -3, -5, -7, -7, -5, -3, -1, -1, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, 0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 9, 8, 7, 6, 4, 2, 0, 0, 2, 4, 6, 8, 10, 10, 8, 7, 7, 5, 3, 1, -1, 0, 2, 4, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 4, 5, 5, 5, 5, 5, 6, 7, 8, 9, 10, 9, 9, 9, 9, 9, 8, 7, 6, 5, 3, 1, 1, 3, 3, 3, 3, 3, 3, 2, 1, 0, -1, -3, -3, -3, -3, -2, -3, -4, -4, -3, -4, -5, -6, -6, -5, -5, -4, -3, -2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20, 20, 17, 16, 16, 15, 15, 15, 15, 13, 13, 13, 13, 14, 15, 16, 18, 18, 16, 14, 12, 10, 8, 5, 5, 5, 4, 4, 4, 4, 4, 4, 2, 0, -2, -2, -2, -4, -4, -2, 0, 0, -2, -4, -6, -6, -6, -8, -10, -12, -14, -16, -15, -13, -12, -11, -11, -11, -11, -13, -13, -13, -13, -13, -14, -16, -18, -18, -18, -18, -16, -16, -16, -14, -13, -14, -15, -15, -14, -14, -12, -11, -12, -13, -13, -12, -13, -14, -15, -15, -13, -11, -9, -7, -5, -5, -5, -3, -1, -1, -1, -1, -3, -5, -5, -3, -3, -3, -1, -1, -1, -1, -3, -3, -3, -4, -6, -6, -4, -2, 0, 0, 0, 0, -2, -2, -2, -3, -5, -7, -9, -11, -13, -13, -11, -9, -7, -6, -6, -6, -6, -4, -2, -2, -4, -6, -8, -7, -5, -3, -2, -2, -2, -2, 0, 0, -2, -4, -4, -2, 0, 2, 2, 1, 1, -1, -3, -5, -7, -10, -10, -10, -10, -8, -7, -7, -5, -3, -2, -4, -4, -4, -6, -8, -10, -12, -12, -12, -12, -12, -14, -13, -13, -13, -11, -11, -11, -11, -11, -11, -11, -9, -7, -5, -3, -1, -1, -1, -1, -1, 1, 1, 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 22, 19, 18, 20, 22, 24, 23, 22, 24, 26, 28, 27, 24, 23, 25, 28, 28, 28, 27, 26, 26, 23, 20, 17, 14, 14, 14, 11, 11, 11, 11, 13, 15, 16, 16, 16, 15, 15, 14, 14, 12, 10, 9, 11, 13, 15, 17, 17, 14, 13, 13, 12, 12, 10, 9, 11, 13, 15, 17, 19, 19, 16, 13, 10, 7, 4, 1, 1, 2, 2, 4, 7, 10, 13, 13, 13, 12, 12, 12, 9, 6, 6, 6, 3, 0, 0, 0, 0, 2, 3, 3, 3, 3, 5, 7, 7, 7, 9, 11, 13, 15, 18, 18, 15, 12, 9, 8, 10, 13, 13, 13, 15, 18, 21, 24, 27, 27, 23, 19, 15, 11, 10, 9, 9, 12, 16, 19, 22, 23, 19, 14, 13, 16, 16, 15, 15, 14, 17, 20, 20, 19, 19, 18, 17, 14, 13, 15, 15, 12, 11, 13, 16, 19, 19, 18, 20, 20, 19, 18, 18, 17, 17, 16, 16, 16, 15, 17, 17, 16, 16, 13, 12, 12, 11, 11, 9, 9, 9, 9, 11, 11, 9, 7, 5, 3, 1, 1, 1, -1, -1, 1, 3, 5, 7, 9, 11, 12, 9, 6, 6, 6, 6, 8, 8, 7, 9, 11, 13, 13, 12, 14, 16, 18, 20, 20, 20, 22, 24, 26, 25, 25, 27, 29, 28, 27, 26, 23, 22, 22, 21, 21, 20, 22, 24, 26, 28, 27, 24, 21, 21, 21, 18, 17, 17, 14, 11, 11, 11, 10, 10, 7, 6, 6, 4, 3, 5, 5, 3, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 0, 0, 1, 2, 3, 4, 3, 1, -1, -3, -3, -3, -3, -2, -3, -4, -6, -8, -10, -10, -10, -12, -12, -12, -12, -10, -10, -11, -12, -14, -16, -18, -20, -22, -24, -26, -28, -27, -27, -26, -26, -25, -25, -27, -26, -24, -22, -22, -22, -22, -24, -24, -24, -24, -23, -23, -22, -22, -21, -20, -19, -17, -15, -13, -11, -9, -7, -7, -9, -9, -9, -11, -13, -15, -17, -16, -14, -13, -15, -14, -14, -14, -12, -10, -8, -7, -9, -11, -13, -15, -14, -14, -13, -13, -15, -17, -19, -18, -18, -17, -17, -16, -16, -18, -20, -22, -21, -21, -21, -21, -21, -20, -21, -22, -24, -24, -22, -22, -24, -26, -25, -23, -21, -19, -18, -17, -17, -19, -21, -23, -25, -27, -29, -31, -30, -29, -28, -26, -25, -24, -24, -23, -23, -25, -24, -24, -24, -22, -20, -18, -18, -20, -20, -20, -20, -18, -16, -16, -16, -14, -12, -10, -8, -6, -4, -4, -4, -4, -4, -2, 0, 2, 4, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 4, 5, 6, 5, 3, 1, 1, 1, 1, 1, 1, 1, 0, -1, -1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, -1, -2, -3, -4, -4, -2, 0, 0, 0, 1, 3, 5, 7, 7, 5, 3, 3, 3, 3, 3 }; + for( int i = 0; i < 1024; i++ ) + { + assertEquals( (short) (decoded[i] << 8), buffer.getShort(), "Bad element at " + i ); + } + + assertEquals( 0, buffer.remaining(), "Must have read all bytes" ); + } +} diff --git a/src/test/kotlin/dan200/computercraft/client/sound/DfpwmStreamTest.java b/src/test/kotlin/dan200/computercraft/client/sound/DfpwmStreamTest.java deleted file mode 100644 index 52a4958a9..000000000 --- a/src/test/kotlin/dan200/computercraft/client/sound/DfpwmStreamTest.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of ComputerCraft - http://www.computercraft.info - * Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission. - * Send enquiries to dratcliffe@gmail.com - */ -package dan200.computercraft.client.sound; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import org.junit.jupiter.api.Test; - -import java.nio.ByteBuffer; - -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class DfpwmStreamTest -{ - @Test - public void testDecodesBytes() - { - DfpwmStream stream = new DfpwmStream(); - - ByteBuf input = ByteBufAllocator.DEFAULT.buffer(); - input.writeBytes( new byte[] { 43, -31, 33, 44, 30, -16, -85, 23, -3, -55, 46, -70, 68, -67, 74, -96, -68, 16, 94, -87, -5, 87, 11, -16, 19, 92, 85, -71, 126, 5, -84, 64, 17, -6, 85, -11, -1, -87, -12, 1, 85, -56, 33, -80, 82, 104, -93, 17, 126, 23, 91, -30, 37, -32, 117, -72, -58, 11, -76, 19, -108, 86, -65, -10, -1, -68, -25, 10, -46, 85, 124, -54, 15, -24, 43, -94, 117, 63, -36, 15, -6, 88, 87, -26, -83, 106, 41, 13, -28, -113, -10, -66, 119, -87, -113, 68, -55, 40, -107, 62, 20, 72, 3, -96, 114, -87, -2, 39, -104, 30, 20, 42, 84, 24, 47, 64, 43, 61, -35, 95, -65, 42, 61, 42, -50, 4, -9, 81 } ); - stream.push( input ); - - byte[] values = new byte[1024]; - ByteBuffer buffer = stream.read( 2048 ); - assertEquals( 1024, buffer.remaining(), "Must have read 1024 bytes" ); - buffer.get( values ); - assertEquals( 0, buffer.remaining() ); - - assertArrayEquals( - new byte[] { -127, -126, -126, -126, -126, -126, -126, -127, -127, -127, -128, 127, 126, 126, 127, -128, -127, -128, 127, 125, 123, 123, 123, 121, 119, 117, 117, 119, 119, 119, 119, 118, 116, 116, 118, 120, 122, 122, 120, 118, 116, 114, 112, 110, 111, 113, 116, 119, 122, 125, 126, 126, 126, 126, 126, 126, -128, -125, -122, -121, -121, -121, -124, -127, -127, -127, -127, -125, -123, -121, -119, -116, -113, -113, -116, -116, -116, -119, -119, -117, -116, -116, -114, -112, -111, -111, -111, -114, -117, -117, -117, -118, -116, -114, -114, -115, -115, -118, -119, -119, -121, -123, -124, -124, -124, -124, -124, -122, -120, -118, -118, -118, -118, -118, -118, -118, -119, -120, -120, -120, -121, -122, -124, -126, -128, -128, -128, -128, -128, 127, 127, -128, -127, -125, -125, -125, -125, -126, -128, 126, 126, 126, 125, 123, 121, 121, 123, 125, 127, 127, 127, 127, 127, 127, 126, 126, 127, 127, 127, 127, -128, -127, -127, -127, -126, -125, -124, -123, -122, -121, -119, -119, -119, -119, -119, -119, -119, -118, -118, -118, -118, -119, -120, -121, -122, -124, -126, -128, -128, -126, -124, -122, -120, -118, -118, -120, -121, -121, -123, -125, -127, 127, -128, -126, -124, -123, -123, -123, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -125, -125, -124, -123, -123, -123, -123, -123, -122, -121, -120, -119, -118, -119, -119, -119, -119, -119, -120, -121, -122, -123, -125, -127, -127, -125, -125, -125, -125, -125, -125, -126, -127, -128, 127, 125, 125, 125, 125, 126, 125, 124, 124, 125, 124, 123, 122, 122, 123, 123, 124, 125, 126, -128, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -125, -124, -123, -122, -121, -120, -118, -116, -114, -112, -110, -108, -108, -111, -112, -112, -113, -113, -113, -113, -115, -115, -115, -115, -114, -113, -112, -110, -110, -112, -114, -116, -118, -120, -123, -123, -123, -124, -124, -124, -124, -124, -124, -126, -128, 126, 126, 126, 124, 124, 126, -128, -128, 126, 124, 122, 122, 122, 120, 118, 116, 114, 112, 113, 115, 116, 117, 117, 117, 117, 115, 115, 115, 115, 115, 114, 112, 110, 110, 110, 110, 112, 112, 112, 114, 115, 114, 113, 113, 114, 114, 116, 117, 116, 115, 115, 116, 115, 114, 113, 113, 115, 117, 119, 121, 123, 123, 123, 125, 127, 127, 127, 127, 125, 123, 123, 125, 125, 125, 127, 127, 127, 127, 125, 125, 125, 124, 122, 122, 124, 126, -128, -128, -128, -128, 126, 126, 126, 125, 123, 121, 119, 117, 115, 115, 117, 119, 121, 122, 122, 122, 122, 124, 126, 126, 124, 122, 120, 121, 123, 125, 126, 126, 126, 126, -128, -128, 126, 124, 124, 126, -128, -126, -126, -127, -127, 127, 125, 123, 121, 118, 118, 118, 118, 120, 121, 121, 123, 125, 126, 124, 124, 124, 122, 120, 118, 116, 116, 116, 116, 116, 114, 115, 115, 115, 117, 117, 117, 117, 117, 117, 117, 119, 121, 123, 125, 127, 127, 127, 127, 127, -127, -127, -127, -126, -124, -122, -120, -118, -116, -114, -112, -110, -108, -106, -106, -109, -110, -108, -106, -104, -105, -106, -104, -102, -100, -101, -104, -105, -103, -100, -100, -100, -101, -102, -102, -105, -108, -111, -114, -114, -114, -117, -117, -117, -117, -115, -113, -112, -112, -112, -113, -113, -114, -114, -116, -118, -119, -117, -115, -113, -111, -111, -114, -115, -115, -116, -116, -118, -119, -117, -115, -113, -111, -109, -109, -112, -115, -118, -121, -124, -127, -127, -126, -126, -124, -121, -118, -115, -115, -115, -116, -116, -116, -119, -122, -122, -122, -125, -128, -128, -128, -128, -126, -125, -125, -125, -125, -123, -121, -121, -121, -119, -117, -115, -113, -110, -110, -113, -116, -119, -120, -118, -115, -115, -115, -113, -110, -107, -104, -101, -101, -105, -109, -113, -117, -118, -119, -119, -116, -112, -109, -106, -105, -109, -114, -115, -112, -112, -113, -113, -114, -111, -108, -108, -109, -109, -110, -111, -114, -115, -113, -113, -116, -117, -115, -112, -109, -109, -110, -108, -108, -109, -110, -110, -111, -111, -112, -112, -112, -113, -111, -111, -112, -112, -115, -116, -116, -117, -117, -119, -119, -119, -119, -117, -117, -119, -121, -123, -125, -127, -127, -127, 127, 127, -127, -125, -123, -121, -119, -117, -116, -119, -122, -122, -122, -122, -120, -120, -121, -119, -117, -115, -115, -116, -114, -112, -110, -108, -108, -108, -106, -104, -102, -103, -103, -101, -99, -100, -101, -102, -105, -106, -106, -107, -107, -108, -106, -104, -102, -100, -101, -104, -107, -107, -107, -110, -111, -111, -114, -117, -117, -117, -118, -118, -121, -122, -122, -124, -125, -123, -123, -125, -127, -127, -127, -127, -127, 127, 127, 127, 127, 127, 127, -128, 127, 127, -128, -128, -127, -126, -125, -124, -125, -127, 127, 125, 125, 125, 125, 126, 125, 124, 122, 120, 118, 118, 118, 116, 116, 116, 116, 118, 118, 117, 116, 114, 112, 110, 108, 106, 104, 102, 100, 101, 101, 102, 102, 103, 103, 101, 102, 104, 106, 106, 106, 106, 104, 104, 104, 104, 105, 105, 106, 106, 107, 108, 109, 111, 113, 115, 117, 119, 121, 121, 119, 119, 119, 117, 115, 113, 111, 112, 114, 115, 113, 114, 114, 114, 116, 118, 120, 121, 119, 117, 115, 113, 114, 114, 115, 115, 113, 111, 109, 110, 110, 111, 111, 112, 112, 110, 108, 106, 107, 107, 107, 107, 107, 108, 107, 106, 104, 104, 106, 106, 104, 102, 103, 105, 107, 109, 110, 111, 111, 109, 107, 105, 103, 101, 99, 97, 98, 99, 100, 102, 103, 104, 104, 105, 105, 103, 104, 104, 104, 106, 108, 110, 110, 108, 108, 108, 108, 110, 112, 112, 112, 114, 116, 118, 120, 122, 124, 124, 124, 124, 124, 126, -128, -126, -124, -122, -122, -123, -123, -123, -123, -123, -123, -123, -123, -125, -125, -125, -125, -124, -123, -122, -123, -125, -127, -127, -127, -127, -127, -127, -127, -128, 127, 127, -128, -127, -127, -128, -128, -127, -127, -128, -128, -128, 127, 126, 125, 124, 124, 126, -128, -128, -128, -127, -125, -123, -121, -121, -123, -125, -125, -125, -125, -125 }, - values, - "Decoded values must match." - ); - } -} From 1fd57a874f4668ea42acfb07305aa30f789bc903 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Mon, 30 May 2022 13:44:11 +0100 Subject: [PATCH 03/14] Send terminal text and colours separately This gives us slightly better compression, as backgrounds will often be a single run of colours while the foreground won't be. In practice, this is rarely an issue, as most terminals are small, but worth doing anyway. --- .../java/dan200/computercraft/core/terminal/Terminal.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/dan200/computercraft/core/terminal/Terminal.java b/src/main/java/dan200/computercraft/core/terminal/Terminal.java index 6385a84dc..45fa8b6b4 100644 --- a/src/main/java/dan200/computercraft/core/terminal/Terminal.java +++ b/src/main/java/dan200/computercraft/core/terminal/Terminal.java @@ -324,9 +324,9 @@ public synchronized void write( PacketBuffer buffer ) TextBuffer textColour = this.textColour[y]; TextBuffer backColour = backgroundColour[y]; + for( int x = 0; x < width; x++ ) buffer.writeByte( text.charAt( x ) & 0xFF ); for( int x = 0; x < width; x++ ) { - buffer.writeByte( text.charAt( x ) & 0xFF ); buffer.writeByte( getColour( backColour.charAt( x ), Colour.BLACK ) << 4 | getColour( textColour.charAt( x ), Colour.WHITE ) @@ -353,10 +353,9 @@ public synchronized void read( PacketBuffer buffer ) TextBuffer textColour = this.textColour[y]; TextBuffer backColour = backgroundColour[y]; + for( int x = 0; x < width; x++ ) text.setChar( x, (char) (buffer.readByte() & 0xFF) ); for( int x = 0; x < width; x++ ) { - text.setChar( x, (char) (buffer.readByte() & 0xFF) ); - byte colour = buffer.readByte(); backColour.setChar( x, base16.charAt( (colour >> 4) & 0xF ) ); textColour.setChar( x, base16.charAt( colour & 0xF ) ); From 4411756b0652eb78a8faf6ccfa0cd325af34a4c7 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Mon, 30 May 2022 14:25:51 +0100 Subject: [PATCH 04/14] Use a queue rather than a set in TickScheduler We now track whether a tile is enqueued or not via an atomic boolean on the block entity itself, rather than using a hash set. This is significantly faster (>10x). This is mostly intended for monitors, as they're the only peripheral likely to call TickScheduler.schedule lots of times (rather than modems, which just invoke it when opening/closing a channel[^1])[^2]. This change is enough to allow me to update 120 monitors each tick without any major tearing. [^1]: GPS does do this on each gps.locate call, so it will help there, but modems are typically limited by other computers sending messages, not peripheral calls themselves. [^2]: Note that montitors implement their own change tracking, so still only call this once per tick. But it's enough to introduce some latency! --- .../shared/common/TileGeneric.java | 8 +++++++ .../shared/util/TickScheduler.java | 23 +++++++------------ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/main/java/dan200/computercraft/shared/common/TileGeneric.java b/src/main/java/dan200/computercraft/shared/common/TileGeneric.java index 9ade77ceb..cc24dd1c6 100644 --- a/src/main/java/dan200/computercraft/shared/common/TileGeneric.java +++ b/src/main/java/dan200/computercraft/shared/common/TileGeneric.java @@ -19,9 +19,17 @@ import net.minecraftforge.common.util.Constants; import javax.annotation.Nonnull; +import java.util.concurrent.atomic.AtomicBoolean; public abstract class TileGeneric extends TileEntity { + /** + * Is this block enqueued to be updated next tick? This should only be read/written by the tick scheduler. + * + * @see dan200.computercraft.shared.util.TickScheduler + */ + public final AtomicBoolean scheduled = new AtomicBoolean(); + public TileGeneric( TileEntityType type ) { super( type ); diff --git a/src/main/java/dan200/computercraft/shared/util/TickScheduler.java b/src/main/java/dan200/computercraft/shared/util/TickScheduler.java index d5452099d..5fcf7ffe4 100644 --- a/src/main/java/dan200/computercraft/shared/util/TickScheduler.java +++ b/src/main/java/dan200/computercraft/shared/util/TickScheduler.java @@ -5,10 +5,8 @@ */ package dan200.computercraft.shared.util; -import com.google.common.collect.MapMaker; import dan200.computercraft.ComputerCraft; import dan200.computercraft.shared.common.TileGeneric; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ITickList; import net.minecraft.world.World; @@ -16,9 +14,8 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; -import java.util.Collections; -import java.util.Iterator; -import java.util.Set; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedDeque; /** * A thread-safe version of {@link ITickList#scheduleTick(BlockPos, Object, int)}. @@ -32,16 +29,12 @@ private TickScheduler() { } - private static final Set toTick = Collections.newSetFromMap( - new MapMaker() - .weakKeys() - .makeMap() - ); + private static final Queue toTick = new ConcurrentLinkedDeque<>(); public static void schedule( TileGeneric tile ) { World world = tile.getLevel(); - if( world != null && !world.isClientSide ) toTick.add( tile ); + if( world != null && !world.isClientSide && !tile.scheduled.getAndSet( true ) ) toTick.add( tile ); } @SubscribeEvent @@ -49,11 +42,11 @@ public static void tick( TickEvent.ServerTickEvent event ) { if( event.phase != TickEvent.Phase.START ) return; - Iterator iterator = toTick.iterator(); - while( iterator.hasNext() ) + TileGeneric tile; + while( (tile = toTick.poll()) != null ) { - TileEntity tile = iterator.next(); - iterator.remove(); + tile.scheduled.set( false ); + if( tile.isRemoved() ) continue; World world = tile.getLevel(); BlockPos pos = tile.getBlockPos(); From cd76425877395b50f615015935bdd3df369a864a Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Mon, 30 May 2022 17:42:33 +0100 Subject: [PATCH 05/14] Tiny bits and bobs Oh my, what good commit discipline! - Remove unused method in NetworkHandler. - Correctly pass the transformation to ComputerBorderRenderer. --- .../dan200/computercraft/client/gui/GuiComputer.java | 2 +- .../client/render/ComputerBorderRenderer.java | 11 ++--------- .../computercraft/shared/network/NetworkHandler.java | 7 ------- 3 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/main/java/dan200/computercraft/client/gui/GuiComputer.java b/src/main/java/dan200/computercraft/client/gui/GuiComputer.java index 87da21608..bf2e39de7 100644 --- a/src/main/java/dan200/computercraft/client/gui/GuiComputer.java +++ b/src/main/java/dan200/computercraft/client/gui/GuiComputer.java @@ -74,7 +74,7 @@ public void renderBg( @Nonnull MatrixStack stack, float partialTicks, int mouseX { // Draw a border around the terminal ComputerBorderRenderer.render( - ComputerBorderRenderer.getTexture( family ), terminal.x, terminal.y, getBlitOffset(), + stack.last().pose(), ComputerBorderRenderer.getTexture( family ), terminal.x, terminal.y, getBlitOffset(), FULL_BRIGHT_LIGHTMAP, terminal.getWidth(), terminal.getHeight() ); ComputerSidebar.renderBackground( stack, leftPos, topPos + sidebarYOffset ); diff --git a/src/main/java/dan200/computercraft/client/render/ComputerBorderRenderer.java b/src/main/java/dan200/computercraft/client/render/ComputerBorderRenderer.java index fceca4040..ebd8a96c7 100644 --- a/src/main/java/dan200/computercraft/client/render/ComputerBorderRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/ComputerBorderRenderer.java @@ -23,13 +23,6 @@ public class ComputerBorderRenderer public static final ResourceLocation BACKGROUND_COMMAND = new ResourceLocation( ComputerCraft.MOD_ID, "textures/gui/corners_command.png" ); public static final ResourceLocation BACKGROUND_COLOUR = new ResourceLocation( ComputerCraft.MOD_ID, "textures/gui/corners_colour.png" ); - private static final Matrix4f IDENTITY = new Matrix4f(); - - static - { - IDENTITY.setIdentity(); - } - /** * The margin between the terminal and its border. */ @@ -91,10 +84,10 @@ public static RenderType getRenderType( ResourceLocation location ) return RenderType.text( location ); } - public static void render( ResourceLocation location, int x, int y, int z, int light, int width, int height ) + public static void render( Matrix4f transform, ResourceLocation location, int x, int y, int z, int light, int width, int height ) { IRenderTypeBuffer.Impl source = IRenderTypeBuffer.immediate( Tessellator.getInstance().getBuilder() ); - render( IDENTITY, source.getBuffer( getRenderType( location ) ), x, y, z, light, width, height, false, 1, 1, 1 ); + render( transform, source.getBuffer( getRenderType( location ) ), x, y, z, light, width, height, false, 1, 1, 1 ); source.endBatch(); } diff --git a/src/main/java/dan200/computercraft/shared/network/NetworkHandler.java b/src/main/java/dan200/computercraft/shared/network/NetworkHandler.java index e28f5d23e..5dca012cc 100644 --- a/src/main/java/dan200/computercraft/shared/network/NetworkHandler.java +++ b/src/main/java/dan200/computercraft/shared/network/NetworkHandler.java @@ -23,7 +23,6 @@ import net.minecraftforge.fml.network.simple.SimpleChannel; import java.util.function.Function; -import java.util.function.Supplier; public final class NetworkHandler { @@ -111,10 +110,4 @@ private static void registerMainThread( int id, Netwo } ) .add(); } - - @SuppressWarnings( "unchecked" ) - private static Class getType( Supplier supplier ) - { - return (Class) supplier.get().getClass(); - } } From 178126725e4101ca198454b0f32504f663e55722 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Wed, 1 Jun 2022 00:47:00 +0100 Subject: [PATCH 06/14] Add more eldritch horrors to the build system - Add a basic data exporter to the test mod, run via a /ccexport command. This dumps all of CC's recipes, and the item icons needed to display those recipes. - Post-process our illuaminate HTML, applying several transforms: - Apply syntax highlighting to code blocks. We previously did this at runtime, so this shaves some bytes off the bundle. - Convert a mc-recipe custom element into a recipe grid using react/react-dom. - Add a recipe to the speaker page. I'll probably clean this up in the future (though someone else is free to too!), but it's a nice start and proof-of-concept. I tried so hard here to use next.js and MDX instead of rolling our own solution again, but it's so hard to make it play well with "normal" Markdown, which isn't explicitly written for MDX. --- build.gradle | 28 +- config/checkstyle/checkstyle.xml | 4 +- package-lock.json | 1719 +++++++++++++++++ package.json | 10 + .../peripheral/speaker/SpeakerPeripheral.java | 3 + .../dan200/computercraft/export/Exporter.java | 153 ++ .../computercraft/export/ImageRenderer.java | 84 + .../dan200/computercraft/export/JsonDump.java | 65 + src/web/components/Recipe.tsx | 44 + src/web/components/WithExport.tsx | 23 + src/web/components/support.tsx | 25 + src/web/export/index.json | 760 ++++++++ src/web/export/items/computercraft/cable.png | Bin 0 -> 375 bytes .../items/computercraft/computer_advanced.png | Bin 0 -> 2564 bytes .../items/computercraft/computer_command.png | Bin 0 -> 3180 bytes .../items/computercraft/computer_normal.png | Bin 0 -> 1229 bytes src/web/export/items/computercraft/disk.png | Bin 0 -> 189 bytes .../export/items/computercraft/disk_drive.png | Bin 0 -> 1327 bytes .../items/computercraft/monitor_advanced.png | Bin 0 -> 2463 bytes .../items/computercraft/monitor_normal.png | Bin 0 -> 1172 bytes .../pocket_computer_advanced.png | Bin 0 -> 158 bytes .../computercraft/pocket_computer_normal.png | Bin 0 -> 158 bytes .../items/computercraft/printed_book.png | Bin 0 -> 287 bytes .../items/computercraft/printed_page.png | Bin 0 -> 208 bytes .../items/computercraft/printed_pages.png | Bin 0 -> 259 bytes .../export/items/computercraft/printer.png | Bin 0 -> 1306 bytes .../export/items/computercraft/speaker.png | Bin 0 -> 1386 bytes .../items/computercraft/treasure_disk.png | Bin 0 -> 189 bytes .../items/computercraft/turtle_advanced.png | Bin 0 -> 1684 bytes .../items/computercraft/turtle_normal.png | Bin 0 -> 977 bytes .../items/computercraft/wired_modem.png | Bin 0 -> 593 bytes .../items/computercraft/wired_modem_full.png | Bin 0 -> 1272 bytes .../computercraft/wireless_modem_advanced.png | Bin 0 -> 1027 bytes .../computercraft/wireless_modem_normal.png | Bin 0 -> 620 bytes src/web/export/items/minecraft/black_dye.png | Bin 0 -> 218 bytes src/web/export/items/minecraft/blue_dye.png | Bin 0 -> 228 bytes src/web/export/items/minecraft/brown_dye.png | Bin 0 -> 218 bytes src/web/export/items/minecraft/chest.png | Bin 0 -> 1603 bytes .../export/items/minecraft/command_block.png | Bin 0 -> 1597 bytes src/web/export/items/minecraft/cyan_dye.png | Bin 0 -> 243 bytes src/web/export/items/minecraft/ender_eye.png | Bin 0 -> 278 bytes .../export/items/minecraft/ender_pearl.png | Bin 0 -> 266 bytes src/web/export/items/minecraft/glass_pane.png | Bin 0 -> 186 bytes src/web/export/items/minecraft/gold_block.png | Bin 0 -> 1192 bytes src/web/export/items/minecraft/gold_ingot.png | Bin 0 -> 240 bytes .../export/items/minecraft/golden_apple.png | Bin 0 -> 257 bytes src/web/export/items/minecraft/gray_dye.png | Bin 0 -> 229 bytes src/web/export/items/minecraft/green_dye.png | Bin 0 -> 236 bytes src/web/export/items/minecraft/iron_ingot.png | Bin 0 -> 240 bytes src/web/export/items/minecraft/leather.png | Bin 0 -> 242 bytes .../export/items/minecraft/light_blue_dye.png | Bin 0 -> 224 bytes .../export/items/minecraft/light_gray_dye.png | Bin 0 -> 229 bytes src/web/export/items/minecraft/lime_dye.png | Bin 0 -> 221 bytes .../export/items/minecraft/magenta_dye.png | Bin 0 -> 220 bytes src/web/export/items/minecraft/note_block.png | Bin 0 -> 1024 bytes src/web/export/items/minecraft/orange_dye.png | Bin 0 -> 232 bytes src/web/export/items/minecraft/pink_dye.png | Bin 0 -> 220 bytes src/web/export/items/minecraft/purple_dye.png | Bin 0 -> 220 bytes src/web/export/items/minecraft/red_dye.png | Bin 0 -> 233 bytes src/web/export/items/minecraft/redstone.png | Bin 0 -> 236 bytes src/web/export/items/minecraft/stone.png | Bin 0 -> 1040 bytes src/web/export/items/minecraft/string.png | Bin 0 -> 193 bytes src/web/export/items/minecraft/white_dye.png | Bin 0 -> 245 bytes src/web/export/items/minecraft/yellow_dye.png | Bin 0 -> 235 bytes src/web/index.tsx | 2 - src/web/prism.js | 5 - src/web/styles.css | 87 +- src/web/transform.tsx | 53 + tsconfig.json | 3 + 69 files changed, 3051 insertions(+), 17 deletions(-) create mode 100644 src/testMod/java/dan200/computercraft/export/Exporter.java create mode 100644 src/testMod/java/dan200/computercraft/export/ImageRenderer.java create mode 100644 src/testMod/java/dan200/computercraft/export/JsonDump.java create mode 100644 src/web/components/Recipe.tsx create mode 100644 src/web/components/WithExport.tsx create mode 100644 src/web/components/support.tsx create mode 100644 src/web/export/index.json create mode 100644 src/web/export/items/computercraft/cable.png create mode 100644 src/web/export/items/computercraft/computer_advanced.png create mode 100644 src/web/export/items/computercraft/computer_command.png create mode 100644 src/web/export/items/computercraft/computer_normal.png create mode 100644 src/web/export/items/computercraft/disk.png create mode 100644 src/web/export/items/computercraft/disk_drive.png create mode 100644 src/web/export/items/computercraft/monitor_advanced.png create mode 100644 src/web/export/items/computercraft/monitor_normal.png create mode 100644 src/web/export/items/computercraft/pocket_computer_advanced.png create mode 100644 src/web/export/items/computercraft/pocket_computer_normal.png create mode 100644 src/web/export/items/computercraft/printed_book.png create mode 100644 src/web/export/items/computercraft/printed_page.png create mode 100644 src/web/export/items/computercraft/printed_pages.png create mode 100644 src/web/export/items/computercraft/printer.png create mode 100644 src/web/export/items/computercraft/speaker.png create mode 100644 src/web/export/items/computercraft/treasure_disk.png create mode 100644 src/web/export/items/computercraft/turtle_advanced.png create mode 100644 src/web/export/items/computercraft/turtle_normal.png create mode 100644 src/web/export/items/computercraft/wired_modem.png create mode 100644 src/web/export/items/computercraft/wired_modem_full.png create mode 100644 src/web/export/items/computercraft/wireless_modem_advanced.png create mode 100644 src/web/export/items/computercraft/wireless_modem_normal.png create mode 100644 src/web/export/items/minecraft/black_dye.png create mode 100644 src/web/export/items/minecraft/blue_dye.png create mode 100644 src/web/export/items/minecraft/brown_dye.png create mode 100644 src/web/export/items/minecraft/chest.png create mode 100644 src/web/export/items/minecraft/command_block.png create mode 100644 src/web/export/items/minecraft/cyan_dye.png create mode 100644 src/web/export/items/minecraft/ender_eye.png create mode 100644 src/web/export/items/minecraft/ender_pearl.png create mode 100644 src/web/export/items/minecraft/glass_pane.png create mode 100644 src/web/export/items/minecraft/gold_block.png create mode 100644 src/web/export/items/minecraft/gold_ingot.png create mode 100644 src/web/export/items/minecraft/golden_apple.png create mode 100644 src/web/export/items/minecraft/gray_dye.png create mode 100644 src/web/export/items/minecraft/green_dye.png create mode 100644 src/web/export/items/minecraft/iron_ingot.png create mode 100644 src/web/export/items/minecraft/leather.png create mode 100644 src/web/export/items/minecraft/light_blue_dye.png create mode 100644 src/web/export/items/minecraft/light_gray_dye.png create mode 100644 src/web/export/items/minecraft/lime_dye.png create mode 100644 src/web/export/items/minecraft/magenta_dye.png create mode 100644 src/web/export/items/minecraft/note_block.png create mode 100644 src/web/export/items/minecraft/orange_dye.png create mode 100644 src/web/export/items/minecraft/pink_dye.png create mode 100644 src/web/export/items/minecraft/purple_dye.png create mode 100644 src/web/export/items/minecraft/red_dye.png create mode 100644 src/web/export/items/minecraft/redstone.png create mode 100644 src/web/export/items/minecraft/stone.png create mode 100644 src/web/export/items/minecraft/string.png create mode 100644 src/web/export/items/minecraft/white_dye.png create mode 100644 src/web/export/items/minecraft/yellow_dye.png delete mode 100644 src/web/prism.js create mode 100644 src/web/transform.tsx diff --git a/build.gradle b/build.gradle index 3ea9a6beb..16a6d3dd1 100644 --- a/build.gradle +++ b/build.gradle @@ -158,7 +158,7 @@ accessTransformer file('src/testMod/resources/META-INF/accesstransformer.cfg') testModImplementation sourceSets.main.output - cctJavadoc 'cc.tweaked:cct-javadoc:1.4.5' + cctJavadoc 'cc.tweaked:cct-javadoc:1.4.6' } // Compile tasks @@ -298,7 +298,7 @@ commandLine mkCommand('"node_modules/.bin/rollup" --config rollup.config.js') task illuaminateDocs(type: Exec, dependsOn: [rollup, luaJavadoc]) { group = "build" - description = "Bundles JS into rollup" + description = "Generates docs using Illuaminate" inputs.files(fileTree("doc")).withPropertyName("docs") inputs.files(fileTree("src/main/resources/data/computercraft/lua/rom")).withPropertyName("lua rom") @@ -311,7 +311,20 @@ task illuaminateDocs(type: Exec, dependsOn: [rollup, luaJavadoc]) { commandLine mkCommand('"bin/illuaminate" doc-gen') } -task docWebsite(type: Copy, dependsOn: [illuaminateDocs]) { +task jsxDocs(type: Exec, dependsOn: [illuaminateDocs]) { + group = "build" + description = "Post-processes documentation to statically render some dynamic content." + + inputs.files(fileTree("src/web")).withPropertyName("sources") + inputs.file("package-lock.json").withPropertyName("package-lock.json") + inputs.file("tsconfig.json").withPropertyName("Typescript config") + inputs.files(fileTree("$buildDir/docs/lua")) + outputs.dir("$buildDir/docs/site") + + commandLine mkCommand("'node_modules/.bin/ts-node' --esm src/web/transform.tsx") +} + +task docWebsite(type: Copy, dependsOn: [jsxDocs]) { from('doc') { include 'logo.png' include 'images/**' @@ -319,7 +332,14 @@ task docWebsite(type: Copy, dependsOn: [illuaminateDocs]) { from("$buildDir/rollup") { exclude 'index.js' } - into "${project.docsDir}/lua" + from("$buildDir/docs/lua") { + exclude '**/*.html' + } + from("src/web/export/items") { + into("images/items") + } + + into "${project.docsDir}/site" } // Check tasks diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index b96d5c3db..f67654f08 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -76,7 +76,9 @@ - + + + diff --git a/package-lock.json b/package-lock.json index ec3137ce0..2cfb30386 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,9 +15,18 @@ "devDependencies": { "@rollup/plugin-typescript": "^8.2.5", "@rollup/plugin-url": "^6.1.0", + "@types/glob": "^7.2.0", + "@types/react-dom": "^18.0.5", + "glob": "^8.0.3", + "react": "^18.1.0", + "react-dom": "^18.1.0", + "rehype": "^12.0.1", + "rehype-highlight": "^5.0.2", + "rehype-react": "^7.1.1", "requirejs": "^2.3.6", "rollup": "^2.33.1", "rollup-plugin-terser": "^7.0.2", + "ts-node": "^10.8.0", "typescript": "^4.0.5" } }, @@ -56,6 +65,79 @@ "node": ">=6.9.0" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz", + "integrity": "sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA==", + "dev": true, + "dependencies": { + "unist-util-visit": "^1.4.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", + "dev": true + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "dev": true, + "dependencies": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "dev": true, + "dependencies": { + "unist-util-is": "^3.0.0" + } + }, "node_modules/@rollup/plugin-typescript": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.3.0.tgz", @@ -108,18 +190,132 @@ "rollup": "^1.20.0||^2.0.0" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, "node_modules/@types/node": { "version": "16.11.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz", "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==", "dev": true }, + "node_modules/@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.0.9", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.9.tgz", + "integrity": "sha512-9bjbg1hJHUm4De19L1cHiW0Jvx3geel6Qczhjd0qY5VKVE2X5+x77YxAepuCwVh4vrgZJdgEJw48zrhRIeF4Nw==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.5.tgz", + "integrity": "sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -132,12 +328,53 @@ "node": ">=4" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -152,6 +389,26 @@ "node": ">=4" } }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -167,12 +424,43 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "node_modules/comma-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", + "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -188,6 +476,40 @@ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dev": true, + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -208,6 +530,25 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -229,6 +570,200 @@ "node": ">=4" } }, + "node_modules/hast-to-hyperscript": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-10.0.1.tgz", + "integrity": "sha512-dhIVGoKCQVewFi+vz3Vt567E4ejMppS1haBRL6TEmeLeJVB1i/FJIIg/e6s1Bwn0g5qtYojHEKvyGA+OZuyifw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.0.tgz", + "integrity": "sha512-m8yhANIAccpU4K6+121KpPP55sSl9/samzQSQGpb0mTExcNh2WlvjtMwSWFhg6uqD4Rr6Nfa8N6TMypQM51rzQ==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.2.tgz", + "integrity": "sha512-thjnlGAnwP8ef/GSO1Q8BfVk2gundnc2peGQqEg2kUt/IqesiGg/5mSwN2fE7nLzy61pg88NG6xV+UrGOrx9EA==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.0.tgz", + "integrity": "sha512-AyjlI2pTAZEOeu7GeBPZhROx0RHBnydkQIXlhnFzDi0qfXTmGUWoCYZtomHbrdrheV4VFUlPcfJ6LMF5T6sQzg==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.3.tgz", + "integrity": "sha512-/D/E5ymdPYhHpPkuTHOUkSatxr4w1ZKrZsG0Zv/3C2SRVT0JFJG53VS45AMrBtYk0wp5A7ksEhiC8QaOZM95+A==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.2", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.1.tgz", + "integrity": "sha512-7S3mOBxACy8syL45hCn3J7rHqYaXkxRfsX6LXEU5Shz4nt4GxdjtMUtG+T6G/ZLUHd7kslFAf14kAN71bz30xA==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "unist-util-find-after": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz", + "integrity": "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.0.2.tgz", + "integrity": "sha512-uA8ooUY4ipaBvKcMuPehTAB/YfFLSSzCwFSwT6ltJbocFUKH/GDHLN+tflq7lSRf9H86uOuxOFkh1KgIy3Gg2g==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/highlight.js": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.5.1.tgz", + "integrity": "sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "dev": true + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, "node_modules/is-core-module": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", @@ -241,6 +776,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-plain-obj": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz", + "integrity": "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", @@ -282,6 +829,33 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowlight": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-2.6.1.tgz", + "integrity": "sha512-t0ueDL6SIn9FKHipm78CNjWcJQv0xi6WCjYAICyO6GyPzoT7E58yom1mNwvI7AMwVe3pLwwFT0Bt2gml7uaUeQ==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "fault": "^2.0.0", + "highlight.js": "~11.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -297,6 +871,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -315,6 +895,33 @@ "node": ">=4.0.0" } }, + "node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -342,6 +949,16 @@ "url": "https://opencollective.com/preact" } }, + "node_modules/property-information": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", + "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -351,6 +968,115 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/react": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.1.0.tgz", + "integrity": "sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.1.0.tgz", + "integrity": "sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.22.0" + }, + "peerDependencies": { + "react": "^18.1.0" + } + }, + "node_modules/rehype": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-12.0.1.tgz", + "integrity": "sha512-ey6kAqwLM3X6QnMDILJthGvG1m1ULROS9NT4uG9IDCuv08SFyLlreSuvOa//DgEvbXx62DS6elGVqusWhRUbgw==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "rehype-parse": "^8.0.0", + "rehype-stringify": "^9.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-highlight": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-5.0.2.tgz", + "integrity": "sha512-ZNm8V8BQUDn05cJPzAu/PjiloaFFrh+Pt3bY+NCcdCggI7Uyl5mW0FGR7RATeIz5/ECUd1D8Kvjt4HaLPmnOMw==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-to-text": "^3.0.0", + "lowlight": "^2.0.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.4.tgz", + "integrity": "sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^7.0.0", + "parse5": "^6.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-react": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-7.1.1.tgz", + "integrity": "sha512-6yaitxM95JFsuTA74OH54OyvTAeRqR4/A6f45S2sEk2FEG04iGgsObcmEIFQRsjK9pfAhc74lR4iGf/W2G/sBw==", + "dev": true, + "dependencies": { + "@mapbox/hast-util-table-cell-style": "^0.2.0", + "@types/hast": "^2.0.0", + "hast-to-hyperscript": "^10.0.0", + "hast-util-whitespace": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=17" + } + }, + "node_modules/rehype-stringify": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.3.tgz", + "integrity": "sha512-kWiZ1bgyWlgOxpqD5HnxShKAdXtb2IUljn3hQAhySeak6IOQPPt6DeGnsIh4ixm7yKJWzm8TXFuC/lPfcWHJqw==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-to-html": "^8.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/requirejs": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", @@ -427,6 +1153,15 @@ } ] }, + "node_modules/scheduler": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.22.0.tgz", + "integrity": "sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -473,6 +1208,39 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", + "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.2.tgz", + "integrity": "sha512-MTxTVcEkorNtBbNpoFJPEh0kKdM6+QbMjLbaxmvaPMmayOXdr/AIVIIJX7FReUVweRBFJfZepK4A4AKgwuFpMQ==", + "dev": true, + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "dev": true, + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -510,6 +1278,59 @@ } } }, + "node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-node": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.0.tgz", + "integrity": "sha512-/fNd5Qh+zTt8Vt1KbYZjRHCE9sI5i7nqfD/dzBBRDeVXZXS6kToW6R7tTU6Nd4XavFs0mAVCg29Q//ML7WsZYA==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, "node_modules/tslib": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", @@ -527,6 +1348,166 @@ "engines": { "node": ">=4.2.0" } + }, + "node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-find-after": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-4.0.0.tgz", + "integrity": "sha512-gfpsxKQde7atVF30n5Gff2fQhAc4/HTOV4CvkXpTg9wRfQhZWdXitpyXHWB6YcYgnsxLx+4gGHeVjCTAAp9sjw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.0.tgz", + "integrity": "sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz", + "integrity": "sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vfile": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.2.tgz", + "integrity": "sha512-w0PLIugRY3Crkgw89TeMvHCzqCs/zpreR31hl4D92y6SOE07+bfJe+dK5Q2akwS+i/c801kzjoOr9gMcTe6IAA==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.0.1.tgz", + "integrity": "sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.2.tgz", + "integrity": "sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } } }, "dependencies": { @@ -556,6 +1537,72 @@ "js-tokens": "^4.0.0" } }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@mapbox/hast-util-table-cell-style": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz", + "integrity": "sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA==", + "dev": true, + "requires": { + "unist-util-visit": "^1.4.1" + }, + "dependencies": { + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", + "dev": true + }, + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "dev": true, + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "dev": true, + "requires": { + "unist-util-is": "^3.0.0" + } + } + } + }, "@rollup/plugin-typescript": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.3.0.tgz", @@ -588,18 +1635,123 @@ "picomatch": "^2.2.2" } }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dev": true, + "requires": { + "@types/unist": "*" + } + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, "@types/node": { "version": "16.11.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz", "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==", "dev": true }, + "@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "@types/react": { + "version": "18.0.9", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.9.tgz", + "integrity": "sha512-9bjbg1hJHUm4De19L1cHiW0Jvx3geel6Qczhjd0qY5VKVE2X5+x77YxAepuCwVh4vrgZJdgEJw48zrhRIeF4Nw==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.5.tgz", + "integrity": "sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true + }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "dev": true + }, + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -609,12 +1761,45 @@ "color-convert": "^1.9.0" } }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -626,6 +1811,18 @@ "supports-color": "^5.3.0" } }, + "character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true + }, + "character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -641,12 +1838,36 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "comma-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", + "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==", + "dev": true + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "csstype": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -659,6 +1880,33 @@ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dev": true, + "requires": { + "format": "^0.2.0" + } + }, + "format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -672,6 +1920,19 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -687,6 +1948,144 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "hast-to-hyperscript": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-10.0.1.tgz", + "integrity": "sha512-dhIVGoKCQVewFi+vz3Vt567E4ejMppS1haBRL6TEmeLeJVB1i/FJIIg/e6s1Bwn0g5qtYojHEKvyGA+OZuyifw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^5.0.0", + "web-namespaces": "^2.0.0" + } + }, + "hast-util-from-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.0.tgz", + "integrity": "sha512-m8yhANIAccpU4K6+121KpPP55sSl9/samzQSQGpb0mTExcNh2WlvjtMwSWFhg6uqD4Rr6Nfa8N6TMypQM51rzQ==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + } + }, + "hast-util-is-element": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.2.tgz", + "integrity": "sha512-thjnlGAnwP8ef/GSO1Q8BfVk2gundnc2peGQqEg2kUt/IqesiGg/5mSwN2fE7nLzy61pg88NG6xV+UrGOrx9EA==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" + } + }, + "hast-util-parse-selector": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.0.tgz", + "integrity": "sha512-AyjlI2pTAZEOeu7GeBPZhROx0RHBnydkQIXlhnFzDi0qfXTmGUWoCYZtomHbrdrheV4VFUlPcfJ6LMF5T6sQzg==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0" + } + }, + "hast-util-to-html": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.3.tgz", + "integrity": "sha512-/D/E5ymdPYhHpPkuTHOUkSatxr4w1ZKrZsG0Zv/3C2SRVT0JFJG53VS45AMrBtYk0wp5A7ksEhiC8QaOZM95+A==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.2", + "unist-util-is": "^5.0.0" + } + }, + "hast-util-to-text": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.1.tgz", + "integrity": "sha512-7S3mOBxACy8syL45hCn3J7rHqYaXkxRfsX6LXEU5Shz4nt4GxdjtMUtG+T6G/ZLUHd7kslFAf14kAN71bz30xA==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "unist-util-find-after": "^4.0.0" + } + }, + "hast-util-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz", + "integrity": "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==", + "dev": true + }, + "hastscript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.0.2.tgz", + "integrity": "sha512-uA8ooUY4ipaBvKcMuPehTAB/YfFLSSzCwFSwT6ltJbocFUKH/GDHLN+tflq7lSRf9H86uOuxOFkh1KgIy3Gg2g==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + } + }, + "highlight.js": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.5.1.tgz", + "integrity": "sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q==", + "dev": true + }, + "html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "dev": true + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true + }, "is-core-module": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", @@ -696,6 +2095,12 @@ "has": "^1.0.3" } }, + "is-plain-obj": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz", + "integrity": "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==", + "dev": true + }, "jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", @@ -730,6 +2135,26 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lowlight": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-2.6.1.tgz", + "integrity": "sha512-t0ueDL6SIn9FKHipm78CNjWcJQv0xi6WCjYAICyO6GyPzoT7E58yom1mNwvI7AMwVe3pLwwFT0Bt2gml7uaUeQ==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0", + "fault": "^2.0.0", + "highlight.js": "~11.5.0" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -739,6 +2164,12 @@ "semver": "^6.0.0" } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -751,6 +2182,30 @@ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -768,6 +2223,12 @@ "resolved": "https://registry.npmjs.org/preact/-/preact-10.6.1.tgz", "integrity": "sha512-ydCg+ISIq70vqiThvNWStZWLRjR9U2awP/JAmGdWUKm9+Tyuy+MqVdAIyEByeIspAVtD4GWC/SJtxO8XD4knVA==" }, + "property-information": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", + "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -777,6 +2238,86 @@ "safe-buffer": "^5.1.0" } }, + "react": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.1.0.tgz", + "integrity": "sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-dom": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.1.0.tgz", + "integrity": "sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.22.0" + } + }, + "rehype": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-12.0.1.tgz", + "integrity": "sha512-ey6kAqwLM3X6QnMDILJthGvG1m1ULROS9NT4uG9IDCuv08SFyLlreSuvOa//DgEvbXx62DS6elGVqusWhRUbgw==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0", + "rehype-parse": "^8.0.0", + "rehype-stringify": "^9.0.0", + "unified": "^10.0.0" + } + }, + "rehype-highlight": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-5.0.2.tgz", + "integrity": "sha512-ZNm8V8BQUDn05cJPzAu/PjiloaFFrh+Pt3bY+NCcdCggI7Uyl5mW0FGR7RATeIz5/ECUd1D8Kvjt4HaLPmnOMw==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0", + "hast-util-to-text": "^3.0.0", + "lowlight": "^2.0.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0" + } + }, + "rehype-parse": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.4.tgz", + "integrity": "sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^7.0.0", + "parse5": "^6.0.0", + "unified": "^10.0.0" + } + }, + "rehype-react": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-7.1.1.tgz", + "integrity": "sha512-6yaitxM95JFsuTA74OH54OyvTAeRqR4/A6f45S2sEk2FEG04iGgsObcmEIFQRsjK9pfAhc74lR4iGf/W2G/sBw==", + "dev": true, + "requires": { + "@mapbox/hast-util-table-cell-style": "^0.2.0", + "@types/hast": "^2.0.0", + "hast-to-hyperscript": "^10.0.0", + "hast-util-whitespace": "^2.0.0", + "unified": "^10.0.0" + } + }, + "rehype-stringify": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.3.tgz", + "integrity": "sha512-kWiZ1bgyWlgOxpqD5HnxShKAdXtb2IUljn3hQAhySeak6IOQPPt6DeGnsIh4ixm7yKJWzm8TXFuC/lPfcWHJqw==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0", + "hast-util-to-html": "^8.0.0", + "unified": "^10.0.0" + } + }, "requirejs": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", @@ -820,6 +2361,15 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, + "scheduler": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.22.0.tgz", + "integrity": "sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -859,6 +2409,31 @@ } } }, + "space-separated-tokens": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", + "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==", + "dev": true + }, + "stringify-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.2.tgz", + "integrity": "sha512-MTxTVcEkorNtBbNpoFJPEh0kKdM6+QbMjLbaxmvaPMmayOXdr/AIVIIJX7FReUVweRBFJfZepK4A4AKgwuFpMQ==", + "dev": true, + "requires": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + } + }, + "style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "dev": true, + "requires": { + "inline-style-parser": "0.1.1" + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -879,6 +2454,33 @@ "source-map-support": "~0.5.20" } }, + "trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true + }, + "ts-node": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.0.tgz", + "integrity": "sha512-/fNd5Qh+zTt8Vt1KbYZjRHCE9sI5i7nqfD/dzBBRDeVXZXS6kToW6R7tTU6Nd4XavFs0mAVCg29Q//ML7WsZYA==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, "tslib": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", @@ -889,6 +2491,123 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", "dev": true + }, + "unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + } + }, + "unist-util-find-after": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-4.0.0.tgz", + "integrity": "sha512-gfpsxKQde7atVF30n5Gff2fQhAc4/HTOV4CvkXpTg9wRfQhZWdXitpyXHWB6YcYgnsxLx+4gGHeVjCTAAp9sjw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + } + }, + "unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-visit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.0.tgz", + "integrity": "sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + } + }, + "unist-util-visit-parents": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz", + "integrity": "sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + } + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "vfile": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.2.tgz", + "integrity": "sha512-w0PLIugRY3Crkgw89TeMvHCzqCs/zpreR31hl4D92y6SOE07+bfJe+dK5Q2akwS+i/c801kzjoOr9gMcTe6IAA==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + } + }, + "vfile-location": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.0.1.tgz", + "integrity": "sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + } + }, + "vfile-message": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.2.tgz", + "integrity": "sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + } + }, + "web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true } } } diff --git a/package.json b/package.json index 123f4dbd2..d9aab4b5f 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "Website additions for tweaked.cc", "author": "SquidDev", "license": "BSD-3-Clause", + "type": "module", "dependencies": { "preact": "^10.5.5", "tslib": "^2.0.3" @@ -11,9 +12,18 @@ "devDependencies": { "@rollup/plugin-typescript": "^8.2.5", "@rollup/plugin-url": "^6.1.0", + "@types/glob": "^7.2.0", + "@types/react-dom": "^18.0.5", + "glob": "^8.0.3", + "react": "^18.1.0", + "react-dom": "^18.1.0", + "rehype": "^12.0.1", + "rehype-highlight": "^5.0.2", + "rehype-react": "^7.1.1", "requirejs": "^2.3.6", "rollup": "^2.33.1", "rollup-plugin-terser": "^7.0.2", + "ts-node": "^10.8.0", "typescript": "^4.0.5" } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java index 65ba23dfc..9f543e713 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java @@ -41,6 +41,9 @@ * - {@link #playSound} plays any built-in Minecraft sound, such as block sounds or mob noises. * - {@link #playAudio} can play arbitrary audio. * + *

Recipe

+ * + * * @cc.module speaker * @cc.since 1.80pr1 */ diff --git a/src/testMod/java/dan200/computercraft/export/Exporter.java b/src/testMod/java/dan200/computercraft/export/Exporter.java new file mode 100644 index 000000000..9b5cc515c --- /dev/null +++ b/src/testMod/java/dan200/computercraft/export/Exporter.java @@ -0,0 +1,153 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.export; + +import com.google.common.io.MoreFiles; +import com.google.common.io.RecursiveDeleteOption; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.mojang.blaze3d.systems.RenderSystem; +import dan200.computercraft.ComputerCraft; +import dan200.computercraft.ingame.mod.TestMod; +import net.minecraft.client.Minecraft; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.*; +import net.minecraft.util.NonNullList; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.ClientChatEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.registries.ForgeRegistries; + +import java.io.File; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.io.Writer; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Set; + +/** + * Provides a {@literal /ccexport } command which exports icons and recipes for all ComputerCraft items. + */ +@Mod.EventBusSubscriber( modid = TestMod.MOD_ID, value = Dist.CLIENT ) +public class Exporter +{ + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + + @SubscribeEvent + public static void onClientCommands( ClientChatEvent event ) + { + String prefix = "/ccexport"; + if( !event.getMessage().startsWith( prefix ) ) return; + event.setCanceled( true ); + + Path output = new File( event.getMessage().substring( prefix.length() ).trim() ).getAbsoluteFile().toPath(); + if( !Files.isDirectory( output ) ) + { + Minecraft.getInstance().gui.getChat().addMessage( new StringTextComponent( "Output path does not exist" ) ); + return; + } + + RenderSystem.assertThread( RenderSystem::isOnRenderThread ); + try( ImageRenderer renderer = new ImageRenderer() ) + { + export( output, renderer ); + } + catch( IOException e ) + { + throw new UncheckedIOException( e ); + } + + Minecraft.getInstance().gui.getChat().addMessage( new StringTextComponent( "Export finished!" ) ); + } + + private static void export( Path root, ImageRenderer renderer ) throws IOException + { + JsonDump dump = new JsonDump(); + + Set items = new HashSet<>(); + + // First find all CC items + for( Item item : ForgeRegistries.ITEMS.getValues() ) + { + if( item.getRegistryName().getNamespace().equals( ComputerCraft.MOD_ID ) ) items.add( item ); + } + + // Now find all CC recipes. + for( ICraftingRecipe recipe : Minecraft.getInstance().level.getRecipeManager().getAllRecipesFor( IRecipeType.CRAFTING ) ) + { + ItemStack result = recipe.getResultItem(); + if( !result.getItem().getRegistryName().getNamespace().equals( ComputerCraft.MOD_ID ) ) continue; + if( result.hasTag() ) + { + ComputerCraft.log.warn( "Skipping recipe {} as it has NBT", recipe.getId() ); + continue; + } + + if( recipe instanceof ShapedRecipe ) + { + JsonDump.Recipe converted = new JsonDump.Recipe( result ); + + ShapedRecipe shaped = (ShapedRecipe) recipe; + for( int x = 0; x < shaped.getWidth(); x++ ) + { + for( int y = 0; y < shaped.getHeight(); y++ ) + { + Ingredient ingredient = shaped.getIngredients().get( x + y * shaped.getWidth() ); + if( ingredient.isEmpty() ) continue; + + converted.setInput( x + y * 3, ingredient, items ); + } + } + + dump.recipes.put( recipe.getId().toString(), converted ); + } + else if( recipe instanceof ShapelessRecipe ) + { + JsonDump.Recipe converted = new JsonDump.Recipe( result ); + + ShapelessRecipe shapeless = (ShapelessRecipe) recipe; + NonNullList ingredients = shapeless.getIngredients(); + for( int i = 0; i < ingredients.size(); i++ ) + { + converted.setInput( i, ingredients.get( i ), items ); + } + + dump.recipes.put( recipe.getId().toString(), converted ); + } + else + { + ComputerCraft.log.info( "Don't know how to handle recipe {}", recipe ); + } + } + + Path itemDir = root.resolve( "items" ); + if( Files.exists( itemDir ) ) MoreFiles.deleteRecursively( itemDir, RecursiveDeleteOption.ALLOW_INSECURE ); + + renderer.setupState(); + for( Item item : items ) + { + ItemStack stack = new ItemStack( item ); + dump.itemNames.put( item.getRegistryName().toString(), stack.getHoverName().getString() ); + + ResourceLocation location = item.getRegistryName(); + renderer.captureRender( itemDir.resolve( location.getNamespace() ).resolve( location.getPath() + ".png" ), + () -> Minecraft.getInstance().getItemRenderer().renderAndDecorateFakeItem( stack, 0, 0 ) + ); + } + renderer.clearState(); + + try( Writer writer = Files.newBufferedWriter( root.resolve( "index.json" ) ) ) + { + GSON.toJson( dump, writer ); + } + } +} diff --git a/src/testMod/java/dan200/computercraft/export/ImageRenderer.java b/src/testMod/java/dan200/computercraft/export/ImageRenderer.java new file mode 100644 index 000000000..cbc7eb735 --- /dev/null +++ b/src/testMod/java/dan200/computercraft/export/ImageRenderer.java @@ -0,0 +1,84 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.export; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.FogRenderer; +import net.minecraft.client.renderer.texture.NativeImage; +import net.minecraft.client.shader.Framebuffer; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +/** + * Utilities for saving OpenGL output to an image rather than displaying it on the screen. + */ +public class ImageRenderer implements AutoCloseable +{ + public static final int WIDTH = 64; + public static final int HEIGHT = 64; + + private final Framebuffer framebuffer = new Framebuffer( WIDTH, HEIGHT, true, Minecraft.ON_OSX ); + private final NativeImage image = new NativeImage( WIDTH, HEIGHT, Minecraft.ON_OSX ); + + public ImageRenderer() + { + framebuffer.setClearColor( 0, 0, 0, 0 ); + framebuffer.clear( Minecraft.ON_OSX ); + } + + public void setupState() + { + RenderSystem.matrixMode( GL11.GL_PROJECTION ); + RenderSystem.pushMatrix(); + RenderSystem.loadIdentity(); + RenderSystem.ortho( 0, 16, 16, 0, 1000, 3000 ); + + RenderSystem.matrixMode( GL11.GL_MODELVIEW ); + RenderSystem.pushMatrix(); + RenderSystem.loadIdentity(); + RenderSystem.translatef( 0, 0, -2000f ); + + FogRenderer.setupNoFog(); + } + + public void clearState() + { + RenderSystem.matrixMode( GL11.GL_PROJECTION ); + RenderSystem.popMatrix(); + + RenderSystem.matrixMode( GL11.GL_MODELVIEW ); + RenderSystem.popMatrix(); + } + + public void captureRender( Path output, Runnable render ) throws IOException + { + Files.createDirectories( output.getParent() ); + + framebuffer.bindWrite( true ); + RenderSystem.clear( GL12.GL_COLOR_BUFFER_BIT | GL12.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX ); + render.run(); + framebuffer.unbindWrite(); + + framebuffer.bindRead(); + image.downloadTexture( 0, false ); + image.flipY(); + framebuffer.unbindRead(); + + image.writeToFile( output ); + } + + @Override + public void close() + { + image.close(); + framebuffer.destroyBuffers(); + } +} diff --git a/src/testMod/java/dan200/computercraft/export/JsonDump.java b/src/testMod/java/dan200/computercraft/export/JsonDump.java new file mode 100644 index 000000000..8b2431fb2 --- /dev/null +++ b/src/testMod/java/dan200/computercraft/export/JsonDump.java @@ -0,0 +1,65 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.export; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.item.crafting.Ingredient; + +import java.util.*; + +public class JsonDump +{ + public Map itemNames = new TreeMap<>(); + public Map recipes = new TreeMap<>(); + + public static class Recipe + { + public final String[][] inputs = new String[9][]; + public String output; + public int count; + + public Recipe( ItemStack output ) + { + this.output = output.getItem().getRegistryName().toString(); + count = output.getCount(); + } + + public void setInput( int pos, Ingredient ingredient, Set trackedItems ) + { + if( ingredient.isEmpty() ) return; + + ItemStack[] items = ingredient.getItems(); + + // First try to simplify some tags to something easier. + for( ItemStack stack : items ) + { + Item item = stack.getItem(); + if( !canonicalItem.contains( item ) ) continue; + + trackedItems.add( item ); + inputs[pos] = new String[] { item.getRegistryName().toString() }; + return; + } + + String[] itemIds = new String[items.length]; + for( int i = 0; i < items.length; i++ ) + { + Item item = items[i].getItem(); + trackedItems.add( item ); + itemIds[i] = item.getRegistryName().toString(); + } + Arrays.sort( itemIds ); + + inputs[pos] = itemIds; + } + + private static final Set canonicalItem = new HashSet<>( Arrays.asList( + Items.GLASS_PANE, Items.STONE, Items.CHEST + ) ); + } +} diff --git a/src/web/components/Recipe.tsx b/src/web/components/Recipe.tsx new file mode 100644 index 000000000..1dbf34c4f --- /dev/null +++ b/src/web/components/Recipe.tsx @@ -0,0 +1,44 @@ +import type { FunctionComponent } from "react"; +import { createElement as h } from "react"; +import useExport from "./WithExport.js"; + +const Item: FunctionComponent<{ item: string }> = ({ item }) => { + const data = useExport(); + const itemName = data.itemNames[item]; + + return {itemName} +}; + +const Arrow: FunctionComponent = (props) => + + + +; + +const Recipe: FunctionComponent<{ recipe: string }> = ({ recipe }) => { + const data = useExport(); + const recipeInfo = data.recipes[recipe]; + if (!recipeInfo) throw Error("Cannot find recipe for " + recipe); + + return
+
+ {data.itemNames[recipeInfo.output]} +
+ {recipeInfo.inputs.map((items, i) =>
{items && }
)} +
+ +
+ + {recipeInfo.count > 1 && {recipeInfo.count}} +
+
+
; +} +export default Recipe; diff --git a/src/web/components/WithExport.tsx b/src/web/components/WithExport.tsx new file mode 100644 index 000000000..10cfcfb37 --- /dev/null +++ b/src/web/components/WithExport.tsx @@ -0,0 +1,23 @@ +import { createElement as h, useContext, createContext, FunctionComponent, ReactNode } from "react"; + +export type DataExport = { + readonly itemNames: Record, + readonly recipes: Record, +}; + +export type Recipe = { + readonly inputs: Array>, + readonly output: string, + readonly count: number, +}; + +const DataExport = createContext({ + itemNames: {}, + recipes: {}, +}); + +export const useExport = () => useContext(DataExport); +export default useExport; + +export const WithExport: FunctionComponent<{ data: DataExport, children: ReactNode }> = + ({ data, children }) => {children}; diff --git a/src/web/components/support.tsx b/src/web/components/support.tsx new file mode 100644 index 000000000..9cea4b321 --- /dev/null +++ b/src/web/components/support.tsx @@ -0,0 +1,25 @@ +import type { FunctionComponent } from "react"; + +/** + * Wrap a component and ensure that no children are passed to it. + * + * Our custom tags *must* be explicitly closed, as will be parsed as + * (rest of the document). This ensures you've not forgotten to do + * that. + * + * @param component The component to wrap + * @returns A new functional component identical to the previous one + */ +export const noChildren = function (component: FunctionComponent): FunctionComponent { + // I hope that our few remaining friends + // Give up on trying to save us + + const name = component.displayName ?? component.name; + const wrapped: FunctionComponent = props => { + if ((props as any).children) throw Error("Unexpected children in " + name); + + return component(props); + }; + wrapped.displayName = name; + return wrapped; +} diff --git a/src/web/export/index.json b/src/web/export/index.json new file mode 100644 index 000000000..f4bfe9cac --- /dev/null +++ b/src/web/export/index.json @@ -0,0 +1,760 @@ +{ + "itemNames": { + "computercraft:cable": "Networking Cable", + "computercraft:computer_advanced": "Advanced Computer", + "computercraft:computer_command": "Command Computer", + "computercraft:computer_normal": "Computer", + "computercraft:disk": "Floppy Disk", + "computercraft:disk_drive": "Disk Drive", + "computercraft:monitor_advanced": "Advanced Monitor", + "computercraft:monitor_normal": "Monitor", + "computercraft:pocket_computer_advanced": "Advanced Pocket Computer", + "computercraft:pocket_computer_normal": "Pocket Computer", + "computercraft:printed_book": "Printed Book", + "computercraft:printed_page": "Printed Page", + "computercraft:printed_pages": "Printed Pages", + "computercraft:printer": "Printer", + "computercraft:speaker": "Speaker", + "computercraft:treasure_disk": "Floppy Disk", + "computercraft:turtle_advanced": "Advanced Turtle", + "computercraft:turtle_normal": "Turtle", + "computercraft:wired_modem": "Wired Modem", + "computercraft:wired_modem_full": "Wired Modem", + "computercraft:wireless_modem_advanced": "Ender Modem", + "computercraft:wireless_modem_normal": "Wireless Modem", + "minecraft:black_dye": "Black Dye", + "minecraft:blue_dye": "Blue Dye", + "minecraft:brown_dye": "Brown Dye", + "minecraft:chest": "Chest", + "minecraft:command_block": "Command Block", + "minecraft:cyan_dye": "Cyan Dye", + "minecraft:ender_eye": "Eye of Ender", + "minecraft:ender_pearl": "Ender Pearl", + "minecraft:glass_pane": "Glass Pane", + "minecraft:gold_block": "Block of Gold", + "minecraft:gold_ingot": "Gold Ingot", + "minecraft:golden_apple": "Golden Apple", + "minecraft:gray_dye": "Gray Dye", + "minecraft:green_dye": "Green Dye", + "minecraft:iron_ingot": "Iron Ingot", + "minecraft:leather": "Leather", + "minecraft:light_blue_dye": "Light Blue Dye", + "minecraft:light_gray_dye": "Light Gray Dye", + "minecraft:lime_dye": "Lime Dye", + "minecraft:magenta_dye": "Magenta Dye", + "minecraft:note_block": "Note Block", + "minecraft:orange_dye": "Orange Dye", + "minecraft:pink_dye": "Pink Dye", + "minecraft:purple_dye": "Purple Dye", + "minecraft:red_dye": "Red Dye", + "minecraft:redstone": "Redstone Dust", + "minecraft:stone": "Stone", + "minecraft:string": "String", + "minecraft:white_dye": "White Dye", + "minecraft:yellow_dye": "Yellow Dye" + }, + "recipes": { + "computercraft:cable": { + "inputs": [ + null, + [ + "minecraft:stone" + ], + null, + [ + "minecraft:stone" + ], + [ + "minecraft:redstone" + ], + [ + "minecraft:stone" + ], + null, + [ + "minecraft:stone" + ], + null + ], + "output": "computercraft:cable", + "count": 6 + }, + "computercraft:computer_advanced": { + "inputs": [ + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:redstone" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:glass_pane" + ], + [ + "minecraft:gold_ingot" + ] + ], + "output": "computercraft:computer_advanced", + "count": 1 + }, + "computercraft:computer_advanced_upgrade": { + "inputs": [ + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "computercraft:computer_normal" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + null, + [ + "minecraft:gold_ingot" + ] + ], + "output": "computercraft:computer_advanced", + "count": 1 + }, + "computercraft:computer_command": { + "inputs": [ + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:command_block" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:glass_pane" + ], + [ + "minecraft:gold_ingot" + ] + ], + "output": "computercraft:computer_command", + "count": 1 + }, + "computercraft:computer_normal": { + "inputs": [ + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:redstone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:glass_pane" + ], + [ + "minecraft:stone" + ] + ], + "output": "computercraft:computer_normal", + "count": 1 + }, + "computercraft:disk_drive": { + "inputs": [ + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:redstone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:redstone" + ], + [ + "minecraft:stone" + ] + ], + "output": "computercraft:disk_drive", + "count": 1 + }, + "computercraft:monitor_advanced": { + "inputs": [ + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:glass_pane" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ] + ], + "output": "computercraft:monitor_advanced", + "count": 4 + }, + "computercraft:monitor_normal": { + "inputs": [ + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:glass_pane" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ] + ], + "output": "computercraft:monitor_normal", + "count": 1 + }, + "computercraft:pocket_computer_advanced": { + "inputs": [ + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:golden_apple" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:glass_pane" + ], + [ + "minecraft:gold_ingot" + ] + ], + "output": "computercraft:pocket_computer_advanced", + "count": 1 + }, + "computercraft:pocket_computer_advanced_upgrade": { + "inputs": [ + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "computercraft:pocket_computer_normal" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + null, + [ + "minecraft:gold_ingot" + ] + ], + "output": "computercraft:pocket_computer_advanced", + "count": 1 + }, + "computercraft:pocket_computer_normal": { + "inputs": [ + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:golden_apple" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:glass_pane" + ], + [ + "minecraft:stone" + ] + ], + "output": "computercraft:pocket_computer_normal", + "count": 1 + }, + "computercraft:printed_book": { + "inputs": [ + [ + "minecraft:leather" + ], + [ + "computercraft:printed_page" + ], + [ + "minecraft:string" + ], + null, + null, + null, + null, + null, + null + ], + "output": "computercraft:printed_book", + "count": 1 + }, + "computercraft:printed_pages": { + "inputs": [ + [ + "computercraft:printed_page" + ], + [ + "computercraft:printed_page" + ], + [ + "minecraft:string" + ], + null, + null, + null, + null, + null, + null + ], + "output": "computercraft:printed_pages", + "count": 1 + }, + "computercraft:printer": { + "inputs": [ + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:redstone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:black_dye", + "minecraft:blue_dye", + "minecraft:brown_dye", + "minecraft:cyan_dye", + "minecraft:gray_dye", + "minecraft:green_dye", + "minecraft:light_blue_dye", + "minecraft:light_gray_dye", + "minecraft:lime_dye", + "minecraft:magenta_dye", + "minecraft:orange_dye", + "minecraft:pink_dye", + "minecraft:purple_dye", + "minecraft:red_dye", + "minecraft:white_dye", + "minecraft:yellow_dye" + ], + [ + "minecraft:stone" + ] + ], + "output": "computercraft:printer", + "count": 1 + }, + "computercraft:speaker": { + "inputs": [ + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:note_block" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:redstone" + ], + [ + "minecraft:stone" + ] + ], + "output": "computercraft:speaker", + "count": 1 + }, + "computercraft:turtle_advanced": { + "inputs": [ + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "computercraft:computer_advanced" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:chest" + ], + [ + "minecraft:gold_ingot" + ] + ], + "output": "computercraft:turtle_advanced", + "count": 1 + }, + "computercraft:turtle_advanced_upgrade": { + "inputs": [ + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "computercraft:turtle_normal" + ], + [ + "minecraft:gold_ingot" + ], + null, + [ + "minecraft:gold_block" + ], + null + ], + "output": "computercraft:turtle_advanced", + "count": 1 + }, + "computercraft:turtle_normal": { + "inputs": [ + [ + "minecraft:iron_ingot" + ], + [ + "minecraft:iron_ingot" + ], + [ + "minecraft:iron_ingot" + ], + [ + "minecraft:iron_ingot" + ], + [ + "computercraft:computer_normal" + ], + [ + "minecraft:iron_ingot" + ], + [ + "minecraft:iron_ingot" + ], + [ + "minecraft:chest" + ], + [ + "minecraft:iron_ingot" + ] + ], + "output": "computercraft:turtle_normal", + "count": 1 + }, + "computercraft:wired_modem": { + "inputs": [ + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:redstone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ] + ], + "output": "computercraft:wired_modem", + "count": 1 + }, + "computercraft:wired_modem_full_from": { + "inputs": [ + [ + "computercraft:wired_modem" + ], + null, + null, + null, + null, + null, + null, + null, + null + ], + "output": "computercraft:wired_modem_full", + "count": 1 + }, + "computercraft:wired_modem_full_to": { + "inputs": [ + [ + "computercraft:wired_modem_full" + ], + null, + null, + null, + null, + null, + null, + null, + null + ], + "output": "computercraft:wired_modem", + "count": 1 + }, + "computercraft:wireless_modem_advanced": { + "inputs": [ + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:ender_eye" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ], + [ + "minecraft:gold_ingot" + ] + ], + "output": "computercraft:wireless_modem_advanced", + "count": 1 + }, + "computercraft:wireless_modem_normal": { + "inputs": [ + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:ender_pearl" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ], + [ + "minecraft:stone" + ] + ], + "output": "computercraft:wireless_modem_normal", + "count": 1 + } + } +} diff --git a/src/web/export/items/computercraft/cable.png b/src/web/export/items/computercraft/cable.png new file mode 100644 index 0000000000000000000000000000000000000000..593ed23736897c5e231fa2b777a8d9029a48925f GIT binary patch literal 375 zcmV--0f_#IP)t%@QoyX_o{XdbGc}}v_cmu?|JV63%zMuD_1$of^6}4H~wSGr-6aep+qF*sl?0`M3v~J{V zA%UF-h*lSA^(w&|JfR>uUR5j$fCL~aK>V(fg@8-oi2>$Ap1lO$k@z_?z}q|x12>ox zGyL{BeU1F)9TBsi#eo|Tm}iqTcToXwH5q16;1ZP8^l9umL|IKouB-cM?E3m{xIZdY Vc)zeM1N{I1002ovPDHLkV1jO_obCVs literal 0 HcmV?d00001 diff --git a/src/web/export/items/computercraft/computer_advanced.png b/src/web/export/items/computercraft/computer_advanced.png new file mode 100644 index 0000000000000000000000000000000000000000..2b9f5f5a331651b503f9a0159a871c8847cd71e4 GIT binary patch literal 2564 zcmWlbc|4SR7r=kd;~8e5W+qz-V;M8DO^c{29t>te?}XP9AxX1pR9W4BwrmlAh;AA3U~gMd4UKfkI)PLFJ%EJbM1E2e*9 z7?3>3TXVJmkKcjJt`{KBCI|5Z+0sD-A)j@UIsYU$QUR6x-4ic}K+>a)JBjVA5KMMs zry~;^bA-l_R9Mg$trzl8LY6(grl%ay#z@&4JCh|HO7bn+7ANx4?Rb;FYttm|!PhP` ztyyEE*x5=a1JjcN-KB2_Gcoc0zB2oglt;CJ4XKMAY+ulY^K{#*7clFSE?$1fi_4W} z-I_0M?Wy*>sBYJjy%_POd!VChi*;F)a$R*sGC|p#@arHqRmQHhO_M@Tl2R~G(a;d} zITcBoP%$tR&l58Vw$*nFGCFh*dYx}h8M>&pHj$mCbTd|qLe`PNdFuUmJ4HF9)}!vJ zs{$)nuo0P#rWru(R(ZZ1e&X%{JoL?yigslpyhQ|J>?lLM*Ov8ZtYAgxurx<>cOHQ3 z54&ybFsZ{k4wW-+AB-!tST(Y)tZ@Dn0Y7QCfrcG(dMiO?lgWC@GZy2k$-#XeirYM{ z&HnD0p4O!tF>7t2vpeCA7z10qH3J*}gSU9i;AYa_jz2647|oJ=a#X~9Fk884xjszk zHYrCG>eK-pD018La4t*gw0N5@O}U@1{o7lDb>fn>evHC2e*FW*hzzr-=Oy{UDGPyP zTDc|f%+zd@*B)D`FS}qm*7hqoOYu!h6yt<1(2G&X6sEB*t=6i$`?i@y7f#ISr88`T zrbXP=V-jY#_lpR(4cBwn{>*2W^Yd4PeSQC!69Sz&JELzXd0D?Vb40~j$y8Y{ZwRLr zs4&~v`{S-=`6Vl&rjA5E9sXm2tl^lvvMrHV9am7Yi}_fQMd>+mt`b4#yN) zoS)eby-V6hq4LMODS|}G=+m8WCwgbhO1pA%6&_b1V6g;BQ{4V(t(RLQrWsP`yCx6T zsdl({r{EYp?|$Qep_sed;{f!!Iii435zxD?5$hR*1jt(3_}I_==NwHXJ*P}KCQ#U% z1;2GuM=6Pco}=G>ez%~~>G=HgXin>~Pa)8bTb}1|p#wp*ESy)i0@18uLnRGD1T&M9 zAv}zkpKKR);Lw@0Yoc8J?U?mq`8NGQ7?9%!FSu)#BYgg2xjBVwn8rIl52I zrasBOCc1WxwZ*Ns>DC+H+$Af#YJY!Fpld~C^Iz=&f{afpQZ80>NIQVY-=Ll2-xQu@ zfj-?&U}|WmsaI$QL*kEv7i&+!f13?X>lfxQp4z?x3jM=I(4o?p>(~K4+}Wj$?FK1D znDFSsdPLRI5D;P%30RUsX11{7heLK9(|s{_F7o9qpwXP``}x^GhZ*#7#Yqv0z6q%= z4ujD8lT8S7!4KHOm+}VE2osaPR&G?nF<91xfwtBp4ui~>h?7|#010I8GXTc> zO(E1+AEH5CjL^Dtzm!)K_j5FAJ4g$b{TpJ968Xloq86bWpeiyT^!&*X=zMl62ND$a z7YMP0#W}sFlr;!A8ln(eTF0{1=wQW%LoNk6H;`c286EWs&Kl^v?LDe^cV*CEh7ed2 zWpNyAO8TQ2&HkL^Z-h0GvrQ4%+g^ntB9Pf#j?`mGmGWU_fWa9^nbGZzLu) zQ2!mSI9xMC-RFAO1*Rb{rxB?#gWe4X3J|aI3nhqk+iug~8!0Y0aWB~wtuAx)1&Cr5 zaIR}A*UkkMLsZ`JIqmBwvF9uLTxiicTvMQ^WBIL0l#$K|&+!0)nR?`8*b!*}3J0T+ z8=A0q+vU%Q7hk#0+_=JK@U;V+CW1X2z*L!zD*)0;m}WzeGnu(hAN`6u5r7(JunW*Q zs3uwq+Et>CZX)ovmU`Q1iEM*BAy!oDb7>R2YbfO;9lI8jPXRuEfr928QLX-Y&lyn5 zZ$6P;1!kZ)#^o^d&fdwNa?lkeVv@TlzR{3^&p)FpgCQ*{cJs#^OdDy?QRiJ@nnH9seI2bq1S?WW#f^qHr>#j~ zq~%-_y#4+RnTk5>BD}m6ZE_-V>rnU#Og7wpHP*^0598{EtUVLe<%{_zV2vlla8Ht4 zL@$PIBfu}~z<4^!)!YY7m;HSTPvx1<(yp(W8g9tIiFHK}ue1SX(|TO)??$D^6bQvp zE@Ub%TFtB=O`TW%v(kYCJ`BXT<3i01Ovq%lJ%?aYv5yd|iL;AeUVNd?5jXh9{x26n zBYQ%3>2h)TY;zFy-$}T2b?s1dP`$PyreQHM1 znZoNI|6$$R>Szl1m*-!wQS&&nwa3~+A=R?(3+8%RxSLV)!Z6AzBiRUt4crP={wo*u zLnGB4J~|xXOheAy0 zomwQmHC{Giwbh33eR~=MTDam0U2A2=n?hgSGohhR9^&|D{?mlS0{LN`B$HxSrzck5 zEdt}G?Ha%>U9t;mK40sc@npBBlnZ(n5`5%+$=m;y)Uvy~{6*Nr{Ii-vP6$C{edCBGKUJK^nqX=JqZ@+qvTBWkF( zNdtai`u(VW6&U|PBk@iAa0I3bQ$!XrZ>Ar)bmdRkOMO(1swYO(5ViAY#uZD3M|?7e zr$>ntn}vI^ce{>TW|84QkrG**w>J30pXXH34nKg?fNfuT2UX+oX_gMe;*XvmWHL+N z1S(h=y63#R?6TIXUqvc935B4OD(ki9$gSj}=0mk)_=US{Uu!y9VjF!^5si&T+8dE8 zuO*MN$?%j`1=78&S${RPd6oS{5K;Kg;`6yz|Rxdw`ptDC_E+!Gg4!upG-;BmbV@gB*wEMupuenorpC4>=clPOU zPGsfaSkLToW9ZL}9|^|G_U{?qn)`=WC`YY#9j2SOw`IG~!53q#@sjxSQ!g}lay?sb z5^>a%`eg8;ed+rriecxk19D94;83vzlwAIuh%?a$bfeRI_CHt*;SN{j<>7ee*WJb= z#lt;RVt2;qe%iU+I%KSH?i12}+RfPKbnbtsq@lo31_`o1U12k)La=9J-K(BG=&k76 zq)7X_>BXt^FwD7Q=?@)5~@5I&|Kvly4aO%YS=U zNCabpLucb34(CD9fJ5A?pz_j#J5KoDEclVXML&8-p(Ns+c?7Ff$RGon?}v{P+DmVT zq5Pg3Azcz=u=eZ3vFZke@rf^P$>o`*_lxb8nGusOXHC^4~8t6m=cyh_w z3<3JSAOr_94bQhJtXN;Af@cvXx9+IAs60%?gNCT8I5}gNU?Ku+EF;QHUgxr~b8R>n zJ2gvlOnZCtmJxtECp9lo=tlsqxH$_cLH$-bVV$Qg#@-5!-^PRjmB>uYJ4H4}n`2!_ zWMKz|uD8*CpDGx-_Q`PYF1LNkN)wfA80nyqS*?#NBj7aOX_QztV~m9D)>^DY){)EB znnR+}_;oPk;qtwuQs*KQYrheG0p2la3V2>A-q)B|iCm$rQC-5P1Xs+8fbUNI6Ho5V z9t}G8a4pY6hHerW*T3{95S`p!e?o|eN*%-1=^UB&UoL!3@xDr5yqCR^r(}_!W zMBtDb(;6=wxWX%PA~e{S|D#NsSn{lW+4zf{(73k8Pv?9mDw%mykr`k}U(Cd>pP?uy zxyn5ws1+_-tqLug*`L~G7yC?c_^jlmeI)AmEVK6B`?6h~$K2D`G@ChozX6+EHNO

(5_NmQAb(4=_t%`B=_~D~pl8njfhP^U8aAjv95X z+3>lb*!!3$VysWm`ho0@-GaKT;H||68%JNI4JbygjCV`ZrIK}*U3NmVI<;;LPF`Qx z(e`cCM*rzuI70{nJp=^KValJ)r89 zJRL&}z0ix2a%ZBM^Q?ghf6$B2!-1l`8ag{fB}z zw^xOo%Lv%;ibB(fnev(7`3|H>IFF5M<_=w`0p>KL^2un=zx2@GbgJ7I4|_W1X`D5HSi*XoWU@+~`Hb4t%!&A3fZAC~`h zJ=k*nE^jmUAu4~@%?=4wQY{vuY;R{oLw+;L0(c_$^;iddeCcTjzp-7p5R@}oIHO=3 zKI$K~qN6GuUpUweQ_<)oX<%SIL3B}-@5nyR^nlB7CQV+`B#8jb5Q%EVyNl^2t3pkG z6g!0LR-ChpaK5AM>4!}1<1nEkQoLd6V~(ig8Zv3CR^x*pxRj^kafxWdM5zjKBz+Bu zZX!-{#Dn)LzC;|yONQ7T93~ntNJZBK#0mjRZK(whX19cogqrMw=d$5$16`0b(?4vT z2*!dF3#t4x)2z;Dk6F=>&;yz%gMTz-$q9jANo)kuzLYS8DDJExgY$bRorpv8yFStd zr3Ie1(E|!0SIk58@!A}gTRc1zn#d3WT9P>f`%S}re3o#OP+>fAo%_H|iQYG;;EZ|V zRuJ>`Kd*MgWC#QXS|1D@3m2cQ!P1z}A`J&T%cj1Y7c75J#cR{A=Wl_>?vPEIo_51O zd}{aGb8gT{4_k!120|Sgxt5dnn@=I98}69ilQiz&RTUoGj^llR^*ECr4T?AhXXf5E z%i>~fafyi>75s?wfMHN~518*Q2ZPM)xLMk7aqR&&!;JOHEV+btzdQf1^O&}T`)f+y~#52ECv0iVx1kqa=_AesseYBZ^XhK3hi;=bdu$*(?%x;S zw76^1^TN+RxU3_fyFv_bD9~g`*&s5Sd0U!vDG_fs3eaBn3rhQ#UXx+AC?b_Bn?@B6 zCe#B*z%i+}Hrx2JK!v_@5R{=JnU}$_(^vDqEyo?G8<~i8#umowN+k;uEqqv2_BfTu z(PjZSaK4TSGOi6%L9OY}0w=(nJD}3BDrHM@s#|8g?QlYJ>S2<*dWlPH4GIIj236Kb z^5{4V%>BFhI0Ec%m_zrkEY06-JHxw=(g>fu2_t*v2ewyH!baci_jkXd8+<$%H z)!`u)+-mKU1Hx=e$iYxK*YHr>Cr4OV#of40A4OI*qqA{7`PYBA^0b9UvrfBg#}T&BBnO$hX+I^ zIpVB7NrXVrjan93N}~eFnv0u2tHQcOG|hVFy8Tc2rJ@>?UZ@7$Mr&?qouy z6M71vql-2$@r(CE;w z_29W`nE|_q1xnZJf*OnECXq6^pu6;r9*#^LxgwRBsJp+{b9Xx-%MV*s%jgR<7N((} zC;Kf?T0wikgj9#;WjsLSi%^=$oB;4k9!wJ4`G)E&km*-B!>0%wSd~UN$)XVVy!!I` z$xh^a8XgZU-)snivUM0B!-eklVL=E!ZWen**SxRit{}416&H}jZ&A-z?Mp+fPAN)A zSlIKbJ^wx_cz4E&QUVM%YKM|Q3W{c0uFf1aaIRhcG`}pT3&cNB0f;)zmA)oz$O^Mq u`1p!w0Shz!W3k{89zXXCIp0HDmI=G!>f07GaYi~t0NXu|RwWjk*#7~oU6bkn literal 0 HcmV?d00001 diff --git a/src/web/export/items/computercraft/computer_normal.png b/src/web/export/items/computercraft/computer_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..fa1787e89b099b213678fe3af36839a916cd5929 GIT binary patch literal 1229 zcmV;;1Ty=HP)K#31vWQTjNO$fVLBs~0? znKi<~Vt4J%nbe}f|IN%lgWTNwzY#=H^e^%tD2gbW{ZKwfc~J;4o4x%&?)&pRFN!=D zBG2EhZp8EaJeT4eIYs2USIAx0Mcwgu6jF{coldWlgXYL`AuI7b?;CQ!%YRzUd#WPNXV`RB>qR8tU zctX9+UV$(}O-o)o$WAmR!Z&cA1x5pKoEM0kn{RZjCa5RePAMM@S^&p^4YFivC9Tp& zbHbm`=e=GFkfx6F>lYBFWS=4jz>(h8WqH2u>w2%ZSTumAG|e&uOsBrz^dN5{A$JN7 zI6&9)1_NDRK=d2HZkIt=){E);tCf)RBB7-5&jQF@cQhOfg5VQizemK2X_~9$a;Xe} zZ)gNSi|*}cG>qdQ&@>fbW&n@~AdHtV5pY|PBXG4^S^DkmD2C7=7U7)&$Wj2vM$GZ} zohPEmVQnH^*Kb3XYg(uPUICD%dv0Vuet&&M1or^N;N1ItU5~?%lB2Y0Y2Lcvdas-ST0ABn1Hv<46F@Pn2))|Y%WdM#6ea%wK9^S#)YKOl7 zsBuV2N<3tQ0DyIefWv_hhr^{7GFI?D?9$U02#B!&)E+JZB9Y_&hfQlD+~cD@0_xkh{}P z><|!k1ClcU5roXWlRHg-`}lQkFCUMm&t~jrbBk zSEnEeRaKSc$47QrgY4nKxCGd2S^z}A3$6J0C`(49?+-?Q(JkL>lor@RL1iGI6og3M z-}_wvl&c;r6#%v%Dl`NM2#CAny`Jj9QufaXcvHy_oq#RLdp*^IWl1_nEy#xoUx=s> zuxWcQ0a!%?@a(#I!J{CIs66laSpjTNzus(;1U)nqfNhtxi4p(^cp)HBddKwZ?G^xi zLjl0gs%=}+Mj_o`f@Rf!4Mzf1B=DF~<%HnJVI9;(4InAL5&+<1>gIEto~Y!8kY?C6 z0X9-f|B?&x1|e60LIO~}UMI2uUB4(lA>=C1Y6}wpv~}w>8Gw)Io3Dcq6;DE#CIeXh zW%dSPS`4Uc^Lesm`@bp2FrkWyR>HO?lPz_Bg}iQrJeWMA{a4DHiJ%8bVq7n0gpB~$ r*`LS>0UJIZ8^#ai7zp?W`FG+!zvJyJ04o>G00000NkvXXu0mjf**_ol literal 0 HcmV?d00001 diff --git a/src/web/export/items/computercraft/disk.png b/src/web/export/items/computercraft/disk.png new file mode 100644 index 0000000000000000000000000000000000000000..0f11b076256bd9f9a2a67207932d153a5ade8715 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ei2$DvS0F9N#}OJD8Wk0lpP#>P z-@fP1pMU-O_0)N81E3sZNswPKgTu2MX+Tb}r;B5V$MLrp40#z81y}=hdRTSlv~F!^ z-MrzOrk+%}wGHT$rXy)^2B*vo@AiW+`D joWq~Tu$ZIdz&#ct)$=!QSGWEH8qeVA>gTe~DWM4f{0l{G literal 0 HcmV?d00001 diff --git a/src/web/export/items/computercraft/disk_drive.png b/src/web/export/items/computercraft/disk_drive.png new file mode 100644 index 0000000000000000000000000000000000000000..158aafddfeb7168a1b9c76d3e05cba9d6ab919b6 GIT binary patch literal 1327 zcmV+~1O0Cx~Kal(WrmE_?s+6j# zm$MsLt^BHDafO^Z_PjIXp68+NbUG=PV=R};^W>m8iCl3dtJUfoa@)3R(N&`WO8wu6 zc(>D}+9}GhmaiuQYlHtI!Kiq3I>|?v$jfIF@qz&UkN?GdM3O1+;SU$2R2=`?L|oV7 z3_XCd@-9$2f21S`@54mG(B+=H-idTN4KCDOe)tW3SdLa}yT}=^ z`epVEgf(hL^4>vlVki;5f$Jhn;d^Q^aTo*RT=G0nRt&iac zf3w+4CL=&mxbClCKvOx7}{F0muc7 z0BF&>yt$btNf2NQ1HdW)zz85LwlEQJTazPjx7*pq<>gHRF@cD}D-BQ<0N_Tf#o|>a zqRC-xV#6>lLy=D=p$2#cKv5i}k>ld^`56(?0~CXEpH2-U2}72L@JcRq01^sr1YXau z8E^~pc@8dEH-&)Yp(KZ6q5&Q#@j!r2u4}Q2uw76)hq zx?@+gAzcphi~=ZNVsJ8l#eQ_@)3E*Y`;D3Mr762d^16TrZ@vy#x z2_h*Y`W%3xL|@CocIHE6IC?GbwI329GegjAmcpV-^2c*1f36Q4+D`W`9cFIRpO<@b<0E$(E-GHI12)n zr@0Pj@S;J0Y?F+%EEkLUJn8obiw{_yrg=8i08NXCQWo;i?Zg2AAp*MIBax?B_6|S< z#kmi>(*(G_4!i3ghX8<#(q~z2>Hsc55M_6N8UP}XB2Ys6c{a)40UGoHC{05X5X9}` z+DuqZfc+jaLjW?*4SfnsXxp}F-rmY?4a(bFxRP-Ka4!iV`+g7QLwblb9RUylZ?xj= zt!V^Nyxy8qTx0M)MB@+uO`tqYwHCxeMP(qMQG_U7U#HUuZ{y^An(p^G`iG~w2U`t* zEvOa^K>`9`ZUHOs4FLQw_F&8X3j$7B{?GwZ*5_;>$;TdS8`42)MLx9nMnsDME}lj| z0PvduuyXq5m5hQgs$H!fA3-atM;nlmkLaPP0UW34O=JKd;Ee!Cn`RMN2E;I1djwb$^DuZ-hK}pedXw?+}VS$TIVMxgZ<_z|Q_eP6*iW l#ln2QwC4l@{zCqp_y_IDD<{(V>cs#6002ovPDHLkV1jHmPE-H@ literal 0 HcmV?d00001 diff --git a/src/web/export/items/computercraft/monitor_advanced.png b/src/web/export/items/computercraft/monitor_advanced.png new file mode 100644 index 0000000000000000000000000000000000000000..5e99f1a3fc2a123c8d8e03a7dcb45d000d0da96f GIT binary patch literal 2463 zcmWkwdpwl+7yiC)?~EBkW?V+OHKuWA5FwE&cCl-h z#F8O}mDP;PrsTHK5@o23bTPS$_}M?sbN)J?&w0-0d7jVtmhIspE3G080FZTMIeKk( z#(#ywZsYG~F1`W)AL{C8?-T#x<4=*^s>kFrzxGZfKP;GwYY6?LCcWC?e*OhLK`*n} zjV|>V(maoCEgIU~nZ+`DQgJu(%*aGNmKR#Sp?A8a|J|V!XSg3+6CL-p&6h`9=gg*K zS9Y(B)Nk1x>MIin1Z%6GL*B+I6<4lR<6LLny<3ZQT3lX^mVA7n&x9kczzC4juvv|D zjE#%4gox~w1soo?ahit=r7Izb+S;AZGlON?VDkOg0S8^mNVncSG_kJo_!$ePDT14s zon_`8j`|{Ggcv+x#ILC#<`D#3=0s{QWA)2lO;7(!S}EL1YHd3ZGFaKGLTR<@F^}kx zkset+_-tgOFYOzpsPMFjmj6||n*ZJqELID_$bF7X(3U70&Z-(5HjfvpZiss)iO~AO z;~P3S`kaYPx_eSCJ~@4lVaC?}p{8Rp_oE(PFxq!zOHQPpsZ*MioL8$URmj=Zsx2K* z*4VkufqD{2RciuM8|X^`uD%B7qKadQ?> z{GhO3lZJk2A#rP4gZ%ATAm|)voFAEic}k&_w&foShc?$Mpbk_h-?EQqQh2h3@|E`!GMRsz~=Le1ODIJnO9-(PeR@MR0Tk|rc@M|q+ zq-M2rA+1X?Yhr!B>Z@%pN-qoS6!ec>rBelm<~L;(WK%ac5@_{+x$_`{T@pH5lps31aI-g| z!n4QJJ|#0-m%Y$i;Hla9MC33Ssa;9fIGydhBl?&yZX z3TONDUrkeAUnofbCt3Z(YpI4^ZNBKMo-d9#WMs~F-6sac?c92J{>RuEYG3hzbUwNm zZz=CC9Iifg99_4_aKx~)f3-xQZf9)Aj(g0AwjbDX^Sd-mx^j@h7thGh;_l>9#J zMJ}-oH>@x?0{{KmRz*wvVYI;%qo_lYm%Lt4z~RxvsMmkVk{NsJ+yra?HU?B;Vm60u%2qjWcedAa)n0kW3v&Eg)uN^&;&$!1+Ww8*NWlG6_+H*)Xs6 ze|v74w!Yl|#>Vc!0%I{x78$hV3WLBcPp~{d};ep)i*2|xD#ke?LwC=@T=@7xcw0s4HPQD0ZIYVx)CfO z@1_Y!R2bDbh4G(cxv-+BEJdw=F6=T2jdB-u?qPG1Av3SJ$7YXcvUvFahv)kvgrI_NkIHj2_@@uk+9N&9n061~bD zl%cOGBNw9dDEYG<+Tfy#A7Dpk`l0?R_T}KVQ>QKyt_}Dj&9Pr4c0Nx*wQfQjfOJUe zG2?A1V`Lz@9Nz~M;|eiWeU;8Qac!^z%ry|M^TB9G{rBIm7%cBj?uW1SSy3@29AFQR zn>4E`vDLoe^X`*)2q6B9L`C(crq5Mj8C%*=h6%#OgKO!|a1%?9J0dS8V@dLCj%oyn zuaT527L~!=(5qU)i_dTbRER1HXR7anN$uq}uazxWx}y!tYNM_~dnrq}h2IGW{QLzQ z7tFHnxY0aM0a1j0L&#%NuMa~5*u2G4TazSqv{$zWJbvHamrxE~%tg;-J+y>>&gee} z0p8p_bZEqZ_6N|(aclyFIvP8C*xD7iKZCE5p{iFMnjrMNpm@R;9VXS>;Uc=3RD(w> z)LTdR`dk*~)a^qZp00dZTsYW;yoA`!4a0W8A%Z{@{F(z)H?o;n4I(Xk4|6QY%upwDg}-CIKDyRJNXpcjD{HsFY*g<(+syg_*hA}?<4SLA?m zzfN!fZz2m|@PO;j2ZGLHIDp|Ykt<#J!Qlr&WjGIL1&eS4dB>R+8wnME;>Z%k3nkZqu1D44FV=L5 zh}^BGPq1L3kNC)vB@IZPn_Y+3@*oJjTzXfIo^5VH{b2F)M!Z=%A9%~;0B_~!sksyN z0F<+!zAfwq`BHs}fyE|Lmc83;4y#?KxG@vywQ-h(* zoyEVpyw4DA8)!}aY8}mo?-Ds#I?&L$lLSgR5EOfcLqcn^yB5&Oi)loObJI7Sfh0y1 z`thOK$cdXU_kW(Ne(;-KPq^=+moPEG4O3NEr{R&sVOUW#nP6U^Y>0l6Qsbc?{@GzQ z!-D1s`HrHoZ}~wNj>G2LJG3Ts!L7fX(BBqG$=SW)Y+H;Di?KLX9wN1LHML)7+cxNm zH>V8oDORLn24-JmgWbh5ev)$P^DW!cNb`0!R$3`^pTOKBcv$*aYuMD{6p2`$!+v$> z6q4$zjX8Cx3L33~oQe!Q;M|lN7ayLYBq&TR7~gfV7r7kNTm*K~k&RII6akf@Sc}sW zXOS|IO$p5X^SSEK<{LZjT+&B#3^k$aBQ6s~U?)I!7) zN+QTzcwKhWp2S3JAR1${2X8-^I literal 0 HcmV?d00001 diff --git a/src/web/export/items/computercraft/monitor_normal.png b/src/web/export/items/computercraft/monitor_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..b80d1f84fc339e849b1f22cdaf1122b72afce99a GIT binary patch literal 1172 zcmV;F1Z(?=P)0K;i`$*>Dpkgl!H97yr)8 z8R1aHt=+tn8np2IX6Bgz?(Y8Ih>|4v7kLzwWs-zHlrKrVSR1^K1fAl=@yI`6A|HJd@uCQ>$7?Ykk$4L7@JALTM3P*Zi0gVX zLj$0!au=wbKU@-ocQ%nYc4g0}-idTPwl0*X{BRCVOgpO;hN0paC&DqZTslz}O%6Pv z-exl(gsADr8wc5mwnX?3+-H%|0$leUqTuFRU8f1^3AaMS=b$tmjXaW0u4q@BxRuF79Le7hXlE#k(kbB;EG#p0J8Q^e0#Jgo#oAr9F41jNF z1VD@4{dhcDt)fWNRDhKOKq7!(u3;kJwjxL1X0x&N`}^?RtsPA(M^3-wZYb z9$|r;gA3LTARu|HHL+3v6H43?;Fs%KFp(fE%NUl-Fi5`AlvqV7;E+M$L$-%TK+bl) zyx=_&$FOt8SGlG|3cxvFdd!X+MaAU#e*f|^b;1zFK0KFy0Z0onIZHT_AyCfLaYmzy z@~#K(3?Kp(lW`zmc}b3daSOm}fB$9xAS4E`1kf(Va@h~SQKGMTW;>(D=o=(KU_bT&IxXa^;C;ubavU2I5WwR+yuQNz_5gOK0uUm{TS?Z<6G6lk zz)l5Jc+((&w~0rZ=cYLt^#Rg>0;p<4$MW81ZaA8NDXz>J%iQuIsA${LD{lkUu{geSqz@13(0P z(2CE`s$xVoe>MioK7i5!TPUau1XO|$*?d0e1E?OX6#%v%YBU512>6BvYuP^|;7cuk zTm`5etSiz%YC%5K_(4RCfbC_u3hIH&E6s` zn*p_By-jwv$uTUbqNbH_oXKQIYjcCVX@oqOyrsA{x5?Xypa*Gc+%9K?g8Ma`{~R)2G#c zlKQU!g&0eM{DK)Ap4~_Ta%??a978-hlM^IV95~q*tY=ErY52#*a`C{5ra;!kTx`uu z;^HN&dU{{N8#vj*7*`0$X0S2~^D)P#^BOQPJkQ*#7{kbx0W^rg)78&qol`;+0OV09 A(*OVf literal 0 HcmV?d00001 diff --git a/src/web/export/items/computercraft/pocket_computer_normal.png b/src/web/export/items/computercraft/pocket_computer_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..25f6ee70027200f6a0fa62299d14007cf90ffdc2 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e{s5m4S0F7YD5#>MQd3j2e*Jo@ z-gB}*A;yv*zhDN3XE)M-99vHp#}JRszR^u8vb#yTs*L%DUfwB7h5xv zxOfSxp5B-622Qpx#uWmx8LZ60e9ZCbyao&m&olQb#xSyF01aaBboFyt=akR{04D1u A{r~^~ literal 0 HcmV?d00001 diff --git a/src/web/export/items/computercraft/printed_book.png b/src/web/export/items/computercraft/printed_book.png new file mode 100644 index 0000000000000000000000000000000000000000..ee4b235f7fabfb769727356b77cf04aa4a319c26 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|el>na*S0Jsfu5PO@Y^yKgW+s~A zC7zz1o)aKZS6w}!r|0tJ%O5{}obFrM4phfj666=m;PC858j!Qn)5S5w!~5)&K*1IR z9+nGH7Tg;*h;3+K)w#kXmZT_VP@dz=zs~q?&Z&O~?b3{XJ9_D#S)L-7F!j8ScRLTe z&h<%rl3W#cw#l+HI$W4=a6#W>V@`jSN*O68hHEvI!v9^Ks31_}0i6H^ob`XnicS2+a~^nDeLCnDNK@ fCDCk+nLnA1i!GS&e7++q(9sN@u6{1-oD!Mh}hfiSN9NB(6+~nQ(Z))Js!j*d7=4x)d=8EdI^m$#8FF66856p@ zC-n4OzI^%l^XFf`e!aWt)O(;bV@Z%-FoVOh8)-n!WKS2z5D)LOmoD-)CfT}Bo8rNR-@xLc>sRG4)C83)KOp00i_>zopr07GPC AcmMzZ literal 0 HcmV?d00001 diff --git a/src/web/export/items/computercraft/printer.png b/src/web/export/items/computercraft/printer.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe8a80dae400bec68c5473e290c767ba902d298 GIT binary patch literal 1306 zcmV+#1?BpQP)9f2sN)y4zE@2`spH0M%BDf###dt)LDe&PBC!|!G{@X-6&*um| zfTFS&sGL8N5-k72MB>=vn!DPGbUF=PsJr;^8~m^sS!=mmYCV%cI7X3kC+ez?fj{Wm z>=_74)QseP2c;83itr8Wv&b3%p7#W+lHv#5s0gYF-O2LlbOi7`aFD~HwXj+p!w=zV zwK9wmpeQ`=*DoL}sC}9o04F-_(+a{cG)==uk^yjE6lIBk#Uc!c8h8^a_7om)fPN56 zr>2>}nhb!$p@ii)Pj(n?Hj3v(LZ-=M0pz}aGn-DM=mX$*M8uPA+ne=ztqnjnGy+>@rqy|U^=RTR3W){aRkKr%7)B#8+xDfbz24}z{ zEaW+O(7FjM2p&stIA$8)fdUT%xbi$3CK4{|ItG(j7Rj?tj(KE}4mcJN_*fjE5Rgkd z@9uDq#4&iz>g7oia~~oN;2tqNMn^|cGG%!<+}$nQ zhy9`|2+++P|4|?CHFfcEb#GMahT>+pE&+BdrGNP+@&UnCpv3@`Z?`!oV49!GI|N&S ztgUPSkn6TvY5=~XzmWHcRwkirTL2>eGWvk99Raki{rIq#_J323%Z4mkvV`kCJnX6Z zGvs|C)Po0_!kO|8p{NIWZk;a|go^<1>`&x`0Ef@#)_c>Qvk>qX^6#vF0D-p~&LrIA Qd;kCd07*qoM6N<$f<{n58vpF;Sm+n4+@KIjl_aqcYyH%jBL0G6T&vf#EXBQ znR9?+yX~&sypv_s>hqg3&&Gu1*RC0>ZXmp+&n!T1wb&|8^4dY|L~}&^1$!1d4Im635rr+2IhmWAPuA0Uj_K0^+`p5NBTnnY0~#P#)T)&TCZEYArr8bwi4 zgIXe~W{O^@f#b=f*Arrf=r(}uHb?mWqZdW1l~ny=p`z*A0_5ZIpx^7o@dv{FkGS|aNCd*aJ5?b;_7O!K(tx_BsT^i z&j3(`c*Eg~?ua4B*vy3xR|({n1%QJZT}Uj%`~gq5<4<;)Z}vVd$YF(X=cR44LDw zd_nS--2nha#3o>uA@MHTq7cZnowv8NBT0gpb830JZFd9!R%`%*9i^x2G*Nt*Jl}3_ zZ%4s&injM^x$Cyut`N3sodT2vnd&88*$^CO6a@XgDd!NlEX(xZQ3II3hskshV5a3A z8(N4v1ffY7GywYT&z~9qgu(#JfF#k@wcA3p+a0Q-)tb#d2T&`?*F5us{!I+PrA^ks zKwKUA?;U^(M^aYOOU?)Y{2KsTmzOqK*I_MsAjG>8a;?zwu+6GJ5C9HbD(e7ne+!t) zoZ6-d1kml=-Q8h+*?zK~>}$KOZL^7+p#hLGr&Utt)*T^41!$A~w$i(*3mX$~prs*z zo+jPWJRc7G{YA?n`)wq)X^e=0QQoY(2HgP;YNi>`>1Y7E#{i)K8^;8wBWOfk-JcYIHi(yi0PVI0Y~BG5=7&+RLdk>4KPa37D_$_0S=N8*~?3}0?=hs`9dv|>A}(fPzmx#h7f@O3)*B}CKcR_ z_1g4csp{7Vyg8~56~KaQpqB|GH3g;z%LD6>TCxvEx(IP3Kx$bwdZ3pH0J^)RsR@__ zb@5WSf-&+qnLIqC7P>H~mdPeLn+a07*qoM6N<$f*`elUH||9 literal 0 HcmV?d00001 diff --git a/src/web/export/items/computercraft/treasure_disk.png b/src/web/export/items/computercraft/treasure_disk.png new file mode 100644 index 0000000000000000000000000000000000000000..2aa8a62b7b93c9a08c11294dadc4ed1eee94131e GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ei2$DvS0F9N$6=CjAv82JDk>^J zKY!o8eb1ji_gwLEKTwXbB*-tA!Qt7BG$1F~)5S5w6ciK{6%`g178e&67#J8D8X6uR9v>ecARr(iAt53nA|oRsBqSsyB_$>% zCMPE+C@3f?DJd!{Dl021EG#T7EiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mn zI5;?0R4!LkGgnnCS5+-nRWDanFjrMES5-1sRxMXnF;`bFS64G#S2JB)H(gvfU0pa` zT{>M|JY8KrUR5z(Rxw^#HC|dZURyR^Tr^%>I9^;jUR^j|T{>P}J6>HpUR^$wl~I+I zRF;%emXuVMl~k6OQJ0TdmylMMkyw|LP?wWYmy=SLlU0|KR+p4Zmy}JHlu(zHQJ0ie zmz7YLl~I?KQkRugmzGhNmQt6NRhO1nn2}GIkx-bDR+y7bn3GVLlTw(IQ<#%fn3GnR zl~0(JQka!fn3YzVnN*>oVWFaAqLo&nn_Z%uU8102qM%};pk<<=VWOdBqM>M_qG6(< zWul^KqM~b}qHM;;YR1QJ#>a8T$ZN;QZO6!N$iHC7!eYq9YskfJ$i;BT$7{&PZOF%P z$jNNUzIVyMbIHMT$-#BW!e+_CX34{7$-`>N!*0pLammAT$-{NY#Bs^QbIHYI$;D>L z#c0XJY{|uL$;ENW#%jsNammMO$;WKT$8O2UY{|%O$;fZX$Z^TYb;`nW%EV{N#B0jL zZpy@P%Eo2N#%apNYs$uM%ExkH%>B^-0004WQchClT^hIj5P*X)PA_i(v$VzFnr3xwq z5uxp-tL_9TO0f!|Hfftin8|zYb&@;x<-EDL*OD=FuQfd)kU73 zq+)x(+aAWFEaN1p%2C$;N5CKb1dov1$|)L67V*>VR9p*q%fWyb=&iFtwobZ>HR`|M zKVJfP%RxLjv|Le3WQfj@?o^&9Iqb^0DS&6aDE9Nz1uH&2Ad$Ib$v>Ag)cx&tLx)u7 zuS$uxH13eVqb#_fNr_L)`iCeUt(74$jPvaQzt?Nz+{xwJ$POrnSa4~NDyVa^)tz}t ze7>Ai!gst=*vZikxQi^Hyx^t*)sT7Cj&NF7%C`qR;*DHlj_+fMn~(ENs!v$O)$4nfCv0e+sw`LSRP`vN5W;}jDWv^rdD^|dP8(|zBC zD*YK}LiSZiqmQt^n(RTVLcJg9!QHpNDa*RpU!d@JtR{w&0ra7m>#FPW-Su~{FG1-z z?&>Sq(#Wd;XN6SI(-c7{gxm@2kA#@drYNXkW`v+SzBzCLt89ujr|g5>A`&?>T@tji zL=YbvrH3WU;l@bQBn2^2xtX+0YA6d}g{WeFmLQm{;5Cb!aECKh%R<@aY@?^>uaFij zUokQ!9d&6t1yz=CQlhgfuuvP)=p#&M&Jspky$eS+Z;h;lJ-euusqKa+ByEnaI(3R- zGGLWfgk85TT3(eDi^|^3d$rKNeHb_%?Jp@4%;Zl7hBM8wc zrYNYO5tkB$&GEj?#|uT!76^+;3WnnzMG=Gcfl=da-u1+V&{Ts#7&a`gc_ zTp4}-JNRhIII}V56+hC`BvDGrP*H|v^vK(RW2mN$^M-l9_MpuuB~mI2h7#&sJ`{c7 zuW)S}eQJkSlJ6N54ZExtA^g`lALPS^)MnwNWH;Vs?;=e!v^{2OhuixkN-8hxld%z;64n zy;?3$nOrgF%J(AxZ+c7Vsf0?*H|5Zx!WZ)CC6cno{2sv$tte@z8uCqfTSz&`8W!)k zI2iD)g^4yATBTGJ(h|8ukiS&^kqmKwE7r|=T7yE$f!vX2a9HzK(J(+EaM_w!JL)M5 zLJI9HBRHa*$A+^b9BgsQCAWR#85AVBJNhAh$A)ET>v2%wA;-1y*e9OrBrk=c;xjI! z(o|pB^f)LQMa351x!zuLAU~TFEiow$w##z`cQO(XGKItgPPtr8d_2BgLo0q-`Ym%; zT{mZEilGj|VoYL4Jm|QEYWzdbn-%7<9zr;~y!Ms?Vj_l0lz1ebbTN+|;9TTxh~_af zA_g(5ClMtcj>oiGf9a8L42t0Z8rnpuu9mIkQLGO)<@LI54FNPn${s}Q{&nOfCVv>= z0Gbx-HQ24$p3x^qq%kV$7&pW9j=a?nVn-fBzr4>uK%p`guGNTE(2--E{vBv3V7L3~ zj%BfEJX|MEET}?P9y;>z;SO@yCd!&x#=;^KR}cb|UHLK#ak--sG18c(*?=N&`(%v~ z0`2zj7;OGg8540TnGW+R0c&GNF0ANa^9(VX5+l>ouy$=%Zpp)72SwR7ljoV1JsBhce@w;h-!p`TqCLuBHxHpTm@}<&Xl`gq$yEid zKZo`jdDY$20h}MvXN9}+J+2N6-D+EH|8e^pY~CB1B=E~(00000NkvXXu0mjfVb`_& literal 0 HcmV?d00001 diff --git a/src/web/export/items/computercraft/wired_modem.png b/src/web/export/items/computercraft/wired_modem.png new file mode 100644 index 0000000000000000000000000000000000000000..841d3dc737af4be0db978fd379a96ec3dc6165ed GIT binary patch literal 593 zcmV-X0~L3Z`bR!;)Kci06KxW-EM^Ug4=w4#uXWSW83lS*m}n1^{D|sPV!vveJ`6ghE|sY zKt2a(1ot4D$GsR5@IH1s6lgLykRart0{qej?v)o2G4>rt6yK z?d@6w$ywYWr@am#^3&aY9_e{14Be}_Hlxz!a%GxV3>8^_vkW$ zsF!1gDVWm(7K?iYRP2)5h9;haOq)$Dkt@Ch5ZiQ~z{wsWv? z4>%rcuppTGhr@o~alc5&G+7HB7JD|GOw#lNpsElt_kDlA+wJuElVC7?_yg*>8O>(X zvP{#mGy#4M07d}8-OcB7sJ0AsD>KxCJS#^g011i{fu9vj#&Wsb@-o8_ z8H0gy&}Skq4S+|Edjh;#EPNjt4vRg5A#)s(gC0X?d6}AkN`d1_9U&2rOF17NaKN(+ zX3ilw3ei8kNDV+(p?ma>6Gg$)_3`-dundy~+CC9^M)}K&0f0-OxR>xu1%YsuVK|+V zJWUP%QiL8b7l86O3MQZ-AV-G)NOKOu(pk)U0Dkw^F93LqU<_ahfT}cy@g=!saTa<0 z-vC0?gaJShPVZ9AJry|v@U7V}1$64UjKD%7M+Lzh0QBgPd}QfC7yww|xh^C08we-| z^3llBgU|yCbcutE07h^-tH(!}UmE;eH@&~sRv*a&Hx-Ecnkp)vk4%?y=yt8?xIlxnnl~}0u!Kr0+30%zjqutLAr^SMe#!+ z1^`6B!()V=B(=VG#yG~Q0Cc3M-?2Xk?63R}iF6PE0000=@3R#YoiRVr3hELK%7R#q!kRxDOlEml@8R#q=oRxwsrDppr5R#z@pQ!H0gF;`S6 zS5zujR4Z3hELT)5S5z`rRVr6iD_2!4S5+-nRW4UmFIQDCS5+}rRxDRmEmu}9S5_~R zlu?wGQk0cbm6cAFl~I+IQk9idm6cVMl~$IKRF;uemXlDHlT((IR+g1dmX%VMkye+K zQJ0ibmz7b*#cjvIW5>p9$Hs2RzjDaJZOFuH$i!{P#BRyIZ^^)F$--vI!)(dJZpp)M z$;E2P#cayNZhr-%ApigX0d!JMQvg8b*k%9#0-#AmK~z}7?bcsUBUKm%@ZU^lptJ>% zxRelYOjeWbh7aJ4dZS)&;f0^mTfc&dH>ll0A_*qzhFu8|(g0mLbdDEOLAG6bx_e_H z@72sX=Y8gR|2=1Tum}4uSQ2@z&g=I8Xi#qR!#e`3aJ@}A;Kz3W_<-;&0+&BKesepU z;l4`Prl@iK+q47s11#VR=dBBtdhlp21`XG~@mhMBgagPP&BLI9?~N1|9R!TBc|vFg zzQZMcYU5-Tib#M~kZjlJOLPmIRO>|?gXJLE4n`OF1^!aQUMDVul_2>#m!y4ugxU`w88UbJk_fP zD<%YKwUlL8dycZa?U9w442BEzIkv&$1>}a~SRxq=`#8qVV{|&$Euqz#DqvHR*l%92 zv4dTm@ie?$0JCZD&5fJKV((@O2T@hvPN@rb{L|S0WlEnvqVJ3e24!|V;h#baYEhjS z3Yup(@1MbzKqo|MV&1&n`xJiP!m~(4O3Qz3C2)3xvNt^|Q}UXocaGN2?zZy`1|vw5 z8|?iptV1VunCkW0=kQ$s7T@9gYlX4TnDRv@~F8P$mNy0BGUi>002ovPDHLkV1g|A#&ZAw literal 0 HcmV?d00001 diff --git a/src/web/export/items/computercraft/wireless_modem_normal.png b/src/web/export/items/computercraft/wireless_modem_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..287a1738fd32af3e3ac773d44ac5abd7f8c2b051 GIT binary patch literal 620 zcmV-y0+aoTP)bjS`>_6G*bb3bK_x)*Emc4T4Tt7|IvaahM`7jKQq!UH3hR`e@$8jL} zO7g|~X29VvjyE|0urYOq!#uC+JkKKch}b0WdlvJ9Mcx27i(CN#vB=SygUk7RRylbO z0gDA=60eubWs|c^{X?(;-1T~8`J{3z=MMlJ%0u}ZwVimU)^k|=a{~|nzyf&tuE9IU z-t_>1Ujzsiz<1Q(DHg{7iG#!7Lp%h0Fd&w*GeADU+W{Y00jzLNNk9OQBcKJ4Qxth^ z9##Ta0bgGPNF`zpUSp98v;p-0@Ec&r!8-wRmfV9^4JV@k@E!?3W#`OG{euU`0B$A2 zJRm?!nN^^5;||;ah8!G^1W0mf0U#H^F(sf8P?A{d2F1C2djAmcc?ZBS zNGLv70O=0EZ@v*SOu#bM?*Z&mZba4F0J#FRZVZri0%;5jfU-!wHUKi9UX90qVaVEv zC5ga;McNtB2#E0pkY8!%db3S{7=zwJsT>c~u#IN}AVrx-3MdnK19TQZ%2C#Uy7Y1c z9nqGpB!FDjfTm9M&bU`MfZhff=`!N2TbThV=^DVBnYVfY+>PWmxt5UuweG%6Ui(1h z&Q$onty}ba4#v@P0e-AnySK4(82F+9|B-Cx~ux`Yx|n zxKir@|Eeo@_y-nelFgxCGsAIIv>z+_RCI1z)zN<#~u(v?&BB{F%qP;7OyTgzl@AKlFz@$i0o@gQ%50SD`abqBcCfYBTKrhk7- z)^^&8@qbf~m{P8=b?fBGsb}`FmZ>wP9Nfmd`3#51F7ZvW3471@-3fKgYV7zep=6;R z#PmV2$vEDoKjSFVdQ&MBb@0Q8tsoB#j- literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/brown_dye.png b/src/web/export/items/minecraft/brown_dye.png new file mode 100644 index 0000000000000000000000000000000000000000..7263ee4639abf20989c31b2737bb31035cc01af8 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ep#Yx{S0L>u&zhvoQt7HVJ;vyG zolm{pzE40=#*!evUK^<%TvfnvV^)7Q+#SB;xa^fU(C)H%_>I@9o-Y(ir96or7q9_f8o zET^d(h<%*&=W@Zz^MAq~uIwzg*dH6A$|kqJ%13aSNv0sDQ{fEmAmPlN66TE_Ko>B0 My85}Sb4q9e0LTGKJpcdz literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/chest.png b/src/web/export/items/minecraft/chest.png new file mode 100644 index 0000000000000000000000000000000000000000..19f6cab553d2fb2e6758aca911ce944b5cb80de0 GIT binary patch literal 1603 zcmV-J2E6%+P)T~8yFKC7!?~C6dV{79T^lI85JEG z6&@KBAs7iGAQ>bf8YLhZB_SFn9SKzwG$#`^Bn&k*H8vv(Hzy7_ zCJ#6%3ppqeIXO8xCk{I+5OjDAa6++a84U>adC1>6?9i0byFXBSu259BZ6QW zgIy+tS|EsHDwJX%mS`lGmzS7i9Gq?`ySuw5^@B|S0004WQchCJ9$##DoV1U(F zdY@$Hmjeb^uM}F7hf0rs8DM}_S%OGi*;d$jf50acs}xAI6?JZ>VfXz2>x{2)hNdQ? zDj0LWa*87hfC23qXD}i|LX8QV77@{c+-i_VG>F3`#Xj2$h!cQMaD!f0T}DOTgjq>& zX?rfI(MkE|6TR+f339ZkaxEs6bcdOY90C5IZzGjqRA?lWazq+ch(_Fqw5mrlb&+=0 zwS5JR%qTeBy^BzV+n8ELh-p4L32=6(eqeAQor(NNF{Q;JF17fd6hD>oF02`{l(I@c zBu&C71X4bg+ok-OvZ?0*R~`rn_#!+_nM5I$ojl&<>XR`v6Gh08$77U#w*IKtF z!M3Zl%syNA9-nnJV6<4umwk$}&`Lc(oG_@gPZ z8nP#(pY|O5$7RLqbFF*E^MExkMXnW{Q!(`;?BO-m=?$N8`PoJ1zQM$J9`Lap+@w5< zCacA}UKp#bqd4%)-`IL$;*uZd0avn*HFimEl!{bC6vzHx`*!gi#XwN#7Bl*D`QrF1n37u zE+QZX?zuDUs~?BNNxSYCn;pj%WUBBoH*&5SvEiO!%%vJD&x3xf2nSC$rnssi%Y>gi zA?n4Cktt6O_ec}=^1zC zeW129q1Qk!)X*snCDy8Bs&FP|dg&Xj21|%~NAnspbub&!IHsD$x{Aqj==B&z7^8@1 z{6A^I-ZI%Rl_sNOb}PZqRE|=Q!v(dBMV+R@9Xwf z=u}fg4{0yRQ&pJ0)tL6P6G8OKihsBj@;H*4v~f6NlSU;ClfM;dn$xm?7cRK%hD5_i zs*PLCq+7i@T()U;^#uSgt=M!+Qf5SHEv~ycX%+tFRVM}WfMCT}{;KLtNaI$L;>9wX z(W3km056^Qm7AhgIN!X$zb2>2PX&aG+>O5Myshw^)8%gg1jOz7%kJ*mXg+ku;~gIy z7wS}`aY!_N>#TQv@?0=dz18^l0I;Nbr~EfD{s+nF*G#ys4C4R*002ovPDHLkV1hOe BvT6VT literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/command_block.png b/src/web/export/items/minecraft/command_block.png new file mode 100644 index 0000000000000000000000000000000000000000..cef1cac2eb9535d8d5e7c40bbf058458d79cb6e4 GIT binary patch literal 1597 zcmV-D2EzG?P)KR!Z2CKE?SNlGghN?|ojG967C z7)>`JPEAoyG9OPkDp5EnQBYJ-P*qYwH&ReoQ&Lt{J|R^{K4T;zV`6DzfktIRCuk@q zZEAIGY;tl!A#*x7b8&ckd4GRQOMpu#gfA|Hf{cY-Du;!Ph*ma=Vo8fOG>nRpjbcWQ za$k^+m64B_l8~5_du*37FPB&>nN3QWm!PAdsi|dSt7A2>dpWeRyS8&kw}N83xWc@G zUA>ooz`e)9z{}Nh7A^&c-i?vvB z1nK+BiGSje3EaC64-fdJ2&U5B=Z*j-d$8Nv+XsnAWd!d)Oq9EA+oRFw4hF&;zlbZ> zJiT{*PVV2a=CHjz8{9WUol)s2ciZmudUx#qoiFqGa%tP@K1!OTuL?(%?<)77 zKiT`&FMKVRP-MZfGT>P)PBzn7G| zE=N#ktCAuE`lTYs0w~%eOhu5l)wG@i1_Npx+%Dws^z=lR%gaj@L03kwP;FJOmjGvH zgvP=j?dMS}mrHeDMbK!J0B5iupycpD+wApv)CME!BP>$Vwo`Q<7sqM9asayrK^#+V zSZEvj{Jc9F(Qcq+&*#+7Q+dD9a2!VD0CFFX<9NX3L^q>tW?kwETC0_vrVNm|HyZ6W zBZ`3Ga6AqI6oV1ySSq=09VuL@N>_KBcAF46AQ%EL93qJUBjh|#MK1|Qh6I{T0NPFg zFpP#2g9K!vF7npN+yQ8}0U$&Mh@xQ>d6a}Au&4z~wQw8&0T@vLL|){19ssfQ&qPg< zf^g&x3D}&oJKnZ6U2M7E6H6b_wr?i*OR18F770O`$teCBRibIyyMm z-334hB;b|+rl|m7czx|j0(T~No~)ZVI@*QRs#PHj;~AjS3B!LR!iy9^0aV?^uCyx5 zFxKXQWhuY~05_gaf&eOkrZ|N2XN9O#o&j1de)`1)0dx{^oOPZcz-I~A-UgsiPC)}W z1WzYH0G)uy0w91a9z^Mdyo)i)Q z$M-n_2JC1+d7wn-M3utnsT9H+k7;|yt_y(g3n{_Qj!Z$U4HVi71;D@54E%fsPz=-p ze`~r}|Al3j% zp{6sC&u=zM^FSt{5twcmPO%1Hjva_vtz3b%fkH`Sh!dKyV>2HpMq7xQsImgvI)Nf! zz$X(3=*LzE08DvxN~n`Spp~k-Rrnh!0mm)99|XL8F_o=Wr{nQvDh(9sMNzF{6B$0I z;1mZ6Co$%e2~*kZz@0Z!VW4n3S20u#YHgeeg#?t8aOaZ=Q#p!W7$_iMD!a5doZ^{~ z8->g#lgaK3kOM^@C76R`*c-3Bs|M<142H@iKpkb2HWJ6)*zmTj0FjO%h_jK3u*tn% zf8%|f5P`0Nnn)V(4tI$_2<(mk0>^dqVeG!kU5&W$usBfI|Cw-`Op2Nfl;$hKZ8CC~ vjpRBTgxeTJK2V&kkC_H+ecTAJ^=Iur%lw~oA>)o<00000NkvXXu0mjf1&pYZ literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/cyan_dye.png b/src/web/export/items/minecraft/cyan_dye.png new file mode 100644 index 0000000000000000000000000000000000000000..03d946dbb28561c11e49eb724c1c0813b470ec7d GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e=>VS)S0K&n6v^wACLWX_lhCA` z*Q--K+q!3+*WCS^J}g-Wlx8dm@(X5gcy=QV$Z7L*aSZYBetT&n?*RoK7Kil*xYm5o z-p~~Ofh(?Y<74qf9Zab{hrJDh{&97?JV_H=Fl91>V0oy}0~UreRr!LU2^(S#+){Rl znexUpsNr|S#H$rWj2CuCX2(oWUmj`qAY1HROSfu0`yYojmd8y~nI}d?=DrqD2vS=0 mx%}@H&4fj{Gg(7lrpoXV3kMP!N{rSvNk`AJo)pMiJ;X*pi;(?AirP+hi5m^fSkFWE{-7{-fypX z3m#M8VM)+QSSXgHD3-;@y-|QW;((KG$d&VE&iu79yJP;@9(+@Nf~SAVzsinPU(PV! z+ALS;IG=e+8QbAajU2CP?{AB`E6>5|a(9-8rejeWlVIrP71L7%u1=oN@coLF_>7&? zg&5eMonw7`=*Wz=DU!R-{$TAg1_1?@)zQ9;%zLM)7^vFc X@$}}%G)y`HbSQ(TtDnm{r-UW|fMsM= literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/ender_pearl.png b/src/web/export/items/minecraft/ender_pearl.png new file mode 100644 index 0000000000000000000000000000000000000000..539a50c680f637359729c8e97acc175859d4c4b5 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e#Q>iWS0K%-rod)l!0qG6W2P?< z8z5bkrP@@ieR{p|^tP^#_b<%Olm#kcED7=pW^j0RBMr!z?&;zf;^F=FvLkPcfk11b zP7kZj6(+GPM($)FyLHu)^^?`69GZB%_5YUH-*Yboltuo_yA^ex(I+mr)?t0K-LqNO zTy8LI&eBX8W4$S;_|;n|HeAScq(#WBRg`|ah0q6Z9km;={N5Z!ZV?SsGRS{hr0E-jzL zVI?oqS!Er-lCfE5#=|Jf2SLRQ&z`G%Sp7?0Mw$76MCC!&`ONmdKI;Vst082(e`2YX_ literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/gold_block.png b/src/web/export/items/minecraft/gold_block.png new file mode 100644 index 0000000000000000000000000000000000000000..4331c0b18a0588816e6740b364de4d0f172643bf GIT binary patch literal 1192 zcmXw&3rtgI6vxlKy?xLJRH#y02Gv$Kl>ya?7<^n9k0P%k^%aENmcodswit(QZsT6+ zV^vuyW5`1sFlN*-3iy}-!FyYoF3!Zgv}_DP7NkixyE!+VX6`o2PQLH_bN>0hlanvs z&uJ*gmIxI>0FdP9Gd8k{hqi#j=JwC204qjAo-vcvqLhf@RGFzL!kim!*%o7|$gS8U zuPBYHu&h32QXYSO;hAH~PbqnCtG3roxf_?dyOQ0Xl@C%H+L>@~P&3`5n*Az$*5BhF zUG2ZC_djrmz1oLtUu4h5f?~jDe3bwgnv;=cl+WifX*DI;;XtDbP5X^h|3Cc3vdibQ z{|@j@hh_~09!haPzszO2 zELfV%$e50P=@&CmfY8_VvKqNDrGY0R+7bZ?GPgEYm0s#PuG?yl|0T#3OqRy)UY1{s ze^3=~?`Eb%*p)|KLryQS@KDv2R;-QcCeK_ff5|QYEqD!``GY#^g@MH#yKE-%8DD*uRJ)gzLNaK6MUFGrFDT7RL*FT)4bLHQ?7Q9xqLZII+J+y@+2p{+m!kqQ7_d z-V*#Z_U@YPvD_`eYcCCJb5LQ&-6BVe@lssG`q+e-C9=vSSAar$%JX5^)-?TN;(AZi zK|~(_Ay4E`k2O_1J5{@;U&=ePcoj}1(MU?u(9IVk+ft6G83jZ_%yO--Ep^;U6E^b# z)Bw1-94nzn#l~em4}>8n9m7R=Xw04|s3b|$!D+|e$c0ws5Hv>1CSfpnuG$25>;q?s za<-TLoKzHcTg2aV5&hycXfAT~RT&`Dq zcwN1wQ|p~*MnG~zNuo6uGaME*fMPN$*}#qfq_f)P0;gO9br)}7B>Thgxq1*-Py%pH zYTv33Tt&c+6(q-r$#pJr7d?TeakZ{%X4^@QSSFv^S{Yq}jAa0(tQqLH>S^(c09mgL zQ<D{IX*^0YE*R_&ILKb<}xd0Ruf*F;1^p*$8aXjR)8TBK<#i#S>DdG5VS)S0G)Y!L%V+@a7cZXX{13 zU-ta9j$&v9Fm)zNj0IjnD!3O!g3uq&)O=DDhD zUMIIerO;I?p{dzcjMi_|)3kmvO`P(pv*YHxb>azT2GZx*H_L_;F`r|MSuC89VzsmJ gSEKl3=^r)hDaJ+u7s}^<0Xm1l)78&qol`;+0HjY?v;Y7A literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/golden_apple.png b/src/web/export/items/minecraft/golden_apple.png new file mode 100644 index 0000000000000000000000000000000000000000..88f462936121f34ae609298791a9f153807a1cb7 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|exd5LKS0EiM#2Ku@S)#$TAzARo z0^#Sc!(N_r`TTXl?>~?E{>@Vds$eV$@(X5gcy=QV$eHNr;uzx5dG>;#ptB(l^MwF| z)&K$4Kmj1x8enjnZ{NNB-?k^u&Dy}e_uzBGe?|u~9nMus&H2mZ$yCe~f1#gIGu5kj z(zX(3d-f$;uHBnCb7uAWuWq*vi0<|<->`ba+gpNj878RQUZ*>kX{uAU=iUcapPlqe zg%##6)t&e^p@$<#Df`|lF#|Ui1_nX-*J1@a{QSohI%>s#dI25B;OXk;vd$@?2>|6s BUl#xX literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/gray_dye.png b/src/web/export/items/minecraft/gray_dye.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5c3bda9e10f0215e8a2d4f3ec1cf10730b8fa4 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e=>VS)SCF8CLr6$SY;0^sMn-9A zX;V|v)TvXKEnQlEtJnZ2%~%rT7tG-B>_!@pQ{n027~aP21Op`18Y8LZ*U4r zXk9ZwbQ4pueV81lV&J~a0>{VNIwBKi&-OhvJ($6@<@*d<+nNBc>=hqpt-Q8t!hOc9 zGu;x#p?B4t7?Tr>7;41DXQXnrU5cH`J&7SvK~2w;wc|lR@ttR@I1?7+dNP^2e`bnj W-)1Q-&9wpO1_n=8KbLh*2~7Zo+)R=H literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/green_dye.png b/src/web/export/items/minecraft/green_dye.png new file mode 100644 index 0000000000000000000000000000000000000000..46c6bb4360a6449ca306515d5ece3436df703500 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ep#Yx{S0Jrq!m91aZ5qJqnI)0b zqTBZ6-3y>7V@Z%-FoVOh8)-mJho_5Uh==#nOJ_L`7;vyYSo44@pEbNfd(YqSmyVZ~ zEVNh8T`1>tz+YhN*7Iy1%osc#uq|aez%$_vVS)S0HU-ViF!69vd55SXkK5 z(6DUTva46G{`vDq^Hp^uP@1tM$S;_|;n|HeAg9^W#WBRg`|V{%-UA9et%*7biDDZX zTGJPbr7hfaor#z6(8PBe_A37`j}YT{c)!f^o190g%ITZ(5xZ`S6^We5R6OqJb*A`| z;p?3O;tnQ4Y27Y{RgB8h8g!Uz8Yj&w`Fe%>#qk%VlF9<9PY=nkyZw5^av$m0^Yb%EG2)~yD*f5fiT zb6RRNp52sgIe{@bWq?&t;ucLK6U;omwFP literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/light_blue_dye.png b/src/web/export/items/minecraft/light_blue_dye.png new file mode 100644 index 0000000000000000000000000000000000000000..f41f3eb3e01493a9294d120fc528e07b8609df2a GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ei2$DvS0F9tP-K%j!@uEl-pm^f ztDf|3|G53~pO9bEzX0VJOM?7@862M7NCR@pJY5_^JiOmtI?H=NfrB+6EP)k-3V`VE zv#B$dU6nh^{r=JU-+V_rLRRW1mnYdWyHu5jix!$EpJU$gTe~DWM4fB2-eT literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/light_gray_dye.png b/src/web/export/items/minecraft/light_gray_dye.png new file mode 100644 index 0000000000000000000000000000000000000000..a62673feaec1bed24de34a33f047d6a0ea6449d8 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e(Ey(iS0HU;;~gGSHFxgD9Xs|P zJ9g~awQD);B@=-Xj3q&S!3+-1ZlnP@b)GJcAs*guCmrNGV8Fw?w<-JuSKLAE3fA}b zPOEpd1x-qy>d*J7Q%}Lg#f-VHJM_@U2`}wJ>cjJDK=NMo$6QLQYy*71c4{(-gl^_zx1X)B#e~=MP@1Ot YJdgD^Mb-2_0A0f1>FVdQ&MBb@0RFI20ssI2 literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/lime_dye.png b/src/web/export/items/minecraft/lime_dye.png new file mode 100644 index 0000000000000000000000000000000000000000..c804898306973e0691b93461a1b9ec84f79d3c9a GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ei2$DvS0JtECS{bS5jle+Wff=X z5rM{wGOHe0U7Y*$J5Y|XB*-tA!Qt7BG$5zg)5S5w!~5-}-Mj}Bcv=$IPY{hbs9nJt zmcV+AfBzf}{?2b1JDQ&Dd(@J%ZL_iG&P`kaTf*Fx`UGt?mX^P&x$79^aCXnNcQfB@ z-Pgfl!<^V~-iNc}gpk|G^h`$~0p^)MR;wQ9aXwo(d9_%Bw6C||jmTNT-c9pvzPLT( Q0?>K}Pgg&ebxsLQ0Kno>3IG5A literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/magenta_dye.png b/src/web/export/items/minecraft/magenta_dye.png new file mode 100644 index 0000000000000000000000000000000000000000..628b15ab827aa939720676ea136c0ea905d299b7 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ei2$DvS0J6Gm|9^sVU6FiJ<;1v zW*ojzdFj!lJGb-Ry8z`FOM?7@862M7NCR?;JY5_^JiOmt+Q@srfP=*$>;zX_qi6&W z9ejOUzez-OQLXvErf2JaFio61S?%#jy#}R2;b+!~+DRn)UD=Vg$|0sf>a$YTvQ@vk z0~~mLzRmVzOp9zI5 zJ2TKDo&W#<0d!JMQvg8b*k%9#19eG6K~z|UwU&u;t1t{j8)AaN5F7sgW1p@Tyd`ax zd7d!tbb61ZD~a^y=l`A?o$uuL`{xLj<9vot`Lf*a`~E)SlndZpL?I^tJ^OJSuOn1W zVV9kcUN2@*MBl0d=HG}yP9eAI!t+NVmOKRXp|HoY9D30&$%)?zIipid`rtW8O;2%A z5>K+IlHXuJeUVzO<6%dt#v%9aI`l#{T}P_Mv27BlzZU)+do$qIn;>@S-M&3JmW5<+ zyJWzX5y(J0*0m8S=p`Q9E|&^$wJhqYa~l`Evb+SW>osSwOB;`}e|TgJc9V}|1&A>t zj!pWvS^qY^xOkI$UjZVWlnim`IB+2g1GIXR&$Fjf0TQ3n3+*QCJo|U#=<_@b6(A8{ zno`PzpkC>ynO{dIz+3{-q=1+TM6rfhF42c!ZU968CKiQA>z67z$pLU30P-M=0&%{H zq;?5U220A7@!OjF(iv@XSNQ}89*L5-vU?}LP$vg zmPNJ>VmF8f-Zvfq5E9GJN;nJcI|C?pI?QPXiNj7D9@m6|Fr6y^qcn|+XM`luO=3X) z>H+;kfN2r{M~94)n4Qc)vkMwutw1e-eis42;7a2Vnsev?>nhztBPMo|n`!_G>}D;V zVXhq{th2g@RwniU$p9d;0|Wtl_Ofc@Dn+0XA&M2$S_7~LD4uh7mqM3tux~D6_ES&>soVP*h=Ky~k%{{mvO_e#Ab%G`L)5{(Z zPxpd0RRJ1U0Pxa3*aeKz>7Iir8zi0s-viba!yL>#8>Aor-p0HHPTtDhE^tgS zUsl2fiPyPU0*>B%GZ`Sj$#W&50c;64cgH1l06_%lr>;bd(FVzKhkpzh#|pp%LXe!- zP~?*Vye@&~B~ba;{C~iRsFlEq^Mx`?U>+nOOkMyA1QXcFJO>=uY3}}!yhTJCB%1@c zjvR)E(R+keQVx>!{<*v_FVdQ&MBb@0CTib1poj5 literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/pink_dye.png b/src/web/export/items/minecraft/pink_dye.png new file mode 100644 index 0000000000000000000000000000000000000000..992f9051798438c35c770619b5df9ba4a9c8dd86 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ei2$DvS0G(y8a>N<%E|JDH##@H zT6*%!rpw36J OJAQwar literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/purple_dye.png b/src/web/export/items/minecraft/purple_dye.png new file mode 100644 index 0000000000000000000000000000000000000000..318d73f5eb0c54c0fc3e2f69d0be949e9ac81679 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ei2$DvS0EiARS>K*r9po~m&L9{ zL8sRxUp>)t?yIijVW1piNswPKgTu2MX+Tbqr;B5Vhxgk{8+i{HaIiRpo#2XV6pa9) zgRhV4H;Je&sx|-D^lbePriqg$t35uc*PwJL{LDI0JBeh!D?8FwIm9$beOAg^w(56x zfCI13x7nVIX^~9}OTwQvsW?bqh7CJ(xYa*Oxx|e zv)!AV#6LV{Wk3nWk|4ie28U-i(tw;MPZ!4!5AU~^5ArrB2)G1BFKEqe6w64AzVXl7 zz+T(&=<3Ct=U5NzVZM1_)1S)BGhUTkH^jb2DGKkFo#7hb`Xs9BccVu`b#}-a*>@cb z4i@i9g>(}Ft|UhYu6@Z^8n=<(hu31kGNujJne0w!eBQKty)uKqJY7-cSy`M7Ut*>x ceR#P>Yx=>L*Ea2o2D*m9)78&qol`;+0E6IE*#H0l literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/redstone.png b/src/web/export/items/minecraft/redstone.png new file mode 100644 index 0000000000000000000000000000000000000000..0beaa512a2f0c6dfc2b4a0c88c3ef069c2cc9345 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ei2$DvS0Js!z+lYA>cGkn&CXEB zz_5a!@ecz7&(-DcfpUx`L4Lsu4$p3+0Xa>cE{-7{-fu5$pxAq^2=KaP)4E;2GQI5;>*M@LXlP*+!1UteEhVq$7)YIJmTf`WqN13hy90004WQchCv?z$5P)~7mQngL zYWPY12ngV|Mh(^c)Uws>+GF|$5MWz_rq^vua`83%2m)TWq-D1}d&#X=)M&Ydz&5hR zagTV(GHq(qXt|6nf^D1D`M5u~jIVeQ52HrQH*>ak1pmo(7OzszX6c)=tkJ%@HGRlW z1jl{+{;)Ax&w9{nXs2h(=JIs9@BaJsa`=!nmRb(OGU~v{Pgg~-&h@b^G1XY$ zgVTJkXa0Nzf#d$mUt887*Ey!1%i3%Fd{v_n)L7@Ix9dzNrWyyAeEMdcAyA{nm$%9B z?%B&4k9sY?Ue#!cpjqdZ$G@wOvDT3Nc=!1#GA0Xw-=g{Q!|Bx-u4I$G); z2pp~2`I;>)q?YEEx&wmA-t1(erA^oJxR2C4IwjDQjhKiD*11g;yPDH|%iSw+FICS}OMlxJFB!-n!hVQKO}F2LY}vTE=wTQ=^8| z?LYw67PMUV2H*`4fbRfDEn8aL0s`PW8z<-OyiF~Y9Y6rMHaR&z$r?BS2mt;QlO09@|?0RIP~g4mFEFTCRb0000< KMNUMnLSTYhtlRJa literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/string.png b/src/web/export/items/minecraft/string.png new file mode 100644 index 0000000000000000000000000000000000000000..6b82875cd177c04a2d3c32e10ada99459e172091 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSJOMr-u0UGP#qGw88(+SB(G(VV z59BkJ1o;IsI6S+N2IM4rx;TbdoL+lrBkvId9+rc-MYH#)y=T5@@L{H>@f?Q;&lZ36 z>J_oh1-xd`7Or-w?-k1@&U9)uVLi8znIpt>uU$67H<8S9rtA$X=N;( no^KonmThAGQeSxga7~@6&BmXM>D6XH>li#;{an^LB{Ts51}#FX literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/white_dye.png b/src/web/export/items/minecraft/white_dye.png new file mode 100644 index 0000000000000000000000000000000000000000..314ceaba965c5e02400bf30305eb0d82cf0ab12b GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ep#Yx{S0L@|k`fV8yM6n~=g*)2 z`SWMKx;YO}l(8hpFPOpM*^M+HXQHQzV~B_M+bO$w4+rot?`;a(A-aPp{KCK0OA->F zSbBbcawze%utLE6$3I>#XLumTuz)LPK=QvI*ejGAR`tfztUp$yyRrcQjb{je;9Q1CR><-7OvF)A1y pT{B7Vd^Ur{{bxo?0v~*=Vtn7bM6+gNWdzW144$rjF6*2UngBm5Ue5pk literal 0 HcmV?d00001 diff --git a/src/web/export/items/minecraft/yellow_dye.png b/src/web/export/items/minecraft/yellow_dye.png new file mode 100644 index 0000000000000000000000000000000000000000..6e1b056a3d28920e1ab665813089ca7df8d8f2ad GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e(Ey(iS0G&)Bh`~7ytz;6(gx)x zPc%Qj?Pu$GhM-l=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); -Prism.languages.ini={comment:{pattern:/(^[ \f\t\v]*)[#;][^\n\r]*/m,lookbehind:!0},section:{pattern:/(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,lookbehind:!0,inside:{"section-name":{pattern:/(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,lookbehind:!0,alias:"selector"},punctuation:/\[|\]/}},key:{pattern:/(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,lookbehind:!0,alias:"attr-value",inside:{"inner-value":{pattern:/^("|').+(?=\1$)/,lookbehind:!0}}},punctuation:/=/}; -!function(e){function n(e){return e.replace(/__/g,(function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^[\t ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^[\t ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism); diff --git a/src/web/styles.css b/src/web/styles.css index a69dbe4a2..d72373384 100644 --- a/src/web/styles.css +++ b/src/web/styles.css @@ -12,7 +12,8 @@ table { width: 100%; } -table td, table th { +table td, +table th { border: 1px solid #cccccc; padding: 2px 4px; } @@ -38,7 +39,8 @@ pre.highlight { position: fixed; z-index: 200; top: 0px; - top: 0px;; + top: 0px; + ; } /* Behold, the most cursed CSS! copy-cat's resizing algorithm is a weird, in @@ -78,7 +80,9 @@ pre.highlight { font-size: 15px; } -.titlebar-close:hover { background: #cc4c4c; } +.titlebar-close:hover { + background: #cc4c4c; +} @media (max-width: 700px) { .computer-container { @@ -86,6 +90,79 @@ pre.highlight { height: calc(179px + 40px); } - .titlebar { height: 20px; } - .titlebar-close { font-size: 7px; } + .titlebar { + height: 20px; + } + + .titlebar-close { + font-size: 7px; + } +} + +:root { + --recipe-bg: #ddd; + --recipe-fg: #bbb; + --recipe-hover: #aaa; + + --recipe-padding: 4px; + --recipe-size: 32px; +} + + +.recipe-container { + display: flex; + justify-content: center; + margin: 1em 0; +} + +.recipe { + display: inline-grid; + padding: var(--recipe-padding); + + background: var(--recipe-bg); + column-gap: var(--recipe-padding); + row-gap: var(--recipe-padding); + grid-template-rows: auto auto; + grid-template-columns: max-content 1fr max-content; +} + +.recipe-title { + grid-column-start: span 3; +} + +.recipe-inputs { + display: inline-grid; + column-gap: var(--recipe-padding); + row-gap: var(--recipe-padding); + align-items: center; + grid-template-rows: 1fr 1fr 1fr; + grid-template-columns: 1fr 1fr 1fr; +} + +.recipe-item { + padding: var(--recipe-padding); + background-color: var(--recipe-fg); +} + +.recipe-item:hover { + background-color: var(--recipe-hover); +} + +.recipe-item > img { + display: block; + width: var(--recipe-size); + height: var(--recipe-size); + max-width: 10vw; + max-height: 10vw; +} + +.recipe-arrow { + width: var(--recipe-size); + max-width: 10vw; + align-self: center; +} + +.recipe-output { + /* Hrm! */ + align-self: center; } diff --git a/src/web/transform.tsx b/src/web/transform.tsx new file mode 100644 index 000000000..24eb1a5f2 --- /dev/null +++ b/src/web/transform.tsx @@ -0,0 +1,53 @@ +/** + * Find all HTML files generated by illuaminate and pipe them through a remark. + * + * This performs compile-time syntax highlighting and expands our custom + * components using React SSR. + * + * Yes, this would be so much nicer with next.js. + */ +import * as fs from "fs/promises"; +import globModule from "glob"; +import * as path from "path"; +import { createElement, createElement as h, Fragment } from 'react'; +import { renderToStaticMarkup } from "react-dom/server"; +import rehypeHighlight from "rehype-highlight"; +import rehypeParse from 'rehype-parse'; +import rehypeReact from 'rehype-react'; +import { unified } from 'unified'; +import { promisify } from "util"; +// Our components +import Recipe from "./components/Recipe.js"; +import { noChildren } from "./components/support.js"; +import { DataExport, WithExport } from "./components/WithExport.js"; + +const glob = promisify(globModule); + +(async () => { + const base = "build/docs/lua"; + + const processor = unified() + .use(rehypeParse, { emitParseErrors: true }) + .use(rehypeHighlight, { prefix: "" }) + .use(rehypeReact, { + createElement, + Fragment, + passNode: false, + components: { + ['mc-recipe']: noChildren(Recipe), + ['mcrecipe']: noChildren(Recipe), + } as any + }); + + const dataExport = JSON.parse(await fs.readFile("src/web/export/index.json", "utf-8")) as DataExport; + + for (const file of await glob(base + "/**/*.html")) { + const contents = await fs.readFile(file, "utf-8"); + + const { result } = await processor.process(contents); + + const outputPath = path.resolve("build/docs/site", path.relative(base, file)); + await fs.mkdir(path.dirname(outputPath), { recursive: true }); + await fs.writeFile(outputPath, "" + renderToStaticMarkup({result})); + } +})(); diff --git a/tsconfig.json b/tsconfig.json index a1a8a0ed1..2e161c2c3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,6 +22,9 @@ "noFallthroughCasesInSwitch": true, "importsNotUsedAsValues": "error", "forceConsistentCasingInFileNames": true, + + // Needed for some of our internal stuff. + "allowSyntheticDefaultImports": true, }, "include": [ "src/web", From b91809bfc73553157bdf26f8174eabc2dc44f41c Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Wed, 1 Jun 2022 01:02:23 +0100 Subject: [PATCH 07/14] Move some eldritch horrors to another directory Also fix make-doc.sh uploading the wrong file. --- .gitattributes | 2 +- .github/workflows/make-doc.sh | 2 +- CONTRIBUTING.md | 2 +- build.gradle | 2 +- src/{web => generated}/export/index.json | 0 .../export/items/computercraft/cable.png | Bin .../items/computercraft/computer_advanced.png | Bin .../export/items/computercraft/computer_command.png | Bin .../export/items/computercraft/computer_normal.png | Bin .../export/items/computercraft/disk.png | Bin .../export/items/computercraft/disk_drive.png | Bin .../export/items/computercraft/monitor_advanced.png | Bin .../export/items/computercraft/monitor_normal.png | Bin .../computercraft/pocket_computer_advanced.png | Bin .../items/computercraft/pocket_computer_normal.png | Bin .../export/items/computercraft/printed_book.png | Bin .../export/items/computercraft/printed_page.png | Bin .../export/items/computercraft/printed_pages.png | Bin .../export/items/computercraft/printer.png | Bin .../export/items/computercraft/speaker.png | Bin .../export/items/computercraft/treasure_disk.png | Bin .../export/items/computercraft/turtle_advanced.png | Bin .../export/items/computercraft/turtle_normal.png | Bin .../export/items/computercraft/wired_modem.png | Bin .../export/items/computercraft/wired_modem_full.png | Bin .../items/computercraft/wireless_modem_advanced.png | Bin .../items/computercraft/wireless_modem_normal.png | Bin .../export/items/minecraft/black_dye.png | Bin .../export/items/minecraft/blue_dye.png | Bin .../export/items/minecraft/brown_dye.png | Bin .../export/items/minecraft/chest.png | Bin .../export/items/minecraft/command_block.png | Bin .../export/items/minecraft/cyan_dye.png | Bin .../export/items/minecraft/ender_eye.png | Bin .../export/items/minecraft/ender_pearl.png | Bin .../export/items/minecraft/glass_pane.png | Bin .../export/items/minecraft/gold_block.png | Bin .../export/items/minecraft/gold_ingot.png | Bin .../export/items/minecraft/golden_apple.png | Bin .../export/items/minecraft/gray_dye.png | Bin .../export/items/minecraft/green_dye.png | Bin .../export/items/minecraft/iron_ingot.png | Bin .../export/items/minecraft/leather.png | Bin .../export/items/minecraft/light_blue_dye.png | Bin .../export/items/minecraft/light_gray_dye.png | Bin .../export/items/minecraft/lime_dye.png | Bin .../export/items/minecraft/magenta_dye.png | Bin .../export/items/minecraft/note_block.png | Bin .../export/items/minecraft/orange_dye.png | Bin .../export/items/minecraft/pink_dye.png | Bin .../export/items/minecraft/purple_dye.png | Bin .../export/items/minecraft/red_dye.png | Bin .../export/items/minecraft/redstone.png | Bin .../export/items/minecraft/stone.png | Bin .../export/items/minecraft/string.png | Bin .../export/items/minecraft/white_dye.png | Bin .../export/items/minecraft/yellow_dye.png | Bin src/web/transform.tsx | 2 +- 58 files changed, 5 insertions(+), 5 deletions(-) rename src/{web => generated}/export/index.json (100%) rename src/{web => generated}/export/items/computercraft/cable.png (100%) rename src/{web => generated}/export/items/computercraft/computer_advanced.png (100%) rename src/{web => generated}/export/items/computercraft/computer_command.png (100%) rename src/{web => generated}/export/items/computercraft/computer_normal.png (100%) rename src/{web => generated}/export/items/computercraft/disk.png (100%) rename src/{web => generated}/export/items/computercraft/disk_drive.png (100%) rename src/{web => generated}/export/items/computercraft/monitor_advanced.png (100%) rename src/{web => generated}/export/items/computercraft/monitor_normal.png (100%) rename src/{web => generated}/export/items/computercraft/pocket_computer_advanced.png (100%) rename src/{web => generated}/export/items/computercraft/pocket_computer_normal.png (100%) rename src/{web => generated}/export/items/computercraft/printed_book.png (100%) rename src/{web => generated}/export/items/computercraft/printed_page.png (100%) rename src/{web => generated}/export/items/computercraft/printed_pages.png (100%) rename src/{web => generated}/export/items/computercraft/printer.png (100%) rename src/{web => generated}/export/items/computercraft/speaker.png (100%) rename src/{web => generated}/export/items/computercraft/treasure_disk.png (100%) rename src/{web => generated}/export/items/computercraft/turtle_advanced.png (100%) rename src/{web => generated}/export/items/computercraft/turtle_normal.png (100%) rename src/{web => generated}/export/items/computercraft/wired_modem.png (100%) rename src/{web => generated}/export/items/computercraft/wired_modem_full.png (100%) rename src/{web => generated}/export/items/computercraft/wireless_modem_advanced.png (100%) rename src/{web => generated}/export/items/computercraft/wireless_modem_normal.png (100%) rename src/{web => generated}/export/items/minecraft/black_dye.png (100%) rename src/{web => generated}/export/items/minecraft/blue_dye.png (100%) rename src/{web => generated}/export/items/minecraft/brown_dye.png (100%) rename src/{web => generated}/export/items/minecraft/chest.png (100%) rename src/{web => generated}/export/items/minecraft/command_block.png (100%) rename src/{web => generated}/export/items/minecraft/cyan_dye.png (100%) rename src/{web => generated}/export/items/minecraft/ender_eye.png (100%) rename src/{web => generated}/export/items/minecraft/ender_pearl.png (100%) rename src/{web => generated}/export/items/minecraft/glass_pane.png (100%) rename src/{web => generated}/export/items/minecraft/gold_block.png (100%) rename src/{web => generated}/export/items/minecraft/gold_ingot.png (100%) rename src/{web => generated}/export/items/minecraft/golden_apple.png (100%) rename src/{web => generated}/export/items/minecraft/gray_dye.png (100%) rename src/{web => generated}/export/items/minecraft/green_dye.png (100%) rename src/{web => generated}/export/items/minecraft/iron_ingot.png (100%) rename src/{web => generated}/export/items/minecraft/leather.png (100%) rename src/{web => generated}/export/items/minecraft/light_blue_dye.png (100%) rename src/{web => generated}/export/items/minecraft/light_gray_dye.png (100%) rename src/{web => generated}/export/items/minecraft/lime_dye.png (100%) rename src/{web => generated}/export/items/minecraft/magenta_dye.png (100%) rename src/{web => generated}/export/items/minecraft/note_block.png (100%) rename src/{web => generated}/export/items/minecraft/orange_dye.png (100%) rename src/{web => generated}/export/items/minecraft/pink_dye.png (100%) rename src/{web => generated}/export/items/minecraft/purple_dye.png (100%) rename src/{web => generated}/export/items/minecraft/red_dye.png (100%) rename src/{web => generated}/export/items/minecraft/redstone.png (100%) rename src/{web => generated}/export/items/minecraft/stone.png (100%) rename src/{web => generated}/export/items/minecraft/string.png (100%) rename src/{web => generated}/export/items/minecraft/white_dye.png (100%) rename src/{web => generated}/export/items/minecraft/yellow_dye.png (100%) diff --git a/.gitattributes b/.gitattributes index 9a0642d09..6501a79bc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,5 @@ # Ignore changes in generated files -src/generated/resources/data/** linguist-generated +src/generated/** linguist-generated src/testMod/server-files/structures linguist-generated * text=auto diff --git a/.github/workflows/make-doc.sh b/.github/workflows/make-doc.sh index f22851bee..e7aca0e61 100755 --- a/.github/workflows/make-doc.sh +++ b/.github/workflows/make-doc.sh @@ -12,7 +12,7 @@ chmod 600 "$HOME/.ssh/key" # And upload rsync -avc -e "ssh -i $HOME/.ssh/key -o StrictHostKeyChecking=no -p $SSH_PORT" \ - "$GITHUB_WORKSPACE/build/docs/lua/" \ + "$GITHUB_WORKSPACE/build/docs/site/" \ "$SSH_USER@$SSH_HOST:/$DEST" rsync -avc -e "ssh -i $HOME/.ssh/key -o StrictHostKeyChecking=no -p $SSH_PORT" \ "$GITHUB_WORKSPACE/build/docs/javadoc/" \ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c9afbdb4c..bae4f7b4f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -65,7 +65,7 @@ #### Building documentation - `./gradlew luaJavadoc` - Generate documentation stubs for Java methods. - `./gradlew docWebsite` - Generate the whole website (including Javascript pages). The resulting HTML is stored at - `./build/docs/lua/`. + `./build/docs/site/`. #### Writing documentation illuaminate's documentation system is not currently documented (somewhat ironic), but is _largely_ the same as diff --git a/build.gradle b/build.gradle index 16a6d3dd1..59da21991 100644 --- a/build.gradle +++ b/build.gradle @@ -335,7 +335,7 @@ task docWebsite(type: Copy, dependsOn: [jsxDocs]) { from("$buildDir/docs/lua") { exclude '**/*.html' } - from("src/web/export/items") { + from("src/generated/export/items") { into("images/items") } diff --git a/src/web/export/index.json b/src/generated/export/index.json similarity index 100% rename from src/web/export/index.json rename to src/generated/export/index.json diff --git a/src/web/export/items/computercraft/cable.png b/src/generated/export/items/computercraft/cable.png similarity index 100% rename from src/web/export/items/computercraft/cable.png rename to src/generated/export/items/computercraft/cable.png diff --git a/src/web/export/items/computercraft/computer_advanced.png b/src/generated/export/items/computercraft/computer_advanced.png similarity index 100% rename from src/web/export/items/computercraft/computer_advanced.png rename to src/generated/export/items/computercraft/computer_advanced.png diff --git a/src/web/export/items/computercraft/computer_command.png b/src/generated/export/items/computercraft/computer_command.png similarity index 100% rename from src/web/export/items/computercraft/computer_command.png rename to src/generated/export/items/computercraft/computer_command.png diff --git a/src/web/export/items/computercraft/computer_normal.png b/src/generated/export/items/computercraft/computer_normal.png similarity index 100% rename from src/web/export/items/computercraft/computer_normal.png rename to src/generated/export/items/computercraft/computer_normal.png diff --git a/src/web/export/items/computercraft/disk.png b/src/generated/export/items/computercraft/disk.png similarity index 100% rename from src/web/export/items/computercraft/disk.png rename to src/generated/export/items/computercraft/disk.png diff --git a/src/web/export/items/computercraft/disk_drive.png b/src/generated/export/items/computercraft/disk_drive.png similarity index 100% rename from src/web/export/items/computercraft/disk_drive.png rename to src/generated/export/items/computercraft/disk_drive.png diff --git a/src/web/export/items/computercraft/monitor_advanced.png b/src/generated/export/items/computercraft/monitor_advanced.png similarity index 100% rename from src/web/export/items/computercraft/monitor_advanced.png rename to src/generated/export/items/computercraft/monitor_advanced.png diff --git a/src/web/export/items/computercraft/monitor_normal.png b/src/generated/export/items/computercraft/monitor_normal.png similarity index 100% rename from src/web/export/items/computercraft/monitor_normal.png rename to src/generated/export/items/computercraft/monitor_normal.png diff --git a/src/web/export/items/computercraft/pocket_computer_advanced.png b/src/generated/export/items/computercraft/pocket_computer_advanced.png similarity index 100% rename from src/web/export/items/computercraft/pocket_computer_advanced.png rename to src/generated/export/items/computercraft/pocket_computer_advanced.png diff --git a/src/web/export/items/computercraft/pocket_computer_normal.png b/src/generated/export/items/computercraft/pocket_computer_normal.png similarity index 100% rename from src/web/export/items/computercraft/pocket_computer_normal.png rename to src/generated/export/items/computercraft/pocket_computer_normal.png diff --git a/src/web/export/items/computercraft/printed_book.png b/src/generated/export/items/computercraft/printed_book.png similarity index 100% rename from src/web/export/items/computercraft/printed_book.png rename to src/generated/export/items/computercraft/printed_book.png diff --git a/src/web/export/items/computercraft/printed_page.png b/src/generated/export/items/computercraft/printed_page.png similarity index 100% rename from src/web/export/items/computercraft/printed_page.png rename to src/generated/export/items/computercraft/printed_page.png diff --git a/src/web/export/items/computercraft/printed_pages.png b/src/generated/export/items/computercraft/printed_pages.png similarity index 100% rename from src/web/export/items/computercraft/printed_pages.png rename to src/generated/export/items/computercraft/printed_pages.png diff --git a/src/web/export/items/computercraft/printer.png b/src/generated/export/items/computercraft/printer.png similarity index 100% rename from src/web/export/items/computercraft/printer.png rename to src/generated/export/items/computercraft/printer.png diff --git a/src/web/export/items/computercraft/speaker.png b/src/generated/export/items/computercraft/speaker.png similarity index 100% rename from src/web/export/items/computercraft/speaker.png rename to src/generated/export/items/computercraft/speaker.png diff --git a/src/web/export/items/computercraft/treasure_disk.png b/src/generated/export/items/computercraft/treasure_disk.png similarity index 100% rename from src/web/export/items/computercraft/treasure_disk.png rename to src/generated/export/items/computercraft/treasure_disk.png diff --git a/src/web/export/items/computercraft/turtle_advanced.png b/src/generated/export/items/computercraft/turtle_advanced.png similarity index 100% rename from src/web/export/items/computercraft/turtle_advanced.png rename to src/generated/export/items/computercraft/turtle_advanced.png diff --git a/src/web/export/items/computercraft/turtle_normal.png b/src/generated/export/items/computercraft/turtle_normal.png similarity index 100% rename from src/web/export/items/computercraft/turtle_normal.png rename to src/generated/export/items/computercraft/turtle_normal.png diff --git a/src/web/export/items/computercraft/wired_modem.png b/src/generated/export/items/computercraft/wired_modem.png similarity index 100% rename from src/web/export/items/computercraft/wired_modem.png rename to src/generated/export/items/computercraft/wired_modem.png diff --git a/src/web/export/items/computercraft/wired_modem_full.png b/src/generated/export/items/computercraft/wired_modem_full.png similarity index 100% rename from src/web/export/items/computercraft/wired_modem_full.png rename to src/generated/export/items/computercraft/wired_modem_full.png diff --git a/src/web/export/items/computercraft/wireless_modem_advanced.png b/src/generated/export/items/computercraft/wireless_modem_advanced.png similarity index 100% rename from src/web/export/items/computercraft/wireless_modem_advanced.png rename to src/generated/export/items/computercraft/wireless_modem_advanced.png diff --git a/src/web/export/items/computercraft/wireless_modem_normal.png b/src/generated/export/items/computercraft/wireless_modem_normal.png similarity index 100% rename from src/web/export/items/computercraft/wireless_modem_normal.png rename to src/generated/export/items/computercraft/wireless_modem_normal.png diff --git a/src/web/export/items/minecraft/black_dye.png b/src/generated/export/items/minecraft/black_dye.png similarity index 100% rename from src/web/export/items/minecraft/black_dye.png rename to src/generated/export/items/minecraft/black_dye.png diff --git a/src/web/export/items/minecraft/blue_dye.png b/src/generated/export/items/minecraft/blue_dye.png similarity index 100% rename from src/web/export/items/minecraft/blue_dye.png rename to src/generated/export/items/minecraft/blue_dye.png diff --git a/src/web/export/items/minecraft/brown_dye.png b/src/generated/export/items/minecraft/brown_dye.png similarity index 100% rename from src/web/export/items/minecraft/brown_dye.png rename to src/generated/export/items/minecraft/brown_dye.png diff --git a/src/web/export/items/minecraft/chest.png b/src/generated/export/items/minecraft/chest.png similarity index 100% rename from src/web/export/items/minecraft/chest.png rename to src/generated/export/items/minecraft/chest.png diff --git a/src/web/export/items/minecraft/command_block.png b/src/generated/export/items/minecraft/command_block.png similarity index 100% rename from src/web/export/items/minecraft/command_block.png rename to src/generated/export/items/minecraft/command_block.png diff --git a/src/web/export/items/minecraft/cyan_dye.png b/src/generated/export/items/minecraft/cyan_dye.png similarity index 100% rename from src/web/export/items/minecraft/cyan_dye.png rename to src/generated/export/items/minecraft/cyan_dye.png diff --git a/src/web/export/items/minecraft/ender_eye.png b/src/generated/export/items/minecraft/ender_eye.png similarity index 100% rename from src/web/export/items/minecraft/ender_eye.png rename to src/generated/export/items/minecraft/ender_eye.png diff --git a/src/web/export/items/minecraft/ender_pearl.png b/src/generated/export/items/minecraft/ender_pearl.png similarity index 100% rename from src/web/export/items/minecraft/ender_pearl.png rename to src/generated/export/items/minecraft/ender_pearl.png diff --git a/src/web/export/items/minecraft/glass_pane.png b/src/generated/export/items/minecraft/glass_pane.png similarity index 100% rename from src/web/export/items/minecraft/glass_pane.png rename to src/generated/export/items/minecraft/glass_pane.png diff --git a/src/web/export/items/minecraft/gold_block.png b/src/generated/export/items/minecraft/gold_block.png similarity index 100% rename from src/web/export/items/minecraft/gold_block.png rename to src/generated/export/items/minecraft/gold_block.png diff --git a/src/web/export/items/minecraft/gold_ingot.png b/src/generated/export/items/minecraft/gold_ingot.png similarity index 100% rename from src/web/export/items/minecraft/gold_ingot.png rename to src/generated/export/items/minecraft/gold_ingot.png diff --git a/src/web/export/items/minecraft/golden_apple.png b/src/generated/export/items/minecraft/golden_apple.png similarity index 100% rename from src/web/export/items/minecraft/golden_apple.png rename to src/generated/export/items/minecraft/golden_apple.png diff --git a/src/web/export/items/minecraft/gray_dye.png b/src/generated/export/items/minecraft/gray_dye.png similarity index 100% rename from src/web/export/items/minecraft/gray_dye.png rename to src/generated/export/items/minecraft/gray_dye.png diff --git a/src/web/export/items/minecraft/green_dye.png b/src/generated/export/items/minecraft/green_dye.png similarity index 100% rename from src/web/export/items/minecraft/green_dye.png rename to src/generated/export/items/minecraft/green_dye.png diff --git a/src/web/export/items/minecraft/iron_ingot.png b/src/generated/export/items/minecraft/iron_ingot.png similarity index 100% rename from src/web/export/items/minecraft/iron_ingot.png rename to src/generated/export/items/minecraft/iron_ingot.png diff --git a/src/web/export/items/minecraft/leather.png b/src/generated/export/items/minecraft/leather.png similarity index 100% rename from src/web/export/items/minecraft/leather.png rename to src/generated/export/items/minecraft/leather.png diff --git a/src/web/export/items/minecraft/light_blue_dye.png b/src/generated/export/items/minecraft/light_blue_dye.png similarity index 100% rename from src/web/export/items/minecraft/light_blue_dye.png rename to src/generated/export/items/minecraft/light_blue_dye.png diff --git a/src/web/export/items/minecraft/light_gray_dye.png b/src/generated/export/items/minecraft/light_gray_dye.png similarity index 100% rename from src/web/export/items/minecraft/light_gray_dye.png rename to src/generated/export/items/minecraft/light_gray_dye.png diff --git a/src/web/export/items/minecraft/lime_dye.png b/src/generated/export/items/minecraft/lime_dye.png similarity index 100% rename from src/web/export/items/minecraft/lime_dye.png rename to src/generated/export/items/minecraft/lime_dye.png diff --git a/src/web/export/items/minecraft/magenta_dye.png b/src/generated/export/items/minecraft/magenta_dye.png similarity index 100% rename from src/web/export/items/minecraft/magenta_dye.png rename to src/generated/export/items/minecraft/magenta_dye.png diff --git a/src/web/export/items/minecraft/note_block.png b/src/generated/export/items/minecraft/note_block.png similarity index 100% rename from src/web/export/items/minecraft/note_block.png rename to src/generated/export/items/minecraft/note_block.png diff --git a/src/web/export/items/minecraft/orange_dye.png b/src/generated/export/items/minecraft/orange_dye.png similarity index 100% rename from src/web/export/items/minecraft/orange_dye.png rename to src/generated/export/items/minecraft/orange_dye.png diff --git a/src/web/export/items/minecraft/pink_dye.png b/src/generated/export/items/minecraft/pink_dye.png similarity index 100% rename from src/web/export/items/minecraft/pink_dye.png rename to src/generated/export/items/minecraft/pink_dye.png diff --git a/src/web/export/items/minecraft/purple_dye.png b/src/generated/export/items/minecraft/purple_dye.png similarity index 100% rename from src/web/export/items/minecraft/purple_dye.png rename to src/generated/export/items/minecraft/purple_dye.png diff --git a/src/web/export/items/minecraft/red_dye.png b/src/generated/export/items/minecraft/red_dye.png similarity index 100% rename from src/web/export/items/minecraft/red_dye.png rename to src/generated/export/items/minecraft/red_dye.png diff --git a/src/web/export/items/minecraft/redstone.png b/src/generated/export/items/minecraft/redstone.png similarity index 100% rename from src/web/export/items/minecraft/redstone.png rename to src/generated/export/items/minecraft/redstone.png diff --git a/src/web/export/items/minecraft/stone.png b/src/generated/export/items/minecraft/stone.png similarity index 100% rename from src/web/export/items/minecraft/stone.png rename to src/generated/export/items/minecraft/stone.png diff --git a/src/web/export/items/minecraft/string.png b/src/generated/export/items/minecraft/string.png similarity index 100% rename from src/web/export/items/minecraft/string.png rename to src/generated/export/items/minecraft/string.png diff --git a/src/web/export/items/minecraft/white_dye.png b/src/generated/export/items/minecraft/white_dye.png similarity index 100% rename from src/web/export/items/minecraft/white_dye.png rename to src/generated/export/items/minecraft/white_dye.png diff --git a/src/web/export/items/minecraft/yellow_dye.png b/src/generated/export/items/minecraft/yellow_dye.png similarity index 100% rename from src/web/export/items/minecraft/yellow_dye.png rename to src/generated/export/items/minecraft/yellow_dye.png diff --git a/src/web/transform.tsx b/src/web/transform.tsx index 24eb1a5f2..521ee56b8 100644 --- a/src/web/transform.tsx +++ b/src/web/transform.tsx @@ -39,7 +39,7 @@ const glob = promisify(globModule); } as any }); - const dataExport = JSON.parse(await fs.readFile("src/web/export/index.json", "utf-8")) as DataExport; + const dataExport = JSON.parse(await fs.readFile("src/generated/export/index.json", "utf-8")) as DataExport; for (const file of await glob(base + "/**/*.html")) { const contents = await fs.readFile(file, "utf-8"); From 0b6dc256075baaaec88d2fea1b7230ed64ade2ec Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Wed, 1 Jun 2022 14:33:09 +0100 Subject: [PATCH 08/14] Fix command quoting for Windows Thanks Lupus for finding this. I really need to redo how some of these commands are run - maybe use npm scripts instead. --- build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 59da21991..798dab338 100644 --- a/build.gradle +++ b/build.gradle @@ -316,12 +316,13 @@ task jsxDocs(type: Exec, dependsOn: [illuaminateDocs]) { description = "Post-processes documentation to statically render some dynamic content." inputs.files(fileTree("src/web")).withPropertyName("sources") + inputs.file("src/generated/export/index.json").withPropertyName("export") inputs.file("package-lock.json").withPropertyName("package-lock.json") inputs.file("tsconfig.json").withPropertyName("Typescript config") inputs.files(fileTree("$buildDir/docs/lua")) outputs.dir("$buildDir/docs/site") - commandLine mkCommand("'node_modules/.bin/ts-node' --esm src/web/transform.tsx") + commandLine mkCommand('"node_modules/.bin/ts-node" --esm src/web/transform.tsx') } task docWebsite(type: Copy, dependsOn: [jsxDocs]) { From a1cbc1d803bdc6ed9df5f2f38130985dda8aa474 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sat, 4 Jun 2022 15:30:42 +0100 Subject: [PATCH 09/14] Fix turtles not preserving their lock when moving --- .../computercraft/shared/computer/blocks/TileComputerBase.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java index 88bad785a..3d4f98852 100644 --- a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java +++ b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java @@ -437,6 +437,7 @@ protected void transferStateFrom( TileComputerBase copy ) label = copy.label; on = copy.on; startOn = copy.startOn; + lockCode = copy.lockCode; updateBlock(); } copy.instanceID = -1; From 0e1e8dfa8c8472cb3cbcd58aa90ea62be87a3f83 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sun, 5 Jun 2022 12:20:07 +0100 Subject: [PATCH 10/14] Add recipes to more pages Might be better if we had pages for each block, but this'll do for now. --- .../diskdrive/DiskDrivePeripheral.java | 5 ++++ .../peripheral/modem/ModemPeripheral.java | 9 ++++++ .../peripheral/monitor/MonitorPeripheral.java | 6 ++++ .../peripheral/printer/PrinterPeripheral.java | 5 ++++ .../peripheral/speaker/SpeakerPeripheral.java | 6 ++-- src/web/components/Recipe.tsx | 28 ++++++++++--------- src/web/styles.css | 17 ++++++++--- 7 files changed, 57 insertions(+), 19 deletions(-) diff --git a/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDrivePeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDrivePeripheral.java index 4d21f7176..db47fe6ef 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDrivePeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDrivePeripheral.java @@ -30,6 +30,11 @@ * When a disk is inserted, a {@code disk} event is fired, with the side peripheral is on. Likewise, when the disk is * detached, a {@code disk_eject} event is fired. * + * ## Recipe + *

+ * + *
+ * * @cc.module drive */ public class DiskDrivePeripheral implements IPeripheral diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java index fde98d4fe..c815f67ab 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java @@ -75,6 +75,15 @@ * * print("Received a reply: " .. tostring(message)) * } + * + * ## Recipes + *
+ * + * + * + * + * + *
*/ public abstract class ModemPeripheral implements IPeripheral, IPacketSender, IPacketReceiver { diff --git a/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorPeripheral.java index bb83499ab..d574212b3 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorPeripheral.java @@ -25,6 +25,12 @@ * * Like computers, monitors come in both normal (no colour) and advanced (colour) varieties. * + * ## Recipes + *
+ * + * + *
+ * * @cc.module monitor * @cc.usage Write "Hello, world!" to an adjacent monitor: * diff --git a/src/main/java/dan200/computercraft/shared/peripheral/printer/PrinterPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/printer/PrinterPeripheral.java index 8d881db9b..64f33cc5e 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/printer/PrinterPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/printer/PrinterPeripheral.java @@ -18,6 +18,11 @@ /** * The printer peripheral allows pages and books to be printed. * + * ## Recipe + *
+ * + *
+ * * @cc.module printer */ public class PrinterPeripheral implements IPeripheral diff --git a/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java index 9f543e713..34e6baac5 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java @@ -41,8 +41,10 @@ * - {@link #playSound} plays any built-in Minecraft sound, such as block sounds or mob noises. * - {@link #playAudio} can play arbitrary audio. * - *

Recipe

- * + * ## Recipe + *
+ * + *
* * @cc.module speaker * @cc.since 1.80pr1 diff --git a/src/web/components/Recipe.tsx b/src/web/components/Recipe.tsx index 1dbf34c4f..40d402156 100644 --- a/src/web/components/Recipe.tsx +++ b/src/web/components/Recipe.tsx @@ -10,9 +10,12 @@ const Item: FunctionComponent<{ item: string }> = ({ item }) => { src={`/images/items/${item.replace(":", "/")}.png`} alt={itemName} title={itemName} + className="recipe-icon" /> }; +const EmptyItem: FunctionComponent = () => ; + const Arrow: FunctionComponent = (props) => -
- {data.itemNames[recipeInfo.output]} -
- {recipeInfo.inputs.map((items, i) =>
{items && }
)} -
- -
- - {recipeInfo.count > 1 && {recipeInfo.count}} -
+ return
+ {data.itemNames[recipeInfo.output]} +
+ {recipeInfo.inputs.map((items, i) =>
{items ? : }
)}
-
; -} + +
+ + {recipeInfo.count > 1 && {recipeInfo.count}} +
+
+}; + export default Recipe; diff --git a/src/web/styles.css b/src/web/styles.css index d72373384..5ed6964aa 100644 --- a/src/web/styles.css +++ b/src/web/styles.css @@ -40,7 +40,6 @@ pre.highlight { z-index: 200; top: 0px; top: 0px; - ; } /* Behold, the most cursed CSS! copy-cat's resizing algorithm is a weird, in @@ -108,11 +107,12 @@ pre.highlight { --recipe-size: 32px; } - .recipe-container { display: flex; justify-content: center; margin: 1em 0; + gap: 1em; + flex-wrap: wrap; } .recipe { @@ -127,6 +127,7 @@ pre.highlight { } .recipe-title { + color: #222; /* Same as --foreground in light theme. Ugly, but too lazy to style in dark for now. */ grid-column-start: span 3; } @@ -148,7 +149,7 @@ pre.highlight { background-color: var(--recipe-hover); } -.recipe-item > img { +.recipe-icon { display: block; width: var(--recipe-size); height: var(--recipe-size); @@ -163,6 +164,14 @@ pre.highlight { } .recipe-output { - /* Hrm! */ align-self: center; + position: relative; +} + +.recipe-count { + position: absolute; + bottom: 0; + right: var(--recipe-padding); + color: #fff; + text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000 } From 0aac966239709e744aa31a043f5392892ae10eee Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 6 Jun 2022 11:55:10 +0000 Subject: [PATCH 11/14] Added translation for Ukrainian Co-authored-by: RobloMinerYT --- src/main/resources/assets/computercraft/lang/uk_UA.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/resources/assets/computercraft/lang/uk_UA.json diff --git a/src/main/resources/assets/computercraft/lang/uk_UA.json b/src/main/resources/assets/computercraft/lang/uk_UA.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/src/main/resources/assets/computercraft/lang/uk_UA.json @@ -0,0 +1 @@ +{} From ca58e39707ff7d01c38fb23f3f18759590f0dd2a Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 7 Jun 2022 04:23:27 +0000 Subject: [PATCH 12/14] Translations for Ukrainian Co-authored-by: RobloMinerYT --- .../assets/computercraft/lang/uk_UA.json | 136 +++++++++++++++++- 1 file changed, 135 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/computercraft/lang/uk_UA.json b/src/main/resources/assets/computercraft/lang/uk_UA.json index 0967ef424..943556576 100644 --- a/src/main/resources/assets/computercraft/lang/uk_UA.json +++ b/src/main/resources/assets/computercraft/lang/uk_UA.json @@ -1 +1,135 @@ -{} +{ + "block.computercraft.computer_normal": "Комп'ютер", + "block.computercraft.computer_advanced": "Просунутий комп'ютер", + "block.computercraft.computer_command": "Командний комп'ютер", + "block.computercraft.disk_drive": "Дисковод", + "block.computercraft.printer": "Принтер", + "block.computercraft.speaker": "Колонка", + "block.computercraft.monitor_normal": "Монітор", + "block.computercraft.wireless_modem_normal": "Бездротовий модем", + "block.computercraft.wireless_modem_advanced": "Ендер модем", + "block.computercraft.wired_modem": "Дротовий модем", + "itemGroup.computercraft": "ComputerCraft", + "block.computercraft.cable": "Мережевий кабель", + "block.computercraft.wired_modem_full": "Дротовий модем", + "block.computercraft.turtle_normal": "Черепашка", + "block.computercraft.turtle_advanced": "Просунута Черепашка", + "item.computercraft.disk": "Дискета", + "item.computercraft.treasure_disk": "Дискета", + "item.computercraft.printed_page": "Надрукована сторінка", + "item.computercraft.printed_pages": "Надруковані сторінки", + "item.computercraft.printed_book": "Надрукована книжка", + "item.computercraft.pocket_computer_normal": "Кишеньковий комп'ютер", + "item.computercraft.pocket_computer_normal.upgraded": "%s Кишеньковий комп'ютер", + "item.computercraft.pocket_computer_advanced.upgraded": "Просунутий %s Кишеньковий комп'ютер", + "upgrade.minecraft.diamond_sword.adjective": "Бойова", + "upgrade.minecraft.diamond_shovel.adjective": "Копаюча", + "block.computercraft.turtle_normal.upgraded": "%s Черепашка", + "block.computercraft.turtle_normal.upgraded_twice": "%s %s Черепашка", + "block.computercraft.turtle_advanced.upgraded": "Просунута %s Черепашка", + "upgrade.minecraft.diamond_axe.adjective": "Рубляча", + "upgrade.minecraft.diamond_hoe.adjective": "Обробна", + "upgrade.minecraft.crafting_table.adjective": "Вміла", + "upgrade.computercraft.wireless_modem_normal.adjective": "Бездротовий", + "upgrade.computercraft.wireless_modem_advanced.adjective": "Ендер", + "upgrade.computercraft.speaker.adjective": "Шумливий", + "chat.computercraft.wired_modem.peripheral_disconnected": "Периферійний пристрій \\\"%s\\\" відключено від мережі", + "commands.computercraft.synopsis": "Різні команди для керування комп'ютерами.", + "commands.computercraft.help.synopsis": "Надає допомогу для конкретних команд", + "commands.computercraft.help.desc": "Показує це повідомлення довідки", + "commands.computercraft.help.no_children": "%s не має підкоманд", + "commands.computercraft.help.no_command": "Немає такої команди '%s'", + "commands.computercraft.dump.synopsis": "Відобразити стан комп'ютерів.", + "commands.computercraft.dump.action": "Переглянути інформацію про цей комп'ютер", + "commands.computercraft.dump.open_path": "Переглянути файли цього комп'ютера", + "commands.computercraft.shutdown.synopsis": "Віддалено завершити роботу комп'ютерів.", + "commands.computercraft.shutdown.done": "У %s/%s комп'ютерів завершено роботу", + "commands.computercraft.turn_on.synopsis": "Увімкнути комп'ютери віддалено.", + "commands.computercraft.turn_on.done": "%s/%s комп'ютерів увімкнено", + "commands.computercraft.tp.synopsis": "Телепортувати до конкретного комп'ютера.", + "commands.computercraft.tp.action": "Телепортувати до цього комп'ютера", + "commands.computercraft.tp.not_player": "Не можна відкрити термінал для не-гравця", + "commands.computercraft.tp.not_there": "Не можна визначити у світі розташування комп'ютер", + "commands.computercraft.view.synopsis": "Переглянути термінал комп'ютера.", + "commands.computercraft.view.action": "Переглянути цей комп'ютер", + "commands.computercraft.view.not_player": "Не можна відкрити термінал для не-гравця", + "commands.computercraft.track.synopsis": "Відстеження середовища виконання комп'ютерів.", + "commands.computercraft.track.start.synopsis": "Почати відстеження всіх комп'ютерів", + "commands.computercraft.track.start.desc": "Почати відстеження всіх середовищ виконання комп'ютера та кількість подій. Це скасує результати та попередні запуски.", + "commands.computercraft.track.start.stop": "Запустити %s, щоб зупинити відстеження та переглянути результати", + "commands.computercraft.track.stop.synopsis": "Припинити відстеження всіх комп'ютерів", + "commands.computercraft.track.stop.desc": "Припинити відстеження всіх подій комп'ютера та середовищ виконання", + "commands.computercraft.track.stop.action": "Натисніть, щоб припинити відстеження", + "commands.computercraft.track.stop.not_enabled": "На даний момент немає комп'ютерів, що відстежують.", + "commands.computercraft.track.dump.desc": "Вивести останні результати відстеження комп'ютера.", + "commands.computercraft.track.dump.computer": "Комп'ютер", + "commands.computercraft.reload.synopsis": "Перезавантажити файл конфігурації ComputerCraft'a", + "commands.computercraft.reload.desc": "Перезавантажує файл конфігурації ComputerCraft'a", + "commands.computercraft.reload.done": "Конфігурація перезавантажена", + "commands.computercraft.generic.no_position": "<немає позиції>", + "commands.computercraft.generic.position": "%s, %s, %s", + "commands.computercraft.generic.yes": "Y", + "commands.computercraft.generic.no": "N", + "commands.computercraft.generic.exception": "Необроблений виняток (%s)", + "commands.computercraft.generic.additional_rows": "%d додаткових рядків …", + "argument.computercraft.computer.no_matching": "Немає відповідних комп'ютерів з '%s'", + "argument.computercraft.computer.many_matching": "Декілька комп'ютерів відповідають з '%s' (екземпляри %s)", + "argument.computercraft.tracking_field.no_field": "Невідоме поле '%s'", + "tracking_field.computercraft.tasks.name": "Завдання", + "tracking_field.computercraft.average.name": "Середній час", + "tracking_field.computercraft.max.name": "Максимальний час", + "tracking_field.computercraft.server_count.name": "Число серверних завдань", + "tracking_field.computercraft.server_time.name": "Час серверних завдань", + "tracking_field.computercraft.fs.name": "Операції з файловою системою", + "tracking_field.computercraft.turtle.name": "Операції з черепашкою", + "tracking_field.computercraft.http.name": "HTTP запити", + "tracking_field.computercraft.http_upload.name": "HTTP завантаження", + "tracking_field.computercraft.http_download.name": "HTTP завантаження", + "tracking_field.computercraft.websocket_outgoing.name": "Вихідний Websocket", + "tracking_field.computercraft.coroutines_created.name": "Співпрограма створена", + "tracking_field.computercraft.coroutines_dead.name": "Співпрограма видалена", + "gui.computercraft.tooltip.copy": "Скопійовано в Буфер обміну", + "gui.computercraft.tooltip.computer_id": "Ідентифікатор комп'ютера: %s", + "gui.computercraft.tooltip.turn_on": "Увімкнути цей комп'ютер", + "gui.computercraft.tooltip.turn_on.key": "Утримуй Ctrl+R", + "gui.computercraft.tooltip.turn_off": "Вимкнути цей комп'ютер", + "gui.computercraft.tooltip.turn_off.key": "Утримуй Ctrl+S", + "gui.computercraft.tooltip.terminate.key": "Утримуй Ctrl+T", + "gui.computercraft.upload.success": "Завантаження успішне", + "gui.computercraft.upload.success.msg": "%d файлів завантажено.", + "gui.computercraft.upload.failed": "Завантаження не вдалося", + "gui.computercraft.upload.failed.out_of_space": "Недостатньо місця в комп'ютері для цих файлів.", + "gui.computercraft.upload.failed.computer_off": "Ви повинні увімкнути комп'ютер перед завантаженням файлів.", + "gui.computercraft.upload.failed.too_much": "Твої файли надто великі для завантаження.", + "gui.computercraft.upload.failed.name_too_long": "Назви файлів занадто довгі для завантаження.", + "gui.computercraft.upload.failed.too_many_files": "Неможливо завантажити стільки файлів.", + "gui.computercraft.upload.failed.overwrite_dir": "Не можна завантажити %s, оскільки папка з такою самою назвою вже існує.", + "gui.computercraft.upload.failed.generic": "Завантаження файлів не вдалося (%s)", + "gui.computercraft.upload.failed.corrupted": "Файли пошкоджені під час завантаження. Спробуй знову.", + "gui.computercraft.upload.overwrite": "Файли будуть перезаписані", + "gui.computercraft.upload.overwrite.detail": "При завантаженні файли будуть перезаписані. Продовжити?%s", + "gui.computercraft.upload.overwrite_button": "Перезаписати", + "gui.computercraft.pocket_computer_overlay": "Кишеньковий комп'ютер відкритий. Натисніть ESC, щоб закрити.", + "block.computercraft.monitor_advanced": "Просунутий Монітор", + "item.computercraft.pocket_computer_advanced": "Просунутий Кишеньковий комп'ютер", + "upgrade.minecraft.diamond_pickaxe.adjective": "Добувна", + "chat.computercraft.wired_modem.peripheral_connected": "Периферійний пристрій \\\"%s\\\" підключено до мережі", + "commands.computercraft.desc": "Команда /computercraft надає різні Налагоджувальні та Адміністративні інструменти для управління та взаємодії з комп'ютерами.", + "commands.computercraft.dump.desc": "Відображає стан усіх комп'ютерів або конкретної інформації про один комп'ютер. Ви можете вказати ідентифікатор екземпляра комп'ютера (наприклад 123), ідентифікатор комп'ютера (наприклад #123) або позначку (наприклад, \"@My Computer\").", + "commands.computercraft.shutdown.desc": "Завершити роботу перерахованих комп'ютерів або всі, якщо жодного не вказано. Ви можете вказати ідентифікатор екземпляра комп'ютера (наприклад 123), ідентифікатор комп'ютера (наприклад #123) або позначку (наприклад, \"@My Computer\").", + "commands.computercraft.turn_on.desc": "Увімкнути перелічені комп'ютери. Ви можете вказати ідентифікатор екземпляра комп'ютера (наприклад 123), ідентифікатор комп'ютера (наприклад #123) або позначку (наприклад, \"@My Computer\").", + "commands.computercraft.tp.desc": "Телепортувати до розташування комп'ютера. Ви можете вказати або ідентифікатор екземпляра комп'ютера (наприклад, 123) або ідентифікатор комп'ютера (наприклад, #123).", + "commands.computercraft.view.desc": "Відкрити термінал комп'ютера, який дозволяє віддалено керувати комп'ютером. Це не надає доступу до інвентарів черепашок. Ви можете вказати або ідентифікатор екземпляра комп'ютера (наприклад, 123) або ідентифікатор комп'ютера (наприклад, #123).", + "commands.computercraft.track.desc": "Відстежує, як довго комп'ютери виконують, а також те, як багато вони обробляють події. Ця інформація представляється аналогічно /forge track і може бути корисною для діагностики лага.", + "commands.computercraft.track.dump.synopsis": "Вивести останні результати відстеження", + "commands.computercraft.track.dump.no_timings": "Немає доступних розкладів", + "commands.computercraft.queue.synopsis": "Надіслати подію computer_command до Командного комп'ютера", + "commands.computercraft.queue.desc": "Надіслати подію computer_command до Командного комп'ютера через додаткові аргументи. В основному це призначено для Картоделів, діє як зручніша для користувача комп'ютерна версія /trigger. Будь-який гравець зможе запустити команду, яка, ймовірно, буде зроблена через події клацання текстового компонента.", + "argument.computercraft.argument_expected": "Очікується аргумент", + "tracking_field.computercraft.total.name": "Загальний час", + "tracking_field.computercraft.peripheral.name": "Виклики периферійних пристроїв", + "tracking_field.computercraft.websocket_incoming.name": "Вхідний Websocket", + "gui.computercraft.tooltip.disk_id": "Ідентифікатор диска: %s", + "gui.computercraft.tooltip.terminate": "Припинити поточний запущений код", + "block.computercraft.turtle_advanced.upgraded_twice": "Просунута %s %s Черепашка" +} From cbbb34cdd4a9bb9b30debb010f3a2fbdae453b3e Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Thu, 9 Jun 2022 08:43:19 +0100 Subject: [PATCH 13/14] Normalise language files again Weblate keeps making things uppercase >_> --- .../assets/computercraft/lang/da_dk.json | 20 +++---- .../lang/{uk_UA.json => uk_ua.json} | 54 +++++++++---------- 2 files changed, 37 insertions(+), 37 deletions(-) rename src/main/resources/assets/computercraft/lang/{uk_UA.json => uk_ua.json} (99%) diff --git a/src/main/resources/assets/computercraft/lang/da_dk.json b/src/main/resources/assets/computercraft/lang/da_dk.json index 5dc87bb01..78e069b22 100644 --- a/src/main/resources/assets/computercraft/lang/da_dk.json +++ b/src/main/resources/assets/computercraft/lang/da_dk.json @@ -1,4 +1,5 @@ { + "itemGroup.computercraft": "ComputerCraft", "block.computercraft.computer_normal": "Computer", "block.computercraft.computer_advanced": "Avanceret Computer", "block.computercraft.computer_command": "Kommandocomputer", @@ -41,23 +42,22 @@ "gui.computercraft.tooltip.computer_id": "Computer-ID: %s", "gui.computercraft.tooltip.disk_id": "Disk-ID: %s", "gui.computercraft.tooltip.turn_on": "Tænd denne computer", + "gui.computercraft.tooltip.turn_on.key": "Hold Ctrl+R nede", "gui.computercraft.tooltip.turn_off": "Sluk denne computer", - "gui.computercraft.tooltip.terminate.key": "Hold Ctrl+T nede", "gui.computercraft.tooltip.turn_off.key": "Hold Ctrl+S nede", "gui.computercraft.tooltip.terminate": "Stop den igangværende kode", - "gui.computercraft.tooltip.turn_on.key": "Hold Ctrl+R nede", - "gui.computercraft.upload.overwrite_button": "Overskriv", - "gui.computercraft.upload.overwrite.detail": "Følgende filer vil blive overskrevet ved upload. Fortsæt?%s", + "gui.computercraft.tooltip.terminate.key": "Hold Ctrl+T nede", "gui.computercraft.upload.success": "Upload Lykkedes", - "gui.computercraft.upload.overwrite": "Filer ville blive overskrevet", + "gui.computercraft.upload.success.msg": "%d filer uploadet.", + "gui.computercraft.upload.failed": "Upload Fejlede", "gui.computercraft.upload.failed.out_of_space": "Ikke nok plads på computeren til disse filer.", "gui.computercraft.upload.failed.computer_off": "Du skal tænde computeren, før du kan uploade filer.", "gui.computercraft.upload.failed.too_much": "Dine filer er for store til at blive uploadet.", - "gui.computercraft.upload.failed.overwrite_dir": "Kan ikke uploade %s, da der allerede er en mappe med det samme navn.", - "gui.computercraft.upload.success.msg": "%d filer uploadet.", - "gui.computercraft.upload.failed": "Upload Fejlede", "gui.computercraft.upload.failed.name_too_long": "Filnavne er for lange til at blive uploadet.", "gui.computercraft.upload.failed.too_many_files": "Kan ikke uploade så mange filer.", - "gui.computercraft.pocket_computer_overlay": "Lommecomputer åben. Tryk ESC for at lukke.", - "itemGroup.computercraft": "ComputerCraft" + "gui.computercraft.upload.failed.overwrite_dir": "Kan ikke uploade %s, da der allerede er en mappe med det samme navn.", + "gui.computercraft.upload.overwrite": "Filer ville blive overskrevet", + "gui.computercraft.upload.overwrite.detail": "Følgende filer vil blive overskrevet ved upload. Fortsæt?%s", + "gui.computercraft.upload.overwrite_button": "Overskriv", + "gui.computercraft.pocket_computer_overlay": "Lommecomputer åben. Tryk ESC for at lukke." } diff --git a/src/main/resources/assets/computercraft/lang/uk_UA.json b/src/main/resources/assets/computercraft/lang/uk_ua.json similarity index 99% rename from src/main/resources/assets/computercraft/lang/uk_UA.json rename to src/main/resources/assets/computercraft/lang/uk_ua.json index 943556576..264c53ce9 100644 --- a/src/main/resources/assets/computercraft/lang/uk_UA.json +++ b/src/main/resources/assets/computercraft/lang/uk_ua.json @@ -1,4 +1,5 @@ { + "itemGroup.computercraft": "ComputerCraft", "block.computercraft.computer_normal": "Комп'ютер", "block.computercraft.computer_advanced": "Просунутий комп'ютер", "block.computercraft.computer_command": "Командний комп'ютер", @@ -6,14 +7,18 @@ "block.computercraft.printer": "Принтер", "block.computercraft.speaker": "Колонка", "block.computercraft.monitor_normal": "Монітор", + "block.computercraft.monitor_advanced": "Просунутий Монітор", "block.computercraft.wireless_modem_normal": "Бездротовий модем", "block.computercraft.wireless_modem_advanced": "Ендер модем", "block.computercraft.wired_modem": "Дротовий модем", - "itemGroup.computercraft": "ComputerCraft", "block.computercraft.cable": "Мережевий кабель", "block.computercraft.wired_modem_full": "Дротовий модем", "block.computercraft.turtle_normal": "Черепашка", + "block.computercraft.turtle_normal.upgraded": "%s Черепашка", + "block.computercraft.turtle_normal.upgraded_twice": "%s %s Черепашка", "block.computercraft.turtle_advanced": "Просунута Черепашка", + "block.computercraft.turtle_advanced.upgraded": "Просунута %s Черепашка", + "block.computercraft.turtle_advanced.upgraded_twice": "Просунута %s %s Черепашка", "item.computercraft.disk": "Дискета", "item.computercraft.treasure_disk": "Дискета", "item.computercraft.printed_page": "Надрукована сторінка", @@ -21,39 +26,46 @@ "item.computercraft.printed_book": "Надрукована книжка", "item.computercraft.pocket_computer_normal": "Кишеньковий комп'ютер", "item.computercraft.pocket_computer_normal.upgraded": "%s Кишеньковий комп'ютер", + "item.computercraft.pocket_computer_advanced": "Просунутий Кишеньковий комп'ютер", "item.computercraft.pocket_computer_advanced.upgraded": "Просунутий %s Кишеньковий комп'ютер", "upgrade.minecraft.diamond_sword.adjective": "Бойова", "upgrade.minecraft.diamond_shovel.adjective": "Копаюча", - "block.computercraft.turtle_normal.upgraded": "%s Черепашка", - "block.computercraft.turtle_normal.upgraded_twice": "%s %s Черепашка", - "block.computercraft.turtle_advanced.upgraded": "Просунута %s Черепашка", + "upgrade.minecraft.diamond_pickaxe.adjective": "Добувна", "upgrade.minecraft.diamond_axe.adjective": "Рубляча", "upgrade.minecraft.diamond_hoe.adjective": "Обробна", "upgrade.minecraft.crafting_table.adjective": "Вміла", "upgrade.computercraft.wireless_modem_normal.adjective": "Бездротовий", "upgrade.computercraft.wireless_modem_advanced.adjective": "Ендер", "upgrade.computercraft.speaker.adjective": "Шумливий", + "chat.computercraft.wired_modem.peripheral_connected": "Периферійний пристрій \\\"%s\\\" підключено до мережі", "chat.computercraft.wired_modem.peripheral_disconnected": "Периферійний пристрій \\\"%s\\\" відключено від мережі", "commands.computercraft.synopsis": "Різні команди для керування комп'ютерами.", + "commands.computercraft.desc": "Команда /computercraft надає різні Налагоджувальні та Адміністративні інструменти для управління та взаємодії з комп'ютерами.", "commands.computercraft.help.synopsis": "Надає допомогу для конкретних команд", "commands.computercraft.help.desc": "Показує це повідомлення довідки", "commands.computercraft.help.no_children": "%s не має підкоманд", "commands.computercraft.help.no_command": "Немає такої команди '%s'", "commands.computercraft.dump.synopsis": "Відобразити стан комп'ютерів.", + "commands.computercraft.dump.desc": "Відображає стан усіх комп'ютерів або конкретної інформації про один комп'ютер. Ви можете вказати ідентифікатор екземпляра комп'ютера (наприклад 123), ідентифікатор комп'ютера (наприклад #123) або позначку (наприклад, \"@My Computer\").", "commands.computercraft.dump.action": "Переглянути інформацію про цей комп'ютер", "commands.computercraft.dump.open_path": "Переглянути файли цього комп'ютера", "commands.computercraft.shutdown.synopsis": "Віддалено завершити роботу комп'ютерів.", + "commands.computercraft.shutdown.desc": "Завершити роботу перерахованих комп'ютерів або всі, якщо жодного не вказано. Ви можете вказати ідентифікатор екземпляра комп'ютера (наприклад 123), ідентифікатор комп'ютера (наприклад #123) або позначку (наприклад, \"@My Computer\").", "commands.computercraft.shutdown.done": "У %s/%s комп'ютерів завершено роботу", "commands.computercraft.turn_on.synopsis": "Увімкнути комп'ютери віддалено.", + "commands.computercraft.turn_on.desc": "Увімкнути перелічені комп'ютери. Ви можете вказати ідентифікатор екземпляра комп'ютера (наприклад 123), ідентифікатор комп'ютера (наприклад #123) або позначку (наприклад, \"@My Computer\").", "commands.computercraft.turn_on.done": "%s/%s комп'ютерів увімкнено", "commands.computercraft.tp.synopsis": "Телепортувати до конкретного комп'ютера.", + "commands.computercraft.tp.desc": "Телепортувати до розташування комп'ютера. Ви можете вказати або ідентифікатор екземпляра комп'ютера (наприклад, 123) або ідентифікатор комп'ютера (наприклад, #123).", "commands.computercraft.tp.action": "Телепортувати до цього комп'ютера", "commands.computercraft.tp.not_player": "Не можна відкрити термінал для не-гравця", "commands.computercraft.tp.not_there": "Не можна визначити у світі розташування комп'ютер", "commands.computercraft.view.synopsis": "Переглянути термінал комп'ютера.", + "commands.computercraft.view.desc": "Відкрити термінал комп'ютера, який дозволяє віддалено керувати комп'ютером. Це не надає доступу до інвентарів черепашок. Ви можете вказати або ідентифікатор екземпляра комп'ютера (наприклад, 123) або ідентифікатор комп'ютера (наприклад, #123).", "commands.computercraft.view.action": "Переглянути цей комп'ютер", "commands.computercraft.view.not_player": "Не можна відкрити термінал для не-гравця", "commands.computercraft.track.synopsis": "Відстеження середовища виконання комп'ютерів.", + "commands.computercraft.track.desc": "Відстежує, як довго комп'ютери виконують, а також те, як багато вони обробляють події. Ця інформація представляється аналогічно /forge track і може бути корисною для діагностики лага.", "commands.computercraft.track.start.synopsis": "Почати відстеження всіх комп'ютерів", "commands.computercraft.track.start.desc": "Почати відстеження всіх середовищ виконання комп'ютера та кількість подій. Це скасує результати та попередні запуски.", "commands.computercraft.track.start.stop": "Запустити %s, щоб зупинити відстеження та переглянути результати", @@ -61,11 +73,15 @@ "commands.computercraft.track.stop.desc": "Припинити відстеження всіх подій комп'ютера та середовищ виконання", "commands.computercraft.track.stop.action": "Натисніть, щоб припинити відстеження", "commands.computercraft.track.stop.not_enabled": "На даний момент немає комп'ютерів, що відстежують.", + "commands.computercraft.track.dump.synopsis": "Вивести останні результати відстеження", "commands.computercraft.track.dump.desc": "Вивести останні результати відстеження комп'ютера.", + "commands.computercraft.track.dump.no_timings": "Немає доступних розкладів", "commands.computercraft.track.dump.computer": "Комп'ютер", "commands.computercraft.reload.synopsis": "Перезавантажити файл конфігурації ComputerCraft'a", "commands.computercraft.reload.desc": "Перезавантажує файл конфігурації ComputerCraft'a", "commands.computercraft.reload.done": "Конфігурація перезавантажена", + "commands.computercraft.queue.synopsis": "Надіслати подію computer_command до Командного комп'ютера", + "commands.computercraft.queue.desc": "Надіслати подію computer_command до Командного комп'ютера через додаткові аргументи. В основному це призначено для Картоделів, діє як зручніша для користувача комп'ютерна версія /trigger. Будь-який гравець зможе запустити команду, яка, ймовірно, буде зроблена через події клацання текстового компонента.", "commands.computercraft.generic.no_position": "<немає позиції>", "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.generic.yes": "Y", @@ -75,25 +91,31 @@ "argument.computercraft.computer.no_matching": "Немає відповідних комп'ютерів з '%s'", "argument.computercraft.computer.many_matching": "Декілька комп'ютерів відповідають з '%s' (екземпляри %s)", "argument.computercraft.tracking_field.no_field": "Невідоме поле '%s'", + "argument.computercraft.argument_expected": "Очікується аргумент", "tracking_field.computercraft.tasks.name": "Завдання", + "tracking_field.computercraft.total.name": "Загальний час", "tracking_field.computercraft.average.name": "Середній час", "tracking_field.computercraft.max.name": "Максимальний час", "tracking_field.computercraft.server_count.name": "Число серверних завдань", "tracking_field.computercraft.server_time.name": "Час серверних завдань", + "tracking_field.computercraft.peripheral.name": "Виклики периферійних пристроїв", "tracking_field.computercraft.fs.name": "Операції з файловою системою", "tracking_field.computercraft.turtle.name": "Операції з черепашкою", "tracking_field.computercraft.http.name": "HTTP запити", "tracking_field.computercraft.http_upload.name": "HTTP завантаження", "tracking_field.computercraft.http_download.name": "HTTP завантаження", + "tracking_field.computercraft.websocket_incoming.name": "Вхідний Websocket", "tracking_field.computercraft.websocket_outgoing.name": "Вихідний Websocket", "tracking_field.computercraft.coroutines_created.name": "Співпрограма створена", "tracking_field.computercraft.coroutines_dead.name": "Співпрограма видалена", "gui.computercraft.tooltip.copy": "Скопійовано в Буфер обміну", "gui.computercraft.tooltip.computer_id": "Ідентифікатор комп'ютера: %s", + "gui.computercraft.tooltip.disk_id": "Ідентифікатор диска: %s", "gui.computercraft.tooltip.turn_on": "Увімкнути цей комп'ютер", "gui.computercraft.tooltip.turn_on.key": "Утримуй Ctrl+R", "gui.computercraft.tooltip.turn_off": "Вимкнути цей комп'ютер", "gui.computercraft.tooltip.turn_off.key": "Утримуй Ctrl+S", + "gui.computercraft.tooltip.terminate": "Припинити поточний запущений код", "gui.computercraft.tooltip.terminate.key": "Утримуй Ctrl+T", "gui.computercraft.upload.success": "Завантаження успішне", "gui.computercraft.upload.success.msg": "%d файлів завантажено.", @@ -109,27 +131,5 @@ "gui.computercraft.upload.overwrite": "Файли будуть перезаписані", "gui.computercraft.upload.overwrite.detail": "При завантаженні файли будуть перезаписані. Продовжити?%s", "gui.computercraft.upload.overwrite_button": "Перезаписати", - "gui.computercraft.pocket_computer_overlay": "Кишеньковий комп'ютер відкритий. Натисніть ESC, щоб закрити.", - "block.computercraft.monitor_advanced": "Просунутий Монітор", - "item.computercraft.pocket_computer_advanced": "Просунутий Кишеньковий комп'ютер", - "upgrade.minecraft.diamond_pickaxe.adjective": "Добувна", - "chat.computercraft.wired_modem.peripheral_connected": "Периферійний пристрій \\\"%s\\\" підключено до мережі", - "commands.computercraft.desc": "Команда /computercraft надає різні Налагоджувальні та Адміністративні інструменти для управління та взаємодії з комп'ютерами.", - "commands.computercraft.dump.desc": "Відображає стан усіх комп'ютерів або конкретної інформації про один комп'ютер. Ви можете вказати ідентифікатор екземпляра комп'ютера (наприклад 123), ідентифікатор комп'ютера (наприклад #123) або позначку (наприклад, \"@My Computer\").", - "commands.computercraft.shutdown.desc": "Завершити роботу перерахованих комп'ютерів або всі, якщо жодного не вказано. Ви можете вказати ідентифікатор екземпляра комп'ютера (наприклад 123), ідентифікатор комп'ютера (наприклад #123) або позначку (наприклад, \"@My Computer\").", - "commands.computercraft.turn_on.desc": "Увімкнути перелічені комп'ютери. Ви можете вказати ідентифікатор екземпляра комп'ютера (наприклад 123), ідентифікатор комп'ютера (наприклад #123) або позначку (наприклад, \"@My Computer\").", - "commands.computercraft.tp.desc": "Телепортувати до розташування комп'ютера. Ви можете вказати або ідентифікатор екземпляра комп'ютера (наприклад, 123) або ідентифікатор комп'ютера (наприклад, #123).", - "commands.computercraft.view.desc": "Відкрити термінал комп'ютера, який дозволяє віддалено керувати комп'ютером. Це не надає доступу до інвентарів черепашок. Ви можете вказати або ідентифікатор екземпляра комп'ютера (наприклад, 123) або ідентифікатор комп'ютера (наприклад, #123).", - "commands.computercraft.track.desc": "Відстежує, як довго комп'ютери виконують, а також те, як багато вони обробляють події. Ця інформація представляється аналогічно /forge track і може бути корисною для діагностики лага.", - "commands.computercraft.track.dump.synopsis": "Вивести останні результати відстеження", - "commands.computercraft.track.dump.no_timings": "Немає доступних розкладів", - "commands.computercraft.queue.synopsis": "Надіслати подію computer_command до Командного комп'ютера", - "commands.computercraft.queue.desc": "Надіслати подію computer_command до Командного комп'ютера через додаткові аргументи. В основному це призначено для Картоделів, діє як зручніша для користувача комп'ютерна версія /trigger. Будь-який гравець зможе запустити команду, яка, ймовірно, буде зроблена через події клацання текстового компонента.", - "argument.computercraft.argument_expected": "Очікується аргумент", - "tracking_field.computercraft.total.name": "Загальний час", - "tracking_field.computercraft.peripheral.name": "Виклики периферійних пристроїв", - "tracking_field.computercraft.websocket_incoming.name": "Вхідний Websocket", - "gui.computercraft.tooltip.disk_id": "Ідентифікатор диска: %s", - "gui.computercraft.tooltip.terminate": "Припинити поточний запущений код", - "block.computercraft.turtle_advanced.upgraded_twice": "Просунута %s %s Черепашка" + "gui.computercraft.pocket_computer_overlay": "Кишеньковий комп'ютер відкритий. Натисніть ESC, щоб закрити." } From 1e044aed6888d19fa2c3a7b06e8cd39918b2fd64 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Thu, 9 Jun 2022 23:41:16 +0100 Subject: [PATCH 14/14] Bump version to 1.100.6 --- gradle.properties | 2 +- .../computercraft/api/ComputerCraftAPI.java | 2 +- .../api/detail/BasicItemDetailProvider.java | 4 ++-- .../api/detail/IDetailProvider.java | 1 - .../core/lua/CobaltLuaMachine.java | 6 ++++-- .../core/lua/ResultInterpreterFunction.java | 5 ++++- .../generic/data/DetailProviders.java | 6 +++--- .../peripheral/printer/ContainerPrinter.java | 5 ++++- .../computercraft/lua/rom/help/changelog.md | 16 ++++++++++++++++ .../data/computercraft/lua/rom/help/whatsnew.md | 17 ++++++++++++----- 10 files changed, 47 insertions(+), 17 deletions(-) diff --git a/gradle.properties b/gradle.properties index 11f25ee2a..566e86b5d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ # Mod properties -mod_version=1.100.5 +mod_version=1.100.6 # Minecraft properties (update mods.toml when changing) mc_version=1.16.5 diff --git a/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java b/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java index dc00bb641..ddd01384c 100644 --- a/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java +++ b/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java @@ -232,7 +232,7 @@ public static void registerAPIFactory( @Nonnull ILuaAPIFactory factory ) * @param type The type of object that this provider can provide details for. Should be {@link BlockReference}, * {@link FluidStack} or {@link ItemStack}. * @param provider The detail provider to register. - * @param The type of object that this provider can provide details for. + * @param The type of object that this provider can provide details for. */ public static void registerDetailProvider( @Nonnull Class type, @Nonnull IDetailProvider provider ) { diff --git a/src/main/java/dan200/computercraft/api/detail/BasicItemDetailProvider.java b/src/main/java/dan200/computercraft/api/detail/BasicItemDetailProvider.java index 10398d8bd..17b05c299 100644 --- a/src/main/java/dan200/computercraft/api/detail/BasicItemDetailProvider.java +++ b/src/main/java/dan200/computercraft/api/detail/BasicItemDetailProvider.java @@ -64,14 +64,14 @@ public abstract void provideDetails( @Nonnull Map data, public void provideDetails( @Nonnull Map data, @Nonnull ItemStack stack ) { Item item = stack.getItem(); - if ( !itemType.isInstance( item ) ) return; + if( !itemType.isInstance( item ) ) return; // If `namespace` is specified, insert into a new data map instead of the existing one. Map child = namespace == null ? data : new HashMap<>(); provideDetails( child, stack, itemType.cast( item ) ); - if ( namespace != null ) + if( namespace != null ) { data.put( namespace, child ); } diff --git a/src/main/java/dan200/computercraft/api/detail/IDetailProvider.java b/src/main/java/dan200/computercraft/api/detail/IDetailProvider.java index 74841bc8c..c98efb3b5 100644 --- a/src/main/java/dan200/computercraft/api/detail/IDetailProvider.java +++ b/src/main/java/dan200/computercraft/api/detail/IDetailProvider.java @@ -12,7 +12,6 @@ * This interface is used to provide details about a block, fluid, or item. * * @param The type of object that this provider can provide details for. - * * @see dan200.computercraft.api.ComputerCraftAPI#registerDetailProvider(Class, IDetailProvider) */ @FunctionalInterface diff --git a/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java b/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java index 555466a20..a22f27f62 100644 --- a/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java +++ b/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java @@ -6,7 +6,10 @@ package dan200.computercraft.core.lua; import dan200.computercraft.ComputerCraft; -import dan200.computercraft.api.lua.*; +import dan200.computercraft.api.lua.IDynamicLuaObject; +import dan200.computercraft.api.lua.ILuaAPI; +import dan200.computercraft.api.lua.ILuaContext; +import dan200.computercraft.api.lua.ILuaFunction; import dan200.computercraft.core.asm.LuaMethod; import dan200.computercraft.core.asm.ObjectSource; import dan200.computercraft.core.computer.Computer; @@ -14,7 +17,6 @@ import dan200.computercraft.core.tracking.Tracking; import dan200.computercraft.core.tracking.TrackingField; import dan200.computercraft.shared.util.ThreadUtils; -import org.squiddev.cobalt.LuaTable; import org.squiddev.cobalt.*; import org.squiddev.cobalt.compiler.CompileException; import org.squiddev.cobalt.compiler.LoadState; diff --git a/src/main/java/dan200/computercraft/core/lua/ResultInterpreterFunction.java b/src/main/java/dan200/computercraft/core/lua/ResultInterpreterFunction.java index f848ebde2..615055894 100644 --- a/src/main/java/dan200/computercraft/core/lua/ResultInterpreterFunction.java +++ b/src/main/java/dan200/computercraft/core/lua/ResultInterpreterFunction.java @@ -6,7 +6,10 @@ package dan200.computercraft.core.lua; import dan200.computercraft.ComputerCraft; -import dan200.computercraft.api.lua.*; +import dan200.computercraft.api.lua.ILuaCallback; +import dan200.computercraft.api.lua.ILuaContext; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.core.asm.LuaMethod; import org.squiddev.cobalt.*; import org.squiddev.cobalt.debug.DebugFrame; diff --git a/src/main/java/dan200/computercraft/shared/peripheral/generic/data/DetailProviders.java b/src/main/java/dan200/computercraft/shared/peripheral/generic/data/DetailProviders.java index 313eecc18..42cedace6 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/generic/data/DetailProviders.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/generic/data/DetailProviders.java @@ -21,7 +21,7 @@ public static synchronized void registerProvider( Class type, IDetailProv Objects.requireNonNull( type, "type cannot be null" ); Objects.requireNonNull( provider, "provider cannot be null" ); - if ( type != BlockReference.class && type != ItemStack.class && type != FluidStack.class ) + if( type != BlockReference.class && type != ItemStack.class && type != FluidStack.class ) { throw new IllegalArgumentException( "type must be assignable from BlockReference, ItemStack or FluidStack" ); } @@ -33,9 +33,9 @@ public static synchronized void registerProvider( Class type, IDetailProv public static void fillData( Class type, Map data, T value ) { Collection> providers = (Collection>) (Object) allProviders.get( type ); - if ( providers == null ) return; + if( providers == null ) return; - for ( IDetailProvider provider : providers ) + for( IDetailProvider provider : providers ) { provider.provideDetails( data, value ); } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/printer/ContainerPrinter.java b/src/main/java/dan200/computercraft/shared/peripheral/printer/ContainerPrinter.java index 2d99d0bb1..a594a07ab 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/printer/ContainerPrinter.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/printer/ContainerPrinter.java @@ -37,7 +37,10 @@ private ContainerPrinter( int id, PlayerInventory player, IInventory inventory, addSlot( new ValidatingSlot( inventory, 0, 13, 35, TilePrinter::isInk ) ); // In-tray - for( int x = 0; x < 6; x++ ) addSlot( new ValidatingSlot( inventory, x + 1, 61 + x * 18, 22, TilePrinter::isPaper ) ); + for( int x = 0; x < 6; x++ ) + { + addSlot( new ValidatingSlot( inventory, x + 1, 61 + x * 18, 22, TilePrinter::isPaper ) ); + } // Out-tray for( int x = 0; x < 6; x++ ) addSlot( new ValidatingSlot( inventory, x + 7, 61 + x * 18, 49, o -> false ) ); diff --git a/src/main/resources/data/computercraft/lua/rom/help/changelog.md b/src/main/resources/data/computercraft/lua/rom/help/changelog.md index b39f2aad4..a18ae8da0 100644 --- a/src/main/resources/data/computercraft/lua/rom/help/changelog.md +++ b/src/main/resources/data/computercraft/lua/rom/help/changelog.md @@ -1,3 +1,19 @@ +# New features in CC: Tweaked 1.100.6 + +* Various documentation improvements (MCJack123, FayneAldan). +* Allow CC's blocks to be rotated when used in structure blocks (Seniorendi). +* Several performance improvements to computer execution. +* Add parse_empty_array option to textutils.unserialiseJSON (@ChickChicky). +* Add an API to allow other mods to provide extra item/block details (Lemmmy). +* All blocks with GUIs can now be "locked" (via a command or NBT editing tools) like vanilla inventories. Players can only interact with them with a specific named item. + +Several bug fixes: +* Fix printouts being rendered with an offset in item frames (coolsa). +* Reduce position latency when playing audio with a noisy pocket computer. +* Fix total counts in /computercraft turn-on/shutdown commands. +* Fix "Run" command not working in the editor when run from a subdirectory (Wojbie). +* Pocket computers correctly preserve their on state. + # New features in CC: Tweaked 1.100.5 * Generic peripherals now use capabilities on the given side if one isn't provided on the internal side. diff --git a/src/main/resources/data/computercraft/lua/rom/help/whatsnew.md b/src/main/resources/data/computercraft/lua/rom/help/whatsnew.md index cf8a8280a..bb371ced3 100644 --- a/src/main/resources/data/computercraft/lua/rom/help/whatsnew.md +++ b/src/main/resources/data/computercraft/lua/rom/help/whatsnew.md @@ -1,10 +1,17 @@ -New features in CC: Tweaked 1.100.5 +New features in CC: Tweaked 1.100.6 -* Generic peripherals now use capabilities on the given side if one isn't provided on the internal side. -* Improve performance of monitor rendering. +* Various documentation improvements (MCJack123, FayneAldan). +* Allow CC's blocks to be rotated when used in structure blocks (Seniorendi). +* Several performance improvements to computer execution. +* Add parse_empty_array option to textutils.unserialiseJSON (@ChickChicky). +* Add an API to allow other mods to provide extra item/block details (Lemmmy). +* All blocks with GUIs can now be "locked" (via a command or NBT editing tools) like vanilla inventories. Players can only interact with them with a specific named item. Several bug fixes: -* Various documentation fixes (bclindner, Hasaabitt) -* Speaker sounds are now correctly positioned on the centre of the speaker block. +* Fix printouts being rendered with an offset in item frames (coolsa). +* Reduce position latency when playing audio with a noisy pocket computer. +* Fix total counts in /computercraft turn-on/shutdown commands. +* Fix "Run" command not working in the editor when run from a subdirectory (Wojbie). +* Pocket computers correctly preserve their on state. Type "help changelog" to see the full version history.