Merge branch 'master' of /home/opensim/var/repo/opensim
commit
800fae41c7
|
@ -205,3 +205,4 @@ In addition, we would like to thank:
|
|||
* The Mono Project
|
||||
* The NANT Developers
|
||||
* Microsoft (.NET, MSSQL-Adapters)
|
||||
*x
|
||||
|
|
|
@ -241,11 +241,15 @@ namespace OpenSim.Framework
|
|||
|
||||
m_textureEntry = prim.Textures.GetBytes();
|
||||
|
||||
if (prim.Sculpt != null)
|
||||
{
|
||||
SculptEntry = (prim.Sculpt.Type != OpenMetaverse.SculptType.None);
|
||||
SculptData = prim.Sculpt.GetBytes();
|
||||
SculptTexture = prim.Sculpt.SculptTexture;
|
||||
SculptType = (byte)prim.Sculpt.Type;
|
||||
}
|
||||
else SculptType = (byte)OpenMetaverse.SculptType.None;
|
||||
}
|
||||
|
||||
[XmlIgnore]
|
||||
public Primitive.TextureEntry Textures
|
||||
|
|
|
@ -356,7 +356,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[BASE HTTP SERVER]: OnRequest() failed with {0}{1}", e.Message, e.StackTrace);
|
||||
m_log.Error(String.Format("[BASE HTTP SERVER]: OnRequest() failed: {0} ", e.Message), e);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -551,11 +551,11 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
catch (SocketException e)
|
||||
{
|
||||
// This has to be here to prevent a Linux/Mono crash
|
||||
m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e);
|
||||
m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message);
|
||||
m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}. ", e.Message), e);
|
||||
}
|
||||
|
||||
return;
|
||||
|
@ -658,15 +658,15 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
//
|
||||
// An alternative may be to turn off all response write exceptions on the HttpListener, but let's go
|
||||
// with the minimum first
|
||||
m_log.WarnFormat("[BASE HTTP SERVER]: HandleRequest threw {0}.\nNOTE: this may be spurious on Linux", e);
|
||||
m_log.Warn(String.Format("[BASE HTTP SERVER]: HandleRequest threw {0}.\nNOTE: this may be spurious on Linux ", e.Message), e);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}{1}", e.Message, e.StackTrace);
|
||||
m_log.Error(String.Format("[BASE HTTP SERVER]: HandleRequest() threw {0} ", e.Message), e);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}{1}", e.Message, e.StackTrace);
|
||||
m_log.Error(String.Format("[BASE HTTP SERVER]: HandleRequest() threw {0} ", e.Message), e);
|
||||
SendHTML500(response);
|
||||
}
|
||||
finally
|
||||
|
@ -933,11 +933,11 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
catch (SocketException e)
|
||||
{
|
||||
// This has to be here to prevent a Linux/Mono crash
|
||||
m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e);
|
||||
m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message);
|
||||
m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e);
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
@ -970,11 +970,11 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
catch (SocketException e)
|
||||
{
|
||||
// This has to be here to prevent a Linux/Mono crash
|
||||
m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e);
|
||||
m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message);
|
||||
m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1085,12 +1085,12 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
m_log.WarnFormat("[BASE HTTP SERVER]: LLSD IOException {0}.", e);
|
||||
m_log.Warn(String.Format("[BASE HTTP SERVER]: LLSD IOException {0} ", e.Message), e);
|
||||
}
|
||||
catch (SocketException e)
|
||||
{
|
||||
// This has to be here to prevent a Linux/Mono crash
|
||||
m_log.WarnFormat("[BASE HTTP SERVER]: LLSD issue {0}.\nNOTE: this may be spurious on Linux.", e);
|
||||
m_log.Warn(String.Format("[BASE HTTP SERVER]: LLSD issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1342,8 +1342,8 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
catch (SocketException f)
|
||||
{
|
||||
// This has to be here to prevent a Linux/Mono crash
|
||||
m_log.WarnFormat(
|
||||
"[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", f);
|
||||
m_log.Warn(
|
||||
String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", f.Message), f);
|
||||
}
|
||||
}
|
||||
catch(Exception)
|
||||
|
@ -1638,11 +1638,11 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
catch (SocketException e)
|
||||
{
|
||||
// This has to be here to prevent a Linux/Mono crash
|
||||
m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e);
|
||||
m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message);
|
||||
m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1679,7 +1679,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
catch (SocketException e)
|
||||
{
|
||||
// This has to be here to prevent a Linux/Mono crash
|
||||
m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e);
|
||||
m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1715,7 +1715,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
catch (SocketException e)
|
||||
{
|
||||
// This has to be here to prevent a Linux/Mono crash
|
||||
m_log.WarnFormat("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e);
|
||||
m_log.Warn(String.Format("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1794,7 +1794,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
|
||||
public void httpServerException(object source, Exception exception)
|
||||
{
|
||||
m_log.ErrorFormat("[BASE HTTP SERVER]: {0} had an exception {1}", source.ToString(), exception.ToString());
|
||||
m_log.Error(String.Format("[BASE HTTP SERVER]: {0} had an exception: {1} ", source.ToString(), exception.Message), exception);
|
||||
/*
|
||||
if (HTTPDRunning)// && NotSocketErrors > 5)
|
||||
{
|
||||
|
|
|
@ -26,6 +26,8 @@
|
|||
*/
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
|
||||
namespace OpenSim.Framework
|
||||
|
@ -35,6 +37,8 @@ namespace OpenSim.Framework
|
|||
/// </summary>
|
||||
public class TaskInventoryItem : ICloneable
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
/// <summary>
|
||||
/// XXX This should really be factored out into some constants class.
|
||||
/// </summary>
|
||||
|
@ -331,12 +335,18 @@ namespace OpenSim.Framework
|
|||
}
|
||||
}
|
||||
|
||||
public bool OwnerChanged {
|
||||
get {
|
||||
public bool OwnerChanged
|
||||
{
|
||||
get
|
||||
{
|
||||
return _ownerChanged;
|
||||
}
|
||||
set {
|
||||
set
|
||||
{
|
||||
_ownerChanged = value;
|
||||
// m_log.DebugFormat(
|
||||
// "[TASK INVENTORY ITEM]: Owner changed set {0} for {1} {2} owned by {3}",
|
||||
// _ownerChanged, Name, ItemID, OwnerID);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -529,7 +529,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
|||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[ATTACHMENTS MODULE]: Adding attachment {0} to avatar {1} in pt {2} pos {3} {4}",
|
||||
// so.Name, avatar.Name, attachmentpoint, attachOffset, so.RootPart.AttachedPos);
|
||||
// so.Name, sp.Name, attachmentpoint, attachOffset, so.RootPart.AttachedPos);
|
||||
|
||||
so.DetachFromBackup();
|
||||
|
||||
|
|
|
@ -448,30 +448,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
/// Find the client for a ID
|
||||
/// </summary>
|
||||
public IClientAPI LocateClientObject(UUID agentID)
|
||||
{
|
||||
Scene scene = GetClientScene(agentID);
|
||||
if (scene != null)
|
||||
{
|
||||
ScenePresence presence = scene.GetScenePresence(agentID);
|
||||
if (presence != null)
|
||||
return presence.ControllingClient;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Find the scene for an agent
|
||||
/// </summary>
|
||||
private Scene GetClientScene(UUID agentId)
|
||||
{
|
||||
lock (m_Scenes)
|
||||
{
|
||||
foreach (Scene scene in m_Scenes)
|
||||
{
|
||||
ScenePresence presence = scene.GetScenePresence(agentId);
|
||||
ScenePresence presence = scene.GetScenePresence(agentID);
|
||||
if (presence != null && !presence.IsChildAgent)
|
||||
return scene;
|
||||
return presence.ControllingClient;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -498,7 +482,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
Util.FireAndForget(
|
||||
delegate
|
||||
{
|
||||
m_log.DebugFormat("[FRIENDS MODULE]: Notifying {0} friends", friendList.Count);
|
||||
m_log.DebugFormat(
|
||||
"[FRIENDS MODULE]: Notifying {0} friends of {1} of online status {2}",
|
||||
friendList.Count, agentID, online);
|
||||
|
||||
// Notify about this user status
|
||||
StatusNotify(friendList, agentID, online);
|
||||
}
|
||||
|
@ -515,7 +502,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
{
|
||||
// Try local
|
||||
if (LocalStatusNotification(userID, friendID, online))
|
||||
return;
|
||||
continue;
|
||||
|
||||
// The friend is not here [as root]. Let's forward.
|
||||
PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() });
|
||||
|
@ -523,11 +510,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
{
|
||||
PresenceInfo friendSession = null;
|
||||
foreach (PresenceInfo pinfo in friendSessions)
|
||||
{
|
||||
if (pinfo.RegionID != UUID.Zero) // let's guard against sessions-gone-bad
|
||||
{
|
||||
friendSession = pinfo;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (friendSession != null)
|
||||
{
|
||||
|
|
|
@ -126,7 +126,6 @@ namespace OpenSim.Region.CoreModules.World.Land
|
|||
// m_log.DebugFormat(
|
||||
// "[PRIM COUNT MODULE]: Ignoring OnParcelPrimCountAdd() for {0} on {1} since count is tainted",
|
||||
// obj.Name, m_Scene.RegionInfo.RegionName);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -113,9 +113,11 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
/// </param>
|
||||
/// <param name="landAtTarget">
|
||||
/// If true and the avatar is flying when it reaches the target, land.
|
||||
/// </param>
|
||||
/// </param> name="running">
|
||||
/// If true, NPC moves with running speed.
|
||||
/// <returns>True if the operation succeeded, false if there was no such agent or the agent was not an NPC</returns>
|
||||
bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget);
|
||||
///
|
||||
bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget, bool running);
|
||||
|
||||
/// <summary>
|
||||
/// Stop the NPC's current movement.
|
||||
|
|
|
@ -2771,7 +2771,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
//we need to do a terse update even if the move wasn't allowed
|
||||
// so that the position is reset in the client (the object snaps back)
|
||||
ScheduleGroupForTerseUpdate();
|
||||
RootPart.ScheduleTerseUpdate();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -1219,10 +1219,16 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
if (engine != null)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[PRIM INVENTORY]: Resuming script {0} {1} for {2}, OwnerChanged {3}",
|
||||
// item.Name, item.ItemID, item.OwnerID, item.OwnerChanged);
|
||||
|
||||
engine.ResumeScript(item.ItemID);
|
||||
|
||||
if (item.OwnerChanged)
|
||||
engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER });
|
||||
|
||||
item.OwnerChanged = false;
|
||||
engine.ResumeScript(item.ItemID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -169,7 +169,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
|||
}
|
||||
}
|
||||
|
||||
public bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget)
|
||||
public bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget, bool running)
|
||||
{
|
||||
lock (m_avatars)
|
||||
{
|
||||
|
@ -183,6 +183,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
|||
sp.Name, pos, scene.RegionInfo.RegionName, noFly, landAtTarget);
|
||||
|
||||
sp.MoveToTarget(pos, noFly, landAtTarget);
|
||||
sp.SetAlwaysRun = running;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -242,7 +242,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
|||
Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
|
||||
|
||||
Vector3 targetPos = startPos + new Vector3(0, 10, 0);
|
||||
m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false);
|
||||
m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false, false);
|
||||
|
||||
Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
|
||||
//Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0.7071068f, 0.7071068f)));
|
||||
|
@ -267,7 +267,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
|||
// Try a second movement
|
||||
startPos = npc.AbsolutePosition;
|
||||
targetPos = startPos + new Vector3(10, 0, 0);
|
||||
m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false);
|
||||
m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false, false);
|
||||
|
||||
Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
|
||||
// Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0, 1)));
|
||||
|
|
|
@ -128,6 +128,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public const string GridInfoServiceConfigSectionName = "GridInfoService";
|
||||
|
||||
internal IScriptEngine m_ScriptEngine;
|
||||
internal ILSL_Api m_LSL_Api = null; // get a reference to the LSL API so we can call methods housed there
|
||||
internal SceneObjectPart m_host;
|
||||
|
@ -2032,8 +2034,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
string nick = String.Empty;
|
||||
IConfigSource config = m_ScriptEngine.ConfigSource;
|
||||
|
||||
if (config.Configs["GridInfo"] != null)
|
||||
nick = config.Configs["GridInfo"].GetString("gridnick", nick);
|
||||
if (config.Configs[GridInfoServiceConfigSectionName] != null)
|
||||
nick = config.Configs[GridInfoServiceConfigSectionName].GetString("gridnick", nick);
|
||||
|
||||
if (String.IsNullOrEmpty(nick))
|
||||
nick = GridUserInfo(InfoType.Nick);
|
||||
|
@ -2049,8 +2051,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
string name = String.Empty;
|
||||
IConfigSource config = m_ScriptEngine.ConfigSource;
|
||||
|
||||
if (config.Configs["GridInfo"] != null)
|
||||
name = config.Configs["GridInfo"].GetString("gridname", name);
|
||||
if (config.Configs[GridInfoServiceConfigSectionName] != null)
|
||||
name = config.Configs[GridInfoServiceConfigSectionName].GetString("gridname", name);
|
||||
|
||||
if (String.IsNullOrEmpty(name))
|
||||
name = GridUserInfo(InfoType.Name);
|
||||
|
@ -2066,8 +2068,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
string loginURI = String.Empty;
|
||||
IConfigSource config = m_ScriptEngine.ConfigSource;
|
||||
|
||||
if (config.Configs["GridInfo"] != null)
|
||||
loginURI = config.Configs["GridInfo"].GetString("login", loginURI);
|
||||
if (config.Configs[GridInfoServiceConfigSectionName] != null)
|
||||
loginURI = config.Configs[GridInfoServiceConfigSectionName].GetString("login", loginURI);
|
||||
|
||||
if (String.IsNullOrEmpty(loginURI))
|
||||
loginURI = GridUserInfo(InfoType.Login);
|
||||
|
@ -2114,8 +2116,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
string retval = String.Empty;
|
||||
IConfigSource config = m_ScriptEngine.ConfigSource;
|
||||
|
||||
if (config.Configs["GridInfo"] != null)
|
||||
retval = config.Configs["GridInfo"].GetString(key, retval);
|
||||
if (config.Configs[GridInfoServiceConfigSectionName] != null)
|
||||
retval = config.Configs[GridInfoServiceConfigSectionName].GetString(key, retval);
|
||||
|
||||
if (String.IsNullOrEmpty(retval))
|
||||
retval = GridUserInfo(InfoType.Custom, key);
|
||||
|
@ -2449,7 +2451,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
return;
|
||||
|
||||
Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z);
|
||||
module.MoveToTarget(npcId, World, pos, false, true);
|
||||
module.MoveToTarget(npcId, World, pos, false, true, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2474,7 +2476,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
World,
|
||||
pos,
|
||||
(options & ScriptBaseClass.OS_NPC_NO_FLY) != 0,
|
||||
(options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0);
|
||||
(options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0,
|
||||
(options & ScriptBaseClass.OS_NPC_RUNNING) != 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -626,6 +626,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
|||
public const int OS_NPC_FLY = 0;
|
||||
public const int OS_NPC_NO_FLY = 1;
|
||||
public const int OS_NPC_LAND_AT_TARGET = 2;
|
||||
public const int OS_NPC_RUNNING = 4;
|
||||
|
||||
public const int OS_NPC_SIT_NOW = 0;
|
||||
|
||||
|
|
Binary file not shown.
Loading…
Reference in New Issue