349 lines
19 KiB
C++
349 lines
19 KiB
C++
/**
|
|
* @file ascentprefssys.cpp
|
|
* @Ascent Viewer preferences panel
|
|
*
|
|
* $LicenseInfo:firstyear=2008&license=viewergpl$
|
|
*
|
|
* Copyright (c) 2008, Henri Beauchamp.
|
|
* Rewritten in its entirety 2010 Hg Beeks.
|
|
*
|
|
* Second Life Viewer Source Code
|
|
* The source code in this file ("Source Code") is provided by Linden Lab
|
|
* to you under the terms of the GNU General Public License, version 2.0
|
|
* ("GPL"), unless you have obtained a separate licensing agreement
|
|
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
|
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
|
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
|
*
|
|
* There are special exceptions to the terms and conditions of the GPL as
|
|
* it is applied to this Source Code. View the full text of the exception
|
|
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
|
* online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
|
*
|
|
* By copying, modifying or distributing this software, you acknowledge
|
|
* that you have read and understood your obligations described above,
|
|
* and agree to abide by those obligations.
|
|
*
|
|
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
|
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
|
* COMPLETENESS OR PERFORMANCE.
|
|
* $/LicenseInfo$
|
|
*/
|
|
|
|
#include "llviewerprecompiledheaders.h"
|
|
|
|
//File include
|
|
#include "ascentprefssys.h"
|
|
#include "llagent.h"
|
|
#include "llaudioengine.h" //For POWER USER affirmation.
|
|
#include "llchat.h"
|
|
#include "llcolorswatch.h"
|
|
#include "llcombobox.h"
|
|
#include "llfloaterchat.h" //For POWER USER affirmation.
|
|
#include "llradiogroup.h"
|
|
#include "lluictrlfactory.h"
|
|
#include "llviewercontrol.h"
|
|
|
|
|
|
LLPrefsAscentSys::LLPrefsAscentSys()
|
|
{
|
|
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_preferences_ascent_system.xml");
|
|
|
|
childSetCommitCallback("speed_rez_check", onCommitCheckBox, this);
|
|
childSetCommitCallback("double_click_teleport_check", onCommitCheckBox, this);
|
|
childSetCommitCallback("system_folder_check", onCommitCheckBox, this);
|
|
childSetCommitCallback("show_look_at_check", onCommitCheckBox, this);
|
|
childSetCommitCallback("enable_clouds", onCommitCheckBox, this);
|
|
childSetCommitCallback("power_user_check", onCommitCheckBox, this);
|
|
childSetCommitCallback("power_user_confirm_check", onCommitCheckBox, this);
|
|
|
|
childSetCommitCallback("chat_cmd_toggle", onCommitCmdLine, this);
|
|
childSetCommitCallback("AscentCmdLinePos", onCommitCmdLine, this);
|
|
childSetCommitCallback("AscentCmdLineGround", onCommitCmdLine, this);
|
|
childSetCommitCallback("AscentCmdLineHeight", onCommitCmdLine, this);
|
|
childSetCommitCallback("AscentCmdLineTeleportHome", onCommitCmdLine, this);
|
|
childSetCommitCallback("AscentCmdLineRezPlatform", onCommitCmdLine, this);
|
|
childSetCommitCallback("AscentCmdLineCalc", onCommitCmdLine, this);
|
|
childSetCommitCallback("AscentCmdLineClearChat", onCommitCmdLine, this);
|
|
childSetCommitCallback("AscentCmdLineDrawDistance", onCommitCmdLine, this);
|
|
childSetCommitCallback("AscentCmdTeleportToCam", onCommitCmdLine, this);
|
|
childSetCommitCallback("AscentCmdLineKeyToName", onCommitCmdLine, this);
|
|
childSetCommitCallback("AscentCmdLineOfferTp", onCommitCmdLine, this);
|
|
childSetCommitCallback("AscentCmdLineMapTo", onCommitCmdLine, this);
|
|
childSetCommitCallback("AscentCmdLineTP2", onCommitCmdLine, this);
|
|
|
|
refreshValues();
|
|
refresh();
|
|
}
|
|
|
|
LLPrefsAscentSys::~LLPrefsAscentSys()
|
|
{
|
|
}
|
|
|
|
//static
|
|
void LLPrefsAscentSys::onCommitCheckBox(LLUICtrl* ctrl, void* user_data)
|
|
{
|
|
LLPrefsAscentSys* self = (LLPrefsAscentSys*)user_data;
|
|
|
|
// llinfos << "Change to " << ctrl->getControlName() << " aka " << ctrl->getName() << llendl;
|
|
|
|
if (ctrl->getName() == "speed_rez_check")
|
|
{
|
|
bool enabled = self->childGetValue("speed_rez_check").asBoolean();
|
|
self->childSetEnabled("speed_rez_interval", enabled);
|
|
self->childSetEnabled("speed_rez_seconds", enabled);
|
|
}
|
|
else if (ctrl->getName() == "double_click_teleport_check")
|
|
{
|
|
bool enabled = self->childGetValue("double_click_teleport_check").asBoolean();
|
|
self->childSetEnabled("center_after_teleport_check", enabled);
|
|
self->childSetEnabled("offset_teleport_check", enabled);
|
|
}
|
|
else if (ctrl->getName() == "system_folder_check")
|
|
{
|
|
bool enabled = self->childGetValue("system_folder_check").asBoolean();
|
|
self->childSetEnabled("temp_in_system_check", enabled);
|
|
}
|
|
else if (ctrl->getName() == "enable_clouds")
|
|
{
|
|
bool enabled = self->childGetValue("enable_clouds").asBoolean();
|
|
self->childSetEnabled("enable_classic_clouds", enabled);
|
|
}
|
|
else if (ctrl->getName() == "power_user_check")
|
|
{
|
|
bool enabled = self->childGetValue("power_user_check").asBoolean();
|
|
self->childSetEnabled("power_user_confirm_check", enabled);
|
|
self->childSetValue("power_user_confirm_check", false);
|
|
}
|
|
else if (ctrl->getName() == "power_user_confirm_check")
|
|
{
|
|
bool enabled = self->childGetValue("power_user_confirm_check").asBoolean();
|
|
|
|
gSavedSettings.setBOOL("AscentPowerfulWizard", enabled);
|
|
|
|
if (enabled)
|
|
{
|
|
LLVector3d lpos_global = gAgent.getPositionGlobal();
|
|
gAudiop->triggerSound(LLUUID("58a38e89-44c6-c52b-deb8-9f1ddc527319"), gAgent.getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_UI, lpos_global);
|
|
LLChat chat;
|
|
chat.mSourceType = CHAT_SOURCE_SYSTEM;
|
|
chat.mText = llformat("You are bestowed with powers beyond mortal comprehension.\nUse your newfound abilities wisely.\nUnlocked:\n- Animation Priority up to 7 - Meant for animations that should override anything and everything at all times. DO NOT USE THIS FOR GENERAL ANIMATIONS.\n- Right click > Destroy objects - Permanently deletes an object immediately, when you don't feel like waiting for the server to respond.\n- Right Click > Explode objects - Turns an object physical, temporary, and delinks it.");
|
|
LLFloaterChat::addChat(chat);
|
|
}
|
|
}
|
|
}
|
|
|
|
//static
|
|
void LLPrefsAscentSys::onCommitCmdLine(LLUICtrl* ctrl, void* user_data)
|
|
{
|
|
LLPrefsAscentSys* self = (LLPrefsAscentSys*)user_data;
|
|
|
|
if (ctrl->getName() == "chat_cmd_toggle")
|
|
{
|
|
bool enabled = self->childGetValue("chat_cmd_toggle").asBoolean();
|
|
self->childSetEnabled("cmd_line_text_2", enabled);
|
|
self->childSetEnabled("cmd_line_text_3", enabled);
|
|
self->childSetEnabled("cmd_line_text_4", enabled);
|
|
self->childSetEnabled("cmd_line_text_5", enabled);
|
|
self->childSetEnabled("cmd_line_text_6", enabled);
|
|
self->childSetEnabled("cmd_line_text_7", enabled);
|
|
self->childSetEnabled("cmd_line_text_8", enabled);
|
|
self->childSetEnabled("cmd_line_text_9", enabled);
|
|
self->childSetEnabled("cmd_line_text_10", enabled);
|
|
self->childSetEnabled("cmd_line_text_11", enabled);
|
|
self->childSetEnabled("cmd_line_text_12", enabled);
|
|
self->childSetEnabled("cmd_line_text_13", enabled);
|
|
self->childSetEnabled("cmd_line_text_15", enabled);
|
|
self->childSetEnabled("AscentCmdLinePos", enabled);
|
|
self->childSetEnabled("AscentCmdLineGround", enabled);
|
|
self->childSetEnabled("AscentCmdLineHeight", enabled);
|
|
self->childSetEnabled("AscentCmdLineTeleportHome", enabled);
|
|
self->childSetEnabled("AscentCmdLineRezPlatform", enabled);
|
|
self->childSetEnabled("AscentPlatformSize", enabled);
|
|
self->childSetEnabled("AscentCmdLineCalc", enabled);
|
|
self->childSetEnabled("AscentCmdLineClearChat", enabled);
|
|
self->childSetEnabled("AscentCmdLineDrawDistance", enabled);
|
|
self->childSetEnabled("AscentCmdTeleportToCam", enabled);
|
|
self->childSetEnabled("AscentCmdLineKeyToName", enabled);
|
|
self->childSetEnabled("AscentCmdLineOfferTp", enabled);
|
|
self->childSetEnabled("AscentCmdLineMapTo", enabled);
|
|
self->childSetEnabled("map_to_keep_pos", enabled);
|
|
self->childSetEnabled("AscentCmdLineTP2", enabled);
|
|
}
|
|
|
|
gSavedSettings.setString("AscentCmdLinePos", self->childGetValue("AscentCmdLinePos"));
|
|
gSavedSettings.setString("AscentCmdLineGround", self->childGetValue("AscentCmdLineGround"));
|
|
gSavedSettings.setString("AscentCmdLineHeight", self->childGetValue("AscentCmdLineHeight"));
|
|
gSavedSettings.setString("AscentCmdLineTeleportHome", self->childGetValue("AscentCmdLineTeleportHome"));
|
|
gSavedSettings.setString("AscentCmdLineRezPlatform", self->childGetValue("AscentCmdLineRezPlatform"));
|
|
gSavedSettings.setString("AscentCmdLineCalc", self->childGetValue("AscentCmdLineCalc"));
|
|
gSavedSettings.setString("AscentCmdLineClearChat", self->childGetValue("AscentCmdLineClearChat"));
|
|
gSavedSettings.setString("AscentCmdLineDrawDistance", self->childGetValue("AscentCmdLineDrawDistance"));
|
|
gSavedSettings.setString("AscentCmdTeleportToCam", self->childGetValue("AscentCmdTeleportToCam"));
|
|
gSavedSettings.setString("AscentCmdLineKeyToName", self->childGetValue("AscentCmdLineKeyToName"));
|
|
gSavedSettings.setString("AscentCmdLineOfferTp", self->childGetValue("AscentCmdLineOfferTp"));
|
|
gSavedSettings.setString("AscentCmdLineMapTo", self->childGetValue("AscentCmdLineMapTo"));
|
|
gSavedSettings.setString("AscentCmdLineTP2", self->childGetValue("AscentCmdLineTP2"));
|
|
}
|
|
|
|
void LLPrefsAscentSys::refreshValues()
|
|
{
|
|
//General -----------------------------------------------------------------------------
|
|
mDoubleClickTeleport = gSavedSettings.getBOOL("DoubleClickTeleport");
|
|
mResetCameraAfterTP = gSavedSettings.getBOOL("OptionRotateCamAfterLocalTP");
|
|
mOffsetTPByUserHeight = gSavedSettings.getBOOL("OptionOffsetTPByAgentHeight");
|
|
mPreviewAnimInWorld = gSavedSettings.getBOOL("PreviewAnimInWorld");
|
|
// mSaveScriptsAsMono = gSavedSettings.getBOOL("SaveScriptsAsMono");
|
|
mAlwaysRezInGroup = gSavedSettings.getBOOL("AscentAlwaysRezInGroup");
|
|
mBuildAlwaysEnabled = gSavedSettings.getBOOL("AscentBuildAlwaysEnabled");
|
|
mAlwaysShowFly = gSavedSettings.getBOOL("AscentFlyAlwaysEnabled");
|
|
mDisableMinZoom = gSavedSettings.getBOOL("AscentDisableMinZoomDist");
|
|
mPowerUser = gSavedSettings.getBOOL("AscentPowerfulWizard");
|
|
mUseSystemFolder = gSavedSettings.getBOOL("AscentUseSystemFolder");
|
|
mUploadToSystem = gSavedSettings.getBOOL("AscentSystemTemporary");
|
|
mFetchInventoryOnLogin = gSavedSettings.getBOOL("FetchInventoryOnLogin");
|
|
mEnableLLWind = gSavedSettings.getBOOL("WindEnabled");
|
|
mEnableClouds = gSavedSettings.getBOOL("CloudsEnabled");
|
|
mEnableClassicClouds = gSavedSettings.getBOOL("SkyUseClassicClouds");
|
|
mSpeedRez = gSavedSettings.getBOOL("SpeedRez");
|
|
mSpeedRezInterval = gSavedSettings.getU32("SpeedRezInterval");
|
|
|
|
//Command Line ------------------------------------------------------------------------
|
|
mCmdLine = gSavedSettings.getBOOL("AscentCmdLine");
|
|
mCmdLinePos = gSavedSettings.getString("AscentCmdLinePos");
|
|
mCmdLineGround = gSavedSettings.getString("AscentCmdLineGround");
|
|
mCmdLineHeight = gSavedSettings.getString("AscentCmdLineHeight");
|
|
mCmdLineTeleportHome = gSavedSettings.getString("AscentCmdLineTeleportHome");
|
|
mCmdLineRezPlatform = gSavedSettings.getString("AscentCmdLineRezPlatform");
|
|
mCmdPlatformSize = gSavedSettings.getF32("AscentPlatformSize");
|
|
mCmdLineCalc = gSavedSettings.getString("AscentCmdLineCalc");
|
|
mCmdLineClearChat = gSavedSettings.getString("AscentCmdLineClearChat");
|
|
mCmdLineDrawDistance = gSavedSettings.getString("AscentCmdLineDrawDistance");
|
|
mCmdTeleportToCam = gSavedSettings.getString("AscentCmdTeleportToCam");
|
|
mCmdLineKeyToName = gSavedSettings.getString("AscentCmdLineKeyToName");
|
|
mCmdLineOfferTp = gSavedSettings.getString("AscentCmdLineOfferTp");
|
|
mCmdLineMapTo = gSavedSettings.getString("AscentCmdLineMapTo");
|
|
mCmdMapToKeepPos = gSavedSettings.getBOOL("AscentMapToKeepPos");
|
|
mCmdLineTP2 = gSavedSettings.getString("AscentCmdLineTP2");
|
|
|
|
//Privacy -----------------------------------------------------------------------------
|
|
mBroadcastViewerEffects = gSavedSettings.getBOOL("BroadcastViewerEffects");
|
|
mDisablePointAtAndBeam = gSavedSettings.getBOOL("DisablePointAtAndBeam");
|
|
mPrivateLookAt = gSavedSettings.getBOOL("PrivateLookAt");
|
|
mShowLookAt = gSavedSettings.getBOOL("AscentShowLookAt");
|
|
mRevokePermsOnStandUp = gSavedSettings.getBOOL("RevokePermsOnStandUp");
|
|
mDisableClickSit = gSavedSettings.getBOOL("DisableClickSit");
|
|
mDisplayScriptJumps = gSavedSettings.getBOOL("AscentDisplayTotalScriptJumps");
|
|
mNumScriptDiff = gSavedSettings.getF32("Ascentnumscriptdiff");
|
|
}
|
|
|
|
void LLPrefsAscentSys::refresh()
|
|
{
|
|
childSetEnabled("center_after_teleport_check", mDoubleClickTeleport);
|
|
childSetEnabled("offset_teleport_check", mDoubleClickTeleport);
|
|
childSetValue("power_user_check", mPowerUser);
|
|
childSetValue("power_user_confirm_check", mPowerUser);
|
|
childSetEnabled("temp_in_system_check", mUseSystemFolder);
|
|
childSetEnabled("speed_rez_interval", mSpeedRez);
|
|
childSetEnabled("speed_rez_seconds", mSpeedRez);
|
|
|
|
childSetEnabled("cmd_line_text_2", mCmdLine);
|
|
childSetEnabled("cmd_line_text_3", mCmdLine);
|
|
childSetEnabled("cmd_line_text_4", mCmdLine);
|
|
childSetEnabled("cmd_line_text_5", mCmdLine);
|
|
childSetEnabled("cmd_line_text_6", mCmdLine);
|
|
childSetEnabled("cmd_line_text_7", mCmdLine);
|
|
childSetEnabled("cmd_line_text_8", mCmdLine);
|
|
childSetEnabled("cmd_line_text_9", mCmdLine);
|
|
childSetEnabled("cmd_line_text_10", mCmdLine);
|
|
childSetEnabled("cmd_line_text_11", mCmdLine);
|
|
childSetEnabled("cmd_line_text_12", mCmdLine);
|
|
childSetEnabled("cmd_line_text_13", mCmdLine);
|
|
childSetEnabled("cmd_line_text_15", mCmdLine);
|
|
childSetEnabled("AscentCmdLinePos", mCmdLine);
|
|
childSetEnabled("AscentCmdLineGround", mCmdLine);
|
|
childSetEnabled("AscentCmdLineHeight", mCmdLine);
|
|
childSetEnabled("AscentCmdLineTeleportHome", mCmdLine);
|
|
childSetEnabled("AscentCmdLineRezPlatform", mCmdLine);
|
|
childSetEnabled("AscentPlatformSize", mCmdLine);
|
|
childSetEnabled("AscentCmdLineCalc", mCmdLine);
|
|
childSetEnabled("AscentCmdLineClearChat", mCmdLine);
|
|
childSetEnabled("AscentCmdLineDrawDistance", mCmdLine);
|
|
childSetEnabled("AscentCmdTeleportToCam", mCmdLine);
|
|
childSetEnabled("AscentCmdLineKeyToName", mCmdLine);
|
|
childSetEnabled("AscentCmdLineOfferTp", mCmdLine);
|
|
childSetEnabled("AscentCmdLineMapTo", mCmdLine);
|
|
childSetEnabled("map_to_keep_pos", mCmdLine);
|
|
childSetEnabled("AscentCmdLineTP2", mCmdLine);
|
|
|
|
childSetValue("AscentCmdLinePos", mCmdLinePos);
|
|
childSetValue("AscentCmdLineGround", mCmdLineGround);
|
|
childSetValue("AscentCmdLineHeight", mCmdLineHeight);
|
|
childSetValue("AscentCmdLineTeleportHome", mCmdLineTeleportHome);
|
|
childSetValue("AscentCmdLineRezPlatform", mCmdLineRezPlatform);
|
|
childSetValue("AscentCmdLineCalc", mCmdLineCalc);
|
|
childSetValue("AscentCmdLineClearChat", mCmdLineClearChat);
|
|
childSetValue("AscentCmdLineDrawDistance", mCmdLineDrawDistance);
|
|
childSetValue("AscentCmdTeleportToCam", mCmdTeleportToCam);
|
|
childSetValue("AscentCmdLineKeyToName", mCmdLineKeyToName);
|
|
childSetValue("AscentCmdLineOfferTp", mCmdLineOfferTp);
|
|
childSetValue("AscentCmdLineMapTo", mCmdLineMapTo);
|
|
childSetValue("AscentCmdLineTP2", mCmdLineTP2);
|
|
}
|
|
|
|
void LLPrefsAscentSys::cancel()
|
|
{
|
|
//General -----------------------------------------------------------------------------
|
|
gSavedSettings.setBOOL("DoubleClickTeleport", mDoubleClickTeleport);
|
|
gSavedSettings.setBOOL("OptionRotateCamAfterLocalTP", mResetCameraAfterTP);
|
|
gSavedSettings.setBOOL("OptionOffsetTPByAgentHeight", mOffsetTPByUserHeight);
|
|
gSavedSettings.setBOOL("PreviewAnimInWorld", mPreviewAnimInWorld);
|
|
// gSavedSettings.setBOOL("SaveScriptsAsMono", mSaveScriptsAsMono);
|
|
gSavedSettings.setBOOL("AscentAlwaysRezInGroup", mAlwaysRezInGroup);
|
|
gSavedSettings.setBOOL("AscentBuildAlwaysEnabled", mBuildAlwaysEnabled);
|
|
gSavedSettings.setBOOL("AscentFlyAlwaysEnabled", mAlwaysShowFly);
|
|
gSavedSettings.setBOOL("AscentDisableMinZoomDist", mDisableMinZoom);
|
|
gSavedSettings.setBOOL("AscentUseSystemFolder", mUseSystemFolder);
|
|
gSavedSettings.setBOOL("AscentSystemTemporary", mUploadToSystem);
|
|
gSavedSettings.setBOOL("FetchInventoryOnLogin", mFetchInventoryOnLogin);
|
|
gSavedSettings.setBOOL("WindEnabled", mEnableLLWind);
|
|
gSavedSettings.setBOOL("CloudsEnabled", mEnableClouds);
|
|
gSavedSettings.setBOOL("SkyUseClassicClouds", mEnableClassicClouds);
|
|
gSavedSettings.setBOOL("SpeedRez", mSpeedRez);
|
|
gSavedSettings.setU32("SpeedRezInterval", mSpeedRezInterval);
|
|
|
|
//Command Line ------------------------------------------------------------------------
|
|
gSavedSettings.setBOOL("AscentCmdLine", mCmdLine);
|
|
gSavedSettings.setString("AscentCmdLinePos", mCmdLinePos);
|
|
gSavedSettings.setString("AscentCmdLineGround", mCmdLineGround);
|
|
gSavedSettings.setString("AscentCmdLineHeight", mCmdLineHeight);
|
|
gSavedSettings.setString("AscentCmdLineTeleportHome", mCmdLineTeleportHome);
|
|
gSavedSettings.setString("AscentCmdLineRezPlatform", mCmdLineRezPlatform);
|
|
gSavedSettings.setF32("AscentPlatformSize", mCmdPlatformSize);
|
|
gSavedSettings.setString("AscentCmdLineCalc", mCmdLineCalc);
|
|
gSavedSettings.setString("AscentCmdLineClearChat", mCmdLineClearChat);
|
|
gSavedSettings.setString("AscentCmdLineDrawDistance", mCmdLineDrawDistance);
|
|
gSavedSettings.setString("AscentCmdTeleportToCam", mCmdTeleportToCam);
|
|
gSavedSettings.setString("AscentCmdLineKeyToName", mCmdLineKeyToName);
|
|
gSavedSettings.setString("AscentCmdLineOfferTp", mCmdLineOfferTp);
|
|
gSavedSettings.setString("AscentCmdLineMapTo", mCmdLineMapTo);
|
|
gSavedSettings.setBOOL("AscentMapToKeepPos", mCmdMapToKeepPos);
|
|
gSavedSettings.setString("AscentCmdLineTP2", mCmdLineTP2);
|
|
|
|
//Privacy -----------------------------------------------------------------------------
|
|
gSavedSettings.setBOOL("BroadcastViewerEffects", mBroadcastViewerEffects);
|
|
gSavedSettings.setBOOL("DisablePointAtAndBeam", mDisablePointAtAndBeam);
|
|
gSavedSettings.setBOOL("PrivateLookAt", mPrivateLookAt);
|
|
gSavedSettings.setBOOL("AscentShowLookAt", mShowLookAt);
|
|
gSavedSettings.setBOOL("RevokePermsOnStandUp", mRevokePermsOnStandUp);
|
|
gSavedSettings.setBOOL("DisableClickSit", mDisableClickSit);
|
|
gSavedSettings.setBOOL("AscentDisplayTotalScriptJumps", mDisplayScriptJumps);
|
|
gSavedSettings.setF32("Ascentnumscriptdiff", mNumScriptDiff);
|
|
}
|
|
|
|
void LLPrefsAscentSys::apply()
|
|
{
|
|
refreshValues();
|
|
refresh();
|
|
}
|