예제 #1
0
        public void WordStartingWithKeyIsNotRecognised()
        {
            var output = new KeyParser().ParseLine(0, "keytest", TokenType.Key).Single();

            var expectedOutput = new ParsedSpan(0, TokenType.Parameter, 0, "keytest", Errors.Invalid);

            AreEqual(expectedOutput, output);
        }
예제 #2
0
        public void GetDelimiterCount_ReturnsCorrectCount(string input, int expected)
        {
            var sut = new KeyParser();

            var result = sut.GetDelimiterCount(input);

            Assert.Equal(expected, result);
        }
예제 #3
0
        public void KeyWithTabIsRecognised()
        {
            var output = new KeyParser().ParseLine(0, " key\t  ", TokenType.Key).Single();

            var expectedOutput = new ParsedSpan(0, TokenType.Key, 1, "key", string.Format(Errors.ExpectsParam, "Key"));

            AreEqual(expectedOutput, output);
        }
예제 #4
0
        public void NextTokenShouldBeData()
        {
            var parser = new KeyParser();

            parser.ParseLine(0, "key", TokenType.Key).Single();

            Assert.AreEqual(TokenType.Data | TokenType.Enum, parser.NextExpectedToken);
        }
        private void RunTestValid(TestGroupTest test)
        {
            ECPublicKeyParameters  publicKey  = KeyParser.ParsePublicKeyDer(Hex.Decode(test.PublicKey));
            ECPrivateKeyParameters privateKey = KeyParser.ParsePrivateKeyHex(test.PrivateKey);

            byte[] expectedSharedSecret = Hex.Decode(test.SharedSecret);
            byte[] sharedSecret         = KeyDerivation.ComputeSharedSecret(privateKey, publicKey);
            Assert.True(sharedSecret.SequenceEqual(expectedSharedSecret));
        }
예제 #6
0
        public MainForm()
        {
            InitializeComponent();

            var parser = new KeyParser();

            logic = new MainLogic(this, parser);

            calculator = new GraphicsCalculator();
        }
예제 #7
0
        public void Parse_two_line_edge_case_should_not_parse()
        {
            DISetup.SetupContainer();

            var sb = new StringBuilder();

            sb.AppendLine(@"create_envoys = {		");
            sb.AppendLine(@"create_ship = { name = random graphical_culture = ""ehof_01"" design = ""NAME_Compound_Envoy"" } }");

            var sb2 = new System.Text.StringBuilder();

            sb2.AppendLine(@"create_envoys = {");
            sb2.AppendLine(@"    create_ship = {");
            sb2.AppendLine(@"        name = random");
            sb2.AppendLine(@"        graphical_culture = ""ehof_01""");
            sb2.AppendLine(@"        design = ""NAME_Compound_Envoy""");
            sb2.AppendLine(@"    }");
            sb2.AppendLine(@"}");


            var args = new ParserArgs()
            {
                ContentSHA      = "sha",
                ModDependencies = new List <string> {
                    "1"
                },
                File    = "events\\fake.txt",
                Lines   = sb.ToString().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries),
                ModName = "fake"
            };
            var parser = new KeyParser(new CodeParser(new Logger()), null);
            var result = parser.Parse(args).ToList();

            result.Should().NotBeNullOrEmpty();
            result.Count().Should().Be(1);
            for (int i = 0; i < 1; i++)
            {
                result[i].ContentSHA.Should().Be("sha");
                result[i].Dependencies.First().Should().Be("1");
                result[i].File.Should().Be("events\\fake.txt");
                switch (i)
                {
                case 0:
                    result[i].Code.Trim().Should().Be(sb2.ToString().Trim());
                    result[i].Id.Should().Be("create_envoys");
                    result[i].ValueType.Should().Be(Common.ValueType.Object);
                    break;

                default:
                    break;
                }
                result[i].ModName.Should().Be("fake");
                result[i].Type.Should().Be("events\\txt");
            }
        }
        private void RunTestInvalid(TestGroupTest test)
        {
            ECPrivateKeyParameters privateKey = KeyParser.ParsePrivateKeyHex(test.PrivateKey);

            byte[] publicKeyBytes = Hex.Decode(test.PublicKey);
            Assert.Throws <ArgumentException>(() =>
            {
                ECPublicKeyParameters publicKey = KeyParser.ParsePublicKeyDer(publicKeyBytes);
                byte[] sharedSecret             = KeyDerivation.ComputeSharedSecret(privateKey, publicKey);
            });
        }
예제 #9
0
        public void KeyWithParamSeparatedByTabIsRecognised()
        {
            var output = new KeyParser().ParseLine(0, " key\tid  ", TokenType.Key).ToList();

            var expectedOutput = new List <ParsedSpan>
            {
                new ParsedSpan(0, TokenType.Key, 1, "key"),
                new ParsedSpan(0, TokenType.Key | TokenType.Parameter, 5, "id")
            };

            AreEqual(expectedOutput, output);
        }
예제 #10
0
        private void ProcessRequest(InputRequest request)
        {
            var key       = KeyParser.ToConsoleKey(request.KeyInput);
            var login     = request.Login;
            var character = level.GetPlayer(login);

            Console.WriteLine($"Receive {key.Key} {login}");

            foreach (var subscriber in subscribers)
            {
                subscriber.ProcessInput(key, character);
            }
        }
예제 #11
0
        public void KeyWithTwoVariables()
        {
            var output = new KeyParser().ParseLine(0, "  key id id2", TokenType.Key).ToList();

            var expectedOutput = new List <ParsedSpan>
            {
                new ParsedSpan(0, TokenType.Key, 2, "key"),
                new ParsedSpan(0, TokenType.Parameter | TokenType.Key, 6, "id"),
                new ParsedSpan(0, TokenType.Parameter | TokenType.Key, 9, "id2")
            };

            AreEqual(expectedOutput, output);
        }
예제 #12
0
        public void Parse_inline_edge_case_should_yield_results()
        {
            DISetup.SetupContainer();

            var sb = new StringBuilder();

            sb.AppendLine(@"entity = { name = ""ai_01_blue_sponsored_colonizer_entity"" clone = ""ai_01_blue_colonizer_entity"" }");

            var sb2 = new StringBuilder();

            sb2.AppendLine(@"entity = {");
            sb2.AppendLine(@"    name = ""ai_01_blue_sponsored_colonizer_entity""");
            sb2.AppendLine(@"    clone = ""ai_01_blue_colonizer_entity""");
            sb2.AppendLine(@"}");


            var args = new ParserArgs()
            {
                ContentSHA      = "sha",
                ModDependencies = new List <string> {
                    "1"
                },
                File    = "events\\fake.txt",
                Lines   = sb.ToString().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries),
                ModName = "fake"
            };
            var parser = new KeyParser(new CodeParser(new Logger()), null);
            var result = parser.Parse(args).ToList();

            result.Should().NotBeNullOrEmpty();
            result.Count().Should().Be(1);
            for (int i = 0; i < 1; i++)
            {
                result[i].ContentSHA.Should().Be("sha");
                result[i].Dependencies.First().Should().Be("1");
                result[i].File.Should().Be("events\\fake.txt");
                switch (i)
                {
                case 0:
                    result[i].Code.Trim().Should().Be(sb2.ToString().Trim());
                    result[i].Id.Should().Be("ai_01_blue_sponsored_colonizer_entity");
                    result[i].ValueType.Should().Be(Common.ValueType.Object);
                    break;

                default:
                    break;
                }
                result[i].ModName.Should().Be("fake");
                result[i].Type.Should().Be("events\\txt");
            }
        }
예제 #13
0
        public void DuplicateVariables()
        {
            var output = new KeyParser().ParseLine(0, "key id a id", TokenType.Key).ToList();

            var expectedOutput = new List <ParsedSpan>
            {
                new ParsedSpan(0, TokenType.Key, 0, "key"),
                new ParsedSpan(0, TokenType.Key | TokenType.Parameter, 4, "id"),
                new ParsedSpan(0, TokenType.Key | TokenType.Parameter, 7, "a"),
                new ParsedSpan(0, TokenType.Key | TokenType.Parameter, 9, "id", string.Format(Errors.DuplicateValue, "Key", "id"))
            };

            AreEqual(expectedOutput, output);
        }
예제 #14
0
 /// <summary>
 /// Sends a player action by the network.
 /// </summary>
 public void MakeAction(AbstractPlayer player, ActionType actionType)
 {
     foreach (var targetLogin in serverInputService.Responses.Keys)
     {
         var response = new ServerResponse
         {
             Type     = ResponseType.Action,
             Login    = player.Login,
             KeyInput = KeyParser.FromActionTypeToKeyInput(actionType)
         };
         Console.WriteLine($"Sending {response.Type.ToString()} {response.KeyInput} to {targetLogin}");
         serverInputService.Responses[targetLogin].Enqueue(response);
     }
 }
예제 #15
0
        public string Validate()
        {
            if (StoragePath.IndexOfAny(Path.GetInvalidPathChars()) != -1)
            {
                return("Invalid storage path");
            }

            if (!KeyParser.Validate(AntiKeyProtection))
            {
                return("Invalid protected keys value");
            }

            return(string.Empty);
        }
예제 #16
0
            public void SendMixed(string sequence)
            {
                // TODO: modifiers in mixed mode send e.g. ^{a down}

                var keys = KeyParser.ParseKeyStream(sequence);

                foreach (var key in keys)
                {
                    if (key != Keys.None)
                    {
                        Send(key);
                    }
                }
            }
예제 #17
0
        public void TestDerive()
        {
            ECPrivateKeyParameters privateKey = KeyParser.ParsePrivateKeyDer("MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgCPSuFr4iSIaQprjjchHPyDu2NXFe0vDBoTpPkYaK9dehRANCAATnaFz/vQKuO90pxsINyVNWojabHfbx9qIJ6uD7Q7ZSxmtyo/Ez3/o2kDT8g0pIdyVIYktCsq65VoQIDWSh2Bdm");

            string ephemeralPublicKey = "BPhVspn70Zj2Kkgu9t8+ApEuUWsI/zos5whGCQBlgOkuYagOis7qsrcbQrcprjvTZO3XOU+Qbcc28FSgsRtcgQE=";
            var    keyDerivation      = new KeyDerivation(16, 16);

            KeyDerivation.DerivedKeys keys = keyDerivation.Derive(privateKey, ephemeralPublicKey);

            byte[] expectedSymmetricKey = Hex.Decode("59EDEC98018C6DD4CCAF1119AD247843");
            byte[] expectedMacKey       = Hex.Decode("D5F72946AAE92D54697A4FF305B6F9F4");
            Assert.True(keys.SymmetricEncryptionKey.SequenceEqual(expectedSymmetricKey));
            Assert.True(keys.MacKey.SequenceEqual(expectedMacKey));
        }
예제 #18
0
        public void Setup()
        {
            _parser = new KeyParser();

            var sb = new StringBuilder();

            for (var i = 0; i < Colons; i++)
            {
                sb.Append(Word).Append(':');
            }

            sb.Append(Word);

            _input = sb.ToString();
        }
예제 #19
0
        public void CanParse_inline_edge_case_should_not_parse()
        {
            DISetup.SetupContainer();

            var sb = new StringBuilder();

            sb.AppendLine(@"create_envoys = {		create_ship = { name = random graphical_culture = ""ehof_01"" design = ""NAME_Compound_Envoy"" } }");

            var args = new CanParseArgs()
            {
                File  = "common\\gamerules\\test.txt",
                Lines = sb.ToString().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries),
            };
            var parser = new KeyParser(new CodeParser(new Logger()), null);
            var result = parser.CanParse(args);

            result.Should().BeFalse();
        }
예제 #20
0
        public void CanParse_inline_edge_case_should_parse()
        {
            DISetup.SetupContainer();

            var sb = new StringBuilder();

            sb.AppendLine(@"entity = { name = ""ai_01_blue_sponsored_colonizer_entity"" clone = ""ai_01_blue_colonizer_entity"" }");

            var args = new CanParseArgs()
            {
                File  = "common\\gamerules\\test.txt",
                Lines = sb.ToString().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries),
            };
            var parser = new KeyParser(new CodeParser(new Logger()), null);
            var result = parser.CanParse(args);

            result.Should().BeTrue();
        }
예제 #21
0
        public void CanParse_should_be_false_then_true()
        {
            var sb = new StringBuilder();

            sb.AppendLine(@"@test = 1");
            sb.AppendLine(@"");
            sb.AppendLine(@"namespace = dmm_mod");
            sb.AppendLine(@"");
            sb.AppendLine(@"country_event = {");
            sb.AppendLine(@"    id = dmm_mod.1");
            sb.AppendLine(@"    hide_window = yes");
            sb.AppendLine(@"    is_triggered_only = yes");
            sb.AppendLine(@"");
            sb.AppendLine(@"    trigger = {");
            sb.AppendLine(@"        has_global_flag = dmm_mod_1");
            sb.AppendLine(@"    }");
            sb.AppendLine(@"");
            sb.AppendLine(@"    after = {");
            sb.AppendLine(@"        remove_global_flag = dmm_mod_1_opened");
            sb.AppendLine(@"    }");
            sb.AppendLine(@"");
            sb.AppendLine(@"    immediate = {");
            sb.AppendLine(@"        country_event = {");
            sb.AppendLine(@"            id = asl_options.1");
            sb.AppendLine(@"        }");
            sb.AppendLine(@"    }");
            sb.AppendLine(@"}");

            var args = new CanParseArgs()
            {
                File  = "common\\gamerules\\test.txt",
                Lines = new List <string> {
                    "test", "test2 = {}"
                }
            };
            var parser = new KeyParser(new CodeParser(new Logger()), null);

            parser.CanParse(args).Should().BeFalse();
            args.File  = "events\\test.txt";
            args.Lines = sb.ToString().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            parser.CanParse(args).Should().BeTrue();
        }
예제 #22
0
        static void Main()
        {
            var key = KeyParser.GetKeyString(FString.KEY_PATH);

            Console.WriteLine("Key: " + key);


            var l = TrafficParser
                    .GetTrafficList(
                HttpGet.Get(
                    Url.SERVER_ID_TRAFFIC(7269),
                    FString.HTTPGET_HEADER_KEY,
                    key,
                    10000,
                    FString.USER_AGENT)
                .ToJObject());

            long countIn  = 0;
            long countOut = 0;

            foreach (var i in l)
            {
                Console.WriteLine("==============================");
                Console.WriteLine("Date: " + i.Date);
                Console.WriteLine("In  : " + i.In);
                Console.WriteLine("Out : " + i.Out);
                Console.WriteLine("EFR : " + 100.0 * i.EFR + "%");
                countIn  += i.In;
                countOut += i.Out;
            }
            Console.WriteLine("==============================");
            Console.WriteLine("Total In : " + countIn);
            Console.WriteLine("Total Out: " + countOut);
            Console.WriteLine("Avg. EFR : " + 100.0 * countOut / countIn + "%");
            Console.WriteLine("==============================");
            Console.WriteLine("Finished! Press any key to exit...");
            Console.ReadKey();
        }
예제 #23
0
        public string Parse()
        {
            // Read the contents of the file, but ignore lines that start
            // with a semi-colon (;) because those are comments in BlitzBASIC
            var lines = File.ReadLines(_map)
                        .Where((line) => !line.StartsWith(";"))
                        .ToArray();

            // Create the laundry list of parsers
            var roomParser       = new RoomParser();
            var willyStartParser = new WillyStartParser();
            var exitParser       = new ExitParser();
            var travelatorParser = new TravelatorParser();
            var keyParser        = new KeyParser();
            var horiz            = new HorizontalBaddiesParser();
            var airParser        = new AirParser();

            roomParser.Parse(lines);
            willyStartParser.Parse(lines);
            travelatorParser.Parse(lines);
            exitParser.Parse(lines);
            keyParser.Parse(lines);
            horiz.Parse(lines);
            airParser.Parse(lines);

            return(JsonUtil.MakeFrom(roomParser,
                                     willyStartParser,
                                     travelatorParser,
                                     exitParser,
                                     keyParser,
                                     horiz,
                                     airParser));

            /*
             * Each line:
             *  if it matches a marker; process the number of lines required for that section
             */
        }
예제 #24
0
        public override byte[] ProcessBlock(
            byte[] @in,
            int inOff,
            int inLen)
        {
            if (ForEncryption)
            {
                if (KeyPairGenerator != null)
                {
                    EphemeralKeyPair ephKeyPair = KeyPairGenerator.Generate();

                    PrivParam = ephKeyPair.GetKeyPair().Private;
                    V         = ephKeyPair.GetEncodedPublicKey();
                }
            }
            else
            {
                if (KeyParser != null)
                {
                    MemoryStream bIn = new MemoryStream(@in, inOff, inLen)
                    {
                        Position = SecureHeadSize
                    };
                    try
                    {
                        PubParam = KeyParser.ReadKey(bIn);
                    }
                    catch (IOException e)
                    {
                        throw new InvalidCipherTextException("unable to recover ephemeral public key: " + e.Message, e);
                    }
                    catch (ArgumentException e)
                    {
                        throw new InvalidCipherTextException("unable to recover ephemeral public key: " + e.Message, e);
                    }

                    int encLength = (inLen - (int)(bIn.Length - bIn.Position));
                    V = Arrays.CopyOfRange(@in, inOff + SecureHeadSize, inOff + encLength);
                }
            }

            // Compute the common value and convert to byte array.
            Agree.Init(PrivParam);
            BigInteger z = Agree.CalculateAgreement(PubParam);

            byte[] bigZ = BigIntegers.AsUnsignedByteArray(Agree.GetFieldSize(), z);

            try
            {
                // Initialise the KDF.
                KdfParameters kdfParam = new KdfParameters(bigZ, null);
                Kdf.Init(kdfParam);

                if (ForEncryption)
                {
                    return(EncryptBlock(@in, inOff, inLen));
                }
                else
                {
                    byte[] temp = new byte[inLen - SecureHeadSize];
                    Array.Copy(@in, inOff + SecureHeadSize, temp, 0, temp.Length);
                    return(DecryptBlock(temp, inOff, temp.Length));
                }
            }
            finally
            {
                Arrays.Fill(bigZ, 0);
            }
        }
예제 #25
0
        public void Parse_should_yield_results()
        {
            DISetup.SetupContainer();

            var sb = new StringBuilder();

            sb.AppendLine(@"@test = 1");
            sb.AppendLine(@"");
            sb.AppendLine(@"namespace = dmm_mod");
            sb.AppendLine(@"");
            sb.AppendLine(@"country_event = {");
            sb.AppendLine(@"    id = dmm_mod.1");
            sb.AppendLine(@"    hide_window = yes");
            sb.AppendLine(@"    is_triggered_only = yes");
            sb.AppendLine(@"");
            sb.AppendLine(@"    trigger = {");
            sb.AppendLine(@"        has_global_flag = dmm_mod_1");
            sb.AppendLine(@"    }");
            sb.AppendLine(@"");
            sb.AppendLine(@"    after = {");
            sb.AppendLine(@"        remove_global_flag = dmm_mod_1_opened");
            sb.AppendLine(@"    }");
            sb.AppendLine(@"");
            sb.AppendLine(@"    immediate = {");
            sb.AppendLine(@"        country_event = {");
            sb.AppendLine(@"            id = asl_options.1");
            sb.AppendLine(@"        }");
            sb.AppendLine(@"    }");
            sb.AppendLine(@"}");


            var sb2 = new StringBuilder();

            sb2.AppendLine(@"country_event = {");
            sb2.AppendLine(@"    id = dmm_mod.1");
            sb2.AppendLine(@"    hide_window = yes");
            sb2.AppendLine(@"    is_triggered_only = yes");
            sb2.AppendLine(@"    trigger = {");
            sb2.AppendLine(@"        has_global_flag = dmm_mod_1");
            sb2.AppendLine(@"    }");
            sb2.AppendLine(@"    after = {");
            sb2.AppendLine(@"        remove_global_flag = dmm_mod_1_opened");
            sb2.AppendLine(@"    }");
            sb2.AppendLine(@"    immediate = {");
            sb2.AppendLine(@"        country_event = {");
            sb2.AppendLine(@"            id = asl_options.1");
            sb2.AppendLine(@"        }");
            sb2.AppendLine(@"    }");
            sb2.AppendLine(@"}");

            var args = new ParserArgs()
            {
                ContentSHA      = "sha",
                ModDependencies = new List <string> {
                    "1"
                },
                File    = "events\\fake.txt",
                Lines   = sb.ToString().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries),
                ModName = "fake"
            };
            var parser = new KeyParser(new CodeParser(new Logger()), null);
            var result = parser.Parse(args).ToList();

            result.Should().NotBeNullOrEmpty();
            result.Count().Should().Be(3);
            for (int i = 0; i < 3; i++)
            {
                result[i].ContentSHA.Should().Be("sha");
                result[i].Dependencies.First().Should().Be("1");
                result[i].File.Should().Be("events\\fake.txt");
                switch (i)
                {
                case 0:
                    result[i].Code.Trim().Should().Be("@test = 1");
                    result[i].Id.Should().Be("@test");
                    result[i].ValueType.Should().Be(Common.ValueType.Variable);
                    break;

                case 1:
                    result[i].Id.Should().Be("fake-namespace");
                    result[i].ValueType.Should().Be(Common.ValueType.Namespace);
                    break;

                case 2:
                    result[i].Id.Should().Be("dmm_mod.1");
                    result[i].Code.Should().Be(sb2.ToString().Trim().ReplaceTabs());
                    result[i].ValueType.Should().Be(Common.ValueType.Object);
                    break;

                default:
                    break;
                }
                result[i].ModName.Should().Be("fake");
                result[i].Type.Should().Be("events\\txt");
            }
        }
예제 #26
0
            public static HotkeyDefinition Parse(string sequence)
            {
                Keys    keys = Keys.None, extra = Keys.None;
                Options options = Options.None;
                string  typed   = string.Empty;

                #region Modifiers

                sequence = sequence.Replace(Core.Keyword_ModifierAltGr, new string(new[] { Core.Keyword_ModifierCtrl, Core.Keyword_ModifierAlt }));

                for (int i = 0; i < sequence.Length; i++)
                {
                    switch (sequence[i])
                    {
                    case Core.Keyword_ModifierLeftPair:
                        i++;
                        if (i == sequence.Length)
                        {
                            throw new ArgumentException();
                        }
                        switch (sequence[i])
                        {
                        case Core.Keyword_ModifierWin: extra = Keys.LWin; break;

                        case Core.Keyword_ModifierAlt: extra = Keys.LMenu; break;

                        case Core.Keyword_ModifierCtrl: extra = Keys.LControlKey; break;

                        case Core.Keyword_ModifierShift: extra = Keys.LShiftKey; break;

                        default: throw new ArgumentException();
                        }
                        break;

                    case Core.Keyword_ModifierRightPair:
                        i++;
                        if (i == sequence.Length)
                        {
                            throw new ArgumentException();
                        }
                        switch (sequence[i])
                        {
                        case Core.Keyword_ModifierWin: extra = Keys.RWin; break;

                        case Core.Keyword_ModifierAlt: extra = Keys.RMenu; break;

                        case Core.Keyword_ModifierCtrl: extra = Keys.RControlKey; break;

                        case Core.Keyword_ModifierShift: extra = Keys.RShiftKey; break;

                        default: throw new ArgumentException();
                        }
                        break;

                    case Core.Keyword_ModifierWin: extra = Keys.LWin; break;

                    case Core.Keyword_ModifierAlt: keys |= Keys.Alt; break;

                    case Core.Keyword_ModifierCtrl: keys |= Keys.Control; break;

                    case Core.Keyword_ModifierShift: keys |= Keys.Shift; break;

                    case Core.Keyword_HotkeyIgnoreModifiers: options |= Options.IgnoreModifiers; break;

                    case Core.Keyword_HotkeyPassThrough: options |= Options.PassThrough; break;

                    case Core.Keyword_HotkeyNoRecurse: continue;

                    default:
                        if (i > 0)
                        {
                            sequence = sequence.Substring(i);
                        }
                        i = sequence.Length;
                        break;
                    }
                }

                #endregion

                int z = sequence.IndexOf(Core.Keyword_HotkeyCombination);

                if (z != -1)
                {
                    z++;
                    if (z < sequence.Length)
                    {
                        string alt = sequence.Substring(z).Trim();
                        extra = KeyParser.ParseKey(alt);

                        if (alt.Length == 1)
                        {
                            typed = alt;
                        }
                    }
                    sequence = sequence.Substring(0, z - 1).Trim();
                }

                z = sequence.LastIndexOf(Core.Keyword_Up, StringComparison.OrdinalIgnoreCase);

                if (z > 0 && char.IsWhiteSpace(sequence, z - 1))
                {
                    sequence = sequence.Substring(0, z).Trim();
                    options |= Options.Up;
                }

                keys |= KeyParser.ParseKey(sequence);

                if (typed.Length == 0 && sequence.Length == 1)
                {
                    typed = sequence;
                }

                return(new HotkeyDefinition(keys, extra, options, null)
                {
                    Typed = typed
                });
            }