From 83d602cd250e6483552c9eb783860a7b26afa781 Mon Sep 17 00:00:00 2001 From: Chip Locke Date: Sun, 25 Nov 2018 05:16:10 -0800 Subject: [PATCH] SGR work-in-progress, add xterm palette and start the wrapping work --- src/ConsoleBuffer/Buffer.cs | 8 + src/ConsoleBuffer/Character.cs | 140 +- src/ConsoleBuffer/Commands/ControlSequence.cs | 2 + .../Commands/SetGraphicsRendition.cs | 29 + src/ConsoleBuffer/ConsoleBuffer.csproj | 5 + src/ConsoleBuffer/ConsoleWrapper.cs | 10 +- src/ConsoleBuffer/XtermPalette.cs | 310 ++ src/ConsoleBuffer/xterm-colors.json | 3842 +++++++++++++++++ src/ConsoleBuffer/xterm-colors.ps1 | 11 + src/condo/MainWindow.xaml.cs | 3 + src/condo/Screen.cs | 2 +- .../ConsoleBufferTests/SequenceParserTests.cs | 17 + test/ConsoleBufferTests/XtermPaletteTests.cs | 35 + 13 files changed, 4405 insertions(+), 9 deletions(-) create mode 100644 src/ConsoleBuffer/Commands/SetGraphicsRendition.cs create mode 100644 src/ConsoleBuffer/XtermPalette.cs create mode 100644 src/ConsoleBuffer/xterm-colors.json create mode 100644 src/ConsoleBuffer/xterm-colors.ps1 create mode 100644 test/ConsoleBufferTests/XtermPaletteTests.cs diff --git a/src/ConsoleBuffer/Buffer.cs b/src/ConsoleBuffer/Buffer.cs index 67629a3..3830362 100644 --- a/src/ConsoleBuffer/Buffer.cs +++ b/src/ConsoleBuffer/Buffer.cs @@ -241,6 +241,9 @@ private void HandleControlSequence(Commands.ControlSequence cmd) case Commands.SetCursorPosition scp: this.HandleSetCursorPosition(scp); break; + case Commands.SetGraphicsRendition sgr: + this.HandleSGR(sgr); + break; case Commands.SetMode sm: this.HandleSetMode(sm); break; @@ -354,6 +357,11 @@ private void HandleSetCursorPosition(Commands.SetCursorPosition scp) } } + private void HandleSGR(Commands.SetGraphicsRendition sgr) + { + + } + private void HandleSetMode(Commands.SetMode sm) { switch (sm.Setting) diff --git a/src/ConsoleBuffer/Character.cs b/src/ConsoleBuffer/Character.cs index 883ed0e..5e64d99 100644 --- a/src/ConsoleBuffer/Character.cs +++ b/src/ConsoleBuffer/Character.cs @@ -1,5 +1,7 @@ namespace ConsoleBuffer { + using System; + // XXX: Gonna end up with a lot of these and they're really freakin' big. // could consider a morphable type with different sizes to avoid the (currently) 12 bytes-per-character issue. // on a 'normal' 80x25 terminal the current buffer alone is just >23kB. A 160 character wide buffer with a 32k @@ -7,15 +9,151 @@ namespace ConsoleBuffer // the future. public struct Character { + [Flags] + public enum Options : byte + { + None = 0x00, + // we have 3 color bits which combine to represent the 8 "basic" colors of classic terminals + ColorBits = 0x07, // (0x01, 0x02, 0x04) + Black = 0x00, + Red = 0x01, + Green = 0x02, + Yellow = 0x03, + Blue = 0x04, + Magenta = 0x05, + Cyan = 0x06, + White = 0x07, + + // we use 3 additional bits (currently) for flags + FlagBits = 0x38, // (0x08, 0x10, 0x20) + Bright = 0x08, + Underline = 0x10, + Inverse = 0x20, + Extended = 0x18, + // 0x28 free + // 0x38 free + + // 0x40, 0x80 free bits + } + public struct ColorInfo { public byte R; public byte G; public byte B; + public Options Options; + + public bool Bright + { + get + { + return ((byte)this.Options & (byte)Options.Bright) == (byte)Options.Bright; + } + set + { + if (value) + { + this.Options = (Options)((byte)this.Options | (byte)Options.Bright); + } + else + { + this.Options = (Options)((byte)this.Options & ~(byte)Options.Bright); + } + } + } + + /// + /// Whether the underline bit is set. Should not apply to background colors. + /// + public bool Underline + { + get + { + return ((byte)this.Options & (byte)Options.Underline) == (byte)Options.Underline; + } + set + { + if (value) + { + this.Options = (Options)((byte)this.Options | (byte)Options.Underline); + } + else + { + this.Options = (Options)((byte)this.Options & ~(byte)Options.Underline); + } + } + } + + /// + /// Whether the 'inverse' bit is set. Should not apply to background colors. + /// + public bool Inverse + { + get + { + return ((byte)this.Options & (byte)Options.Inverse) == (byte)Options.Inverse; + } + set + { + if (value) + { + this.Options = (Options)((byte)this.Options | (byte)Options.Inverse); + } + else + { + this.Options = (Options)((byte)this.Options & ~(byte)Options.Inverse); + } + } + } + + /// + /// Whether extended (RGB) color values should be applied for this cell. + /// + public bool Extended + { + get + { + return ((byte)this.Options & (byte)Options.Extended) == (byte)Options.Extended; + } + set + { + if (value) + { + this.Options = (Options)((byte)this.Options | (byte)Options.Extended); + } + else + { + this.Options = (Options)((byte)this.Options & ~(byte)Options.Extended); + } + } + } + + /// + /// Classic color value. + /// + public Options BasicColor + { + get + { + return (Options)((byte)this.Options & (byte)Options.ColorBits); + } + set + { + var colorValue = (byte)value & (byte)Options.ColorBits; + var colorlessOptions = (byte)this.Options & ~(byte)Options.ColorBits; + this.Options = (Options)(colorlessOptions & colorValue); + } + } + + /// + /// True if there is any classic color value set. + /// + public bool HasBasicColor => ((byte)this.Options & (byte)Options.ColorBits) != 0; } public ColorInfo Foreground { get; set; } public ColorInfo Background { get; set; } - public int Glyph { get; set; } // XXX: a single int isn't quite sufficient to represent emoji with ZWJ. fix later. + + public int Glyph { get; set; } // XXX: a single int isn't sufficient to represent emoji with ZWJ. fix later. } } diff --git a/src/ConsoleBuffer/Commands/ControlSequence.cs b/src/ConsoleBuffer/Commands/ControlSequence.cs index ba36f18..fcb7630 100644 --- a/src/ConsoleBuffer/Commands/ControlSequence.cs +++ b/src/ConsoleBuffer/Commands/ControlSequence.cs @@ -28,6 +28,8 @@ public static Base Create(char command, string bufferData) return new EraseIn(bufferData, EraseIn.EraseType.Display); case 'K': return new EraseIn(bufferData, EraseIn.EraseType.Line); + case 'm': + return new SetGraphicsRendition(bufferData); case 'X': return new EraseCharacter(bufferData); } diff --git a/src/ConsoleBuffer/Commands/SetGraphicsRendition.cs b/src/ConsoleBuffer/Commands/SetGraphicsRendition.cs new file mode 100644 index 0000000..0e1c8bb --- /dev/null +++ b/src/ConsoleBuffer/Commands/SetGraphicsRendition.cs @@ -0,0 +1,29 @@ +namespace ConsoleBuffer.Commands +{ + public sealed class SetGraphicsRendition : ControlSequence + { + public enum FlagValue + { + Set, + Unset, + None, + } + + public bool HaveForeground { get; private set; } + public Character.ColorInfo ForegroundColor { get; private set; } + + public bool HaveBackground { get; private set; } + public Character.ColorInfo BackgroundColor { get; private set; } + + public FlagValue Bold { get; private set; } + public FlagValue Underline { get; private set; } + public FlagValue Inverse { get; private set; } + + public SetGraphicsRendition(string bufferData) : base(bufferData) + { + this.Bold = FlagValue.None; + this.Underline = FlagValue.None; + this.Inverse = FlagValue.None; + } + } +} diff --git a/src/ConsoleBuffer/ConsoleBuffer.csproj b/src/ConsoleBuffer/ConsoleBuffer.csproj index 17d3b29..9965fc5 100644 --- a/src/ConsoleBuffer/ConsoleBuffer.csproj +++ b/src/ConsoleBuffer/ConsoleBuffer.csproj @@ -2,4 +2,9 @@ netstandard2.0 + + + Never + + \ No newline at end of file diff --git a/src/ConsoleBuffer/ConsoleWrapper.cs b/src/ConsoleBuffer/ConsoleWrapper.cs index 0442e1d..e9aa8ce 100644 --- a/src/ConsoleBuffer/ConsoleWrapper.cs +++ b/src/ConsoleBuffer/ConsoleWrapper.cs @@ -65,7 +65,7 @@ public ConsoleWrapper(string command) this.InitializeStartupInfo(); this.StartProcess(); - Task.Run(() => this.ReadConsoleTask()); + Task.Factory.StartNew(() => this.ReadConsoleTask(), TaskCreationOptions.LongRunning); this.writeStream = new FileStream(this.writeHandle, FileAccess.Write); } @@ -159,7 +159,7 @@ private void StartProcess() this.Running = true; this.OnPropertyChanged(nameof(this.Running)); - Task.Run(() => + Task.Factory.StartNew(() => { var ret = NativeMethods.WaitForSingleObject(this.processInfo.hProcess, uint.MaxValue); if (ret != 0) @@ -176,11 +176,7 @@ private void StartProcess() this.ProcessExitCode = exitCode; this.Running = false; this.OnPropertyChanged(nameof(this.Running)); - - // XXX: long-term I think we should have the presentation layer do this but let's dump it here for now - var msg = Encoding.UTF8.GetBytes($"\r\n[process terminated with code {exitCode}.]"); - this.Buffer.Append(msg, msg.Length); - }); + }, TaskCreationOptions.LongRunning); } private void ReadConsoleTask() diff --git a/src/ConsoleBuffer/XtermPalette.cs b/src/ConsoleBuffer/XtermPalette.cs new file mode 100644 index 0000000..8a6d259 --- /dev/null +++ b/src/ConsoleBuffer/XtermPalette.cs @@ -0,0 +1,310 @@ +namespace ConsoleBuffer +{ + using System; + using System.Collections.Generic; + + /// + /// Represents the xterm palette for 256 color rendering. + /// + public sealed class XtermPalette + { + private struct XtermColor + { + public int Id; + public byte R; + public byte G; + public byte B; + public string Name; + } + + private readonly XtermColor[] DefaultPalette = new[] + { + new XtermColor { Id = 0, R = 0x00, G = 0x00, B = 0x00, Name = "Black" }, + new XtermColor { Id = 1, R = 0x80, G = 0x00, B = 0x00, Name = "Maroon" }, + new XtermColor { Id = 2, R = 0x00, G = 0x80, B = 0x00, Name = "Green" }, + new XtermColor { Id = 3, R = 0x80, G = 0x80, B = 0x00, Name = "Olive" }, + new XtermColor { Id = 4, R = 0x00, G = 0x00, B = 0x80, Name = "Navy" }, + new XtermColor { Id = 5, R = 0x80, G = 0x00, B = 0x80, Name = "Purple" }, + new XtermColor { Id = 6, R = 0x00, G = 0x80, B = 0x80, Name = "Teal" }, + new XtermColor { Id = 7, R = 0xc0, G = 0xc0, B = 0xc0, Name = "Silver" }, + new XtermColor { Id = 8, R = 0x80, G = 0x80, B = 0x80, Name = "Grey" }, + new XtermColor { Id = 9, R = 0xff, G = 0x00, B = 0x00, Name = "Red" }, + new XtermColor { Id = 10, R = 0x00, G = 0xff, B = 0x00, Name = "Lime" }, + new XtermColor { Id = 11, R = 0xff, G = 0xff, B = 0x00, Name = "Yellow" }, + new XtermColor { Id = 12, R = 0x00, G = 0x00, B = 0xff, Name = "Blue" }, + new XtermColor { Id = 13, R = 0xff, G = 0x00, B = 0xff, Name = "Fuchsia" }, + new XtermColor { Id = 14, R = 0x00, G = 0xff, B = 0xff, Name = "Aqua" }, + new XtermColor { Id = 15, R = 0xff, G = 0xff, B = 0xff, Name = "White" }, + new XtermColor { Id = 16, R = 0x00, G = 0x00, B = 0x00, Name = "Grey0" }, + new XtermColor { Id = 17, R = 0x00, G = 0x00, B = 0x5f, Name = "NavyBlue" }, + new XtermColor { Id = 18, R = 0x00, G = 0x00, B = 0x87, Name = "DarkBlue" }, + new XtermColor { Id = 19, R = 0x00, G = 0x00, B = 0xaf, Name = "Blue3" }, + new XtermColor { Id = 20, R = 0x00, G = 0x00, B = 0xd7, Name = "Blue3" }, + new XtermColor { Id = 21, R = 0x00, G = 0x00, B = 0xff, Name = "Blue1" }, + new XtermColor { Id = 22, R = 0x00, G = 0x5f, B = 0x00, Name = "DarkGreen" }, + new XtermColor { Id = 23, R = 0x00, G = 0x5f, B = 0x5f, Name = "DeepSkyBlue4" }, + new XtermColor { Id = 24, R = 0x00, G = 0x5f, B = 0x87, Name = "DeepSkyBlue4" }, + new XtermColor { Id = 25, R = 0x00, G = 0x5f, B = 0xaf, Name = "DeepSkyBlue4" }, + new XtermColor { Id = 26, R = 0x00, G = 0x5f, B = 0xd7, Name = "DodgerBlue3" }, + new XtermColor { Id = 27, R = 0x00, G = 0x5f, B = 0xff, Name = "DodgerBlue2" }, + new XtermColor { Id = 28, R = 0x00, G = 0x87, B = 0x00, Name = "Green4" }, + new XtermColor { Id = 29, R = 0x00, G = 0x87, B = 0x5f, Name = "SpringGreen4" }, + new XtermColor { Id = 30, R = 0x00, G = 0x87, B = 0x87, Name = "Turquoise4" }, + new XtermColor { Id = 31, R = 0x00, G = 0x87, B = 0xaf, Name = "DeepSkyBlue3" }, + new XtermColor { Id = 32, R = 0x00, G = 0x87, B = 0xd7, Name = "DeepSkyBlue3" }, + new XtermColor { Id = 33, R = 0x00, G = 0x87, B = 0xff, Name = "DodgerBlue1" }, + new XtermColor { Id = 34, R = 0x00, G = 0xaf, B = 0x00, Name = "Green3" }, + new XtermColor { Id = 35, R = 0x00, G = 0xaf, B = 0x5f, Name = "SpringGreen3" }, + new XtermColor { Id = 36, R = 0x00, G = 0xaf, B = 0x87, Name = "DarkCyan" }, + new XtermColor { Id = 37, R = 0x00, G = 0xaf, B = 0xaf, Name = "LightSeaGreen" }, + new XtermColor { Id = 38, R = 0x00, G = 0xaf, B = 0xd7, Name = "DeepSkyBlue2" }, + new XtermColor { Id = 39, R = 0x00, G = 0xaf, B = 0xff, Name = "DeepSkyBlue1" }, + new XtermColor { Id = 40, R = 0x00, G = 0xd7, B = 0x00, Name = "Green3" }, + new XtermColor { Id = 41, R = 0x00, G = 0xd7, B = 0x5f, Name = "SpringGreen3" }, + new XtermColor { Id = 42, R = 0x00, G = 0xd7, B = 0x87, Name = "SpringGreen2" }, + new XtermColor { Id = 43, R = 0x00, G = 0xd7, B = 0xaf, Name = "Cyan3" }, + new XtermColor { Id = 44, R = 0x00, G = 0xd7, B = 0xd7, Name = "DarkTurquoise" }, + new XtermColor { Id = 45, R = 0x00, G = 0xd7, B = 0xff, Name = "Turquoise2" }, + new XtermColor { Id = 46, R = 0x00, G = 0xff, B = 0x00, Name = "Green1" }, + new XtermColor { Id = 47, R = 0x00, G = 0xff, B = 0x5f, Name = "SpringGreen2" }, + new XtermColor { Id = 48, R = 0x00, G = 0xff, B = 0x87, Name = "SpringGreen1" }, + new XtermColor { Id = 49, R = 0x00, G = 0xff, B = 0xaf, Name = "MediumSpringGreen" }, + new XtermColor { Id = 50, R = 0x00, G = 0xff, B = 0xd7, Name = "Cyan2" }, + new XtermColor { Id = 51, R = 0x00, G = 0xff, B = 0xff, Name = "Cyan1" }, + new XtermColor { Id = 52, R = 0x5f, G = 0x00, B = 0x00, Name = "DarkRed" }, + new XtermColor { Id = 53, R = 0x5f, G = 0x00, B = 0x5f, Name = "DeepPink4" }, + new XtermColor { Id = 54, R = 0x5f, G = 0x00, B = 0x87, Name = "Purple4" }, + new XtermColor { Id = 55, R = 0x5f, G = 0x00, B = 0xaf, Name = "Purple4" }, + new XtermColor { Id = 56, R = 0x5f, G = 0x00, B = 0xd7, Name = "Purple3" }, + new XtermColor { Id = 57, R = 0x5f, G = 0x00, B = 0xff, Name = "BlueViolet" }, + new XtermColor { Id = 58, R = 0x5f, G = 0x5f, B = 0x00, Name = "Orange4" }, + new XtermColor { Id = 59, R = 0x5f, G = 0x5f, B = 0x5f, Name = "Grey37" }, + new XtermColor { Id = 60, R = 0x5f, G = 0x5f, B = 0x87, Name = "MediumPurple4" }, + new XtermColor { Id = 61, R = 0x5f, G = 0x5f, B = 0xaf, Name = "SlateBlue3" }, + new XtermColor { Id = 62, R = 0x5f, G = 0x5f, B = 0xd7, Name = "SlateBlue3" }, + new XtermColor { Id = 63, R = 0x5f, G = 0x5f, B = 0xff, Name = "RoyalBlue1" }, + new XtermColor { Id = 64, R = 0x5f, G = 0x87, B = 0x00, Name = "Chartreuse4" }, + new XtermColor { Id = 65, R = 0x5f, G = 0x87, B = 0x5f, Name = "DarkSeaGreen4" }, + new XtermColor { Id = 66, R = 0x5f, G = 0x87, B = 0x87, Name = "PaleTurquoise4" }, + new XtermColor { Id = 67, R = 0x5f, G = 0x87, B = 0xaf, Name = "SteelBlue" }, + new XtermColor { Id = 68, R = 0x5f, G = 0x87, B = 0xd7, Name = "SteelBlue3" }, + new XtermColor { Id = 69, R = 0x5f, G = 0x87, B = 0xff, Name = "CornflowerBlue" }, + new XtermColor { Id = 70, R = 0x5f, G = 0xaf, B = 0x00, Name = "Chartreuse3" }, + new XtermColor { Id = 71, R = 0x5f, G = 0xaf, B = 0x5f, Name = "DarkSeaGreen4" }, + new XtermColor { Id = 72, R = 0x5f, G = 0xaf, B = 0x87, Name = "CadetBlue" }, + new XtermColor { Id = 73, R = 0x5f, G = 0xaf, B = 0xaf, Name = "CadetBlue" }, + new XtermColor { Id = 74, R = 0x5f, G = 0xaf, B = 0xd7, Name = "SkyBlue3" }, + new XtermColor { Id = 75, R = 0x5f, G = 0xaf, B = 0xff, Name = "SteelBlue1" }, + new XtermColor { Id = 76, R = 0x5f, G = 0xd7, B = 0x00, Name = "Chartreuse3" }, + new XtermColor { Id = 77, R = 0x5f, G = 0xd7, B = 0x5f, Name = "PaleGreen3" }, + new XtermColor { Id = 78, R = 0x5f, G = 0xd7, B = 0x87, Name = "SeaGreen3" }, + new XtermColor { Id = 79, R = 0x5f, G = 0xd7, B = 0xaf, Name = "Aquamarine3" }, + new XtermColor { Id = 80, R = 0x5f, G = 0xd7, B = 0xd7, Name = "MediumTurquoise" }, + new XtermColor { Id = 81, R = 0x5f, G = 0xd7, B = 0xff, Name = "SteelBlue1" }, + new XtermColor { Id = 82, R = 0x5f, G = 0xff, B = 0x00, Name = "Chartreuse2" }, + new XtermColor { Id = 83, R = 0x5f, G = 0xff, B = 0x5f, Name = "SeaGreen2" }, + new XtermColor { Id = 84, R = 0x5f, G = 0xff, B = 0x87, Name = "SeaGreen1" }, + new XtermColor { Id = 85, R = 0x5f, G = 0xff, B = 0xaf, Name = "SeaGreen1" }, + new XtermColor { Id = 86, R = 0x5f, G = 0xff, B = 0xd7, Name = "Aquamarine1" }, + new XtermColor { Id = 87, R = 0x5f, G = 0xff, B = 0xff, Name = "DarkSlateGray2" }, + new XtermColor { Id = 88, R = 0x87, G = 0x00, B = 0x00, Name = "DarkRed" }, + new XtermColor { Id = 89, R = 0x87, G = 0x00, B = 0x5f, Name = "DeepPink4" }, + new XtermColor { Id = 90, R = 0x87, G = 0x00, B = 0x87, Name = "DarkMagenta" }, + new XtermColor { Id = 91, R = 0x87, G = 0x00, B = 0xaf, Name = "DarkMagenta" }, + new XtermColor { Id = 92, R = 0x87, G = 0x00, B = 0xd7, Name = "DarkViolet" }, + new XtermColor { Id = 93, R = 0x87, G = 0x00, B = 0xff, Name = "Purple" }, + new XtermColor { Id = 94, R = 0x87, G = 0x5f, B = 0x00, Name = "Orange4" }, + new XtermColor { Id = 95, R = 0x87, G = 0x5f, B = 0x5f, Name = "LightPink4" }, + new XtermColor { Id = 96, R = 0x87, G = 0x5f, B = 0x87, Name = "Plum4" }, + new XtermColor { Id = 97, R = 0x87, G = 0x5f, B = 0xaf, Name = "MediumPurple3" }, + new XtermColor { Id = 98, R = 0x87, G = 0x5f, B = 0xd7, Name = "MediumPurple3" }, + new XtermColor { Id = 99, R = 0x87, G = 0x5f, B = 0xff, Name = "SlateBlue1" }, + new XtermColor { Id = 100, R = 0x87, G = 0x87, B = 0x00, Name = "Yellow4" }, + new XtermColor { Id = 101, R = 0x87, G = 0x87, B = 0x5f, Name = "Wheat4" }, + new XtermColor { Id = 102, R = 0x87, G = 0x87, B = 0x87, Name = "Grey53" }, + new XtermColor { Id = 103, R = 0x87, G = 0x87, B = 0xaf, Name = "LightSlateGrey" }, + new XtermColor { Id = 104, R = 0x87, G = 0x87, B = 0xd7, Name = "MediumPurple" }, + new XtermColor { Id = 105, R = 0x87, G = 0x87, B = 0xff, Name = "LightSlateBlue" }, + new XtermColor { Id = 106, R = 0x87, G = 0xaf, B = 0x00, Name = "Yellow4" }, + new XtermColor { Id = 107, R = 0x87, G = 0xaf, B = 0x5f, Name = "DarkOliveGreen3" }, + new XtermColor { Id = 108, R = 0x87, G = 0xaf, B = 0x87, Name = "DarkSeaGreen" }, + new XtermColor { Id = 109, R = 0x87, G = 0xaf, B = 0xaf, Name = "LightSkyBlue3" }, + new XtermColor { Id = 110, R = 0x87, G = 0xaf, B = 0xd7, Name = "LightSkyBlue3" }, + new XtermColor { Id = 111, R = 0x87, G = 0xaf, B = 0xff, Name = "SkyBlue2" }, + new XtermColor { Id = 112, R = 0x87, G = 0xd7, B = 0x00, Name = "Chartreuse2" }, + new XtermColor { Id = 113, R = 0x87, G = 0xd7, B = 0x5f, Name = "DarkOliveGreen3" }, + new XtermColor { Id = 114, R = 0x87, G = 0xd7, B = 0x87, Name = "PaleGreen3" }, + new XtermColor { Id = 115, R = 0x87, G = 0xd7, B = 0xaf, Name = "DarkSeaGreen3" }, + new XtermColor { Id = 116, R = 0x87, G = 0xd7, B = 0xd7, Name = "DarkSlateGray3" }, + new XtermColor { Id = 117, R = 0x87, G = 0xd7, B = 0xff, Name = "SkyBlue1" }, + new XtermColor { Id = 118, R = 0x87, G = 0xff, B = 0x00, Name = "Chartreuse1" }, + new XtermColor { Id = 119, R = 0x87, G = 0xff, B = 0x5f, Name = "LightGreen" }, + new XtermColor { Id = 120, R = 0x87, G = 0xff, B = 0x87, Name = "LightGreen" }, + new XtermColor { Id = 121, R = 0x87, G = 0xff, B = 0xaf, Name = "PaleGreen1" }, + new XtermColor { Id = 122, R = 0x87, G = 0xff, B = 0xd7, Name = "Aquamarine1" }, + new XtermColor { Id = 123, R = 0x87, G = 0xff, B = 0xff, Name = "DarkSlateGray1" }, + new XtermColor { Id = 124, R = 0xaf, G = 0x00, B = 0x00, Name = "Red3" }, + new XtermColor { Id = 125, R = 0xaf, G = 0x00, B = 0x5f, Name = "DeepPink4" }, + new XtermColor { Id = 126, R = 0xaf, G = 0x00, B = 0x87, Name = "MediumVioletRed" }, + new XtermColor { Id = 127, R = 0xaf, G = 0x00, B = 0xaf, Name = "Magenta3" }, + new XtermColor { Id = 128, R = 0xaf, G = 0x00, B = 0xd7, Name = "DarkViolet" }, + new XtermColor { Id = 129, R = 0xaf, G = 0x00, B = 0xff, Name = "Purple" }, + new XtermColor { Id = 130, R = 0xaf, G = 0x5f, B = 0x00, Name = "DarkOrange3" }, + new XtermColor { Id = 131, R = 0xaf, G = 0x5f, B = 0x5f, Name = "IndianRed" }, + new XtermColor { Id = 132, R = 0xaf, G = 0x5f, B = 0x87, Name = "HotPink3" }, + new XtermColor { Id = 133, R = 0xaf, G = 0x5f, B = 0xaf, Name = "MediumOrchid3" }, + new XtermColor { Id = 134, R = 0xaf, G = 0x5f, B = 0xd7, Name = "MediumOrchid" }, + new XtermColor { Id = 135, R = 0xaf, G = 0x5f, B = 0xff, Name = "MediumPurple2" }, + new XtermColor { Id = 136, R = 0xaf, G = 0x87, B = 0x00, Name = "DarkGoldenrod" }, + new XtermColor { Id = 137, R = 0xaf, G = 0x87, B = 0x5f, Name = "LightSalmon3" }, + new XtermColor { Id = 138, R = 0xaf, G = 0x87, B = 0x87, Name = "RosyBrown" }, + new XtermColor { Id = 139, R = 0xaf, G = 0x87, B = 0xaf, Name = "Grey63" }, + new XtermColor { Id = 140, R = 0xaf, G = 0x87, B = 0xd7, Name = "MediumPurple2" }, + new XtermColor { Id = 141, R = 0xaf, G = 0x87, B = 0xff, Name = "MediumPurple1" }, + new XtermColor { Id = 142, R = 0xaf, G = 0xaf, B = 0x00, Name = "Gold3" }, + new XtermColor { Id = 143, R = 0xaf, G = 0xaf, B = 0x5f, Name = "DarkKhaki" }, + new XtermColor { Id = 144, R = 0xaf, G = 0xaf, B = 0x87, Name = "NavajoWhite3" }, + new XtermColor { Id = 145, R = 0xaf, G = 0xaf, B = 0xaf, Name = "Grey69" }, + new XtermColor { Id = 146, R = 0xaf, G = 0xaf, B = 0xd7, Name = "LightSteelBlue3" }, + new XtermColor { Id = 147, R = 0xaf, G = 0xaf, B = 0xff, Name = "LightSteelBlue" }, + new XtermColor { Id = 148, R = 0xaf, G = 0xd7, B = 0x00, Name = "Yellow3" }, + new XtermColor { Id = 149, R = 0xaf, G = 0xd7, B = 0x5f, Name = "DarkOliveGreen3" }, + new XtermColor { Id = 150, R = 0xaf, G = 0xd7, B = 0x87, Name = "DarkSeaGreen3" }, + new XtermColor { Id = 151, R = 0xaf, G = 0xd7, B = 0xaf, Name = "DarkSeaGreen2" }, + new XtermColor { Id = 152, R = 0xaf, G = 0xd7, B = 0xd7, Name = "LightCyan3" }, + new XtermColor { Id = 153, R = 0xaf, G = 0xd7, B = 0xff, Name = "LightSkyBlue1" }, + new XtermColor { Id = 154, R = 0xaf, G = 0xff, B = 0x00, Name = "GreenYellow" }, + new XtermColor { Id = 155, R = 0xaf, G = 0xff, B = 0x5f, Name = "DarkOliveGreen2" }, + new XtermColor { Id = 156, R = 0xaf, G = 0xff, B = 0x87, Name = "PaleGreen1" }, + new XtermColor { Id = 157, R = 0xaf, G = 0xff, B = 0xaf, Name = "DarkSeaGreen2" }, + new XtermColor { Id = 158, R = 0xaf, G = 0xff, B = 0xd7, Name = "DarkSeaGreen1" }, + new XtermColor { Id = 159, R = 0xaf, G = 0xff, B = 0xff, Name = "PaleTurquoise1" }, + new XtermColor { Id = 160, R = 0xd7, G = 0x00, B = 0x00, Name = "Red3" }, + new XtermColor { Id = 161, R = 0xd7, G = 0x00, B = 0x5f, Name = "DeepPink3" }, + new XtermColor { Id = 162, R = 0xd7, G = 0x00, B = 0x87, Name = "DeepPink3" }, + new XtermColor { Id = 163, R = 0xd7, G = 0x00, B = 0xaf, Name = "Magenta3" }, + new XtermColor { Id = 164, R = 0xd7, G = 0x00, B = 0xd7, Name = "Magenta3" }, + new XtermColor { Id = 165, R = 0xd7, G = 0x00, B = 0xff, Name = "Magenta2" }, + new XtermColor { Id = 166, R = 0xd7, G = 0x5f, B = 0x00, Name = "DarkOrange3" }, + new XtermColor { Id = 167, R = 0xd7, G = 0x5f, B = 0x5f, Name = "IndianRed" }, + new XtermColor { Id = 168, R = 0xd7, G = 0x5f, B = 0x87, Name = "HotPink3" }, + new XtermColor { Id = 169, R = 0xd7, G = 0x5f, B = 0xaf, Name = "HotPink2" }, + new XtermColor { Id = 170, R = 0xd7, G = 0x5f, B = 0xd7, Name = "Orchid" }, + new XtermColor { Id = 171, R = 0xd7, G = 0x5f, B = 0xff, Name = "MediumOrchid1" }, + new XtermColor { Id = 172, R = 0xd7, G = 0x87, B = 0x00, Name = "Orange3" }, + new XtermColor { Id = 173, R = 0xd7, G = 0x87, B = 0x5f, Name = "LightSalmon3" }, + new XtermColor { Id = 174, R = 0xd7, G = 0x87, B = 0x87, Name = "LightPink3" }, + new XtermColor { Id = 175, R = 0xd7, G = 0x87, B = 0xaf, Name = "Pink3" }, + new XtermColor { Id = 176, R = 0xd7, G = 0x87, B = 0xd7, Name = "Plum3" }, + new XtermColor { Id = 177, R = 0xd7, G = 0x87, B = 0xff, Name = "Violet" }, + new XtermColor { Id = 178, R = 0xd7, G = 0xaf, B = 0x00, Name = "Gold3" }, + new XtermColor { Id = 179, R = 0xd7, G = 0xaf, B = 0x5f, Name = "LightGoldenrod3" }, + new XtermColor { Id = 180, R = 0xd7, G = 0xaf, B = 0x87, Name = "Tan" }, + new XtermColor { Id = 181, R = 0xd7, G = 0xaf, B = 0xaf, Name = "MistyRose3" }, + new XtermColor { Id = 182, R = 0xd7, G = 0xaf, B = 0xd7, Name = "Thistle3" }, + new XtermColor { Id = 183, R = 0xd7, G = 0xaf, B = 0xff, Name = "Plum2" }, + new XtermColor { Id = 184, R = 0xd7, G = 0xd7, B = 0x00, Name = "Yellow3" }, + new XtermColor { Id = 185, R = 0xd7, G = 0xd7, B = 0x5f, Name = "Khaki3" }, + new XtermColor { Id = 186, R = 0xd7, G = 0xd7, B = 0x87, Name = "LightGoldenrod2" }, + new XtermColor { Id = 187, R = 0xd7, G = 0xd7, B = 0xaf, Name = "LightYellow3" }, + new XtermColor { Id = 188, R = 0xd7, G = 0xd7, B = 0xd7, Name = "Grey84" }, + new XtermColor { Id = 189, R = 0xd7, G = 0xd7, B = 0xff, Name = "LightSteelBlue1" }, + new XtermColor { Id = 190, R = 0xd7, G = 0xff, B = 0x00, Name = "Yellow2" }, + new XtermColor { Id = 191, R = 0xd7, G = 0xff, B = 0x5f, Name = "DarkOliveGreen1" }, + new XtermColor { Id = 192, R = 0xd7, G = 0xff, B = 0x87, Name = "DarkOliveGreen1" }, + new XtermColor { Id = 193, R = 0xd7, G = 0xff, B = 0xaf, Name = "DarkSeaGreen1" }, + new XtermColor { Id = 194, R = 0xd7, G = 0xff, B = 0xd7, Name = "Honeydew2" }, + new XtermColor { Id = 195, R = 0xd7, G = 0xff, B = 0xff, Name = "LightCyan1" }, + new XtermColor { Id = 196, R = 0xff, G = 0x00, B = 0x00, Name = "Red1" }, + new XtermColor { Id = 197, R = 0xff, G = 0x00, B = 0x5f, Name = "DeepPink2" }, + new XtermColor { Id = 198, R = 0xff, G = 0x00, B = 0x87, Name = "DeepPink1" }, + new XtermColor { Id = 199, R = 0xff, G = 0x00, B = 0xaf, Name = "DeepPink1" }, + new XtermColor { Id = 200, R = 0xff, G = 0x00, B = 0xd7, Name = "Magenta2" }, + new XtermColor { Id = 201, R = 0xff, G = 0x00, B = 0xff, Name = "Magenta1" }, + new XtermColor { Id = 202, R = 0xff, G = 0x5f, B = 0x00, Name = "OrangeRed1" }, + new XtermColor { Id = 203, R = 0xff, G = 0x5f, B = 0x5f, Name = "IndianRed1" }, + new XtermColor { Id = 204, R = 0xff, G = 0x5f, B = 0x87, Name = "IndianRed1" }, + new XtermColor { Id = 205, R = 0xff, G = 0x5f, B = 0xaf, Name = "HotPink" }, + new XtermColor { Id = 206, R = 0xff, G = 0x5f, B = 0xd7, Name = "HotPink" }, + new XtermColor { Id = 207, R = 0xff, G = 0x5f, B = 0xff, Name = "MediumOrchid1" }, + new XtermColor { Id = 208, R = 0xff, G = 0x87, B = 0x00, Name = "DarkOrange" }, + new XtermColor { Id = 209, R = 0xff, G = 0x87, B = 0x5f, Name = "Salmon1" }, + new XtermColor { Id = 210, R = 0xff, G = 0x87, B = 0x87, Name = "LightCoral" }, + new XtermColor { Id = 211, R = 0xff, G = 0x87, B = 0xaf, Name = "PaleVioletRed1" }, + new XtermColor { Id = 212, R = 0xff, G = 0x87, B = 0xd7, Name = "Orchid2" }, + new XtermColor { Id = 213, R = 0xff, G = 0x87, B = 0xff, Name = "Orchid1" }, + new XtermColor { Id = 214, R = 0xff, G = 0xaf, B = 0x00, Name = "Orange1" }, + new XtermColor { Id = 215, R = 0xff, G = 0xaf, B = 0x5f, Name = "SandyBrown" }, + new XtermColor { Id = 216, R = 0xff, G = 0xaf, B = 0x87, Name = "LightSalmon1" }, + new XtermColor { Id = 217, R = 0xff, G = 0xaf, B = 0xaf, Name = "LightPink1" }, + new XtermColor { Id = 218, R = 0xff, G = 0xaf, B = 0xd7, Name = "Pink1" }, + new XtermColor { Id = 219, R = 0xff, G = 0xaf, B = 0xff, Name = "Plum1" }, + new XtermColor { Id = 220, R = 0xff, G = 0xd7, B = 0x00, Name = "Gold1" }, + new XtermColor { Id = 221, R = 0xff, G = 0xd7, B = 0x5f, Name = "LightGoldenrod2" }, + new XtermColor { Id = 222, R = 0xff, G = 0xd7, B = 0x87, Name = "LightGoldenrod2" }, + new XtermColor { Id = 223, R = 0xff, G = 0xd7, B = 0xaf, Name = "NavajoWhite1" }, + new XtermColor { Id = 224, R = 0xff, G = 0xd7, B = 0xd7, Name = "MistyRose1" }, + new XtermColor { Id = 225, R = 0xff, G = 0xd7, B = 0xff, Name = "Thistle1" }, + new XtermColor { Id = 226, R = 0xff, G = 0xff, B = 0x00, Name = "Yellow1" }, + new XtermColor { Id = 227, R = 0xff, G = 0xff, B = 0x5f, Name = "LightGoldenrod1" }, + new XtermColor { Id = 228, R = 0xff, G = 0xff, B = 0x87, Name = "Khaki1" }, + new XtermColor { Id = 229, R = 0xff, G = 0xff, B = 0xaf, Name = "Wheat1" }, + new XtermColor { Id = 230, R = 0xff, G = 0xff, B = 0xd7, Name = "Cornsilk1" }, + new XtermColor { Id = 231, R = 0xff, G = 0xff, B = 0xff, Name = "Grey100" }, + new XtermColor { Id = 232, R = 0x08, G = 0x08, B = 0x08, Name = "Grey3" }, + new XtermColor { Id = 233, R = 0x12, G = 0x12, B = 0x12, Name = "Grey7" }, + new XtermColor { Id = 234, R = 0x1c, G = 0x1c, B = 0x1c, Name = "Grey11" }, + new XtermColor { Id = 235, R = 0x26, G = 0x26, B = 0x26, Name = "Grey15" }, + new XtermColor { Id = 236, R = 0x30, G = 0x30, B = 0x30, Name = "Grey19" }, + new XtermColor { Id = 237, R = 0x3a, G = 0x3a, B = 0x3a, Name = "Grey23" }, + new XtermColor { Id = 238, R = 0x44, G = 0x44, B = 0x44, Name = "Grey27" }, + new XtermColor { Id = 239, R = 0x4e, G = 0x4e, B = 0x4e, Name = "Grey30" }, + new XtermColor { Id = 240, R = 0x58, G = 0x58, B = 0x58, Name = "Grey35" }, + new XtermColor { Id = 241, R = 0x62, G = 0x62, B = 0x62, Name = "Grey39" }, + new XtermColor { Id = 242, R = 0x6c, G = 0x6c, B = 0x6c, Name = "Grey42" }, + new XtermColor { Id = 243, R = 0x76, G = 0x76, B = 0x76, Name = "Grey46" }, + new XtermColor { Id = 244, R = 0x80, G = 0x80, B = 0x80, Name = "Grey50" }, + new XtermColor { Id = 245, R = 0x8a, G = 0x8a, B = 0x8a, Name = "Grey54" }, + new XtermColor { Id = 246, R = 0x94, G = 0x94, B = 0x94, Name = "Grey58" }, + new XtermColor { Id = 247, R = 0x9e, G = 0x9e, B = 0x9e, Name = "Grey62" }, + new XtermColor { Id = 248, R = 0xa8, G = 0xa8, B = 0xa8, Name = "Grey66" }, + new XtermColor { Id = 249, R = 0xb2, G = 0xb2, B = 0xb2, Name = "Grey70" }, + new XtermColor { Id = 250, R = 0xbc, G = 0xbc, B = 0xbc, Name = "Grey74" }, + new XtermColor { Id = 251, R = 0xc6, G = 0xc6, B = 0xc6, Name = "Grey78" }, + new XtermColor { Id = 252, R = 0xd0, G = 0xd0, B = 0xd0, Name = "Grey82" }, + new XtermColor { Id = 253, R = 0xda, G = 0xda, B = 0xda, Name = "Grey85" }, + new XtermColor { Id = 254, R = 0xe4, G = 0xe4, B = 0xe4, Name = "Grey89" }, + new XtermColor { Id = 255, R = 0xee, G = 0xee, B = 0xee, Name = "Grey93" }, + }; + + private readonly Dictionary colorNames = new Dictionary(StringComparer.OrdinalIgnoreCase); + private readonly Character.ColorInfo[] colorPalette; + + public Character.ColorInfo this[int id] + { + get + { + return this.colorPalette[id]; + } + } + + public Character.ColorInfo this[string name] + { + get + { + return this.colorPalette[this.colorNames[name]]; + } + } + + public XtermPalette() + { + this.colorPalette = new Character.ColorInfo[this.DefaultPalette.Length]; + foreach (var c in this.DefaultPalette) + { + var colorInfo = new Character.ColorInfo { R = c.R, G = c.G, B = c.B, Options = Character.Options.None }; + this.colorPalette[c.Id] = colorInfo; + this.colorNames[c.Name] = c.Id; + } + } + } +} diff --git a/src/ConsoleBuffer/xterm-colors.json b/src/ConsoleBuffer/xterm-colors.json new file mode 100644 index 0000000..4c64d99 --- /dev/null +++ b/src/ConsoleBuffer/xterm-colors.json @@ -0,0 +1,3842 @@ +[ + { + "colorId": 0, + "hexString": "#000000", + "rgb": { + "r": 0, + "g": 0, + "b": 0 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 0 + }, + "name": "Black" + }, + { + "colorId": 1, + "hexString": "#800000", + "rgb": { + "r": 128, + "g": 0, + "b": 0 + }, + "hsl": { + "h": 0, + "s": 100, + "l": 25 + }, + "name": "Maroon" + }, + { + "colorId": 2, + "hexString": "#008000", + "rgb": { + "r": 0, + "g": 128, + "b": 0 + }, + "hsl": { + "h": 120, + "s": 100, + "l": 25 + }, + "name": "Green" + }, + { + "colorId": 3, + "hexString": "#808000", + "rgb": { + "r": 128, + "g": 128, + "b": 0 + }, + "hsl": { + "h": 60, + "s": 100, + "l": 25 + }, + "name": "Olive" + }, + { + "colorId": 4, + "hexString": "#000080", + "rgb": { + "r": 0, + "g": 0, + "b": 128 + }, + "hsl": { + "h": 240, + "s": 100, + "l": 25 + }, + "name": "Navy" + }, + { + "colorId": 5, + "hexString": "#800080", + "rgb": { + "r": 128, + "g": 0, + "b": 128 + }, + "hsl": { + "h": 300, + "s": 100, + "l": 25 + }, + "name": "Purple" + }, + { + "colorId": 6, + "hexString": "#008080", + "rgb": { + "r": 0, + "g": 128, + "b": 128 + }, + "hsl": { + "h": 180, + "s": 100, + "l": 25 + }, + "name": "Teal" + }, + { + "colorId": 7, + "hexString": "#c0c0c0", + "rgb": { + "r": 192, + "g": 192, + "b": 192 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 75 + }, + "name": "Silver" + }, + { + "colorId": 8, + "hexString": "#808080", + "rgb": { + "r": 128, + "g": 128, + "b": 128 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 50 + }, + "name": "Grey" + }, + { + "colorId": 9, + "hexString": "#ff0000", + "rgb": { + "r": 255, + "g": 0, + "b": 0 + }, + "hsl": { + "h": 0, + "s": 100, + "l": 50 + }, + "name": "Red" + }, + { + "colorId": 10, + "hexString": "#00ff00", + "rgb": { + "r": 0, + "g": 255, + "b": 0 + }, + "hsl": { + "h": 120, + "s": 100, + "l": 50 + }, + "name": "Lime" + }, + { + "colorId": 11, + "hexString": "#ffff00", + "rgb": { + "r": 255, + "g": 255, + "b": 0 + }, + "hsl": { + "h": 60, + "s": 100, + "l": 50 + }, + "name": "Yellow" + }, + { + "colorId": 12, + "hexString": "#0000ff", + "rgb": { + "r": 0, + "g": 0, + "b": 255 + }, + "hsl": { + "h": 240, + "s": 100, + "l": 50 + }, + "name": "Blue" + }, + { + "colorId": 13, + "hexString": "#ff00ff", + "rgb": { + "r": 255, + "g": 0, + "b": 255 + }, + "hsl": { + "h": 300, + "s": 100, + "l": 50 + }, + "name": "Fuchsia" + }, + { + "colorId": 14, + "hexString": "#00ffff", + "rgb": { + "r": 0, + "g": 255, + "b": 255 + }, + "hsl": { + "h": 180, + "s": 100, + "l": 50 + }, + "name": "Aqua" + }, + { + "colorId": 15, + "hexString": "#ffffff", + "rgb": { + "r": 255, + "g": 255, + "b": 255 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 100 + }, + "name": "White" + }, + { + "colorId": 16, + "hexString": "#000000", + "rgb": { + "r": 0, + "g": 0, + "b": 0 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 0 + }, + "name": "Grey0" + }, + { + "colorId": 17, + "hexString": "#00005f", + "rgb": { + "r": 0, + "g": 0, + "b": 95 + }, + "hsl": { + "h": 240, + "s": 100, + "l": 18 + }, + "name": "NavyBlue" + }, + { + "colorId": 18, + "hexString": "#000087", + "rgb": { + "r": 0, + "g": 0, + "b": 135 + }, + "hsl": { + "h": 240, + "s": 100, + "l": 26 + }, + "name": "DarkBlue" + }, + { + "colorId": 19, + "hexString": "#0000af", + "rgb": { + "r": 0, + "g": 0, + "b": 175 + }, + "hsl": { + "h": 240, + "s": 100, + "l": 34 + }, + "name": "Blue3" + }, + { + "colorId": 20, + "hexString": "#0000d7", + "rgb": { + "r": 0, + "g": 0, + "b": 215 + }, + "hsl": { + "h": 240, + "s": 100, + "l": 42 + }, + "name": "Blue3" + }, + { + "colorId": 21, + "hexString": "#0000ff", + "rgb": { + "r": 0, + "g": 0, + "b": 255 + }, + "hsl": { + "h": 240, + "s": 100, + "l": 50 + }, + "name": "Blue1" + }, + { + "colorId": 22, + "hexString": "#005f00", + "rgb": { + "r": 0, + "g": 95, + "b": 0 + }, + "hsl": { + "h": 120, + "s": 100, + "l": 18 + }, + "name": "DarkGreen" + }, + { + "colorId": 23, + "hexString": "#005f5f", + "rgb": { + "r": 0, + "g": 95, + "b": 95 + }, + "hsl": { + "h": 180, + "s": 100, + "l": 18 + }, + "name": "DeepSkyBlue4" + }, + { + "colorId": 24, + "hexString": "#005f87", + "rgb": { + "r": 0, + "g": 95, + "b": 135 + }, + "hsl": { + "h": 197.777777777778, + "s": 100, + "l": 26 + }, + "name": "DeepSkyBlue4" + }, + { + "colorId": 25, + "hexString": "#005faf", + "rgb": { + "r": 0, + "g": 95, + "b": 175 + }, + "hsl": { + "h": 207.428571428571, + "s": 100, + "l": 34 + }, + "name": "DeepSkyBlue4" + }, + { + "colorId": 26, + "hexString": "#005fd7", + "rgb": { + "r": 0, + "g": 95, + "b": 215 + }, + "hsl": { + "h": 213.488372093023, + "s": 100, + "l": 42 + }, + "name": "DodgerBlue3" + }, + { + "colorId": 27, + "hexString": "#005fff", + "rgb": { + "r": 0, + "g": 95, + "b": 255 + }, + "hsl": { + "h": 217.647058823529, + "s": 100, + "l": 50 + }, + "name": "DodgerBlue2" + }, + { + "colorId": 28, + "hexString": "#008700", + "rgb": { + "r": 0, + "g": 135, + "b": 0 + }, + "hsl": { + "h": 120, + "s": 100, + "l": 26 + }, + "name": "Green4" + }, + { + "colorId": 29, + "hexString": "#00875f", + "rgb": { + "r": 0, + "g": 135, + "b": 95 + }, + "hsl": { + "h": 162.222222222222, + "s": 100, + "l": 26 + }, + "name": "SpringGreen4" + }, + { + "colorId": 30, + "hexString": "#008787", + "rgb": { + "r": 0, + "g": 135, + "b": 135 + }, + "hsl": { + "h": 180, + "s": 100, + "l": 26 + }, + "name": "Turquoise4" + }, + { + "colorId": 31, + "hexString": "#0087af", + "rgb": { + "r": 0, + "g": 135, + "b": 175 + }, + "hsl": { + "h": 193.714285714286, + "s": 100, + "l": 34 + }, + "name": "DeepSkyBlue3" + }, + { + "colorId": 32, + "hexString": "#0087d7", + "rgb": { + "r": 0, + "g": 135, + "b": 215 + }, + "hsl": { + "h": 202.325581395349, + "s": 100, + "l": 42 + }, + "name": "DeepSkyBlue3" + }, + { + "colorId": 33, + "hexString": "#0087ff", + "rgb": { + "r": 0, + "g": 135, + "b": 255 + }, + "hsl": { + "h": 208.235294117647, + "s": 100, + "l": 50 + }, + "name": "DodgerBlue1" + }, + { + "colorId": 34, + "hexString": "#00af00", + "rgb": { + "r": 0, + "g": 175, + "b": 0 + }, + "hsl": { + "h": 120, + "s": 100, + "l": 34 + }, + "name": "Green3" + }, + { + "colorId": 35, + "hexString": "#00af5f", + "rgb": { + "r": 0, + "g": 175, + "b": 95 + }, + "hsl": { + "h": 152.571428571429, + "s": 100, + "l": 34 + }, + "name": "SpringGreen3" + }, + { + "colorId": 36, + "hexString": "#00af87", + "rgb": { + "r": 0, + "g": 175, + "b": 135 + }, + "hsl": { + "h": 166.285714285714, + "s": 100, + "l": 34 + }, + "name": "DarkCyan" + }, + { + "colorId": 37, + "hexString": "#00afaf", + "rgb": { + "r": 0, + "g": 175, + "b": 175 + }, + "hsl": { + "h": 180, + "s": 100, + "l": 34 + }, + "name": "LightSeaGreen" + }, + { + "colorId": 38, + "hexString": "#00afd7", + "rgb": { + "r": 0, + "g": 175, + "b": 215 + }, + "hsl": { + "h": 191.162790697674, + "s": 100, + "l": 42 + }, + "name": "DeepSkyBlue2" + }, + { + "colorId": 39, + "hexString": "#00afff", + "rgb": { + "r": 0, + "g": 175, + "b": 255 + }, + "hsl": { + "h": 198.823529411765, + "s": 100, + "l": 50 + }, + "name": "DeepSkyBlue1" + }, + { + "colorId": 40, + "hexString": "#00d700", + "rgb": { + "r": 0, + "g": 215, + "b": 0 + }, + "hsl": { + "h": 120, + "s": 100, + "l": 42 + }, + "name": "Green3" + }, + { + "colorId": 41, + "hexString": "#00d75f", + "rgb": { + "r": 0, + "g": 215, + "b": 95 + }, + "hsl": { + "h": 146.511627906977, + "s": 100, + "l": 42 + }, + "name": "SpringGreen3" + }, + { + "colorId": 42, + "hexString": "#00d787", + "rgb": { + "r": 0, + "g": 215, + "b": 135 + }, + "hsl": { + "h": 157.674418604651, + "s": 100, + "l": 42 + }, + "name": "SpringGreen2" + }, + { + "colorId": 43, + "hexString": "#00d7af", + "rgb": { + "r": 0, + "g": 215, + "b": 175 + }, + "hsl": { + "h": 168.837209302326, + "s": 100, + "l": 42 + }, + "name": "Cyan3" + }, + { + "colorId": 44, + "hexString": "#00d7d7", + "rgb": { + "r": 0, + "g": 215, + "b": 215 + }, + "hsl": { + "h": 180, + "s": 100, + "l": 42 + }, + "name": "DarkTurquoise" + }, + { + "colorId": 45, + "hexString": "#00d7ff", + "rgb": { + "r": 0, + "g": 215, + "b": 255 + }, + "hsl": { + "h": 189.411764705882, + "s": 100, + "l": 50 + }, + "name": "Turquoise2" + }, + { + "colorId": 46, + "hexString": "#00ff00", + "rgb": { + "r": 0, + "g": 255, + "b": 0 + }, + "hsl": { + "h": 120, + "s": 100, + "l": 50 + }, + "name": "Green1" + }, + { + "colorId": 47, + "hexString": "#00ff5f", + "rgb": { + "r": 0, + "g": 255, + "b": 95 + }, + "hsl": { + "h": 142.352941176471, + "s": 100, + "l": 50 + }, + "name": "SpringGreen2" + }, + { + "colorId": 48, + "hexString": "#00ff87", + "rgb": { + "r": 0, + "g": 255, + "b": 135 + }, + "hsl": { + "h": 151.764705882353, + "s": 100, + "l": 50 + }, + "name": "SpringGreen1" + }, + { + "colorId": 49, + "hexString": "#00ffaf", + "rgb": { + "r": 0, + "g": 255, + "b": 175 + }, + "hsl": { + "h": 161.176470588235, + "s": 100, + "l": 50 + }, + "name": "MediumSpringGreen" + }, + { + "colorId": 50, + "hexString": "#00ffd7", + "rgb": { + "r": 0, + "g": 255, + "b": 215 + }, + "hsl": { + "h": 170.588235294118, + "s": 100, + "l": 50 + }, + "name": "Cyan2" + }, + { + "colorId": 51, + "hexString": "#00ffff", + "rgb": { + "r": 0, + "g": 255, + "b": 255 + }, + "hsl": { + "h": 180, + "s": 100, + "l": 50 + }, + "name": "Cyan1" + }, + { + "colorId": 52, + "hexString": "#5f0000", + "rgb": { + "r": 95, + "g": 0, + "b": 0 + }, + "hsl": { + "h": 0, + "s": 100, + "l": 18 + }, + "name": "DarkRed" + }, + { + "colorId": 53, + "hexString": "#5f005f", + "rgb": { + "r": 95, + "g": 0, + "b": 95 + }, + "hsl": { + "h": 300, + "s": 100, + "l": 18 + }, + "name": "DeepPink4" + }, + { + "colorId": 54, + "hexString": "#5f0087", + "rgb": { + "r": 95, + "g": 0, + "b": 135 + }, + "hsl": { + "h": 282.222222222222, + "s": 100, + "l": 26 + }, + "name": "Purple4" + }, + { + "colorId": 55, + "hexString": "#5f00af", + "rgb": { + "r": 95, + "g": 0, + "b": 175 + }, + "hsl": { + "h": 272.571428571429, + "s": 100, + "l": 34 + }, + "name": "Purple4" + }, + { + "colorId": 56, + "hexString": "#5f00d7", + "rgb": { + "r": 95, + "g": 0, + "b": 215 + }, + "hsl": { + "h": 266.511627906977, + "s": 100, + "l": 42 + }, + "name": "Purple3" + }, + { + "colorId": 57, + "hexString": "#5f00ff", + "rgb": { + "r": 95, + "g": 0, + "b": 255 + }, + "hsl": { + "h": 262.352941176471, + "s": 100, + "l": 50 + }, + "name": "BlueViolet" + }, + { + "colorId": 58, + "hexString": "#5f5f00", + "rgb": { + "r": 95, + "g": 95, + "b": 0 + }, + "hsl": { + "h": 60, + "s": 100, + "l": 18 + }, + "name": "Orange4" + }, + { + "colorId": 59, + "hexString": "#5f5f5f", + "rgb": { + "r": 95, + "g": 95, + "b": 95 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 37 + }, + "name": "Grey37" + }, + { + "colorId": 60, + "hexString": "#5f5f87", + "rgb": { + "r": 95, + "g": 95, + "b": 135 + }, + "hsl": { + "h": 240, + "s": 17, + "l": 45 + }, + "name": "MediumPurple4" + }, + { + "colorId": 61, + "hexString": "#5f5faf", + "rgb": { + "r": 95, + "g": 95, + "b": 175 + }, + "hsl": { + "h": 240, + "s": 33, + "l": 52 + }, + "name": "SlateBlue3" + }, + { + "colorId": 62, + "hexString": "#5f5fd7", + "rgb": { + "r": 95, + "g": 95, + "b": 215 + }, + "hsl": { + "h": 240, + "s": 60, + "l": 60 + }, + "name": "SlateBlue3" + }, + { + "colorId": 63, + "hexString": "#5f5fff", + "rgb": { + "r": 95, + "g": 95, + "b": 255 + }, + "hsl": { + "h": 240, + "s": 100, + "l": 68 + }, + "name": "RoyalBlue1" + }, + { + "colorId": 64, + "hexString": "#5f8700", + "rgb": { + "r": 95, + "g": 135, + "b": 0 + }, + "hsl": { + "h": 77.7777777777778, + "s": 100, + "l": 26 + }, + "name": "Chartreuse4" + }, + { + "colorId": 65, + "hexString": "#5f875f", + "rgb": { + "r": 95, + "g": 135, + "b": 95 + }, + "hsl": { + "h": 120, + "s": 17, + "l": 45 + }, + "name": "DarkSeaGreen4" + }, + { + "colorId": 66, + "hexString": "#5f8787", + "rgb": { + "r": 95, + "g": 135, + "b": 135 + }, + "hsl": { + "h": 180, + "s": 17, + "l": 45 + }, + "name": "PaleTurquoise4" + }, + { + "colorId": 67, + "hexString": "#5f87af", + "rgb": { + "r": 95, + "g": 135, + "b": 175 + }, + "hsl": { + "h": 210, + "s": 33, + "l": 52 + }, + "name": "SteelBlue" + }, + { + "colorId": 68, + "hexString": "#5f87d7", + "rgb": { + "r": 95, + "g": 135, + "b": 215 + }, + "hsl": { + "h": 220, + "s": 60, + "l": 60 + }, + "name": "SteelBlue3" + }, + { + "colorId": 69, + "hexString": "#5f87ff", + "rgb": { + "r": 95, + "g": 135, + "b": 255 + }, + "hsl": { + "h": 225, + "s": 100, + "l": 68 + }, + "name": "CornflowerBlue" + }, + { + "colorId": 70, + "hexString": "#5faf00", + "rgb": { + "r": 95, + "g": 175, + "b": 0 + }, + "hsl": { + "h": 87.4285714285714, + "s": 100, + "l": 34 + }, + "name": "Chartreuse3" + }, + { + "colorId": 71, + "hexString": "#5faf5f", + "rgb": { + "r": 95, + "g": 175, + "b": 95 + }, + "hsl": { + "h": 120, + "s": 33, + "l": 52 + }, + "name": "DarkSeaGreen4" + }, + { + "colorId": 72, + "hexString": "#5faf87", + "rgb": { + "r": 95, + "g": 175, + "b": 135 + }, + "hsl": { + "h": 150, + "s": 33, + "l": 52 + }, + "name": "CadetBlue" + }, + { + "colorId": 73, + "hexString": "#5fafaf", + "rgb": { + "r": 95, + "g": 175, + "b": 175 + }, + "hsl": { + "h": 180, + "s": 33, + "l": 52 + }, + "name": "CadetBlue" + }, + { + "colorId": 74, + "hexString": "#5fafd7", + "rgb": { + "r": 95, + "g": 175, + "b": 215 + }, + "hsl": { + "h": 200, + "s": 60, + "l": 60 + }, + "name": "SkyBlue3" + }, + { + "colorId": 75, + "hexString": "#5fafff", + "rgb": { + "r": 95, + "g": 175, + "b": 255 + }, + "hsl": { + "h": 210, + "s": 100, + "l": 68 + }, + "name": "SteelBlue1" + }, + { + "colorId": 76, + "hexString": "#5fd700", + "rgb": { + "r": 95, + "g": 215, + "b": 0 + }, + "hsl": { + "h": 93.4883720930233, + "s": 100, + "l": 42 + }, + "name": "Chartreuse3" + }, + { + "colorId": 77, + "hexString": "#5fd75f", + "rgb": { + "r": 95, + "g": 215, + "b": 95 + }, + "hsl": { + "h": 120, + "s": 60, + "l": 60 + }, + "name": "PaleGreen3" + }, + { + "colorId": 78, + "hexString": "#5fd787", + "rgb": { + "r": 95, + "g": 215, + "b": 135 + }, + "hsl": { + "h": 140, + "s": 60, + "l": 60 + }, + "name": "SeaGreen3" + }, + { + "colorId": 79, + "hexString": "#5fd7af", + "rgb": { + "r": 95, + "g": 215, + "b": 175 + }, + "hsl": { + "h": 160, + "s": 60, + "l": 60 + }, + "name": "Aquamarine3" + }, + { + "colorId": 80, + "hexString": "#5fd7d7", + "rgb": { + "r": 95, + "g": 215, + "b": 215 + }, + "hsl": { + "h": 180, + "s": 60, + "l": 60 + }, + "name": "MediumTurquoise" + }, + { + "colorId": 81, + "hexString": "#5fd7ff", + "rgb": { + "r": 95, + "g": 215, + "b": 255 + }, + "hsl": { + "h": 195, + "s": 100, + "l": 68 + }, + "name": "SteelBlue1" + }, + { + "colorId": 82, + "hexString": "#5fff00", + "rgb": { + "r": 95, + "g": 255, + "b": 0 + }, + "hsl": { + "h": 97.6470588235294, + "s": 100, + "l": 50 + }, + "name": "Chartreuse2" + }, + { + "colorId": 83, + "hexString": "#5fff5f", + "rgb": { + "r": 95, + "g": 255, + "b": 95 + }, + "hsl": { + "h": 120, + "s": 100, + "l": 68 + }, + "name": "SeaGreen2" + }, + { + "colorId": 84, + "hexString": "#5fff87", + "rgb": { + "r": 95, + "g": 255, + "b": 135 + }, + "hsl": { + "h": 135, + "s": 100, + "l": 68 + }, + "name": "SeaGreen1" + }, + { + "colorId": 85, + "hexString": "#5fffaf", + "rgb": { + "r": 95, + "g": 255, + "b": 175 + }, + "hsl": { + "h": 150, + "s": 100, + "l": 68 + }, + "name": "SeaGreen1" + }, + { + "colorId": 86, + "hexString": "#5fffd7", + "rgb": { + "r": 95, + "g": 255, + "b": 215 + }, + "hsl": { + "h": 165, + "s": 100, + "l": 68 + }, + "name": "Aquamarine1" + }, + { + "colorId": 87, + "hexString": "#5fffff", + "rgb": { + "r": 95, + "g": 255, + "b": 255 + }, + "hsl": { + "h": 180, + "s": 100, + "l": 68 + }, + "name": "DarkSlateGray2" + }, + { + "colorId": 88, + "hexString": "#870000", + "rgb": { + "r": 135, + "g": 0, + "b": 0 + }, + "hsl": { + "h": 0, + "s": 100, + "l": 26 + }, + "name": "DarkRed" + }, + { + "colorId": 89, + "hexString": "#87005f", + "rgb": { + "r": 135, + "g": 0, + "b": 95 + }, + "hsl": { + "h": 317.777777777778, + "s": 100, + "l": 26 + }, + "name": "DeepPink4" + }, + { + "colorId": 90, + "hexString": "#870087", + "rgb": { + "r": 135, + "g": 0, + "b": 135 + }, + "hsl": { + "h": 300, + "s": 100, + "l": 26 + }, + "name": "DarkMagenta" + }, + { + "colorId": 91, + "hexString": "#8700af", + "rgb": { + "r": 135, + "g": 0, + "b": 175 + }, + "hsl": { + "h": 286.285714285714, + "s": 100, + "l": 34 + }, + "name": "DarkMagenta" + }, + { + "colorId": 92, + "hexString": "#8700d7", + "rgb": { + "r": 135, + "g": 0, + "b": 215 + }, + "hsl": { + "h": 277.674418604651, + "s": 100, + "l": 42 + }, + "name": "DarkViolet" + }, + { + "colorId": 93, + "hexString": "#8700ff", + "rgb": { + "r": 135, + "g": 0, + "b": 255 + }, + "hsl": { + "h": 271.764705882353, + "s": 100, + "l": 50 + }, + "name": "Purple" + }, + { + "colorId": 94, + "hexString": "#875f00", + "rgb": { + "r": 135, + "g": 95, + "b": 0 + }, + "hsl": { + "h": 42.2222222222222, + "s": 100, + "l": 26 + }, + "name": "Orange4" + }, + { + "colorId": 95, + "hexString": "#875f5f", + "rgb": { + "r": 135, + "g": 95, + "b": 95 + }, + "hsl": { + "h": 0, + "s": 17, + "l": 45 + }, + "name": "LightPink4" + }, + { + "colorId": 96, + "hexString": "#875f87", + "rgb": { + "r": 135, + "g": 95, + "b": 135 + }, + "hsl": { + "h": 300, + "s": 17, + "l": 45 + }, + "name": "Plum4" + }, + { + "colorId": 97, + "hexString": "#875faf", + "rgb": { + "r": 135, + "g": 95, + "b": 175 + }, + "hsl": { + "h": 270, + "s": 33, + "l": 52 + }, + "name": "MediumPurple3" + }, + { + "colorId": 98, + "hexString": "#875fd7", + "rgb": { + "r": 135, + "g": 95, + "b": 215 + }, + "hsl": { + "h": 260, + "s": 60, + "l": 60 + }, + "name": "MediumPurple3" + }, + { + "colorId": 99, + "hexString": "#875fff", + "rgb": { + "r": 135, + "g": 95, + "b": 255 + }, + "hsl": { + "h": 255, + "s": 100, + "l": 68 + }, + "name": "SlateBlue1" + }, + { + "colorId": 100, + "hexString": "#878700", + "rgb": { + "r": 135, + "g": 135, + "b": 0 + }, + "hsl": { + "h": 60, + "s": 100, + "l": 26 + }, + "name": "Yellow4" + }, + { + "colorId": 101, + "hexString": "#87875f", + "rgb": { + "r": 135, + "g": 135, + "b": 95 + }, + "hsl": { + "h": 60, + "s": 17, + "l": 45 + }, + "name": "Wheat4" + }, + { + "colorId": 102, + "hexString": "#878787", + "rgb": { + "r": 135, + "g": 135, + "b": 135 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 52 + }, + "name": "Grey53" + }, + { + "colorId": 103, + "hexString": "#8787af", + "rgb": { + "r": 135, + "g": 135, + "b": 175 + }, + "hsl": { + "h": 240, + "s": 20, + "l": 60 + }, + "name": "LightSlateGrey" + }, + { + "colorId": 104, + "hexString": "#8787d7", + "rgb": { + "r": 135, + "g": 135, + "b": 215 + }, + "hsl": { + "h": 240, + "s": 50, + "l": 68 + }, + "name": "MediumPurple" + }, + { + "colorId": 105, + "hexString": "#8787ff", + "rgb": { + "r": 135, + "g": 135, + "b": 255 + }, + "hsl": { + "h": 240, + "s": 100, + "l": 76 + }, + "name": "LightSlateBlue" + }, + { + "colorId": 106, + "hexString": "#87af00", + "rgb": { + "r": 135, + "g": 175, + "b": 0 + }, + "hsl": { + "h": 73.7142857142857, + "s": 100, + "l": 34 + }, + "name": "Yellow4" + }, + { + "colorId": 107, + "hexString": "#87af5f", + "rgb": { + "r": 135, + "g": 175, + "b": 95 + }, + "hsl": { + "h": 90, + "s": 33, + "l": 52 + }, + "name": "DarkOliveGreen3" + }, + { + "colorId": 108, + "hexString": "#87af87", + "rgb": { + "r": 135, + "g": 175, + "b": 135 + }, + "hsl": { + "h": 120, + "s": 20, + "l": 60 + }, + "name": "DarkSeaGreen" + }, + { + "colorId": 109, + "hexString": "#87afaf", + "rgb": { + "r": 135, + "g": 175, + "b": 175 + }, + "hsl": { + "h": 180, + "s": 20, + "l": 60 + }, + "name": "LightSkyBlue3" + }, + { + "colorId": 110, + "hexString": "#87afd7", + "rgb": { + "r": 135, + "g": 175, + "b": 215 + }, + "hsl": { + "h": 210, + "s": 50, + "l": 68 + }, + "name": "LightSkyBlue3" + }, + { + "colorId": 111, + "hexString": "#87afff", + "rgb": { + "r": 135, + "g": 175, + "b": 255 + }, + "hsl": { + "h": 220, + "s": 100, + "l": 76 + }, + "name": "SkyBlue2" + }, + { + "colorId": 112, + "hexString": "#87d700", + "rgb": { + "r": 135, + "g": 215, + "b": 0 + }, + "hsl": { + "h": 82.3255813953488, + "s": 100, + "l": 42 + }, + "name": "Chartreuse2" + }, + { + "colorId": 113, + "hexString": "#87d75f", + "rgb": { + "r": 135, + "g": 215, + "b": 95 + }, + "hsl": { + "h": 100, + "s": 60, + "l": 60 + }, + "name": "DarkOliveGreen3" + }, + { + "colorId": 114, + "hexString": "#87d787", + "rgb": { + "r": 135, + "g": 215, + "b": 135 + }, + "hsl": { + "h": 120, + "s": 50, + "l": 68 + }, + "name": "PaleGreen3" + }, + { + "colorId": 115, + "hexString": "#87d7af", + "rgb": { + "r": 135, + "g": 215, + "b": 175 + }, + "hsl": { + "h": 150, + "s": 50, + "l": 68 + }, + "name": "DarkSeaGreen3" + }, + { + "colorId": 116, + "hexString": "#87d7d7", + "rgb": { + "r": 135, + "g": 215, + "b": 215 + }, + "hsl": { + "h": 180, + "s": 50, + "l": 68 + }, + "name": "DarkSlateGray3" + }, + { + "colorId": 117, + "hexString": "#87d7ff", + "rgb": { + "r": 135, + "g": 215, + "b": 255 + }, + "hsl": { + "h": 200, + "s": 100, + "l": 76 + }, + "name": "SkyBlue1" + }, + { + "colorId": 118, + "hexString": "#87ff00", + "rgb": { + "r": 135, + "g": 255, + "b": 0 + }, + "hsl": { + "h": 88.2352941176471, + "s": 100, + "l": 50 + }, + "name": "Chartreuse1" + }, + { + "colorId": 119, + "hexString": "#87ff5f", + "rgb": { + "r": 135, + "g": 255, + "b": 95 + }, + "hsl": { + "h": 105, + "s": 100, + "l": 68 + }, + "name": "LightGreen" + }, + { + "colorId": 120, + "hexString": "#87ff87", + "rgb": { + "r": 135, + "g": 255, + "b": 135 + }, + "hsl": { + "h": 120, + "s": 100, + "l": 76 + }, + "name": "LightGreen" + }, + { + "colorId": 121, + "hexString": "#87ffaf", + "rgb": { + "r": 135, + "g": 255, + "b": 175 + }, + "hsl": { + "h": 140, + "s": 100, + "l": 76 + }, + "name": "PaleGreen1" + }, + { + "colorId": 122, + "hexString": "#87ffd7", + "rgb": { + "r": 135, + "g": 255, + "b": 215 + }, + "hsl": { + "h": 160, + "s": 100, + "l": 76 + }, + "name": "Aquamarine1" + }, + { + "colorId": 123, + "hexString": "#87ffff", + "rgb": { + "r": 135, + "g": 255, + "b": 255 + }, + "hsl": { + "h": 180, + "s": 100, + "l": 76 + }, + "name": "DarkSlateGray1" + }, + { + "colorId": 124, + "hexString": "#af0000", + "rgb": { + "r": 175, + "g": 0, + "b": 0 + }, + "hsl": { + "h": 0, + "s": 100, + "l": 34 + }, + "name": "Red3" + }, + { + "colorId": 125, + "hexString": "#af005f", + "rgb": { + "r": 175, + "g": 0, + "b": 95 + }, + "hsl": { + "h": 327.428571428571, + "s": 100, + "l": 34 + }, + "name": "DeepPink4" + }, + { + "colorId": 126, + "hexString": "#af0087", + "rgb": { + "r": 175, + "g": 0, + "b": 135 + }, + "hsl": { + "h": 313.714285714286, + "s": 100, + "l": 34 + }, + "name": "MediumVioletRed" + }, + { + "colorId": 127, + "hexString": "#af00af", + "rgb": { + "r": 175, + "g": 0, + "b": 175 + }, + "hsl": { + "h": 300, + "s": 100, + "l": 34 + }, + "name": "Magenta3" + }, + { + "colorId": 128, + "hexString": "#af00d7", + "rgb": { + "r": 175, + "g": 0, + "b": 215 + }, + "hsl": { + "h": 288.837209302326, + "s": 100, + "l": 42 + }, + "name": "DarkViolet" + }, + { + "colorId": 129, + "hexString": "#af00ff", + "rgb": { + "r": 175, + "g": 0, + "b": 255 + }, + "hsl": { + "h": 281.176470588235, + "s": 100, + "l": 50 + }, + "name": "Purple" + }, + { + "colorId": 130, + "hexString": "#af5f00", + "rgb": { + "r": 175, + "g": 95, + "b": 0 + }, + "hsl": { + "h": 32.5714285714286, + "s": 100, + "l": 34 + }, + "name": "DarkOrange3" + }, + { + "colorId": 131, + "hexString": "#af5f5f", + "rgb": { + "r": 175, + "g": 95, + "b": 95 + }, + "hsl": { + "h": 0, + "s": 33, + "l": 52 + }, + "name": "IndianRed" + }, + { + "colorId": 132, + "hexString": "#af5f87", + "rgb": { + "r": 175, + "g": 95, + "b": 135 + }, + "hsl": { + "h": 330, + "s": 33, + "l": 52 + }, + "name": "HotPink3" + }, + { + "colorId": 133, + "hexString": "#af5faf", + "rgb": { + "r": 175, + "g": 95, + "b": 175 + }, + "hsl": { + "h": 300, + "s": 33, + "l": 52 + }, + "name": "MediumOrchid3" + }, + { + "colorId": 134, + "hexString": "#af5fd7", + "rgb": { + "r": 175, + "g": 95, + "b": 215 + }, + "hsl": { + "h": 280, + "s": 60, + "l": 60 + }, + "name": "MediumOrchid" + }, + { + "colorId": 135, + "hexString": "#af5fff", + "rgb": { + "r": 175, + "g": 95, + "b": 255 + }, + "hsl": { + "h": 270, + "s": 100, + "l": 68 + }, + "name": "MediumPurple2" + }, + { + "colorId": 136, + "hexString": "#af8700", + "rgb": { + "r": 175, + "g": 135, + "b": 0 + }, + "hsl": { + "h": 46.2857142857143, + "s": 100, + "l": 34 + }, + "name": "DarkGoldenrod" + }, + { + "colorId": 137, + "hexString": "#af875f", + "rgb": { + "r": 175, + "g": 135, + "b": 95 + }, + "hsl": { + "h": 30, + "s": 33, + "l": 52 + }, + "name": "LightSalmon3" + }, + { + "colorId": 138, + "hexString": "#af8787", + "rgb": { + "r": 175, + "g": 135, + "b": 135 + }, + "hsl": { + "h": 0, + "s": 20, + "l": 60 + }, + "name": "RosyBrown" + }, + { + "colorId": 139, + "hexString": "#af87af", + "rgb": { + "r": 175, + "g": 135, + "b": 175 + }, + "hsl": { + "h": 300, + "s": 20, + "l": 60 + }, + "name": "Grey63" + }, + { + "colorId": 140, + "hexString": "#af87d7", + "rgb": { + "r": 175, + "g": 135, + "b": 215 + }, + "hsl": { + "h": 270, + "s": 50, + "l": 68 + }, + "name": "MediumPurple2" + }, + { + "colorId": 141, + "hexString": "#af87ff", + "rgb": { + "r": 175, + "g": 135, + "b": 255 + }, + "hsl": { + "h": 260, + "s": 100, + "l": 76 + }, + "name": "MediumPurple1" + }, + { + "colorId": 142, + "hexString": "#afaf00", + "rgb": { + "r": 175, + "g": 175, + "b": 0 + }, + "hsl": { + "h": 60, + "s": 100, + "l": 34 + }, + "name": "Gold3" + }, + { + "colorId": 143, + "hexString": "#afaf5f", + "rgb": { + "r": 175, + "g": 175, + "b": 95 + }, + "hsl": { + "h": 60, + "s": 33, + "l": 52 + }, + "name": "DarkKhaki" + }, + { + "colorId": 144, + "hexString": "#afaf87", + "rgb": { + "r": 175, + "g": 175, + "b": 135 + }, + "hsl": { + "h": 60, + "s": 20, + "l": 60 + }, + "name": "NavajoWhite3" + }, + { + "colorId": 145, + "hexString": "#afafaf", + "rgb": { + "r": 175, + "g": 175, + "b": 175 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 68 + }, + "name": "Grey69" + }, + { + "colorId": 146, + "hexString": "#afafd7", + "rgb": { + "r": 175, + "g": 175, + "b": 215 + }, + "hsl": { + "h": 240, + "s": 33, + "l": 76 + }, + "name": "LightSteelBlue3" + }, + { + "colorId": 147, + "hexString": "#afafff", + "rgb": { + "r": 175, + "g": 175, + "b": 255 + }, + "hsl": { + "h": 240, + "s": 100, + "l": 84 + }, + "name": "LightSteelBlue" + }, + { + "colorId": 148, + "hexString": "#afd700", + "rgb": { + "r": 175, + "g": 215, + "b": 0 + }, + "hsl": { + "h": 71.1627906976744, + "s": 100, + "l": 42 + }, + "name": "Yellow3" + }, + { + "colorId": 149, + "hexString": "#afd75f", + "rgb": { + "r": 175, + "g": 215, + "b": 95 + }, + "hsl": { + "h": 80, + "s": 60, + "l": 60 + }, + "name": "DarkOliveGreen3" + }, + { + "colorId": 150, + "hexString": "#afd787", + "rgb": { + "r": 175, + "g": 215, + "b": 135 + }, + "hsl": { + "h": 90, + "s": 50, + "l": 68 + }, + "name": "DarkSeaGreen3" + }, + { + "colorId": 151, + "hexString": "#afd7af", + "rgb": { + "r": 175, + "g": 215, + "b": 175 + }, + "hsl": { + "h": 120, + "s": 33, + "l": 76 + }, + "name": "DarkSeaGreen2" + }, + { + "colorId": 152, + "hexString": "#afd7d7", + "rgb": { + "r": 175, + "g": 215, + "b": 215 + }, + "hsl": { + "h": 180, + "s": 33, + "l": 76 + }, + "name": "LightCyan3" + }, + { + "colorId": 153, + "hexString": "#afd7ff", + "rgb": { + "r": 175, + "g": 215, + "b": 255 + }, + "hsl": { + "h": 210, + "s": 100, + "l": 84 + }, + "name": "LightSkyBlue1" + }, + { + "colorId": 154, + "hexString": "#afff00", + "rgb": { + "r": 175, + "g": 255, + "b": 0 + }, + "hsl": { + "h": 78.8235294117647, + "s": 100, + "l": 50 + }, + "name": "GreenYellow" + }, + { + "colorId": 155, + "hexString": "#afff5f", + "rgb": { + "r": 175, + "g": 255, + "b": 95 + }, + "hsl": { + "h": 90, + "s": 100, + "l": 68 + }, + "name": "DarkOliveGreen2" + }, + { + "colorId": 156, + "hexString": "#afff87", + "rgb": { + "r": 175, + "g": 255, + "b": 135 + }, + "hsl": { + "h": 100, + "s": 100, + "l": 76 + }, + "name": "PaleGreen1" + }, + { + "colorId": 157, + "hexString": "#afffaf", + "rgb": { + "r": 175, + "g": 255, + "b": 175 + }, + "hsl": { + "h": 120, + "s": 100, + "l": 84 + }, + "name": "DarkSeaGreen2" + }, + { + "colorId": 158, + "hexString": "#afffd7", + "rgb": { + "r": 175, + "g": 255, + "b": 215 + }, + "hsl": { + "h": 150, + "s": 100, + "l": 84 + }, + "name": "DarkSeaGreen1" + }, + { + "colorId": 159, + "hexString": "#afffff", + "rgb": { + "r": 175, + "g": 255, + "b": 255 + }, + "hsl": { + "h": 180, + "s": 100, + "l": 84 + }, + "name": "PaleTurquoise1" + }, + { + "colorId": 160, + "hexString": "#d70000", + "rgb": { + "r": 215, + "g": 0, + "b": 0 + }, + "hsl": { + "h": 0, + "s": 100, + "l": 42 + }, + "name": "Red3" + }, + { + "colorId": 161, + "hexString": "#d7005f", + "rgb": { + "r": 215, + "g": 0, + "b": 95 + }, + "hsl": { + "h": 333.488372093023, + "s": 100, + "l": 42 + }, + "name": "DeepPink3" + }, + { + "colorId": 162, + "hexString": "#d70087", + "rgb": { + "r": 215, + "g": 0, + "b": 135 + }, + "hsl": { + "h": 322.325581395349, + "s": 100, + "l": 42 + }, + "name": "DeepPink3" + }, + { + "colorId": 163, + "hexString": "#d700af", + "rgb": { + "r": 215, + "g": 0, + "b": 175 + }, + "hsl": { + "h": 311.162790697674, + "s": 100, + "l": 42 + }, + "name": "Magenta3" + }, + { + "colorId": 164, + "hexString": "#d700d7", + "rgb": { + "r": 215, + "g": 0, + "b": 215 + }, + "hsl": { + "h": 300, + "s": 100, + "l": 42 + }, + "name": "Magenta3" + }, + { + "colorId": 165, + "hexString": "#d700ff", + "rgb": { + "r": 215, + "g": 0, + "b": 255 + }, + "hsl": { + "h": 290.588235294118, + "s": 100, + "l": 50 + }, + "name": "Magenta2" + }, + { + "colorId": 166, + "hexString": "#d75f00", + "rgb": { + "r": 215, + "g": 95, + "b": 0 + }, + "hsl": { + "h": 26.5116279069767, + "s": 100, + "l": 42 + }, + "name": "DarkOrange3" + }, + { + "colorId": 167, + "hexString": "#d75f5f", + "rgb": { + "r": 215, + "g": 95, + "b": 95 + }, + "hsl": { + "h": 0, + "s": 60, + "l": 60 + }, + "name": "IndianRed" + }, + { + "colorId": 168, + "hexString": "#d75f87", + "rgb": { + "r": 215, + "g": 95, + "b": 135 + }, + "hsl": { + "h": 340, + "s": 60, + "l": 60 + }, + "name": "HotPink3" + }, + { + "colorId": 169, + "hexString": "#d75faf", + "rgb": { + "r": 215, + "g": 95, + "b": 175 + }, + "hsl": { + "h": 320, + "s": 60, + "l": 60 + }, + "name": "HotPink2" + }, + { + "colorId": 170, + "hexString": "#d75fd7", + "rgb": { + "r": 215, + "g": 95, + "b": 215 + }, + "hsl": { + "h": 300, + "s": 60, + "l": 60 + }, + "name": "Orchid" + }, + { + "colorId": 171, + "hexString": "#d75fff", + "rgb": { + "r": 215, + "g": 95, + "b": 255 + }, + "hsl": { + "h": 285, + "s": 100, + "l": 68 + }, + "name": "MediumOrchid1" + }, + { + "colorId": 172, + "hexString": "#d78700", + "rgb": { + "r": 215, + "g": 135, + "b": 0 + }, + "hsl": { + "h": 37.6744186046512, + "s": 100, + "l": 42 + }, + "name": "Orange3" + }, + { + "colorId": 173, + "hexString": "#d7875f", + "rgb": { + "r": 215, + "g": 135, + "b": 95 + }, + "hsl": { + "h": 20, + "s": 60, + "l": 60 + }, + "name": "LightSalmon3" + }, + { + "colorId": 174, + "hexString": "#d78787", + "rgb": { + "r": 215, + "g": 135, + "b": 135 + }, + "hsl": { + "h": 0, + "s": 50, + "l": 68 + }, + "name": "LightPink3" + }, + { + "colorId": 175, + "hexString": "#d787af", + "rgb": { + "r": 215, + "g": 135, + "b": 175 + }, + "hsl": { + "h": 330, + "s": 50, + "l": 68 + }, + "name": "Pink3" + }, + { + "colorId": 176, + "hexString": "#d787d7", + "rgb": { + "r": 215, + "g": 135, + "b": 215 + }, + "hsl": { + "h": 300, + "s": 50, + "l": 68 + }, + "name": "Plum3" + }, + { + "colorId": 177, + "hexString": "#d787ff", + "rgb": { + "r": 215, + "g": 135, + "b": 255 + }, + "hsl": { + "h": 280, + "s": 100, + "l": 76 + }, + "name": "Violet" + }, + { + "colorId": 178, + "hexString": "#d7af00", + "rgb": { + "r": 215, + "g": 175, + "b": 0 + }, + "hsl": { + "h": 48.8372093023256, + "s": 100, + "l": 42 + }, + "name": "Gold3" + }, + { + "colorId": 179, + "hexString": "#d7af5f", + "rgb": { + "r": 215, + "g": 175, + "b": 95 + }, + "hsl": { + "h": 40, + "s": 60, + "l": 60 + }, + "name": "LightGoldenrod3" + }, + { + "colorId": 180, + "hexString": "#d7af87", + "rgb": { + "r": 215, + "g": 175, + "b": 135 + }, + "hsl": { + "h": 30, + "s": 50, + "l": 68 + }, + "name": "Tan" + }, + { + "colorId": 181, + "hexString": "#d7afaf", + "rgb": { + "r": 215, + "g": 175, + "b": 175 + }, + "hsl": { + "h": 0, + "s": 33, + "l": 76 + }, + "name": "MistyRose3" + }, + { + "colorId": 182, + "hexString": "#d7afd7", + "rgb": { + "r": 215, + "g": 175, + "b": 215 + }, + "hsl": { + "h": 300, + "s": 33, + "l": 76 + }, + "name": "Thistle3" + }, + { + "colorId": 183, + "hexString": "#d7afff", + "rgb": { + "r": 215, + "g": 175, + "b": 255 + }, + "hsl": { + "h": 270, + "s": 100, + "l": 84 + }, + "name": "Plum2" + }, + { + "colorId": 184, + "hexString": "#d7d700", + "rgb": { + "r": 215, + "g": 215, + "b": 0 + }, + "hsl": { + "h": 60, + "s": 100, + "l": 42 + }, + "name": "Yellow3" + }, + { + "colorId": 185, + "hexString": "#d7d75f", + "rgb": { + "r": 215, + "g": 215, + "b": 95 + }, + "hsl": { + "h": 60, + "s": 60, + "l": 60 + }, + "name": "Khaki3" + }, + { + "colorId": 186, + "hexString": "#d7d787", + "rgb": { + "r": 215, + "g": 215, + "b": 135 + }, + "hsl": { + "h": 60, + "s": 50, + "l": 68 + }, + "name": "LightGoldenrod2" + }, + { + "colorId": 187, + "hexString": "#d7d7af", + "rgb": { + "r": 215, + "g": 215, + "b": 175 + }, + "hsl": { + "h": 60, + "s": 33, + "l": 76 + }, + "name": "LightYellow3" + }, + { + "colorId": 188, + "hexString": "#d7d7d7", + "rgb": { + "r": 215, + "g": 215, + "b": 215 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 84 + }, + "name": "Grey84" + }, + { + "colorId": 189, + "hexString": "#d7d7ff", + "rgb": { + "r": 215, + "g": 215, + "b": 255 + }, + "hsl": { + "h": 240, + "s": 100, + "l": 92 + }, + "name": "LightSteelBlue1" + }, + { + "colorId": 190, + "hexString": "#d7ff00", + "rgb": { + "r": 215, + "g": 255, + "b": 0 + }, + "hsl": { + "h": 69.4117647058823, + "s": 100, + "l": 50 + }, + "name": "Yellow2" + }, + { + "colorId": 191, + "hexString": "#d7ff5f", + "rgb": { + "r": 215, + "g": 255, + "b": 95 + }, + "hsl": { + "h": 75, + "s": 100, + "l": 68 + }, + "name": "DarkOliveGreen1" + }, + { + "colorId": 192, + "hexString": "#d7ff87", + "rgb": { + "r": 215, + "g": 255, + "b": 135 + }, + "hsl": { + "h": 80, + "s": 100, + "l": 76 + }, + "name": "DarkOliveGreen1" + }, + { + "colorId": 193, + "hexString": "#d7ffaf", + "rgb": { + "r": 215, + "g": 255, + "b": 175 + }, + "hsl": { + "h": 90, + "s": 100, + "l": 84 + }, + "name": "DarkSeaGreen1" + }, + { + "colorId": 194, + "hexString": "#d7ffd7", + "rgb": { + "r": 215, + "g": 255, + "b": 215 + }, + "hsl": { + "h": 120, + "s": 100, + "l": 92 + }, + "name": "Honeydew2" + }, + { + "colorId": 195, + "hexString": "#d7ffff", + "rgb": { + "r": 215, + "g": 255, + "b": 255 + }, + "hsl": { + "h": 180, + "s": 100, + "l": 92 + }, + "name": "LightCyan1" + }, + { + "colorId": 196, + "hexString": "#ff0000", + "rgb": { + "r": 255, + "g": 0, + "b": 0 + }, + "hsl": { + "h": 0, + "s": 100, + "l": 50 + }, + "name": "Red1" + }, + { + "colorId": 197, + "hexString": "#ff005f", + "rgb": { + "r": 255, + "g": 0, + "b": 95 + }, + "hsl": { + "h": 337.647058823529, + "s": 100, + "l": 50 + }, + "name": "DeepPink2" + }, + { + "colorId": 198, + "hexString": "#ff0087", + "rgb": { + "r": 255, + "g": 0, + "b": 135 + }, + "hsl": { + "h": 328.235294117647, + "s": 100, + "l": 50 + }, + "name": "DeepPink1" + }, + { + "colorId": 199, + "hexString": "#ff00af", + "rgb": { + "r": 255, + "g": 0, + "b": 175 + }, + "hsl": { + "h": 318.823529411765, + "s": 100, + "l": 50 + }, + "name": "DeepPink1" + }, + { + "colorId": 200, + "hexString": "#ff00d7", + "rgb": { + "r": 255, + "g": 0, + "b": 215 + }, + "hsl": { + "h": 309.411764705882, + "s": 100, + "l": 50 + }, + "name": "Magenta2" + }, + { + "colorId": 201, + "hexString": "#ff00ff", + "rgb": { + "r": 255, + "g": 0, + "b": 255 + }, + "hsl": { + "h": 300, + "s": 100, + "l": 50 + }, + "name": "Magenta1" + }, + { + "colorId": 202, + "hexString": "#ff5f00", + "rgb": { + "r": 255, + "g": 95, + "b": 0 + }, + "hsl": { + "h": 22.3529411764706, + "s": 100, + "l": 50 + }, + "name": "OrangeRed1" + }, + { + "colorId": 203, + "hexString": "#ff5f5f", + "rgb": { + "r": 255, + "g": 95, + "b": 95 + }, + "hsl": { + "h": 0, + "s": 100, + "l": 68 + }, + "name": "IndianRed1" + }, + { + "colorId": 204, + "hexString": "#ff5f87", + "rgb": { + "r": 255, + "g": 95, + "b": 135 + }, + "hsl": { + "h": 345, + "s": 100, + "l": 68 + }, + "name": "IndianRed1" + }, + { + "colorId": 205, + "hexString": "#ff5faf", + "rgb": { + "r": 255, + "g": 95, + "b": 175 + }, + "hsl": { + "h": 330, + "s": 100, + "l": 68 + }, + "name": "HotPink" + }, + { + "colorId": 206, + "hexString": "#ff5fd7", + "rgb": { + "r": 255, + "g": 95, + "b": 215 + }, + "hsl": { + "h": 315, + "s": 100, + "l": 68 + }, + "name": "HotPink" + }, + { + "colorId": 207, + "hexString": "#ff5fff", + "rgb": { + "r": 255, + "g": 95, + "b": 255 + }, + "hsl": { + "h": 300, + "s": 100, + "l": 68 + }, + "name": "MediumOrchid1" + }, + { + "colorId": 208, + "hexString": "#ff8700", + "rgb": { + "r": 255, + "g": 135, + "b": 0 + }, + "hsl": { + "h": 31.7647058823529, + "s": 100, + "l": 50 + }, + "name": "DarkOrange" + }, + { + "colorId": 209, + "hexString": "#ff875f", + "rgb": { + "r": 255, + "g": 135, + "b": 95 + }, + "hsl": { + "h": 15, + "s": 100, + "l": 68 + }, + "name": "Salmon1" + }, + { + "colorId": 210, + "hexString": "#ff8787", + "rgb": { + "r": 255, + "g": 135, + "b": 135 + }, + "hsl": { + "h": 0, + "s": 100, + "l": 76 + }, + "name": "LightCoral" + }, + { + "colorId": 211, + "hexString": "#ff87af", + "rgb": { + "r": 255, + "g": 135, + "b": 175 + }, + "hsl": { + "h": 340, + "s": 100, + "l": 76 + }, + "name": "PaleVioletRed1" + }, + { + "colorId": 212, + "hexString": "#ff87d7", + "rgb": { + "r": 255, + "g": 135, + "b": 215 + }, + "hsl": { + "h": 320, + "s": 100, + "l": 76 + }, + "name": "Orchid2" + }, + { + "colorId": 213, + "hexString": "#ff87ff", + "rgb": { + "r": 255, + "g": 135, + "b": 255 + }, + "hsl": { + "h": 300, + "s": 100, + "l": 76 + }, + "name": "Orchid1" + }, + { + "colorId": 214, + "hexString": "#ffaf00", + "rgb": { + "r": 255, + "g": 175, + "b": 0 + }, + "hsl": { + "h": 41.1764705882353, + "s": 100, + "l": 50 + }, + "name": "Orange1" + }, + { + "colorId": 215, + "hexString": "#ffaf5f", + "rgb": { + "r": 255, + "g": 175, + "b": 95 + }, + "hsl": { + "h": 30, + "s": 100, + "l": 68 + }, + "name": "SandyBrown" + }, + { + "colorId": 216, + "hexString": "#ffaf87", + "rgb": { + "r": 255, + "g": 175, + "b": 135 + }, + "hsl": { + "h": 20, + "s": 100, + "l": 76 + }, + "name": "LightSalmon1" + }, + { + "colorId": 217, + "hexString": "#ffafaf", + "rgb": { + "r": 255, + "g": 175, + "b": 175 + }, + "hsl": { + "h": 0, + "s": 100, + "l": 84 + }, + "name": "LightPink1" + }, + { + "colorId": 218, + "hexString": "#ffafd7", + "rgb": { + "r": 255, + "g": 175, + "b": 215 + }, + "hsl": { + "h": 330, + "s": 100, + "l": 84 + }, + "name": "Pink1" + }, + { + "colorId": 219, + "hexString": "#ffafff", + "rgb": { + "r": 255, + "g": 175, + "b": 255 + }, + "hsl": { + "h": 300, + "s": 100, + "l": 84 + }, + "name": "Plum1" + }, + { + "colorId": 220, + "hexString": "#ffd700", + "rgb": { + "r": 255, + "g": 215, + "b": 0 + }, + "hsl": { + "h": 50.5882352941176, + "s": 100, + "l": 50 + }, + "name": "Gold1" + }, + { + "colorId": 221, + "hexString": "#ffd75f", + "rgb": { + "r": 255, + "g": 215, + "b": 95 + }, + "hsl": { + "h": 45, + "s": 100, + "l": 68 + }, + "name": "LightGoldenrod2" + }, + { + "colorId": 222, + "hexString": "#ffd787", + "rgb": { + "r": 255, + "g": 215, + "b": 135 + }, + "hsl": { + "h": 40, + "s": 100, + "l": 76 + }, + "name": "LightGoldenrod2" + }, + { + "colorId": 223, + "hexString": "#ffd7af", + "rgb": { + "r": 255, + "g": 215, + "b": 175 + }, + "hsl": { + "h": 30, + "s": 100, + "l": 84 + }, + "name": "NavajoWhite1" + }, + { + "colorId": 224, + "hexString": "#ffd7d7", + "rgb": { + "r": 255, + "g": 215, + "b": 215 + }, + "hsl": { + "h": 0, + "s": 100, + "l": 92 + }, + "name": "MistyRose1" + }, + { + "colorId": 225, + "hexString": "#ffd7ff", + "rgb": { + "r": 255, + "g": 215, + "b": 255 + }, + "hsl": { + "h": 300, + "s": 100, + "l": 92 + }, + "name": "Thistle1" + }, + { + "colorId": 226, + "hexString": "#ffff00", + "rgb": { + "r": 255, + "g": 255, + "b": 0 + }, + "hsl": { + "h": 60, + "s": 100, + "l": 50 + }, + "name": "Yellow1" + }, + { + "colorId": 227, + "hexString": "#ffff5f", + "rgb": { + "r": 255, + "g": 255, + "b": 95 + }, + "hsl": { + "h": 60, + "s": 100, + "l": 68 + }, + "name": "LightGoldenrod1" + }, + { + "colorId": 228, + "hexString": "#ffff87", + "rgb": { + "r": 255, + "g": 255, + "b": 135 + }, + "hsl": { + "h": 60, + "s": 100, + "l": 76 + }, + "name": "Khaki1" + }, + { + "colorId": 229, + "hexString": "#ffffaf", + "rgb": { + "r": 255, + "g": 255, + "b": 175 + }, + "hsl": { + "h": 60, + "s": 100, + "l": 84 + }, + "name": "Wheat1" + }, + { + "colorId": 230, + "hexString": "#ffffd7", + "rgb": { + "r": 255, + "g": 255, + "b": 215 + }, + "hsl": { + "h": 60, + "s": 100, + "l": 92 + }, + "name": "Cornsilk1" + }, + { + "colorId": 231, + "hexString": "#ffffff", + "rgb": { + "r": 255, + "g": 255, + "b": 255 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 100 + }, + "name": "Grey100" + }, + { + "colorId": 232, + "hexString": "#080808", + "rgb": { + "r": 8, + "g": 8, + "b": 8 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 3 + }, + "name": "Grey3" + }, + { + "colorId": 233, + "hexString": "#121212", + "rgb": { + "r": 18, + "g": 18, + "b": 18 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 7 + }, + "name": "Grey7" + }, + { + "colorId": 234, + "hexString": "#1c1c1c", + "rgb": { + "r": 28, + "g": 28, + "b": 28 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 10 + }, + "name": "Grey11" + }, + { + "colorId": 235, + "hexString": "#262626", + "rgb": { + "r": 38, + "g": 38, + "b": 38 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 14 + }, + "name": "Grey15" + }, + { + "colorId": 236, + "hexString": "#303030", + "rgb": { + "r": 48, + "g": 48, + "b": 48 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 18 + }, + "name": "Grey19" + }, + { + "colorId": 237, + "hexString": "#3a3a3a", + "rgb": { + "r": 58, + "g": 58, + "b": 58 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 22 + }, + "name": "Grey23" + }, + { + "colorId": 238, + "hexString": "#444444", + "rgb": { + "r": 68, + "g": 68, + "b": 68 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 26 + }, + "name": "Grey27" + }, + { + "colorId": 239, + "hexString": "#4e4e4e", + "rgb": { + "r": 78, + "g": 78, + "b": 78 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 30 + }, + "name": "Grey30" + }, + { + "colorId": 240, + "hexString": "#585858", + "rgb": { + "r": 88, + "g": 88, + "b": 88 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 34 + }, + "name": "Grey35" + }, + { + "colorId": 241, + "hexString": "#626262", + "rgb": { + "r": 98, + "g": 98, + "b": 98 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 37 + }, + "name": "Grey39" + }, + { + "colorId": 242, + "hexString": "#6c6c6c", + "rgb": { + "r": 108, + "g": 108, + "b": 108 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 40 + }, + "name": "Grey42" + }, + { + "colorId": 243, + "hexString": "#767676", + "rgb": { + "r": 118, + "g": 118, + "b": 118 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 46 + }, + "name": "Grey46" + }, + { + "colorId": 244, + "hexString": "#808080", + "rgb": { + "r": 128, + "g": 128, + "b": 128 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 50 + }, + "name": "Grey50" + }, + { + "colorId": 245, + "hexString": "#8a8a8a", + "rgb": { + "r": 138, + "g": 138, + "b": 138 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 54 + }, + "name": "Grey54" + }, + { + "colorId": 246, + "hexString": "#949494", + "rgb": { + "r": 148, + "g": 148, + "b": 148 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 58 + }, + "name": "Grey58" + }, + { + "colorId": 247, + "hexString": "#9e9e9e", + "rgb": { + "r": 158, + "g": 158, + "b": 158 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 61 + }, + "name": "Grey62" + }, + { + "colorId": 248, + "hexString": "#a8a8a8", + "rgb": { + "r": 168, + "g": 168, + "b": 168 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 65 + }, + "name": "Grey66" + }, + { + "colorId": 249, + "hexString": "#b2b2b2", + "rgb": { + "r": 178, + "g": 178, + "b": 178 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 69 + }, + "name": "Grey70" + }, + { + "colorId": 250, + "hexString": "#bcbcbc", + "rgb": { + "r": 188, + "g": 188, + "b": 188 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 73 + }, + "name": "Grey74" + }, + { + "colorId": 251, + "hexString": "#c6c6c6", + "rgb": { + "r": 198, + "g": 198, + "b": 198 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 77 + }, + "name": "Grey78" + }, + { + "colorId": 252, + "hexString": "#d0d0d0", + "rgb": { + "r": 208, + "g": 208, + "b": 208 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 81 + }, + "name": "Grey82" + }, + { + "colorId": 253, + "hexString": "#dadada", + "rgb": { + "r": 218, + "g": 218, + "b": 218 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 85 + }, + "name": "Grey85" + }, + { + "colorId": 254, + "hexString": "#e4e4e4", + "rgb": { + "r": 228, + "g": 228, + "b": 228 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 89 + }, + "name": "Grey89" + }, + { + "colorId": 255, + "hexString": "#eeeeee", + "rgb": { + "r": 238, + "g": 238, + "b": 238 + }, + "hsl": { + "h": 0, + "s": 0, + "l": 93 + }, + "name": "Grey93" + } +] \ No newline at end of file diff --git a/src/ConsoleBuffer/xterm-colors.ps1 b/src/ConsoleBuffer/xterm-colors.ps1 new file mode 100644 index 0000000..b3ea1f7 --- /dev/null +++ b/src/ConsoleBuffer/xterm-colors.ps1 @@ -0,0 +1,11 @@ +$colorsFile = join-path $PSScriptRoot "xterm-colors.json" +$colorData = get-content $colorsFIle | convertfrom-json +foreach ($c in $colorData) +{ + $id = $c.colorId + $r = $c.rgb.r.ToString("x2") + $g = $c.rgb.g.ToString("x2") + $b = $c.rgb.b.ToString("x2") + $name = $c.name + write-host "new XtermColor { Id = ${id}, R = 0x$r, G = 0x$g, B = 0x$b, Name = `"${name}`" }," +} \ No newline at end of file diff --git a/src/condo/MainWindow.xaml.cs b/src/condo/MainWindow.xaml.cs index 389b2b4..a870382 100644 --- a/src/condo/MainWindow.xaml.cs +++ b/src/condo/MainWindow.xaml.cs @@ -53,6 +53,9 @@ private void OnLoaded(object sender, RoutedEventArgs e) { if (args.PropertyName == "Running" && this.console != null && this.console.Running == false) { + var msg = System.Text.Encoding.UTF8.GetBytes($"\r\n[process terminated with code {this.console.ProcessExitCode}, press to exit.]"); + this.screen.Buffer.Append(msg, msg.Length); + this.KeyDown += (keySender, keyArgs) => { if (keyArgs.Key == System.Windows.Input.Key.Enter) diff --git a/src/condo/Screen.cs b/src/condo/Screen.cs index f308c4e..77e8d02 100644 --- a/src/condo/Screen.cs +++ b/src/condo/Screen.cs @@ -16,7 +16,7 @@ public sealed class Screen : FrameworkElement, IRenderTarget, IScrollInfo private ConsoleBuffer.Buffer buffer; public ConsoleBuffer.Buffer Buffer { - private get { return this.buffer; } + get { return this.buffer; } set { if (this.buffer != null) diff --git a/test/ConsoleBufferTests/SequenceParserTests.cs b/test/ConsoleBufferTests/SequenceParserTests.cs index 0938b4c..150fcd1 100644 --- a/test/ConsoleBufferTests/SequenceParserTests.cs +++ b/test/ConsoleBufferTests/SequenceParserTests.cs @@ -176,6 +176,23 @@ public void SetCursorPosition(string data, int expectedX, int expectedY) Assert.AreEqual(expectedY, cmd.PosY); } + [TestMethod] + [DataRow("0")] + [DataRow("")] + public void SGRReset(string data) + { + var parser = this.EnsureCommandParses($"\x1b[{data}m"); + var cmd = parser.Command as ConsoleBuffer.Commands.SetGraphicsRendition; + Assert.IsNotNull(cmd); + Assert.IsFalse(cmd.HaveForeground); + Assert.AreEqual(new Character.ColorInfo(), cmd.ForegroundColor); + Assert.IsFalse(cmd.HaveBackground); + Assert.AreEqual(new Character.ColorInfo(), cmd.BackgroundColor); + Assert.AreEqual(ConsoleBuffer.Commands.SetGraphicsRendition.FlagValue.None, cmd.Bold); + Assert.AreEqual(ConsoleBuffer.Commands.SetGraphicsRendition.FlagValue.None, cmd.Underline); + Assert.AreEqual(ConsoleBuffer.Commands.SetGraphicsRendition.FlagValue.None, cmd.Inverse); + } + private SequenceParser EnsureCommandParses(string command) { var parser = new SequenceParser(); diff --git a/test/ConsoleBufferTests/XtermPaletteTests.cs b/test/ConsoleBufferTests/XtermPaletteTests.cs new file mode 100644 index 0000000..b4a0e05 --- /dev/null +++ b/test/ConsoleBufferTests/XtermPaletteTests.cs @@ -0,0 +1,35 @@ +namespace ConsoleBufferTests +{ + using System; + using ConsoleBuffer; + using Microsoft.VisualStudio.TestTools.UnitTesting; + + [TestClass] + public class XtermPaletteTests + { + [TestMethod] + public void Expect256Colors() + { + var palette = new XtermPalette(); + for (var i = 0; i < 256; ++i) + { + Assert.IsInstanceOfType(palette[i], typeof(Character.ColorInfo)); + } + Assert.ThrowsException(() => palette[256]); + } + + [TestMethod] + [DataRow("black", 0, 0, 0)] + [DataRow("WHITE", 0xff, 0xff, 0xff)] + [DataRow("oraNGE4", 0x87, 0x5f, 0x00)] + [DataRow("Purple3", 0x5f, 0x00, 0xd7)] + public void LookupColorByName(string name, int rValue, int gValue, int bValue) + { + var palette = new XtermPalette(); + var colorInfo = palette[name]; + Assert.AreEqual(rValue, colorInfo.R); + Assert.AreEqual(gValue, colorInfo.G); + Assert.AreEqual(bValue, colorInfo.B); + } + } +}