public static void ReadSharedStrings(XmlNode sharedStrings, XmlRobloxFile file) { var error = CreateErrorHandler(nameof(ReadSharedStrings)); if (sharedStrings.Name != "SharedStrings") { throw error("Provided XmlNode's class must be 'SharedStrings'!"); } foreach (XmlNode sharedString in sharedStrings) { if (sharedString.Name == "SharedString") { XmlNode hashNode = sharedString.Attributes.GetNamedItem("md5"); if (hashNode == null) { throw error("Got a SharedString without an 'md5' attribute!"); } string key = hashNode.InnerText; string value = sharedString.InnerText.Replace("\n", ""); byte[] hash = Convert.FromBase64String(key); var record = SharedString.FromBase64(value); if (hash.Length != 16) { throw error($"SharedString base64 key '{key}' must align to byte[16]!"); } if (key != record.Key) { SharedString.Register(key, record.SharedValue); record.Key = key; } file.SharedStrings.Add(key); } } }