public ParsedContent GetContents()
        {
            var res = contents;

            contents = new ParsedContent();
            return(res);
        }
        /// <summary>
        /// Convert the WikiPage to a DiscordEmbed.
        /// </summary>
        /// <returns>A DiscordEmbed containing the info gathered about the page.</returns>
        public DiscordEmbed ToDiscordEmbed()
        {
            string categoryS = "";

            if (Categories != null && Categories.Length > 0)
            {
                categoryS = Categories[0];
                for (int i = 1; i < Categories.Length; i++)
                {
                    categoryS += $" | {Categories[i]}";
                }
                categoryS += " -- ";
            }

            var embed = new DiscordEmbedBuilder
            {
                Title       = $"__**{Title}**__",
                Url         = Util.GetWikiURL(Title),
                Description = ParsedContent.Limit(1024),
                Color       = new DiscordColor(255, 211, 50)
            };

            embed.WithFooter($"{categoryS}Last edit by User:{LastChangeUser}", Util.GetImageURL("Artifact_Cutout.png"));
            embed.WithTimestamp(LastChangeDate);

            return(embed);
        }
Exemple #3
0
        private static ParsedContent ParseContent(SiteContentVersion content, List <SiteContent> contents, int profileTypeId)
        {
            if (content == null || string.IsNullOrWhiteSpace(content.ContentText))
            {
                return(null);
            }

            var parsedContent = new ParsedContent()
            {
                Html    = string.Empty,
                Scripts = string.Empty,
                Styles  = string.Empty
            };

            var doc = new HtmlDocument();

            doc.LoadHtml(content.ContentText);

            foreach (var script in doc.DocumentNode.Descendants("script").ToArray())
            {
                parsedContent.Scripts += script.InnerHtml;
                script.Remove();
            }

            foreach (var style in doc.DocumentNode.Descendants("style").ToArray())
            {
                parsedContent.Styles += style.InnerHtml;
                style.Remove();
            }

            foreach (var link in doc.DocumentNode.Descendants("a").ToArray())
            {
                var href = link.GetAttributeValue("href", string.Empty);

                if (!string.IsNullOrEmpty(href))
                {
                    var linkContent = contents.FindByPermalinkOrUrl(href);

                    if (linkContent != null)
                    {
                        if (linkContent.ProfileTypes.Any() && linkContent.ProfileTypes.All(p => p.ProfileTypeID != profileTypeId))
                        {
                            link.Attributes["href"].Remove();
                            link.SetAttributeValue("class", "disabled");
                        }
                        else if (linkContent.ContentType == ContentType.File && linkContent.Site != null && linkContent.FileInfo != null)
                        {
                            link.SetAttributeValue("data-track", "true");
                            link.SetAttributeValue("data-label", linkContent.Site.SiteName);
                            link.SetAttributeValue("data-value", linkContent.FileInfo.Name);
                        }
                    }
                }
            }

            parsedContent.Html = doc.DocumentNode.InnerHtml;

            return(parsedContent);
        }
Exemple #4
0
        public Parantheses(string content)
        {
            Operators   = new List <Operator>();
            Paranthesis = new List <Parantheses>();

            Content      = content;
            ContentArray = Content.ToCharArray();
            Parse();
            ContentArray = ParsedContent.ToCharArray();
        }
Exemple #5
0
        static void Main(string[] args)
        {
            FunctionTable.LoadData();

            Analyse analyse = new Analyse();

            //analyse.Files.Add(@"F:\Games\Call Of Cthulhu DCoTE\Testing\0.bin");
            //analyse.Files.Add(@"F:\Games\Call Of Cthulhu DCoTE\Testing\1.bin");
            //analyse.Files.Add(@"F:\Games\Call Of Cthulhu DCoTE\Testing\2.bin");
            //analyse.Files.Add(@"F:\Games\Call Of Cthulhu DCoTE\Testing\3.bin");
            //analyse.Files.Add(@"F:\Games\Call Of Cthulhu DCoTE\Testing\4.bin");
            //analyse.Files.Add(args[0]);

            if (args.Length > 1)
            {
                analyse.SaveAsNew = (args[1] != "asold");
                analyse.BuildNew  = (args[1] == "buildnew");
            }

            analyse.NewBase = 605;
            //1AE = 430
            //25D = 605
            //2F8 = 760
            if (args.Length > 2)
            {
                short parseShort = 0;
                short.TryParse(args[2], out parseShort);
                analyse.NewBase = parseShort;
            }

            ParsedContent parsedContent = analyse.AnalyseFile(args[0]);

            analyse.PostAnalysis(parsedContent);

            Console.WriteLine("Finished.");
            //Console.ReadLine();
        }
        public ParsedContent Read(Stream stream)
        {
            var res       = new ParsedContent();
            var info      = new AtomCollection(Channel.ChannelInfo.Extra);
            var processed = false;
            var eos       = false;

            while (!eos)
            {
                var start_pos = stream.Position;
                try {
                    switch (state)
                    {
                    case ReaderState.Header:
                    {
                        var bin    = ReadBytes(stream, 13);
                        var header = new FileHeader(bin);
                        if (header.IsValid)
                        {
                            Logger.Info("FLV Header found");
                            fileHeader        = header;
                            bin               = header.Binary;
                            res.ContentHeader = new Content(position, bin);
                            res.Contents      = null;
                            info.SetChanInfoType("FLV");
                            info.SetChanInfoStreamType("video/x-flv");
                            info.SetChanInfoStreamExt(".flv");
                            res.ChannelInfo = new ChannelInfo(info);
                            position        = bin.Length;
                            tags.Clear();
                            state = ReaderState.Body;
                        }
                        else
                        {
                            throw new BadDataException();
                        }
                    }
                    break;

                    case ReaderState.Body:
                    {
                        var bin        = ReadBytes(stream, 11);
                        var read_valid = false;
                        var body       = new FLVTag(bin);
                        if (body.IsValidHeader)
                        {
                            body.ReadBody(stream);
                            body.ReadFooter(stream);
                            if (body.IsValidFooter)
                            {
                                read_valid = true;
                                bin        = body.Binary;
                                if (res.Contents == null)
                                {
                                    res.Contents = new List <Content>();
                                }
                                res.Contents.Add(new Content(position, bin));
                                tags.AddLast(new TagDesc {
                                        Timestamp = body.Timestamp / 1000.0, DataSize = body.DataSize
                                    });
                                var timespan = tags.Last.Value.Timestamp - tags.First.Value.Timestamp;
                                if (timespan >= 30.0)
                                {
                                    var sz = tags.Take(tags.Count - 1).Sum(t => t.DataSize);
                                    info.SetChanInfoBitrate((int)(sz * 8 / timespan + 900) / 1000);
                                    res.ChannelInfo = new ChannelInfo(info);
                                    while (tags.Count > 1)
                                    {
                                        tags.RemoveFirst();
                                    }
                                }
                                position += bin.Length;
                            }
                        }
                        if (!read_valid)
                        {
                            stream.Position = start_pos;
                            var header = new FileHeader(ReadBytes(stream, 13));
                            if (header.IsValid)
                            {
                                Logger.Info("New FLV Header found");
                                read_valid        = true;
                                fileHeader        = header;
                                bin               = header.Binary;
                                res.ContentHeader = new Content(0, bin);
                                res.Contents      = null;
                                info.SetChanInfoType("FLV");
                                info.SetChanInfoStreamType("video/x-flv");
                                info.SetChanInfoStreamExt(".flv");
                                res.ChannelInfo = new ChannelInfo(info);
                                tags.Clear();
                                position = bin.Length;
                            }
                        }
                        if (!read_valid)
                        {
                            throw new BadDataException();
                        }
                    }
                    break;
                    }
                    processed = true;
                }
                catch (EndOfStreamException) {
                    if (!processed)
                    {
                        throw;
                    }
                    stream.Position = start_pos;
                    eos             = true;
                }
                catch (BadDataException) {
                    stream.Position = start_pos + 1;
                }
            }
            return(res);
        }
Exemple #7
0
        public ParsedContent Read(Stream stream)
        {
            var chunks = 0;
            var res    = new ParsedContent();
            var pos    = Channel.ContentPosition;

            try {
                while (chunks < 8)
                {
                    var chunk = ASFChunk.Read(stream);
                    chunks++;
                    switch (chunk.KnownType)
                    {
                    case ASFChunk.ChunkType.Header: {
                        var header = ASFHeader.Read(chunk);
                        var info   = new AtomCollection(Channel.ChannelInfo.Extra);
                        info.SetChanInfoBitrate(header.Bitrate);
                        if (header.Streams.Any(type => type == ASFHeader.StreamType.Video))
                        {
                            info.SetChanInfoType("WMV");
                            info.SetChanInfoStreamType("video/x-ms-wmv");
                            info.SetChanInfoStreamExt(".wmv");
                        }
                        else if (header.Streams.Any(type => type == ASFHeader.StreamType.Audio))
                        {
                            info.SetChanInfoType("WMA");
                            info.SetChanInfoStreamType("audio/x-ms-wma");
                            info.SetChanInfoStreamExt(".wma");
                        }
                        else
                        {
                            info.SetChanInfoType("ASF");
                            info.SetChanInfoStreamType("video/x-ms-asf");
                            info.SetChanInfoStreamExt(".asf");
                        }
                        res.ChannelInfo   = new ChannelInfo(info);
                        res.ContentHeader = new Content(pos, chunk.ToByteArray());
                        pos += chunk.TotalLength;
                    }
                    break;

                    case ASFChunk.ChunkType.Data:
                        if (res.Contents == null)
                        {
                            res.Contents = new System.Collections.Generic.List <Content>();
                        }
                        res.Contents.Add(new Content(pos, chunk.ToByteArray()));
                        pos += chunk.TotalLength;
                        break;

                    case ASFChunk.ChunkType.Unknown:
                        break;
                    }
                }
            }
            catch (EndOfStreamException) {
                if (chunks == 0)
                {
                    throw;
                }
            }
            return(res);
        }
        public ParsedContent Read(Stream stream)
        {
            var res       = new ParsedContent();
            var bodies    = new List <Element>();
            var info      = new AtomCollection(Channel.ChannelInfo.Extra);
            var processed = false;
            var eos       = false;

            while (!eos)
            {
                var start_pos = stream.Position;
                try {
                    var elt = Element.ReadHeader(stream);
                    if (ebml.MaxIDLength < elt.ID.Length ||
                        ebml.MaxSizeLength < elt.Size.Length)
                    {
                        throw new BadDataException();
                    }
                    switch (state)
                    {
                    case ReaderState.EBML:
                        if (elt.ID.BinaryEquals(Elements.EBML))
                        {
                            elt.ReadBody(stream);
                            ebml  = new EBML(elt);
                            state = ReaderState.Segment;
                        }
                        else
                        {
                            throw new BadDataException();
                        }
                        break;

                    case ReaderState.Segment:
                        if (elt.ID.BinaryEquals(Elements.Segment))
                        {
                            segment = new Segment(elt);
                            state   = ReaderState.EndOfHeader;
                        }
                        else if (elt.ID.BinaryEquals(Elements.EBML))
                        {
                            stream.Position = elt.Position;
                            state           = ReaderState.EBML;
                            continue;
                        }
                        else if (elt.ID.BinaryEquals(Elements.Void) ||
                                 elt.ID.BinaryEquals(Elements.CRC32))
                        {
                            elt.ReadBody(stream);
                        }
                        else
                        {
                            throw new BadDataException();
                        }
                        break;

                    case ReaderState.EndOfHeader:
                        if (elt.ID.BinaryEquals(Elements.Segment))
                        {
                            stream.Position = elt.Position;
                            state           = ReaderState.Segment;
                            continue;
                        }
                        else if (elt.ID.BinaryEquals(Elements.EBML))
                        {
                            stream.Position = elt.Position;
                            state           = ReaderState.EBML;
                            continue;
                        }
                        else if (elt.ID.BinaryEquals(Elements.Cluster))
                        {
                            stream.Position = elt.Position;
                            state           = ReaderState.Cluster;
                            clusters.Clear();
                            MemoryStream header;
                            using (header = new MemoryStream()) {
                                ebml.Element.Write(header);
                                segment.Element.Write(header);
                                foreach (var c in segment.HeaderElements)
                                {
                                    c.Write(header);
                                }
                            }
                            res.ContentHeader = new Content(0, header.ToArray());
                            if (ebml.DocType == "webm")
                            {
                                info.SetChanInfoType("WEBM");
                                info.SetChanInfoStreamType("video/webm");
                                info.SetChanInfoStreamExt(".webm");
                            }
                            else
                            {
                                info.SetChanInfoType("MKV");
                                info.SetChanInfoStreamType("video/x-matroska");
                                info.SetChanInfoStreamExt(".mkv");
                            }
                            res.ChannelInfo = new ChannelInfo(info);
                        }
                        else
                        {
                            elt.ReadBody(stream);
                            segment.AddHeader(elt);
                        }
                        break;

                    case ReaderState.Cluster:
                        if (elt.ID.BinaryEquals(Elements.Segment))
                        {
                            stream.Position = elt.Position;
                            state           = ReaderState.Segment;
                            continue;
                        }
                        else if (elt.ID.BinaryEquals(Elements.EBML))
                        {
                            stream.Position = elt.Position;
                            state           = ReaderState.EBML;
                            continue;
                        }
                        else if (elt.ID.BinaryEquals(Elements.Cluster))
                        {
                            if (clusters.Count > 0)
                            {
                                var timespan = clusters.Sum(c => c.Timespan);
                                if (timespan >= 30.0)
                                {
                                    var sz   = clusters.Sum(c => c.Timespan > 0 ? c.BlockSize : 0);
                                    var kbps = (int)((sz * 8 / timespan + 900) / 1000.0);
                                    info.SetChanInfoBitrate(kbps);
                                    res.ChannelInfo = new ChannelInfo(info);
                                    while (clusters.Count > 1)
                                    {
                                        clusters.RemoveFirst();
                                    }
                                }
                            }
                            var cluster = new Cluster(elt);
                            clusters.AddLast(cluster);
                            bodies.Add(elt);
                            state = ReaderState.Timecode;
                        }
                        else if (elt.ID.BinaryEquals(Elements.Void) ||
                                 elt.ID.BinaryEquals(Elements.CRC32))
                        {
                            elt.ReadBody(stream);
                            bodies.Add(elt);
                        }
                        else
                        {
                            throw new BadDataException();
                        }
                        break;

                    case ReaderState.Timecode:
                        if (elt.ID.BinaryEquals(Elements.Segment))
                        {
                            stream.Position = elt.Position;
                            state           = ReaderState.Segment;
                            continue;
                        }
                        else if (elt.ID.BinaryEquals(Elements.EBML))
                        {
                            stream.Position = elt.Position;
                            state           = ReaderState.EBML;
                            continue;
                        }
                        else if (elt.ID.BinaryEquals(Elements.Cluster))
                        {
                            stream.Position = elt.Position;
                            state           = ReaderState.Cluster;
                            continue;
                        }
                        else if (elt.ID.BinaryEquals(Elements.Timecode))
                        {
                            elt.ReadBody(stream);
                            if (clusters.Last != null)
                            {
                                clusters.Last.Value.Timecode =
                                    Element.ReadUInt(new MemoryStream(elt.Data), elt.Data.Length) * (segment.TimecodeScale / 1000000000.0);
                                if (clusters.Count > 1)
                                {
                                    clusters.Last.Previous.Value.Timespan = clusters.Last.Value.Timecode - clusters.Last.Previous.Value.Timecode;
                                }
                            }
                            bodies.Add(elt);
                            state = ReaderState.Block;
                        }
                        else if (elt.ID.BinaryEquals(Elements.SimpleBlock) ||
                                 elt.ID.BinaryEquals(Elements.BlockGroup))
                        {
                            stream.Position = elt.Position;
                            state           = ReaderState.Block;
                            continue;
                        }
                        else
                        {
                            elt.ReadBody(stream);
                            bodies.Add(elt);
                        }
                        break;

                    case ReaderState.Block:
                        if (elt.ID.BinaryEquals(Elements.Segment))
                        {
                            stream.Position = elt.Position;
                            state           = ReaderState.Segment;
                            continue;
                        }
                        else if (elt.ID.BinaryEquals(Elements.EBML))
                        {
                            stream.Position = elt.Position;
                            state           = ReaderState.EBML;
                            continue;
                        }
                        else if (elt.ID.BinaryEquals(Elements.Cluster))
                        {
                            stream.Position = elt.Position;
                            state           = ReaderState.Cluster;
                            continue;
                        }
                        else if ((elt.ID.BinaryEquals(Elements.SimpleBlock) ||
                                  elt.ID.BinaryEquals(Elements.BlockGroup)) &&
                                 (clusters.Last.Value.BlockID == null ||
                                  elt.ID.BinaryEquals(clusters.Last.Value.BlockID)))
                        {
                            elt.ReadBody(stream);
                            clusters.Last.Value.BlockSize += elt.Size.Value;
                            clusters.Last.Value.BlockID    = elt.ID.Binary;
                            bodies.Add(elt);
                        }
                        else if (clusters.Last.Value.BlockID == null)
                        {
                            elt.ReadBody(stream);
                            bodies.Add(elt);
                        }
                        else
                        {
                            stream.Position = elt.Position;
                            state           = ReaderState.Cluster;
                            continue;
                        }
                        break;
                    }
                    processed = true;
                }
                catch (EndOfStreamException) {
                    if (!processed)
                    {
                        throw;
                    }
                    stream.Position = start_pos;
                    eos             = true;
                }
                catch (BadDataException) {
                    stream.Position = start_pos + 1;
                }
            }
            if (res.ContentHeader != null)
            {
                position =
                    res.ContentHeader.Position +
                    res.ContentHeader.Data.Length;
            }
            if (bodies.Count > 0)
            {
                res.Contents = new List <Content>();
                foreach (var body in bodies)
                {
                    MemoryStream s;
                    using (s = new MemoryStream()) {
                        body.Write(s);
                    }
                    var data = s.ToArray();
                    res.Contents.Add(new Content(position, data));
                    position += data.Length;
                }
            }
            return(res);
        }
Exemple #9
0
        private ParsedContent Parse(Uri uri, Stream contentStream)
        {
            var result = new ParsedContent();

            var document = new HtmlDocument();

            document.Load(contentStream);

            var robotsMetaNode = document.DocumentNode.SelectSingleNode("html/head/meta[@name=\"ROBOTS\"]");

            if (robotsMetaNode != null)
            {
                var robotsMetaContent = robotsMetaNode.GetAttributeValue("content", null);
                if (robotsMetaContent.IndexOf("noindex", StringComparison.InvariantCultureIgnoreCase) != -1)
                {
                    result.NoIndex = true;
                }
                if (robotsMetaContent.IndexOf("nofollow", StringComparison.InvariantCultureIgnoreCase) != -1)
                {
                    result.NoFollow = true;
                    return(result);
                }
            }

            var canonicalNode = document.DocumentNode.SelectSingleNode("html/head/link[@rel=\"canonical\"]");

            if (canonicalNode != null)
            {
                var canonicalHref = canonicalNode.GetAttributeValue("href", null);
                if (canonicalHref != null && Uri.TryCreate(canonicalHref, UriKind.Absolute, out var canonicalUri))
                {
                    result.CanonicalUri = canonicalUri;
                }
            }

            string baseHref = null;
            var    baseNode = document.DocumentNode.SelectSingleNode("html/head/base");

            if (baseNode != null)
            {
                baseHref = baseNode.GetAttributeValue("href", null);
            }

            var anchorNodes = document.DocumentNode.SelectNodes("//a");

            if (anchorNodes != null)
            {
                var crawledLinks = new List <CrawlLink>();
                foreach (var anchor in anchorNodes)
                {
                    var href = anchor.GetAttributeValue("href", null);
                    if (href == null)
                    {
                        continue;
                    }

                    var anchorLocation = uri.BuildUriFromHref(href, baseHref);
                    if (anchorLocation == null)
                    {
                        //Invalid links are ignored
                        continue;
                    }

                    crawledLinks.Add(new CrawlLink
                    {
                        Location     = anchorLocation,
                        Title        = anchor.GetAttributeValue("title", null),
                        Text         = anchor.InnerText,
                        Relationship = anchor.GetAttributeValue("rel", null),
                    });
                }
                result.Links = crawledLinks;
            }

            return(result);
        }
Exemple #10
0
        private void processSingleMessage(string folderName, Message inMessage)
        {
            ParsedPstMessage parsedMessage = new ParsedPstMessage()
            {
                FolderName = folderName,
            };

            try
            {
                parsedMessage.CreationTime     = convertPtypTimeToDateTime(inMessage.GetProperty(MAPIProperties.PidTagCreationTime).Value.Value.ToInt64());
                parsedMessage.ModificationTime = convertPtypTimeToDateTime(inMessage.GetProperty(MAPIProperties.PidTagLastModificationTime).Value.Value.ToInt64());
            }
            catch { }

            try
            {
                parsedMessage.Subject = inMessage.GetProperty(MAPIProperties.PidTagSubject).Value.Value.ToUnicode().Trim();
            }
            catch { }
            try
            {
                parsedMessage.Sender = inMessage.GetProperty(MAPIProperties.PidTagSenderEmailAddress).Value.Value.ToUnicode().Trim();
            }
            catch { }
            try
            {
                parsedMessage.Body = inMessage.GetProperty(MAPIProperties.PidTagBody).Value.Value.ToUnicode().Trim();
            }
            catch { }

            try
            {
                foreach (Recipient recipient in inMessage.GetRecipients())
                {
                    try
                    {
                        string recipientAddress = recipient.GetProperty(MAPIProperties.PidTagEmailAddress).Value.Value.ToUnicode();
                        parsedMessage.Recipients.Add(recipientAddress);
                    }
                    catch (Exception ex)
                    {
                        Output.AddLogEntry("recipient.GetProperty(): " + ex.Message, true);
                    }
                }
            }
            catch (Exception ex)
            {
                Output.AddLogEntry("message.GetRecipients(): " + ex.Message, true);
            }

            // TODO: reenable fetching of attachements when rest is working properly -->
            //try
            //{
            //    foreach (Attachment attachment in inMessage.GetAttachments())
            //    {
            //        try
            //        {
            //            string attFilename = attachment.GetProperty(MAPIProperties.PidTagAttachLongFilename).Value.Value.ToUnicode();
            //            parsedMessage.AttachmentNames.Add(attFilename);
            //        }
            //        catch (Exception ex)
            //        {
            //            log.Error(ex.Message);
            //            Errors.Add(ex.Message);
            //        }
            //    }
            //}
            //catch (Exception ex)
            //{
            //    updateLogAndJournal(null, "message.GetAttachments(): " + ex.Message, true);
            //}

            ParsedContent.Add(parsedMessage);
            //string filePart = $"{parsedMessage.Sender} - {parsedMessage.Subject}";
            //foreach (char invalidChar in System.IO.Path.GetInvalidFileNameChars())
            //{
            //    filePart = filePart.Replace(invalidChar, '_');
            //}
            //string outFile = $"{outDir}\\{filePart}";



            ////outFile = $"{outDir}\\{msgCounter++.ToString()}";
            //string outFileTxt = outFile + ".txt";
            //string outFilePdf = outFile + ".pdf";


            //string result = parsedMessage.MsgAsString;
            //File.WriteAllText(outFileTxt, result);
            //// TODO: reenable after test -->
            //converter.Convert(outFileTxt, outFilePdf);

            //if (!KeepIntermediateFiles)
            //{
            //    File.Delete(outFileTxt);
            //}

            ////extractAndConvertAttachements(inFile, outFile);
        }
Exemple #11
0
        public void BuildVariables(ParsedContent parsedContent)
        {
            Variables = new Dictionary <short, Variable>();
            ValueList = new List <ValueViewModel>();

            this.ValueList = new List <ValueViewModel>();
            foreach (Value value in parsedContent.ValuesList)
            {
                ValueViewModel valueViewModel = new ValueViewModel()
                {
                    Address        = value.Address,
                    AddressHex     = (short)(value.Address - parsedContent.BaseAddress + parsedContent.StartOfValues),
                    AddressHexBase = (short)(value.Address + parsedContent.StartOfValues),
                    DataType       = value.DataType,
                    Reference      = value.Reference,
                    IsMe           = value.IsMe,
                    IsPlayer       = value.IsPlayer
                };
                if (value.SubValues.Count > 0)
                {
                    if (valueViewModel.DataType == DataTypeType.Float)
                    {
                        valueViewModel.SubValue1 = BitConverter.ToSingle(BitConverter.GetBytes((Int32)(value.SubValues[0])), 0);
                    }
                    else
                    {
                        valueViewModel.SubValue1 = value.SubValues[0];
                    }
                }
                if (value.SubValues.Count > 1)
                {
                    valueViewModel.SubValue2 = value.SubValues[1];
                }
                if (value.SubValues.Count > 2)
                {
                    valueViewModel.SubValue3 = value.SubValues[2];
                }
                if (value.SubValues.Count > 3)
                {
                    valueViewModel.SubValue4 = value.SubValues[3];
                }
                if (value.SubValues.Count > 4)
                {
                    valueViewModel.SubValue5 = value.SubValues[4];
                }

                this.ValueList.Add(valueViewModel);


                //build variables list
                if (!Variables.ContainsKey(value.Address))
                {
                    Variable v = new Variable()
                    {
                        Address  = value.Address,
                        DataType = value.DataType.ToString(),
                        //Name = "var" + value.DataType.ToString() + value.Address.ToString()
                    };

                    if (value.IsMe ||
                        value.IsPlayer)
                    {
                        v.Used   = true;
                        v.Static = true;
                    }

                    switch (v.DataType.ToLower())
                    {
                    case ("int"):
                        v.Name = "nVar" + v.Address.ToString();
                        break;

                    case ("string"):
                        v.Name = "szVar" + v.Address.ToString();
                        break;

                    case ("point"):
                        v.Name   = "ptVar" + v.Address.ToString();
                        v.Static = false;     //points are never static
                        break;

                    case ("character"):
                        v.Name = "cVar" + v.Address.ToString();
                        break;

                    case ("float"):
                        v.Name = "fVar" + v.Address.ToString();
                        break;

                    case ("quaternion"):
                        v.Name = "qVar" + v.Address.ToString();
                        break;
                    }

                    if (FixTable.isStaticFix(parsedContent.ScriptName, v.Name))
                    {
                        v.Static = false;
                    }

                    Variables.Add(value.Address, v);
                }
            }

            //work out which variables are static or unused
            for (int i = 0; i < parsedContent.OpCodeList.Count; i++)
            {
                Operation operation = parsedContent.OpCodeList[i];
                if (operation.OpCode == OpCodeType.OP_GETTOP)
                {
                    if (Variables.ContainsKey(operation.DataIndex.Value))
                    {
                        Variables[operation.DataIndex.Value].Static = false;
                        Variables[operation.DataIndex.Value].Used   = true;
                    }
                }
                else if (operation.OpCode == OpCodeType.OP_PUSH)
                {
                    if (Variables.ContainsKey(operation.DataIndex.Value))
                    {
                        Variables[operation.DataIndex.Value].Used = true;
                    }
                }
            }
        }