Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| wiki:class_diagram [2022/07/25 16:16] – admin | wiki:class_diagram [2022/07/27 16:48] (current) – admin | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | --- // | ||
| ====== Class Diagram ====== | ====== Class Diagram ====== | ||
| Line 125: | Line 126: | ||
| </ | </ | ||
| - | ;#; | + | |
| - | ** EVERY METHOD EXPLAINATION ** | + | |
| Line 141: | Line 141: | ||
| Refresh method calls Delete() and ShowsList(), | Refresh method calls Delete() and ShowsList(), | ||
| </ | </ | ||
| - | ;#; | ||
| ===== Building Interact ===== | ===== Building Interact ===== | ||
| Line 251: | Line 250: | ||
| </ | </ | ||
| - | ===== Building Interact | + | ===== Camera Controller |
| <code CSharp | Full Script> | <code CSharp | Full Script> | ||
| - | using Sirenix.OdinInspector; | + | using Micosmo.SensorToolkit; |
| + | using System; | ||
| using System.Collections; | using System.Collections; | ||
| using System.Collections.Generic; | using System.Collections.Generic; | ||
| - | using TMPro; | ||
| using UnityEngine; | using UnityEngine; | ||
| - | public class BuildingInteract | + | #region Code Information |
| + | /* | ||
| + | This script is for cammeracontroller | ||
| + | prettymuch self explainatory | ||
| + | |||
| + | OPENCLOSEUI.UIOPENED IS USED TO DETERMINE IF THERE' | ||
| + | |||
| + | gotovector3() <-- called to set location elsewhere. | ||
| + | |||
| + | */ | ||
| + | # | ||
| + | |||
| + | public class CameraController | ||
| { | { | ||
| - | public enum SenaraiBangunan | ||
| - | { | ||
| - | _1_pusat_islam = 0, | ||
| - | _2_anjung_premier = 1, | ||
| - | _3_cisec = 2, | ||
| - | _4_dewan_jka = 3, | ||
| - | _5_hep = 4, | ||
| - | _6_JKM_D_JKA = 5, | ||
| - | _7_PEJABAT_PENTADBIRAN = 6, | ||
| - | _8_JMSK = 7, | ||
| - | _9_DEWAN_WARISAN = 8, | ||
| - | _10_STUDENT_CENTRE = 9, | ||
| - | _11_GALERI_PUO = 10, | ||
| - | _12_FUTSAL_CAMPUS_A = 11, | ||
| - | _13_BENGKEL_MEKANIKAL = 12, | ||
| - | _14_BENGKEL_AWAM = 13, | ||
| - | _15_PERPUSTAKAAN = 14, | ||
| - | _16_DEWAN_JUBLI = 15, | ||
| - | _17_JMSK_D_JKM = 16, | ||
| - | _18_BENGKKEL_AKM = 17, | ||
| - | _19_JKP = 18, | ||
| - | _20_CAFE_JKE = 19, | ||
| - | _21_JTMK = 20, | ||
| - | _22_JKE = 21 | ||
| - | } | ||
| - | | + | public |
| - | | + | public |
| - | [Title(" | + | public |
| - | public | + | |
| - | public | + | |
| - | | + | |
| - | [EnumToggleButtons] | + | |
| - | [Title(" | + | |
| - | private SenaraiBangunan senaraiBangunan; | + | |
| - | + | ||
| - | private Bangunan bangunan; | + | |
| - | private List< | + | |
| | | ||
| + | public Transform AttachedCamera; | ||
| - | | + | |
| - | | + | |
| - | bangunan = new Bangunan(); | + | |
| - | bangunanChild = new GameObject(); | + | |
| - | bangunanList = GameObject.Find(" | + | |
| - | bangunan = bangunanList[(int)senaraiBangunan]; | + | |
| + | public Quaternion newRotation; | ||
| - | Debug.Log(" | + | private RaySensor sensor; |
| - | instantiateNewHologram(); | + | // Start is called before the first frame update |
| - | setActiveHide(false); | + | void Start() |
| - | } | + | |
| - | + | ||
| - | | + | |
| { | { | ||
| - | | + | |
| - | | + | sensor |
| + | | ||
| - | | + | |
| - | | + | |
| - | | + | |
| - | GameObject.Find(" | + | |
| } | } | ||
| - | + | | |
| - | | + | |
| { | { | ||
| - | | + | |
| - | | + | |
| - | bangunanChild.transform.localScale += new Vector3(0.01f, 0.01f, 0.01f); | + | |
| - | bangunanChild.transform.SetParent(this.transform); | + | |
| - | Destroy(bangunanChild.GetComponent< | + | |
| - | bangunanChild.layer = LayerMask.NameToLayer(" | + | |
| - | bangunanChild.GetComponent< | + | |
| } | } | ||
| - | public void setActiveHide(bool x) | + | public void gotToVector3(float x, float z) |
| { | { | ||
| - | | + | |
| } | } | ||
| - | } | ||
| - | </ | ||
| - | <file | openSearch() > | + | void HandleMovementInput() |
| - | This method is used to open button game object and start searching when user click the building | + | { |
| - | </file> | + | if (OpenCloseUI.UIopened != true)//DETERMINE IF THERE' |
| + | { | ||
| + | if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)) | ||
| + | { | ||
| + | newPosition += (transform.forward * movementSpeed); | ||
| + | } | ||
| - | < | + | if (Input.GetKey(KeyCode.S) |
| - | Create hologram when mouse pointed - it will duplicate object set as child and increase size to 0.01 | + | { |
| - | </ | + | newPosition += (transform.forward * -movementSpeed); |
| + | } | ||
| - | < | + | if (Input.GetKey(KeyCode.A) |
| - | active and deactive hologram object | + | { |
| - | </ | + | newPosition += (transform.right * -movementSpeed); |
| + | } | ||
| - | ===== Building Interact ===== | + | if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) |
| + | { | ||
| + | newPosition += (transform.right * movementSpeed); | ||
| + | } | ||
| - | <code CSharp | Full Script> | + | if (Input.GetKey(KeyCode.Q)) |
| - | using Sirenix.OdinInspector; | + | { |
| - | using System.Collections; | + | newRotation *= Quaternion.Euler(Vector3.up * -rotationSpeed); |
| - | using System.Collections.Generic; | + | } |
| - | using TMPro; | + | |
| - | using UnityEngine; | + | |
| - | public class BuildingInteract : MonoBehaviour | + | if (Input.GetKey(KeyCode.E)) |
| - | { | + | { |
| - | | + | |
| - | { | + | } |
| - | _1_pusat_islam = 0, | + | |
| - | _2_anjung_premier = 1, | + | |
| - | _3_cisec = 2, | + | |
| - | _4_dewan_jka = 3, | + | |
| - | _5_hep = 4, | + | |
| - | _6_JKM_D_JKA = 5, | + | |
| - | _7_PEJABAT_PENTADBIRAN = 6, | + | |
| - | _8_JMSK = 7, | + | |
| - | _9_DEWAN_WARISAN = 8, | + | |
| - | _10_STUDENT_CENTRE = 9, | + | |
| - | _11_GALERI_PUO = 10, | + | |
| - | _12_FUTSAL_CAMPUS_A = 11, | + | |
| - | _13_BENGKEL_MEKANIKAL = 12, | + | |
| - | _14_BENGKEL_AWAM = 13, | + | |
| - | _15_PERPUSTAKAAN = 14, | + | |
| - | _16_DEWAN_JUBLI = 15, | + | |
| - | _17_JMSK_D_JKM = 16, | + | |
| - | _18_BENGKKEL_AKM = 17, | + | |
| - | _19_JKP = 18, | + | |
| - | _20_CAFE_JKE = 19, | + | |
| - | _21_JTMK = 20, | + | |
| - | _22_JKE | + | |
| - | } | + | |
| - | [Title("TEXT INPUT")] | + | if (Input.GetAxis("Mouse ScrollWheel" |
| - | public TMP_InputField tmp; | + | { |
| - | [Title("HOLO MATERIAL" | + | |
| - | | + | } |
| - | | + | |
| - | [SerializeField] | + | |
| - | [EnumToggleButtons] | + | |
| - | [Title(" | + | |
| - | | + | |
| - | private Bangunan bangunan; | + | if (Input.GetAxis(" |
| - | | + | { |
| - | + | if (newCameraPosition.y | |
| + | } | ||
| + | } | ||
| - | private void Start() | + | AttachedCamera.localPosition |
| - | { | + | |
| - | bangunan | + | |
| - | | + | |
| - | | + | |
| - | bangunan = bangunanList[(int)senaraiBangunan]; | + | |
| - | |||
| - | Debug.Log(" | ||
| - | |||
| - | instantiateNewHologram(); | ||
| - | setActiveHide(false); | ||
| } | } | ||
| - | | + | void HandleMouseMovementInput() |
| { | { | ||
| - | var button | + | var ray = GetComponentInChildren< |
| - | | + | |
| + | |||
| + | if (OpenCloseUI.UIopened != true)//DETERMINE IF THERE' | ||
| + | { | ||
| - | tmp.text = bangunan.namaBangunan; | + | if (Input.GetKey(KeyCode.Mouse0)) |
| - | GameObject.Find(" | + | { |
| - | | + | if (detected == true) |
| - | | + | { |
| + | buildingSelected.GetComponent< | ||
| + | } | ||
| + | } | ||
| + | | ||
| } | } | ||
| - | + | bool detected; | |
| - | | + | |
| + | public | ||
| { | { | ||
| - | var newItem | + | var detectedItem |
| - | bangunanChild = newItem.gameObject; | + | |
| - | bangunanChild.transform.localScale += new Vector3(0.01f, 0.01f, 0.01f); | + | |
| - | bangunanChild.transform.SetParent(this.transform); | + | |
| - | Destroy(bangunanChild.GetComponent< | + | |
| - | bangunanChild.layer = LayerMask.NameToLayer(" | + | |
| - | bangunanChild.GetComponent< | + | |
| + | buildingSelected = detectedItem[0]; | ||
| + | buildingSelected.GetComponent< | ||
| + | detected = true; | ||
| } | } | ||
| - | public void setActiveHide(bool x) | + | public void DetectLostBuilding() |
| { | { | ||
| - | | + | |
| + | detected = false; | ||
| } | } | ||
| } | } | ||
| + | |||
| </ | </ | ||
| - | <file | openSearch() > | + | <file | goToVector3(float x, float z);> |
| - | This method | + | This method |
| </ | </ | ||
| - | <file | instantiateNewHologram() > | + | <file | HandleMovementInput();> |
| - | Create hologram when mouse pointed - it will duplicate object set as child and increase size to 0.01 | + | This method |
| </ | </ | ||
| - | <file | setActiveHide(bool x) > | + | <file | HandleMouseMovementInput()> |
| - | active and deactive hologram object | + | This method is to handle mouse movement input by using raycast. This is how we detect building to select it. |
| </ | </ | ||
| - | ===== Building Interact ===== | + | <file | DetectBuilding()> |
| - | + | This method | |
| - | <code CSharp | Full Script> | + | |
| - | using Sirenix.OdinInspector; | + | |
| - | using System.Collections; | + | |
| - | using System.Collections.Generic; | + | |
| - | using TMPro; | + | |
| - | using UnityEngine; | + | |
| - | + | ||
| - | public class BuildingInteract : MonoBehaviour | + | |
| - | { | + | |
| - | public enum SenaraiBangunan | + | |
| - | { | + | |
| - | _1_pusat_islam = 0, | + | |
| - | _2_anjung_premier = 1, | + | |
| - | _3_cisec = 2, | + | |
| - | _4_dewan_jka = 3, | + | |
| - | _5_hep = 4, | + | |
| - | _6_JKM_D_JKA = 5, | + | |
| - | _7_PEJABAT_PENTADBIRAN = 6, | + | |
| - | _8_JMSK = 7, | + | |
| - | _9_DEWAN_WARISAN = 8, | + | |
| - | _10_STUDENT_CENTRE = 9, | + | |
| - | _11_GALERI_PUO = 10, | + | |
| - | _12_FUTSAL_CAMPUS_A = 11, | + | |
| - | _13_BENGKEL_MEKANIKAL = 12, | + | |
| - | _14_BENGKEL_AWAM = 13, | + | |
| - | _15_PERPUSTAKAAN = 14, | + | |
| - | _16_DEWAN_JUBLI = 15, | + | |
| - | _17_JMSK_D_JKM = 16, | + | |
| - | _18_BENGKKEL_AKM = 17, | + | |
| - | _19_JKP = 18, | + | |
| - | _20_CAFE_JKE = 19, | + | |
| - | _21_JTMK = 20, | + | |
| - | _22_JKE = 21 | + | |
| - | } | + | |
| - | + | ||
| - | [Title(" | + | |
| - | public TMP_InputField tmp; | + | |
| - | [Title(" | + | |
| - | public Material holoMaterial; | + | |
| - | public GameObject bangunanChild; | + | |
| - | [SerializeField] | + | |
| - | [EnumToggleButtons] | + | |
| - | [Title(" | + | |
| - | private SenaraiBangunan senaraiBangunan; | + | |
| - | + | ||
| - | private Bangunan bangunan; | + | |
| - | private List< | + | |
| - | + | ||
| - | + | ||
| - | private void Start() | + | |
| - | { | + | |
| - | bangunan = new Bangunan(); | + | |
| - | bangunanChild = new GameObject(); | + | |
| - | bangunanList = GameObject.Find(" | + | |
| - | bangunan = bangunanList[(int)senaraiBangunan]; | + | |
| - | + | ||
| - | + | ||
| - | Debug.Log(" | + | |
| - | + | ||
| - | instantiateNewHologram(); | + | |
| - | setActiveHide(false); | + | |
| - | } | + | |
| - | + | ||
| - | public void openSearch() | + | |
| - | { | + | |
| - | var button = GameObject.Find(" | + | |
| - | button.openObjet(); | + | |
| - | + | ||
| - | tmp.text = bangunan.namaBangunan; | + | |
| - | GameObject.Find(" | + | |
| - | GameObject.Find(" | + | |
| - | GameObject.Find(" | + | |
| - | } | + | |
| - | + | ||
| - | + | ||
| - | private void instantiateNewHologram() | + | |
| - | { | + | |
| - | var newItem = Instantiate(this, | + | |
| - | bangunanChild = newItem.gameObject; | + | |
| - | bangunanChild.transform.localScale += new Vector3(0.01f, | + | |
| - | bangunanChild.transform.SetParent(this.transform); | + | |
| - | Destroy(bangunanChild.GetComponent< | + | |
| - | bangunanChild.layer = LayerMask.NameToLayer(" | + | |
| - | bangunanChild.GetComponent< | + | |
| - | + | ||
| - | } | + | |
| - | + | ||
| - | public void setActiveHide(bool x) | + | |
| - | { | + | |
| - | bangunanChild.SetActive(x); | + | |
| - | } | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | <file | openSearch() > | + | |
| - | This method | + | |
| </ | </ | ||
| - | <file | instantiateNewHologram() > | + | <file | DetectLostBuilding()> |
| - | Create hologram when mouse pointed - it will duplicate object set as child and increase size to 0.01 | + | This method will be called by Ray EVENT gameobject, |
| </ | </ | ||
| - | <file | setActiveHide(bool x) > | ||
| - | active and deactive hologram object | ||
| - | </ | ||
| - | ===== Building Interact | + | |
| + | ===== Bangunan (SCRIPTABLE OBJECT) | ||
| <code CSharp | Full Script> | <code CSharp | Full Script> | ||
| - | using Sirenix.OdinInspector; | ||
| using System.Collections; | using System.Collections; | ||
| using System.Collections.Generic; | using System.Collections.Generic; | ||
| - | using TMPro; | ||
| using UnityEngine; | using UnityEngine; | ||
| + | using Sirenix.OdinInspector; | ||
| - | public class BuildingInteract | + | #region Code Information |
| + | /* | ||
| + | This is a scriptable object. make sure to put x/z location to the pivot of camera Rig | ||
| + | */ | ||
| + | # | ||
| + | |||
| + | [CreateAssetMenu(fileName = " | ||
| + | public class Bangunan | ||
| { | { | ||
| - | public | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | _8_JMSK = 7, | + | |
| - | _9_DEWAN_WARISAN = 8, | + | |
| - | _10_STUDENT_CENTRE = 9, | + | |
| - | _11_GALERI_PUO = 10, | + | |
| - | _12_FUTSAL_CAMPUS_A = 11, | + | |
| - | _13_BENGKEL_MEKANIKAL = 12, | + | |
| - | _14_BENGKEL_AWAM = 13, | + | |
| - | _15_PERPUSTAKAAN = 14, | + | |
| - | _16_DEWAN_JUBLI = 15, | + | |
| - | _17_JMSK_D_JKM = 16, | + | |
| - | _18_BENGKKEL_AKM = 17, | + | |
| - | _19_JKP = 18, | + | |
| - | _20_CAFE_JKE = 19, | + | |
| - | _21_JTMK = 20, | + | |
| - | _22_JKE = 21 | + | |
| - | | + | |
| - | | + | public |
| - | | + | public |
| - | [Title(" | + | } |
| - | public | + | |
| - | | + | |
| - | [SerializeField] | + | |
| - | [EnumToggleButtons] | + | |
| - | [Title(" | + | |
| - | private SenaraiBangunan senaraiBangunan; | + | |
| - | private Bangunan bangunan; | ||
| - | private List< | ||
| - | | ||
| - | |||
| - | private void Start() | ||
| - | { | ||
| - | bangunan = new Bangunan(); | ||
| - | bangunanChild = new GameObject(); | ||
| - | bangunanList = GameObject.Find(" | ||
| - | bangunan = bangunanList[(int)senaraiBangunan]; | ||
| - | |||
| - | |||
| - | Debug.Log(" | ||
| - | |||
| - | instantiateNewHologram(); | ||
| - | setActiveHide(false); | ||
| - | } | ||
| - | |||
| - | public void openSearch() | ||
| - | { | ||
| - | var button = GameObject.Find(" | ||
| - | button.openObjet(); | ||
| - | |||
| - | tmp.text = bangunan.namaBangunan; | ||
| - | GameObject.Find(" | ||
| - | GameObject.Find(" | ||
| - | GameObject.Find(" | ||
| - | } | ||
| - | |||
| - | |||
| - | private void instantiateNewHologram() | ||
| - | { | ||
| - | var newItem = Instantiate(this, | ||
| - | bangunanChild = newItem.gameObject; | ||
| - | bangunanChild.transform.localScale += new Vector3(0.01f, | ||
| - | bangunanChild.transform.SetParent(this.transform); | ||
| - | Destroy(bangunanChild.GetComponent< | ||
| - | bangunanChild.layer = LayerMask.NameToLayer(" | ||
| - | bangunanChild.GetComponent< | ||
| - | |||
| - | } | ||
| - | |||
| - | public void setActiveHide(bool x) | ||
| - | { | ||
| - | bangunanChild.SetActive(x); | ||
| - | } | ||
| - | } | ||
| </ | </ | ||
| - | <file | openSearch() > | ||
| - | This method is used to open button game object and start searching when user click the building | ||
| - | </ | ||
| - | <file | instantiateNewHologram() > | + | ===== Button Lerp To Building ===== |
| - | Create hologram when mouse pointed - it will duplicate object set as child and increase size to 0.01 | + | |
| - | </ | + | |
| - | + | ||
| - | <file | setActiveHide(bool x) > | + | |
| - | active and deactive hologram object | + | |
| - | </ | + | |
| - | + | ||
| - | ===== Building | + | |
| <code CSharp | Full Script> | <code CSharp | Full Script> | ||
| - | using Sirenix.OdinInspector; | ||
| using System.Collections; | using System.Collections; | ||
| using System.Collections.Generic; | using System.Collections.Generic; | ||
| + | using UnityEngine; | ||
| using TMPro; | using TMPro; | ||
| - | using UnityEngine; | + | using System; |
| - | public class BuildingInteract | + | #region Code Information |
| + | /* | ||
| + | This script is for button lerp to building. | ||
| + | So we will get ScriptableObject Bangunan from SearchSystemController iteration | ||
| + | and use building location values to lerp into the preferred location | ||
| + | */ | ||
| + | # | ||
| + | |||
| + | public class ButtonLerpToBuilding | ||
| { | { | ||
| - | public | + | public |
| - | { | + | |
| - | _1_pusat_islam = 0, | + | |
| - | _2_anjung_premier = 1, | + | |
| - | _3_cisec = 2, | + | |
| - | _4_dewan_jka = 3, | + | |
| - | _5_hep = 4, | + | |
| - | _6_JKM_D_JKA = 5, | + | |
| - | _7_PEJABAT_PENTADBIRAN = 6, | + | |
| - | _8_JMSK = 7, | + | |
| - | _9_DEWAN_WARISAN = 8, | + | |
| - | _10_STUDENT_CENTRE = 9, | + | |
| - | _11_GALERI_PUO = 10, | + | |
| - | _12_FUTSAL_CAMPUS_A = 11, | + | |
| - | _13_BENGKEL_MEKANIKAL = 12, | + | |
| - | _14_BENGKEL_AWAM = 13, | + | |
| - | _15_PERPUSTAKAAN = 14, | + | |
| - | _16_DEWAN_JUBLI = 15, | + | |
| - | _17_JMSK_D_JKM = 16, | + | |
| - | _18_BENGKKEL_AKM = 17, | + | |
| - | _19_JKP = 18, | + | |
| - | _20_CAFE_JKE = 19, | + | |
| - | _21_JTMK = 20, | + | |
| - | _22_JKE = 21 | + | |
| - | } | + | |
| - | | + | public void LerpToBuilding() |
| - | | + | |
| - | [Title(" | + | |
| - | public Material holoMaterial; | + | |
| - | public GameObject bangunanChild; | + | |
| - | [SerializeField] | + | |
| - | [EnumToggleButtons] | + | |
| - | [Title(" | + | |
| - | private SenaraiBangunan senaraiBangunan; | + | |
| - | + | ||
| - | private Bangunan bangunan; | + | |
| - | private List< | + | |
| - | + | ||
| - | + | ||
| - | private | + | |
| { | { | ||
| - | | + | |
| - | bangunanChild = new GameObject(); | + | |
| - | bangunanList = GameObject.Find(" | + | |
| - | | + | |
| - | + | ||
| - | + | ||
| - | Debug.Log(" | + | |
| - | + | ||
| - | instantiateNewHologram(); | + | |
| - | setActiveHide(false); | + | |
| } | } | ||
| + | } | ||
| - | public void openSearch() | ||
| - | { | ||
| - | var button = GameObject.Find(" | ||
| - | button.openObjet(); | ||
| - | |||
| - | tmp.text = bangunan.namaBangunan; | ||
| - | GameObject.Find(" | ||
| - | GameObject.Find(" | ||
| - | GameObject.Find(" | ||
| - | } | ||
| - | |||
| - | |||
| - | private void instantiateNewHologram() | ||
| - | { | ||
| - | var newItem = Instantiate(this, | ||
| - | bangunanChild = newItem.gameObject; | ||
| - | bangunanChild.transform.localScale += new Vector3(0.01f, | ||
| - | bangunanChild.transform.SetParent(this.transform); | ||
| - | Destroy(bangunanChild.GetComponent< | ||
| - | bangunanChild.layer = LayerMask.NameToLayer(" | ||
| - | bangunanChild.GetComponent< | ||
| - | |||
| - | } | ||
| - | |||
| - | public void setActiveHide(bool x) | ||
| - | { | ||
| - | bangunanChild.SetActive(x); | ||
| - | } | ||
| - | } | ||
| </ | </ | ||
| - | <file | openSearch() > | + | <file | LerpToBuilding() > |
| - | This method | + | When this method |
| </ | </ | ||
| - | |||
| - | <file | instantiateNewHologram() > | ||
| - | Create hologram when mouse pointed - it will duplicate object set as child and increase size to 0.01 | ||
| - | </ | ||
| - | |||
| - | <file | setActiveHide(bool x) > | ||
| - | active and deactive hologram object | ||
| - | </ | ||
| - | |||
| - | |||
| - | --- // | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||