From a8f1f2c305c7721c2ad672e378a086511ad64136 Mon Sep 17 00:00:00 2001 From: "Joshua \"Yoshi\" Askharoun" Date: Sat, 29 Nov 2025 01:32:09 -0600 Subject: [PATCH] Implement symbols for XML elements --- UIXC/Commands/DebugCommand.cs | 26 +- UIXC/DebugSymbolResolver.cs | 24 +- UIXC/Properties/launchSettings.json | 4 +- libs/MicrosoftIris | 2 +- libs/UIX.Asm/UIX.Asm.csproj | 2 +- libs/UIX.DecompXml/Decompiler.Script.cs | 31 +- libs/UIX.DecompXml/Decompiler.cs | 36 +- libs/UIX.DecompXml/IrisTextWriter.cs | 76 ++ libs/UIX.DecompXml/IrisXmlWriter.cs | 100 +++ libs/UIX.DecompXml/XIrisScriptContent.cs | 16 + .../NOWPLAYINGMUSICBACKGROUND.UIX.fsym.json | 755 +----------------- 11 files changed, 254 insertions(+), 818 deletions(-) create mode 100644 libs/UIX.DecompXml/IrisTextWriter.cs create mode 100644 libs/UIX.DecompXml/IrisXmlWriter.cs create mode 100644 libs/UIX.DecompXml/XIrisScriptContent.cs diff --git a/UIXC/Commands/DebugCommand.cs b/UIXC/Commands/DebugCommand.cs index 09ea5a9..63d729b 100644 --- a/UIXC/Commands/DebugCommand.cs +++ b/UIXC/Commands/DebugCommand.cs @@ -1,4 +1,5 @@ using Microsoft.Iris.Debug; +using Microsoft.Iris.Debug.Symbols; using Microsoft.Iris.Debug.SystemNet; using Spectre.Console; using Spectre.Console.Cli; @@ -24,7 +25,7 @@ public class DebugCommand : Command if (settings.SymbolDir is not null) { Directory.CreateDirectory(settings.SymbolDir); - symbolResolver = new(settings.SymbolDir); + symbolResolver = new(settings.SymbolDir, settings.SourceDir); } AnsiConsole.MarkupLineInterpolated($"Connecting to '{settings.ServerUri}'..."); @@ -86,11 +87,26 @@ public class DebugCommand : Command var line = int.Parse(inputParts[2]); var column = int.Parse(inputParts[3]); - breakOffset = fsym!.OffsetByLineAndColumn(line, column); + var position = new SourcePosition(line, column); + + var location = fsym!.SourceMap.GetLocationFromPosition(position); + if (location is null) + { + AnsiConsole.MarkupLineInterpolated($"[red]Line {line}, column {column} has known offset in '{fileName}'.[/]"); + break; + } + + breakOffset = location.Value.Offset; + + if (fsym.HasSourceCode()) + { + var sourceCode = fsym.GetSourceSubstring(location.Value.Span); + AnsiConsole.Write(new Panel(sourceCode)); + } } - client.UpdateBreakpoint(new(path, breakOffset)); AnsiConsole.MarkupLineInterpolated($"[green]Breakpoint set in '{fileName}' at offset 0x{breakOffset:X4}.[/]"); + client.UpdateBreakpoint(new(path, breakOffset)); break; @@ -115,6 +131,10 @@ public class DebugCommand : Command [CommandOption("-s|--symbols ")] public string? SymbolDir { get; init; } + [Description("The directory containing source code.")] + [CommandOption("--sources ")] + public string? SourceDir { get; init; } + [Description("Whether to decompile the current file when a breakpoint is hit. Generated symbols will be written to the symbol directory if specified.")] [CommandOption("-d|--decompile")] public bool Decompile { get; init; } diff --git a/UIXC/DebugSymbolResolver.cs b/UIXC/DebugSymbolResolver.cs index 3220a2f..29ed5ec 100644 --- a/UIXC/DebugSymbolResolver.cs +++ b/UIXC/DebugSymbolResolver.cs @@ -2,15 +2,15 @@ namespace UIXC; -public class DebugSymbolResolver(string symbolDir) +public class DebugSymbolResolver(string symbolDir, string? sourceDir) { private readonly DirectoryInfo _symbolDir = new(symbolDir); + private readonly DirectoryInfo? _sourceDir = sourceDir is not null ? new(sourceDir) : null; public ApplicationDebugSymbols? GetForApplication(string application) { var fileName = $"{application}.asym.json"; - var asymFile = _symbolDir.EnumerateFiles() - .FirstOrDefault(f => f.Name == fileName); + var asymFile = FindFile(fileName, _symbolDir); if (asymFile is null) return null; @@ -23,13 +23,23 @@ public class DebugSymbolResolver(string symbolDir) public FileDebugSymbols? GetForFile(string file, string? application = null) { var fileName = $"{file}.fsym.json"; - var fsymFile = FindFile(fileName); + var fsymFile = FindFile(fileName, _symbolDir); if (fsymFile is not null) { using var stream = fsymFile.OpenRead(); using var reader = new StreamReader(stream); - return DebugSymbolsJsonParser.ParseForFile(reader.ReadToEnd()); + var fsym = DebugSymbolsJsonParser.ParseForFile(reader.ReadToEnd()); + + var sourceFile = FindFile(file, _sourceDir); + if (sourceFile is not null) + { + using var sourceStream = sourceFile.OpenRead(); + using var sourceReader = new StreamReader(sourceStream); + fsym.SetSourceCode(sourceReader.ReadToEnd()); + } + + return fsym; } if (application is null) @@ -42,9 +52,9 @@ public class DebugSymbolResolver(string symbolDir) return asym.Files.FirstOrDefault(f => f.CompiledFileName == file || f.SourceFileName == file); } - private FileInfo? FindFile(string fileName) + private static FileInfo? FindFile(string fileName, DirectoryInfo? dir) { - return _symbolDir + return dir? .EnumerateFiles() .FirstOrDefault(f => AreEquivalentFileNames(f.Name, fileName)); } diff --git a/UIXC/Properties/launchSettings.json b/UIXC/Properties/launchSettings.json index 2b7d99b..d1ba32f 100644 --- a/UIXC/Properties/launchSettings.json +++ b/UIXC/Properties/launchSettings.json @@ -3,11 +3,11 @@ "UIXC": { "commandName": "Project", - "commandLineArgs": "debug --symbols E:\\Repos\\ZuneDev\\ZuneUIXTools\\test\\syms", + //"commandLineArgs": "debug --symbols E:\\Repos\\ZuneDev\\ZuneUIXTools\\test\\syms --sources E:\\Repos\\ZuneDev\\ZuneUIXTools\\test", + "commandLineArgs": "decompile E:\\Documents\\REProj\\Zune\\Resources\\ZuneShellResources48\\NOWPLAYINGMUSICBACKGROUND.UIX -l xml -A ZuneShell.dll -A UIXControls.dll -A ZuneDBApi.dll -o E:\\Repos\\ZuneDev\\ZuneUIXTools\\test --symbols E:\\Repos\\ZuneDev\\ZuneUIXTools\\test\\syms", //"commandLineArgs": "decompile E:\\Documents\\REProj\\Zune\\Resources\\ZuneMarketplaceResources48\\MarketplaceData.schema.xml -l xml -A ZuneShell.dll -A UIXControls.dll -A ZuneDBApi.dll -o E:\\Repos\\ZuneDev\\ZuneUIXTools\\test", //"commandLineArgs": "decompile E:\\Documents\\REProj\\Zune\\Resources\\ZuneShellResources48\\DeviceLandElements.uix -l xml -A ZuneShell.dll -A UIXControls.dll -A ZuneDBApi.dll -o E:\\Repos\\ZuneDev\\ZuneUIXTools\\test", - //"commandLineArgs": "decompile E:\\Documents\\REProj\\Zune\\Resources\\ZuneShellResources48\\NOWPLAYINGMUSICBACKGROUND.UIX -l xml -A ZuneShell.dll -A UIXControls.dll -A ZuneDBApi.dll -o E:\\Repos\\ZuneDev\\ZuneUIXTools\\test --symbols E:\\Repos\\ZuneDev\\ZuneUIXTools\\test\\syms", //"commandLineArgs": "decompile E:\\Repos\\ZuneDev\\ZuneShell.dll\\libs\\MicrosoftIris\\UIXcontrols\\Resources\\RCDATA\\STYLES.UIX -l xml -A ZuneShell.dll -A UIXControls.dll -A ZuneDBApi.dll -o E:\\Repos\\ZuneDev\\ZuneShell.dll\\ZuneShell\\Resources\\RCDATA\\Dark\\Controls", //"commandLineArgs": "compile E:\\Repos\\ZuneDev\\ZuneUIXTools\\test\\ADDTOCOLLECTION.31_48.UIX -A ZuneShell.dll -A UIXControls.dll -A ZuneDBApi.dll -o E:\\Repos\\ZuneDev\\ZuneUIXTools\\test", //"commandLineArgs": "compile E:\\Documents\\REProj\\Zune\\Resources\\ZuneMarketplaceResources31\\MARKETPLACEDATA.SCHEMA.31_48.XML -A ZuneShell.dll -A UIXControls.dll -A ZuneDBApi.dll -o E:\\Repos\\ZuneDev\\ZuneUIXTools\\test", diff --git a/libs/MicrosoftIris b/libs/MicrosoftIris index 2f293ec..453a8e8 160000 --- a/libs/MicrosoftIris +++ b/libs/MicrosoftIris @@ -1 +1 @@ -Subproject commit 2f293ec6dde4bee43e6d1898e12bb5b628e58d29 +Subproject commit 453a8e8b2939a6e259f343b12101bf5e175aac72 diff --git a/libs/UIX.Asm/UIX.Asm.csproj b/libs/UIX.Asm/UIX.Asm.csproj index f8d7049..e17d950 100644 --- a/libs/UIX.Asm/UIX.Asm.csproj +++ b/libs/UIX.Asm/UIX.Asm.csproj @@ -33,7 +33,7 @@ runtime; build; native; contentfiles; analyzers - + diff --git a/libs/UIX.DecompXml/Decompiler.Script.cs b/libs/UIX.DecompXml/Decompiler.Script.cs index e32cb6e..b1077c2 100644 --- a/libs/UIX.DecompXml/Decompiler.Script.cs +++ b/libs/UIX.DecompXml/Decompiler.Script.cs @@ -615,34 +615,17 @@ partial class Decompiler return SyntaxTree(root); } - public string FormatInlineExpression(ExpressionSyntax expr, CancellationToken token = default) => '{' + FormatSyntaxNode(expr, token) + '}'; + public static string FormatInlineExpression(ExpressionSyntax expr, CancellationToken token = default) => '{' + FormatSyntaxNode(expr, token) + '}'; - public string FormatScript(SyntaxTree tree, CancellationToken token = default) => FormatSyntaxNode(tree.GetRoot(token), token); + public static string FormatScript(SyntaxTree tree, CancellationToken token = default) => FormatSyntaxNode(tree.GetRoot(token), token); - public string FormatSyntaxNode(SyntaxNode root, CancellationToken cancellationToken = default) + public static string FormatSyntaxNode(SyntaxNode root, CancellationToken cancellationToken = default) { - uint? scriptOffset = null; - - root = root.NormalizeWhitespace(); - - foreach (var node in root.GetAnnotatedNodes(UIBOffsetAnnotation.Kind)) - { - var offsetAnnotation = node.GetAnnotations(UIBOffsetAnnotation.Kind).Single(); - var offset = UIBOffsetAnnotation.GetOffset(offsetAnnotation); - - var location = node.GetLocation(); - - //debugSymbols.SourceMap[offset] = new(location.SourceSpan.Start, location.SourceSpan.End); - - if (scriptOffset is null && node is CompilationUnitSyntax) - scriptOffset = offset; - } - - var sourceText = root + return root + .NormalizeWhitespace() .SyntaxTree - .GetText(cancellationToken); - - return sourceText.ToString(); + .GetText(cancellationToken) + .ToString(); } private bool TryDecompileExpression(Instruction instruction, Stack stack, ControlFlowAnalyzer cfa = null) diff --git a/libs/UIX.DecompXml/Decompiler.cs b/libs/UIX.DecompXml/Decompiler.cs index 08f8b27..4b17402 100644 --- a/libs/UIX.DecompXml/Decompiler.cs +++ b/libs/UIX.DecompXml/Decompiler.cs @@ -100,28 +100,28 @@ public partial class Decompiler foreach (var syntaxTree in _context.GetScriptContents(export)) { - var scriptText = FormatScript(syntaxTree); - XElement xScript = new(_nsUix + "Script", new XCData(Environment.NewLine + scriptText + Environment.NewLine)); + XElement xScript = new(_nsUix + "Script", new XIrisScriptContent(syntaxTree.GetRoot())); xScripts.Add(xScript); } if (!xScripts.HasElements) xScripts.Remove(); - List methodsContent = []; + List methodsContent = []; foreach (var method in export.Methods.OfType()) { var methodSyntax = DecompileMethodDeclaration(method, export); - methodsContent.Add(FormatSyntaxNode(methodSyntax)); + methodsContent.Add(methodSyntax); } if (methodsContent.Count > 0) { - var methodsContentStr = Environment.NewLine - + string.Join(Environment.NewLine + Environment.NewLine, methodsContent) - + Environment.NewLine; - XElement xMethods = new(_nsUix + "Methods", new XCData(methodsContentStr)); + var methodsSyntax = CodeAnalysis.CSharp.SyntaxFactory + .CompilationUnit() + .AddMembers([.. methodsContent]); + + XElement xMethods = new(_nsUix + "Methods", new XIrisScriptContent(methodsSyntax)); xExport.Add(xMethods); } @@ -147,25 +147,9 @@ public partial class Decompiler { var xmlDoc = Decompile(); - XmlWriterSettings writerSettings = new() - { - Indent = true, - NamespaceHandling = NamespaceHandling.OmitDuplicates, - Encoding = Encoding.UTF8, - }; + using IrisXmlWriter writer = new(xmlDoc, generateDebugSymbols ? DebugSymbols : null); - StringBuilder sb = new(); - using (XmlWriter writer = XmlWriter.Create(sb, writerSettings)) - { - xmlDoc.WriteTo(writer); - } - - var xmlStr = sb.ToString(); - - if (generateDebugSymbols) - PopulateDebugSymbolsWithXml(xmlDoc, xmlStr); - - return xmlStr; + return writer.WriteToString(); } public void PopulateDebugSymbolsWithXml(XDocument xmlDoc, string xmlStr) diff --git a/libs/UIX.DecompXml/IrisTextWriter.cs b/libs/UIX.DecompXml/IrisTextWriter.cs new file mode 100644 index 0000000..58850ac --- /dev/null +++ b/libs/UIX.DecompXml/IrisTextWriter.cs @@ -0,0 +1,76 @@ +using Microsoft.Iris.Debug.Symbols; +using System; +using System.IO; + +namespace Microsoft.Iris.DecompXml; + +internal class IrisTextWriter : StringWriter +{ + private int _currentLineIndex, _currentColumnIndex; + + public SourcePosition Position => new(_currentLineIndex + 1, _currentColumnIndex + 1); + + public override void Write(char[] buffer, int index, int count) + { + UpdatePosition(buffer.AsSpan(index, count)); + base.Write(buffer, index, count); + } + + public override void Write(string value) + { + if (value is not null) + UpdatePosition(value.AsSpan()); + + base.Write(value); + } + +#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER + public override void Write(ReadOnlySpan buffer) + { + UpdatePosition(buffer); + base.Write(buffer); + } +#endif + + private void UpdatePosition(ReadOnlySpan buffer) + { + int lastNewLineIndex = 0; + for (int c = 0; c < buffer.Length;) + { + if (!IsAtNewLine(buffer, c)) + { + ++c; + continue; + } + + c += NewLine.Length; + IncrementLine(); + lastNewLineIndex = c; + } + + _currentColumnIndex += buffer.Length - lastNewLineIndex; + } + + private bool IsAtNewLine(ReadOnlySpan buffer, int index) + { + for (int n = 0; n < NewLine.Length; ++n) + { + var b = n + index; + if (b >= buffer.Length) + return false; + + var nch = NewLine[n]; + var bch = buffer[b]; + if (nch != bch) + return false; + } + + return true; + } + + private void IncrementLine() + { + ++_currentLineIndex; + _currentColumnIndex = 0; + } +} diff --git a/libs/UIX.DecompXml/IrisXmlWriter.cs b/libs/UIX.DecompXml/IrisXmlWriter.cs new file mode 100644 index 0000000..474325e --- /dev/null +++ b/libs/UIX.DecompXml/IrisXmlWriter.cs @@ -0,0 +1,100 @@ +using Microsoft.Iris.Debug.Symbols; +using System; +using System.Runtime.InteropServices; +using System.Text; +using System.Xml; +using System.Xml.Linq; + +namespace Microsoft.Iris.DecompXml; + +internal class IrisXmlWriter : IDisposable +{ + private readonly IrisTextWriter _textWriter; + private readonly XmlWriter _xmlWriter; + private readonly XDocument _xDoc; + private readonly FileDebugSymbols _symbols; + + public IrisXmlWriter(XDocument xDoc, FileDebugSymbols symbols) + { + _xDoc = xDoc; + _symbols = symbols; + + _textWriter = new(); + _xmlWriter = XmlWriter.Create(_textWriter, new XmlWriterSettings + { + Indent = true, + NamespaceHandling = NamespaceHandling.OmitDuplicates, + Encoding = Encoding.UTF8, + }); + } + + public void Dispose() => _xmlWriter.Dispose(); + + public string WriteToString() + { + Write(); + return _textWriter.ToString(); + } + + private void Write() + { + if (_symbols is null) + { + // If we're not generating symbols, there's no reason to + // use our custom implementation. + _xDoc.WriteTo(_xmlWriter); + _xmlWriter.Flush(); + return; + } + + _xmlWriter.WriteStartDocument(); + + foreach (var node in _xDoc.Nodes()) + WriteXObject(node); + + _xmlWriter.WriteEndDocument(); + _xmlWriter.Flush(); + } + + private void WriteXObject(XObject obj) + { + _xmlWriter.Flush(); + var startPos = _textWriter.Position; + + if (obj is XElement element) + { + _xmlWriter.WriteStartElement(element.Name.LocalName, element.Name.NamespaceName); + + foreach (var attribute in element.Attributes()) + WriteXObject(attribute); + + foreach (var childNode in element.Nodes()) + WriteXObject(childNode); + + _xmlWriter.WriteEndElement(); + } + else if (obj is XIrisScriptContent script) + { + _xmlWriter.WriteCData(script.Value); + } + else if (obj is XCData cdata) + { + _xmlWriter.WriteCData(cdata.Value); + } + else if (obj is XAttribute attribute) + { + _xmlWriter.WriteAttributeString(attribute.Name.LocalName, attribute.Name.NamespaceName, attribute.Value); + } + + + var offset = obj.GetOffset(); + if (offset is not null) + { + _xmlWriter.Flush(); + var endPos = _textWriter.Position; + + var span = new SourceSpan(startPos, endPos); + _symbols.SourceMap.Xml[offset.Value] = span; + } + } +} diff --git a/libs/UIX.DecompXml/XIrisScriptContent.cs b/libs/UIX.DecompXml/XIrisScriptContent.cs new file mode 100644 index 0000000..62e554d --- /dev/null +++ b/libs/UIX.DecompXml/XIrisScriptContent.cs @@ -0,0 +1,16 @@ +using Microsoft.CodeAnalysis; +using System; +using System.Xml.Linq; + +namespace Microsoft.Iris.DecompXml; + +internal class XIrisScriptContent : XCData +{ + public SyntaxNode Syntax { get; } + + public XIrisScriptContent(SyntaxNode syntax) : base("") + { + Syntax = syntax.NormalizeWhitespace(); + Value = $"{Environment.NewLine}{Syntax.GetText()}{Environment.NewLine}"; + } +} diff --git a/test/syms/NOWPLAYINGMUSICBACKGROUND.UIX.fsym.json b/test/syms/NOWPLAYINGMUSICBACKGROUND.UIX.fsym.json index 8aa251c..43d1db2 100644 --- a/test/syms/NOWPLAYINGMUSICBACKGROUND.UIX.fsym.json +++ b/test/syms/NOWPLAYINGMUSICBACKGROUND.UIX.fsym.json @@ -1,754 +1 @@ -{ - "OriginalFileName": null, - "CompiledFileName": "file://E:\\Documents\\REProj\\Zune\\Resources\\ZuneShellResources48\\NOWPLAYINGMUSICBACKGROUND.UIX", - "SourceFileName": null, - "SourceMap": { - "Xml": { - "9": [ - "5:8", - "5:72" - ], - "1253": [ - "10:8", - "10:100" - ], - "1267": [ - "11:8", - "11:86" - ], - "1428": [ - "14:8", - "14:122" - ], - "1439": [ - "15:8", - "15:152" - ], - "1444": [ - "16:8", - "16:131" - ], - "1470": [ - "17:8", - "17:78" - ], - "1479": [ - "18:8", - "18:101" - ], - "1485": [ - "19:8", - "19:100" - ], - "1490": [ - "20:8", - "20:90" - ], - "1498": [ - "21:8", - "21:74" - ], - "1506": [ - "22:8", - "22:74" - ], - "1514": [ - "23:8", - "23:88" - ], - "1522": [ - "24:8", - "24:179" - ], - "1424": [ - "141:6", - "153:11" - ], - "1276": [ - "142:8", - "152:9" - ], - "1302": [ - "144:12", - "144:68" - ], - "1305": [ - "147:12", - "147:193" - ], - "1326": [ - "148:12", - "148:307" - ], - "1376": [ - "149:12", - "149:187" - ], - "1406": [ - "150:12", - "150:92" - ], - "1631": [ - "157:8", - "163:15" - ], - "1655": [ - "158:10", - "162:11" - ], - "1675": [ - "164:8", - "164:102" - ], - "1768": [ - "186:6", - "197:11" - ], - "1681": [ - "187:8", - "196:9" - ], - "1690": [ - "189:12", - "193:43" - ], - "1738": [ - "190:14", - "192:15" - ], - "1711": [ - "191:16", - "191:129" - ], - "1747": [ - "194:12", - "194:170" - ], - "1785": [ - "204:8", - "204:73" - ], - "2909": [ - "213:8", - "213:80" - ], - "2924": [ - "214:8", - "214:83" - ], - "2939": [ - "215:8", - "215:89" - ], - "2954": [ - "216:8", - "216:95" - ], - "2968": [ - "217:8", - "217:86" - ], - "3029": [ - "220:8", - "230:25" - ], - "3266": [ - "221:10", - "229:10" - ], - "3277": [ - "231:8", - "231:91" - ], - "3282": [ - "232:8", - "232:70" - ], - "3290": [ - "233:8", - "233:103" - ], - "3310": [ - "234:8", - "234:120" - ], - "3321": [ - "235:8", - "235:131" - ], - "3025": [ - "347:6", - "359:11" - ], - "2977": [ - "348:8", - "358:9" - ], - "2980": [ - "350:12", - "350:110" - ], - "3001": [ - "351:12", - "356:8" - ], - "3013": [ - "353:16", - "353:125" - ], - "3019": [ - "354:16", - "354:127" - ], - "3956": [ - "364:8", - "364:102" - ], - "4701": [ - "367:8", - "367:118" - ], - "4709": [ - "368:8", - "368:122" - ], - "4718": [ - "369:8", - "369:110" - ], - "4723": [ - "370:8", - "370:72" - ], - "4731": [ - "371:8", - "371:154" - ], - "4697": [ - "446:6", - "524:11" - ], - "3962": [ - "447:8", - "523:9" - ], - "3983": [ - "449:12", - "468:9" - ], - "4011": [ - "450:14", - "452:15" - ], - "3992": [ - "451:16", - "451:103" - ], - "4014": [ - "454:16", - "466:11" - ], - "4050": [ - "456:20", - "456:136" - ], - "4056": [ - "457:20", - "457:125" - ], - "4059": [ - "460:20", - "464:9" - ], - "4074": [ - "462:24", - "462:268" - ], - "4137": [ - "469:12", - "521:9" - ], - "4155": [ - "471:16", - "471:136" - ], - "4161": [ - "472:16", - "472:140" - ], - "4167": [ - "473:16", - "473:122" - ], - "4173": [ - "474:16", - "474:103" - ], - "4203": [ - "476:14", - "478:15" - ], - "4176": [ - "477:16", - "477:137" - ], - "4206": [ - "480:16", - "484:15" - ], - "4246": [ - "481:18", - "483:15" - ], - "4227": [ - "482:20", - "482:96" - ], - "4255": [ - "485:16", - "489:15" - ], - "4295": [ - "486:18", - "488:15" - ], - "4276": [ - "487:20", - "487:103" - ], - "4304": [ - "490:16", - "494:15" - ], - "4344": [ - "491:18", - "493:15" - ], - "4325": [ - "492:20", - "492:103" - ], - "4353": [ - "495:16", - "499:11" - ], - "4427": [ - "496:18", - "498:15" - ], - "4380": [ - "497:20", - "497:210" - ], - "4433": [ - "500:16", - "504:11" - ], - "4507": [ - "501:18", - "503:15" - ], - "4460": [ - "502:20", - "502:210" - ], - "4513": [ - "505:16", - "509:11" - ], - "4587": [ - "506:18", - "508:15" - ], - "4540": [ - "507:20", - "507:210" - ], - "4593": [ - "510:16", - "519:9" - ], - "4631": [ - "511:18", - "513:15" - ], - "4612": [ - "512:20", - "512:105" - ], - "4634": [ - "515:20", - "515:175" - ], - "4655": [ - "516:20", - "516:177" - ], - "4676": [ - "517:20", - "517:151" - ], - "4958": [ - "528:8", - "528:155" - ], - "4972": [ - "529:8", - "529:72" - ], - "4992": [ - "530:8", - "530:121" - ], - "5009": [ - "531:8", - "531:128" - ], - "5026": [ - "532:8", - "532:124" - ], - "5043": [ - "533:8", - "533:92" - ], - "5060": [ - "534:8", - "534:96" - ], - "5066": [ - "537:8", - "537:154" - ], - "5257": [ - "567:8", - "567:163" - ], - "5271": [ - "568:8", - "568:72" - ], - "5291": [ - "569:8", - "569:122" - ], - "5308": [ - "570:8", - "570:129" - ], - "5325": [ - "571:8", - "571:125" - ], - "5342": [ - "572:8", - "572:112" - ], - "5359": [ - "573:8", - "573:96" - ], - "5366": [ - "576:8", - "576:110" - ], - "5371": [ - "577:8", - "577:132" - ], - "5398": [ - "602:8", - "602:96" - ], - "5415": [ - "603:8", - "603:120" - ], - "5432": [ - "604:8", - "604:130" - ], - "5449": [ - "605:8", - "605:134" - ], - "5466": [ - "606:8", - "606:118" - ], - "5483": [ - "607:8", - "607:128" - ], - "5500": [ - "608:8", - "608:132" - ], - "5517": [ - "609:8", - "609:118" - ], - "5534": [ - "610:8", - "610:128" - ], - "5551": [ - "611:8", - "611:132" - ], - "6903": [ - "617:8", - "617:160" - ], - "7011": [ - "620:8", - "620:70" - ], - "7019": [ - "621:8", - "621:130" - ], - "7027": [ - "622:8", - "622:152" - ], - "7041": [ - "623:8", - "623:152" - ], - "7046": [ - "624:8", - "624:86" - ], - "7054": [ - "625:8", - "625:84" - ], - "7062": [ - "626:8", - "626:70" - ], - "7070": [ - "627:8", - "627:78" - ], - "7078": [ - "628:8", - "633:22" - ], - "7096": [ - "629:10", - "632:11" - ], - "7104": [ - "634:8", - "634:70" - ], - "7115": [ - "635:8", - "635:96" - ], - "7149": [ - "636:8", - "636:229" - ], - "7154": [ - "637:8", - "637:72" - ], - "7162": [ - "638:8", - "638:126" - ], - "7188": [ - "639:8", - "639:81" - ], - "7199": [ - "640:8", - "640:90" - ], - "7207": [ - "641:8", - "641:93" - ], - "7007": [ - "738:6", - "749:11" - ], - "6944": [ - "739:8", - "748:9" - ], - "6947": [ - "741:12", - "741:73" - ], - "6959": [ - "742:12", - "746:12" - ], - "6995": [ - "743:14", - "745:11" - ], - "6974": [ - "744:16", - "744:119" - ], - "7393": [ - "753:8", - "753:196" - ], - "7416": [ - "754:8", - "754:180" - ], - "7389": [ - "762:6", - "769:11" - ], - "7350": [ - "763:8", - "768:11" - ], - "7380": [ - "765:12", - "765:116" - ], - "7386": [ - "766:12", - "766:117" - ], - "8105": [ - "778:8", - "778:98" - ], - "8329": [ - "781:8", - "781:130" - ], - "8337": [ - "782:8", - "782:286" - ], - "8385": [ - "783:8", - "783:285" - ], - "8433": [ - "784:8", - "784:287" - ], - "8481": [ - "785:8", - "790:13" - ], - "8490": [ - "787:12", - "787:82" - ], - "8508": [ - "788:12", - "788:82" - ], - "8531": [ - "791:8", - "791:72" - ], - "8540": [ - "792:8", - "792:107" - ], - "8545": [ - "793:8", - "793:127" - ], - "8325": [ - "878:6", - "911:11" - ], - "8111": [ - "879:8", - "910:9" - ], - "8145": [ - "881:12", - "886:19" - ], - "8163": [ - "883:16", - "883:123" - ], - "8171": [ - "884:16", - "884:105" - ], - "8179": [ - "887:12", - "891:19" - ], - "8197": [ - "889:16", - "889:134" - ], - "8205": [ - "894:12", - "894:140" - ], - "8241": [ - "895:12", - "908:11" - ], - "8270": [ - "897:16", - "901:19" - ], - "8288": [ - "899:20", - "899:150" - ], - "8296": [ - "902:16", - "906:19" - ], - "8314": [ - "904:20", - "904:148" - ], - "8941": [ - "915:8", - "915:92" - ], - "8958": [ - "916:8", - "916:95" - ], - "8975": [ - "917:8", - "917:93" - ], - "8992": [ - "918:8", - "918:86" - ], - "9001": [ - "921:8", - "921:78" - ], - "9006": [ - "922:8", - "922:109" - ], - "9018": [ - "923:8", - "923:89" - ], - "9026": [ - "924:8", - "924:152" - ] - }, - "Script": {} - } -} \ No newline at end of file +{"OriginalFileName":null,"CompiledFileName":"file://E:\\Documents\\REProj\\Zune\\Resources\\ZuneShellResources48\\NOWPLAYINGMUSICBACKGROUND.UIX","SourceFileName":null,"SourceMap":{"Xml":{"9":["4:16","5:33"],"1253":["9:16","10:64"],"1267":["10:64","11:47"],"1428":["13:12","14:62"],"1439":["14:62","15:116"],"1450":["16:39","16:55"],"1456":["16:55","16:74"],"1462":["16:74","16:89"],"1444":["15:116","16:92"],"1470":["16:92","17:39"],"1479":["17:39","18:62"],"1485":["18:62","19:61"],"1490":["19:61","20:51"],"1498":["20:51","21:35"],"1506":["21:35","22:35"],"1514":["22:35","23:49"],"1522":["23:49","24:97"],"1282":["142:13","142:27"],"1302":["143:20","144:33"],"1311":["147:47","147:64"],"1317":["147:64","147:112"],"1305":["146:18","147:115"],"1332":["148:52","148:74"],"1338":["148:74","148:90"],"1344":["148:90","148:104"],"1355":["148:104","148:140"],"1361":["148:140","148:192"],"1367":["148:192","148:226"],"1326":["147:115","148:229"],"1382":["149:19","149:37"],"1388":["149:37","149:84"],"1394":["149:84","149:117"],"1400":["149:117","149:149"],"1376":["148:229","149:152"],"1412":["150:19","150:38"],"1418":["150:38","150:54"],"1406":["149:152","150:57"],"1276":["141:13","152:15"],"1424":["140:15","153:15"],"1655":["157:36","162:19"],"1631":["156:16","163:21"],"1675":["163:21","164:63"],"1687":["187:13","187:27"],"1696":["189:51","189:67"],"1702":["189:67","189:91"],"1708":["189:91","189:139"],"1719":["191:31","191:51"],"1727":["191:51","191:72"],"1735":["191:72","191:95"],"1711":["190:25","191:98"],"1738":["189:139","192:27"],"1690":["188:18","193:53"],"1753":["194:50","194:65"],"1759":["194:65","194:89"],"1747":["193:53","194:92"],"1681":["186:13","196:15"],"1768":["185:15","197:15"],"1785":["203:60","204:34"],"2909":["212:69","213:41"],"2924":["213:41","214:44"],"2939":["214:44","215:50"],"2954":["215:50","216:56"],"2968":["216:56","217:47"],"3266":["220:54","229:18"],"3029":["219:12","230:31"],"3277":["230:31","231:52"],"3282":["231:52","232:31"],"3296":["233:26","233:45"],"3302":["233:45","233:61"],"3290":["232:31","233:64"],"3310":["233:64","234:58"],"3321":["234:58","235:67"],"2986":["350:23","350:40"],"2992":["350:40","350:76"],"2980":["349:18","350:79"],"3007":["351:16","351:28"],"3013":["352:24","353:94"],"3019":["353:94","354:96"],"3001":["350:79","356:18"],"2977":["347:13","358:15"],"3025":["346:15","359:15"],"3956":["363:58","364:63"],"4701":["366:12","367:59"],"4709":["367:59","368:62"],"4718":["368:62","369:74"],"4723":["369:74","370:33"],"4731":["370:33","371:102"],"3968":["447:13","447:25"],"3974":["447:25","447:39"],"3980":["447:39","447:60"],"3989":["449:17","449:38"],"4000":["451:31","451:47"],"4008":["451:47","451:69"],"3992":["450:25","451:72"],"4011":["449:38","452:27"],"4020":["454:23","454:45"],"4026":["454:45","454:91"],"4032":["454:91","454:121"],"4038":["454:121","454:150"],"4044":["454:150","454:175"],"4050":["455:28","456:109"],"4056":["456:109","457:98"],"4065":["460:25","460:51"],"4071":["460:51","460:63"],"4080":["462:31","462:47"],"4086":["462:47","462:74"],"4092":["462:74","462:87"],"4098":["462:87","462:106"],"4104":["462:106","462:138"],"4110":["462:138","462:165"],"4116":["462:165","462:188"],"4122":["462:188","462:242"],"4074":["461:30","462:245"],"4059":["459:26","464:27"],"4014":["453:22","466:25"],"3983":["448:18","468:19"],"4143":["469:17","469:34"],"4149":["469:34","469:50"],"4155":["470:24","471:105"],"4161":["471:105","472:109"],"4167":["472:109","473:91"],"4173":["473:91","474:72"],"4184":["477:31","477:57"],"4192":["477:57","477:82"],"4200":["477:82","477:103"],"4176":["476:25","477:106"],"4203":["475:26","478:27"],"4212":["480:27","480:45"],"4218":["480:45","480:98"],"4224":["480:98","480:128"],"4235":["482:35","482:51"],"4243":["482:51","482:66"],"4227":["481:29","482:69"],"4246":["480:128","483:31"],"4206":["479:22","484:29"],"4261":["485:27","485:45"],"4267":["485:45","485:100"],"4273":["485:100","485:130"],"4284":["487:35","487:51"],"4292":["487:51","487:73"],"4276":["486:29","487:76"],"4295":["485:130","488:31"],"4255":["484:29","489:29"],"4310":["490:27","490:45"],"4316":["490:45","490:99"],"4322":["490:99","490:129"],"4333":["492:35","492:51"],"4341":["492:51","492:73"],"4325":["491:29","492:76"],"4344":["490:129","493:31"],"4304":["489:29","494:29"],"4359":["495:23","495:43"],"4365":["495:43","495:86"],"4371":["495:86","495:100"],"4377":["495:100","495:112"],"4388":["497:37","497:60"],"4396":["497:60","497:84"],"4404":["497:84","497:103"],"4412":["497:103","497:125"],"4418":["497:125","497:153"],"4424":["497:153","497:180"],"4380":["496:29","497:183"],"4427":["495:112","498:31"],"4353":["494:29","499:25"],"4439":["500:23","500:42"],"4445":["500:42","500:85"],"4451":["500:85","500:99"],"4457":["500:99","500:111"],"4468":["502:37","502:60"],"4476":["502:60","502:84"],"4484":["502:84","502:103"],"4492":["502:103","502:125"],"4498":["502:125","502:153"],"4504":["502:153","502:180"],"4460":["501:29","502:183"],"4507":["500:111","503:31"],"4433":["499:25","504:25"],"4519":["505:23","505:42"],"4525":["505:42","505:85"],"4531":["505:85","505:99"],"4537":["505:99","505:111"],"4548":["507:37","507:60"],"4556":["507:60","507:84"],"4564":["507:84","507:103"],"4572":["507:103","507:125"],"4578":["507:125","507:153"],"4584":["507:153","507:180"],"4540":["506:29","507:183"],"4587":["505:111","508:31"],"4513":["504:25","509:25"],"4599":["510:21","510:45"],"4609":["510:45","510:80"],"4620":["512:35","512:54"],"4628":["512:54","512:75"],"4612":["511:29","512:78"],"4631":["510:80","513:31"],"4640":["515:59","515:80"],"4646":["515:80","515:102"],"4634":["514:26","515:105"],"4661":["516:60","516:82"],"4667":["516:82","516:104"],"4655":["515:105","516:107"],"4682":["517:58","517:78"],"4676":["516:107","517:81"],"4593":["509:25","519:23"],"4137":["468:19","521:19"],"3962":["446:13","523:15"],"4697":["445:15","524:15"],"4958":["527:16","528:116"],"4972":["528:116","529:36"],"4992":["529:36","530:82"],"5009":["530:82","531:89"],"5026":["531:89","532:85"],"5043":["532:85","533:53"],"5060":["533:53","534:57"],"5066":["536:12","537:102"],"5257":["566:16","567:124"],"5271":["567:124","568:36"],"5291":["568:36","569:83"],"5308":["569:83","570:90"],"5325":["570:90","571:86"],"5342":["571:86","572:73"],"5359":["572:73","573:57"],"5366":["575:12","576:74"],"5371":["576:74","577:70"],"5398":["601:16","602:57"],"5415":["602:57","603:81"],"5432":["603:81","604:91"],"5449":["604:91","605:95"],"5466":["605:95","606:79"],"5483":["606:79","607:89"],"5500":["607:89","608:93"],"5517":["608:93","609:79"],"5534":["609:79","610:89"],"5551":["610:89","611:93"],"6911":["617:44","617:60"],"6919":["617:60","617:81"],"6927":["617:81","617:96"],"6935":["617:96","617:118"],"6903":["616:58","617:121"],"7011":["619:12","620:31"],"7019":["620:31","621:52"],"7027":["621:52","622:70"],"7041":["622:70","623:116"],"7046":["623:116","624:47"],"7054":["624:47","625:45"],"7062":["625:45","626:31"],"7070":["626:31","627:39"],"7096":["628:43","632:19"],"7078":["627:39","633:28"],"7104":["633:28","634:31"],"7115":["634:31","635:57"],"7149":["635:57","636:190"],"7154":["636:190","637:33"],"7168":["638:35","638:51"],"7174":["638:51","638:69"],"7180":["638:69","638:84"],"7162":["637:33","638:87"],"7188":["638:87","639:45"],"7199":["639:45","640:51"],"7207":["640:51","641:54"],"6953":["741:16","741:35"],"6947":["740:18","741:38"],"6965":["742:20","742:40"],"6971":["742:40","742:54"],"7001":["742:54","742:86"],"6983":["744:21","744:53"],"6992":["744:53","744:85"],"6974":["743:21","744:88"],"6995":["742:86","745:23"],"6959":["741:38","746:22"],"6944":["738:13","748:15"],"7007":["737:14","749:15"],"7399":["753:64","753:106"],"7405":["753:106","753:129"],"7393":["752:12","753:132"],"7422":["754:79","754:111"],"7416":["753:132","754:114"],"7356":["763:15","763:33"],"7362":["763:33","763:65"],"7368":["763:65","763:89"],"7374":["763:89","763:132"],"7380":["764:20","765:81"],"7386":["765:81","766:82"],"7350":["762:13","768:17"],"7389":["761:15","769:15"],"8105":["777:98","778:62"],"8329":["780:12","781:52"],"8371":["782:52","782:192"],"8377":["782:192","782:244"],"8337":["781:52","782:247"],"8419":["783:49","783:189"],"8425":["783:189","783:243"],"8385":["782:247","783:246"],"8467":["784:50","784:190"],"8473":["784:190","784:245"],"8433":["783:246","784:248"],"8487":["785:43","785:55"],"8496":["787:25","787:34"],"8502":["787:34","787:44"],"8490":["786:19","787:47"],"8514":["788:25","788:34"],"8520":["788:34","788:44"],"8508":["787:47","788:47"],"8481":["784:248","790:19"],"8531":["790:19","791:33"],"8540":["791:33","792:51"],"8545":["792:51","793:61"],"8117":["879:13","879:30"],"8123":["879:30","879:42"],"8129":["879:42","879:56"],"8135":["879:56","879:82"],"8142":["879:82","879:123"],"8151":["881:27","881:39"],"8157":["881:39","881:64"],"8163":["882:21","883:92"],"8171":["883:92","884:74"],"8145":["880:20","886:29"],"8185":["887:27","887:39"],"8191":["887:39","887:64"],"8197":["888:21","889:103"],"8179":["886:29","891:29"],"8211":["894:17","894:33"],"8217":["894:33","894:47"],"8223":["894:47","894:63"],"8229":["894:63","894:89"],"8235":["894:89","894:102"],"8205":["893:18","894:105"],"8247":["895:19","895:35"],"8253":["895:35","895:67"],"8259":["895:67","895:100"],"8263":["895:100","895:124"],"8267":["895:124","895:144"],"8276":["897:31","897:56"],"8282":["897:56","897:81"],"8288":["898:25","899:123"],"8270":["896:24","901:33"],"8302":["902:31","902:56"],"8308":["902:56","902:81"],"8314":["903:25","904:121"],"8296":["901:33","906:33"],"8241":["894:105","908:21"],"8111":["878:13","910:15"],"8325":["877:14","911:15"],"8941":["914:16","915:53"],"8958":["915:53","916:56"],"8975":["916:56","917:54"],"8992":["917:54","918:47"],"9001":["920:12","921:39"],"9006":["921:39","922:53"],"9018":["922:53","923:50"],"9026":["923:50","924:116"]},"Script":{}}} \ No newline at end of file