Search Unity

Easy Save - The Complete Save Data & Serialization Asset

Discussion in 'Assets and Asset Store' started by JoelAtMoodkie, May 28, 2011.

  1. PLL

    PLL

    Joined:
    Jul 15, 2013
    Posts:
    19
    I have been using the ES2Web UploadRaw functionality for several applications. Now, I contacted support to understand what are the alternative options since such a very useful functions disappeared from ES3. Support told me to use cached files. However, when I create a cached file with the suggested code:

    var settings = new ES3Settings(ES3.Location.Cache);

    add some data

    ES3.Save("counter", counter, settings);

    and upload it

    yield return StartCoroutine(cloud.UploadFile(settings, "myUser", "myUsersPassword"));

    It have always the same filename on the remote server ("SaveFile.es3") so this solution cannot implement the UploadRaw that allowed me to use different identifiers for each upload without creating a physical file.

    Is there any solution? Is there any way to port the ES2Web UploadRaw to ES3. I have several projects that used it and it seems I cannot find a replacement.
     
  2. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    If you private message me your invoice number I can send over a version which allows you to do this.

    All the best,
    Joel
     
  3. PLL

    PLL

    Joined:
    Jul 15, 2013
    Posts:
    19
    Just set the original email from the asset store.

    Thank you. Great support! :)
    PL

    PS I know that I might be one of the few needing this functionality but it might be worth considering its addition to the next update. I am uploading traces for users behaviour for play testing and I think others might find it useful as well.
     
    JoelAtMoodkie likes this.
  4. mrm83

    mrm83

    Joined:
    Nov 29, 2014
    Posts:
    345
    Is ES2 2.7.1 compatible with Unity 2019.4.14f1?

    When there is save file, using ES2.Exists(path) works.
    When there is no save file, using ES2.Exists(path) would cause error
    Code (CSharp):
    1. 02-03 11:30:43.908 28936 29097 E Unity   : ES2InvalidDataException: Easy Save 2 Error: The file provided does not contain data that is readable by Easy Save. Please make sure that file was created by Easy Save.
    2. 02-03 11:30:43.908 28936 29097 E Unity   :   at ES2Reader.Next () [0x0006a] in <b6a10585a5c24e6db873ba8a677b533a>:0
    3. 02-03 11:30:43.908 28936 29097 E Unity   :   at ES2Reader.ScanToTag (System.String tag) [0x00072] in <b6a10585a5c24e6db873ba8a677b533a>:0
    4. 02-03 11:30:43.908 28936 29097 E Unity   :   at ES2Reader.TagExists (System.String tag) [0x00000] in <b6a10585a5c24e6db873ba8a677b533a>:0
    5. 02-03 11:30:43.908 28936 29097 E Unity   :   at ES2Reader.TagExists () [0x00000] in <b6a10585a5c24e6db873ba8a677b533a>:0
    6. 02-03 11:30:43.908 28936 29097 E Unity   :   at ES2File.Exists (ES2Settings settings) [0x00123] in <b6a10585a5c24e6db873ba8a677b533a>:0
    7. 02-03 11:30:43.908 28936 29097 E Unity   :   at ES2.Exists (System.String identifier) [0x00006] in <b6a10585a5c24e6db873ba8a677b533a>:0
    #Update:
    Upgraded to latest EZ2 version and I can see the error now.
     
    Last edited: Feb 3, 2021
  5. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    We have no reported issues with Unity 2019 and ES2. This error usually occurs if the save file is encrypted but encryption is not enabled, or the save data is corrupt or not Easy Save data.

    All the best,
    Joel
     
  6. ksam2

    ksam2

    Joined:
    Apr 28, 2012
    Posts:
    1,079
    You mean if I use Easy Save I can't port my game for consoles?:eek:
     
  7. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    You can port it to consoles, but you'll need to integrate it with their storage APIs, perhaps using the instructions here. This is because Sony and Nintendo require a middleware license to legally use their API which they do not provide to Asset Store developers.

    Just to clarify, this is true of any asset on the Asset Store which would need to access their API.

    All the best,
    Joel
     
  8. ksam2

    ksam2

    Joined:
    Apr 28, 2012
    Posts:
    1,079
    Do I need to save data on consoles again to load or I can use my previous save files to load?
    My game uses 10 save files from easy save that contains my game data like objects positions and rotations my characters and more I just need to load those data that was created PC.
     
    Last edited: Feb 6, 2021
  9. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Save files work across platforms.

    With regards to integrating with the storage APIs themselves, I recommend asking on the developer forums for the platforms you're targeting. I know there's discussion about integrating Easy Save on the Nintendo Switch forums, which will hopefully help you out.

    All the best,
    Joel
     
  10. ksam2

    ksam2

    Joined:
    Apr 28, 2012
    Posts:
    1,079
    Thanks, for now I have another problem I need to encrypt my save files but the problem is that it can't replace save files with old ones when I use encrypt method. I must remove previous save file then easy save can create a new encrypted file but I can't remove old file because it has important information that makes my project to run.
     
  11. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    You would need to load the data using unencrypted settings, and then re-save it with encryption enabled.

    All the best,
    Joel
     
    ksam2 likes this.
  12. IggyZuk

    IggyZuk

    Joined:
    Jan 17, 2015
    Posts:
    43
    Hey, is it possible to put ES3 into an assembly definition?

    I need to do that because one of my custom assembly definition depends on it. By default, ES3 is in the assembly-csharp-firstpass (Plugins folder), which you can't add as a reference.

    When I manually create assembly definitions for ES3 and the inner editor folder, things compile but fail when I run the game. Specifically, the error happens here:

    ES3.Init();
    I've also made sure to add the custom assembly names into the ES3 settings (ES3Defaults > Assembly Names).

    Any idea how to get this thing to work? Thanks.
     
  13. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    We use Unity's CompilationPipeline.GetAssemblies method to get the assemblies in the project. If this isn't finding your assemblies then there might be a bug at their end.

    Please could you create a new, basic project with a basic scene which replicates it and private message it to me?

    Also please ensure you're using the latest version of Easy Save.

    All the best,
    Joel
     
  14. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Thanks for private messaging me a project, I've managed to find the problem.

    You've configured your assembly definition file for the Editor folder incorrectly. You had 'Any Platform' checked, when you should only have 'Editor' checked. You also need to add your Easy Save assembly definition to the Assembly Definition Reference list.

    As this question is more to do with Assembly Definitions than Easy Save, I recommend asking on the main Unity forums if you have any questions regarding assembly definitions :)

    All the best,
    Joel
     

    Attached Files:

    IggyZuk likes this.
  15. IggyZuk

    IggyZuk

    Joined:
    Jan 17, 2015
    Posts:
    43
    Thank you! Works like a charm! :cool:
     
    JoelAtMoodkie likes this.
  16. VastnessVR

    VastnessVR

    Joined:
    Nov 21, 2017
    Posts:
    24
    Hi Joel,
    I purchased Easy Save the other day. Looks great and sort of easy enough to convert my code to load/Save etc.
    I have had nothing to do with player prefs before or saving to a drive eg. using a quest 2.

    I seem to be missing finding a crucial basic newbie tutorial on setting up easy save 3 to create a file, at a location with this bunch of variables.

    Is there such a tutorial of a Unity project step by step or a copy of a project I could look at that is set up so I can understand the format and what is needed?

    Any videos tutorials?

    Cheers
     
    SpaharGR likes this.
  17. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    You can find information on this in the Getting Started guide. We don't have video tutorials for this as it would just be a video of us typing out the code from the Getting Started guide :)

    All the best,
    Joel
     
  18. VastnessVR

    VastnessVR

    Joined:
    Nov 21, 2017
    Posts:
    24
    Thanks Joel,
    Yes I have looked at the Getting started guide.
    Very informative for the power of the asset.
    Looks like it is perfect for what I need. Cheers for the work on this.

    An Example request:
    I'd love to see some working Load/Save UI example Scenes in the asset pack download.
    Something to instantly get your asset up and running and can copy elements from it into our own code.
    Especially for something like the Quest. eg issues with read/write in the manifest file.

    I see somebody has done some good videos for ES2 explaining how things connect together and what to look for in the Unity interface.
    (15) EasySave - Save System Tutorial #1 - Setup & Basic Saving / Loading - Unity 5 - C# - YouTube

    25 minutes+ of typing out code from the Getting Started Guide. :) lol.
    But informative in the sense of knowing to look for in Unity.

    Cheers again
     
  19. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    Most of the tutorial is inserting elements into the scene such as buttons, and the data which is being saved, which is related to Unity in general rather than Easy Save :) However, if there's demand for a tutorial like this then we'll definitely consider adding our own.

    There's a request for this here: https://moodkie.com/forum/viewtopic.php?f=14&t=1545

    Because every project is different it wouldn't be possible for us to create something which works for all projects.

    All the best,
    Joel
     
    VastnessVR likes this.
  20. makaka-org

    makaka-org

    Joined:
    Dec 1, 2013
    Posts:
    1,023
    Do you plan to make a template for TextMesh Pro texts?
     
  21. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    We only provide specific support for the Unity API. For external assets it's the responsibility of the asset developer to make their classes serializable if they aren't already (see the Supported Types guide to see what is serialisable by default).

    Alternatively you may be able to add your own support using the instructions here:
    https://docs.moodkie.com/easy-save-3/es3-guides/choosing-what-is-saved/

    All the best,
    Joel
     
  22. makaka-org

    makaka-org

    Joined:
    Dec 1, 2013
    Posts:
    1,023
    TextMesh Pro was bought by Unity some years ago & now it is provided in Package Manager window. It cannot be said that it is an external asset by 3rd-party.
     
  23. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    makaka-org likes this.
  24. WonkyDonky

    WonkyDonky

    Joined:
    Aug 24, 2014
    Posts:
    65
    Does this work on consoles (ps4/ps5)?

    If not, what would be the reason?
     
  25. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    We can't legally support consoles because Sony's requires a middleware license to use their storage API, which they do not provide to Unity asset developers.

    However, we have a guide on integrating Easy Save's serializer with an external storage API here which you may be able to use (we cannot guarantee this however):

    https://docs.moodkie.com/easy-save-3/es3-guides/integrating-storage-apis/
     
    WonkyDonky likes this.
  26. Adam_Benko

    Adam_Benko

    Joined:
    Jun 16, 2018
    Posts:
    105
    How can I delete the save that was created on application quit ? In the editor, from the easy save window, if it is possible.
     
  27. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    You can do this by going to Tools > Easy Save 3 > Open Persistent Data Path.

    All the best,
    Joel
     
  28. Adam_Benko

    Adam_Benko

    Joined:
    Jun 16, 2018
    Posts:
    105
    Hi. I am trying to save prefab in a scene. It saves the main object and its children. But children of these children are not saved. "Save Children" option in inspector is enabled.
    Structure of the prefab:
    Main obj
    -- child secondary obj (contains the save, the main obj is just a temporary holder that gets destroyed on prefab spawn and is not saved)
    ----- children with other objects
     
  29. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    Please could you create a new, basic project with a simple scene which replicates this and private message it to me with instructions?

    All the best,
    Joel
     
  30. Adam_Benko

    Adam_Benko

    Joined:
    Jun 16, 2018
    Posts:
    105
    The problem was on my side. I fixed it.
    If I could ask another question, in autosave / prefabs , how can I change the default behavior of inspector showing me all child objects of the prefab ? It is unusable like this. Search function does not really help since I have multiple prefabs with the same name.
    I find it very unpractical having all children elements unpacked by default. I want to see them only when I open the prefab just like unity does in its scene inspector.
    Thanks.
     
  31. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi Adam,

    We currently don't have collapse behaviour in this screen, but as this is the first time this has been requested I've added a feature request for this here: https://moodkie.com/forum/viewtopic.php?f=14&t=2201

    All the best,
    Joel
     
  32. Adam_Benko

    Adam_Benko

    Joined:
    Jun 16, 2018
    Posts:
    105
    Auto save stopped working all of the sudden in one scene for PREFABS, for everything else it works.
    In other scenes, it still works for prefabs.
    I refreshed the scene manager, optimized it but did not help. Is there any other way of resenting it or fixing it ?
    Thanks.
     
  33. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    It wouldn't be possible for me to understand what is happening without seeing a project which replicates this. However, you might want to try removing the ES3AutoSave Component from the prefab and re-adding it.

    All the best,
    Joel
     
  34. Adam_Benko

    Adam_Benko

    Joined:
    Jun 16, 2018
    Posts:
    105
    Thanks. This fixed the problem.
     
    JoelAtMoodkie likes this.
  35. Stickeyd

    Stickeyd

    Joined:
    Mar 26, 2017
    Posts:
    174
    Hello.

    This is my code for saving:


    Code (CSharp):
    1.         if (!soundController.AreThereAnyEnemiesAround())
    2.             {
    3.  
    4.  
    5.  
    6.                 var settings = new ES3Settings(ES3.Location.Cache);
    7.  
    8.                 foreach (PlayerPrefsCollectionSaverLoader p in prefs)
    9.                 {
    10.                     p.Save();
    11.                 }
    12.  
    13.  
    14.                 initByCheckpoints.Save();
    15.  
    16.  
    17.  
    18.  
    19.                 ES3.Save<float>("health", health.currentValue, settings);
    20.                 ES3.Save<float>("mana", mana.currentValue, settings);
    21.  
    22.                 ES3.Save<string>("variables", PersistentDataManager.GetSaveData(), settings);
    23.  
    24.  
    25.  
    26.                 ES3AutoSaveMgr autoSaveMgr1 = ES3AutoSaveMgr.Current;
    27.                 autoSaveMgr1.Save();
    28.  
    29.                 saveDelegate();
    30.  
    31.                 ES3.StoreCachedFile();
    32.  
    33.             }
    How do I implement saving to different save slots(files)? Especially I'm curious about autosave
     
  36. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    There's information at the bottom of the Auto Save guide which describes how you can change the file path for auto saving. You can simply specify a different filename for each save slot:

    https://docs.moodkie.com/easy-save-...code/#changing-the-filename-or-path-from-code

    All the best,
    Joel
     
  37. Stickeyd

    Stickeyd

    Joined:
    Mar 26, 2017
    Posts:
    174
    What do I do with the other things that I manually save with this code?

    var settings = new ES3Settings(ES3.Location.Cache);


    Should I change the location to file too or can I save it from cache to file somehow now/later?
     
  38. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    The Easy Save methods accept a filePath as a parameter which you can use to achieve the same thing. For more information please see the Getting Started guide:
    https://docs.moodkie.com/easy-save-3/getting-started/#changing-the-filename-or-path


    All the best,
    Joel
     
  39. VoxelBoy

    VoxelBoy

    Joined:
    Nov 7, 2008
    Posts:
    240
    Hi @JoelAtMoodkie,

    I'm going to need a really good explantion of under which circumstances it is necessary to have ES3GlobalReferences populated. I have not found a satisfactory answer to this in the documentation on the Moodkie website or in any of the forum posts either here or on the Moodkie forums.

    That file is referring to a lot of unused assets in our project and is causing them to be included in the build. There are settings to turn it off in the Easy Save 3 settings but without knowing what effects that might have, I cannot turn them off.

    Which specific Easy Save 3 functionality is it needed for?
    Is it safe to delete that file and let the build process repopulate it?
    Do I need to worry about the IDs changing and breaking compatibility with previous saves?
    Can you update your documentation to explain this?

    It's a really dangerous way to handle references, if I'm being honest.
    Looking forward to hearing from you. Thank you.
     
  40. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    ES3GlobalReferences should not be included in the build. It is only used in the Editor. If this is being included in the build, please could you private message me a new, basic project which replicates this?

    ES3GlobalReferences allows references to be stored to objects outside of scenes, and allows references to be used between scenes. We don't document this as this usually happens in the background and shouldn't require consideration.

    It is safe, but be aware that this will reset all reference IDs.

    This is essentially how Unity handles references underneath, and is how they recommend maintaining persistent references. Handling references this way is no more dangerous than any reference within Unity.

    They will only change if the reference no longer exists (i.e. you delete the reference or the reference manager). This is the same with any reference within Unity.

    All the best,
    Joel
     
  41. Stickeyd

    Stickeyd

    Joined:
    Mar 26, 2017
    Posts:
    174
    The issue is that I'm using settings to save the values in cache to make the saving faster.

    Like this:

    Code (CSharp):
    1.           var settings = new ES3Settings(ES3.Location.Cache);
    2.  
    3.  
    4.                 ES3.Save<float>("health", health.currentValue, settings);
    5.                 ES3.Save<float>("mana", mana.currentValue, settings);
    6.  
    7.                 ES3.Save<string>("variables", PersistentDataManager.GetSaveData(), settings);
    8.  
    9.                 ES3.StoreCachedFile("MySave.es3");
    10.  
    11.  
    So I thought that I shouldn't write filepath in ES3.Save<float> method, but rather somehow write the filepath after its stored in cache like here:

    ES3.StoreCachedFile("MySave.es3");


    For some reason this doesn't create a file MySave.es3 though. Should I just do it like this?


    Code (CSharp):
    1.           var settings = new ES3Settings(ES3.Location.Cache);
    2.  
    3.  
    4.                 ES3.Save<float>("health", health.currentValue, "MySave.es3", settings);
    5.                 ES3.Save<float>("mana", mana.currentValue, "MySave.es3", settings);
    6.  
    7.                 ES3.Save<string>("variables", PersistentDataManager.GetSaveData(),"MySave.es3", settings);
    8.  
    9.                 ES3.StoreCachedFile();
    10.  
    11.  
     
  42. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    Even files in cache have a filename assigned to them. If you don't specify the filename, it'll just use the default filename.

    Just to clarify, ES3.StoreCachedFile takes the file in cache with that given filename and then stores it. If you've not stored anything to that filename in cache, nothing will be saved.

    All the best,
    Joel
     
  43. Stickeyd

    Stickeyd

    Joined:
    Mar 26, 2017
    Posts:
    174
    One more question, can I store the auto save data and other manual saving data in one file?
     
  44. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    As long as you save to different keys (Auto Save uses a random key so this shouldn't be an issue), and you're not saving the same data using both code and Auto Save, saving to the same file will be fine.

    All the best,
    Joel
     
  45. VastnessVR

    VastnessVR

    Joined:
    Nov 21, 2017
    Posts:
    24
    Hi Joel,
    I'm having some issues with loading a List I have made.
    I'm trying to re-populate the Cleared List from the file I made earlier.

    The Scene has an Inputfield that you can add the names to the UserName List and a Dropdown box that is populated from the list of names.

    When you hit Save, it runs the save routine and makes a UserName.es3 file with List of names.
    It also makes files with the Names from List containing all the Variables. eg Bob_Data.es3

    But when I load the UserName.es3 file to the fill the empty List, no data is imported.

    Yes, I have looked at the Getting Started guide and tried the combination in it but none seem to work.

    Any ideas?
    Rodney


    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class ES3_Basic : MonoBehaviour
    6. {
    7.     public List<string> UserName = new List<string>();
    8.  
    9.     public float AAA;
    10.     public bool BBB;
    11.     public int CCC;
    12.     public Transform DDD;
    13.  
    14.     void Start()
    15.     {
    16.         UserName.Clear();
    17.         UserName = ES3.Load("UserName", UserName);
    18.     }
    19.  
    20.     public void Save()
    21.     {
    22.         ES3Settings.defaultSettings.path = "UserName.es3";
    23.         ES3.Save("UserName", UserName);
    24.  
    25.         foreach (string Name in UserName)
    26.         {
    27.             ES3Settings.defaultSettings.path = "" + Name + "_Data.es3";
    28.  
    29.             ES3.Save("AAA", AAA);
    30.             ES3.Save("BBB", BBB);
    31.             ES3.Save("CCC", CCC);
    32.             ES3.Save("DDD", DDD);
    33.         }
    34.     }
    35.  
    36.     public void Load()
    37.         {
    38.             UserName = ES3.Load("UserName", UserName);      
    39.         }
    40. }
    41.  
    And the UserName file

    Code (CSharp):
    1. {
    2.     "UserName" : {
    3.         "__type" : "System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]],mscorlib",
    4.         "value" : [
    5.             "bob","ed","rod"
    6.         ]
    7.     }
    8. }
     
    Last edited: Mar 25, 2021
  46. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    In your code you're only loading the "UserName" key. If you want to load your list items, you would also need to load the "AAA" - "DDD" keys, as this is where you've stored your data.

    Alternatively you can save and load the list, rather than iterating through them and saving each key separately.

    All the best,
    Joel
     
  47. VastnessVR

    VastnessVR

    Joined:
    Nov 21, 2017
    Posts:
    24
    Hi Joel,
    The loading of the variables is fine from "AAA" - "DDD" with the usernames.
    I have that working in the complete code

    It's the loading of the UserNames List from the UserName.es3 file that I can't get to populate the empty list.
    eg. contains bob, ed and rod.

    Is there a different way to load the whole list from the file into the List?
    eg using UserName = ES3.Load("UserName", UserName);

    Rod
     
  48. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    There is an error in your code. You're not setting ES3Settings.defaultSettings.path until after you Save for the first time, meaning it will be loading from a different file to the one you saved to in your Start() method.

    All the best,
    Joel
     
    VastnessVR likes this.
  49. VastnessVR

    VastnessVR

    Joined:
    Nov 21, 2017
    Posts:
    24
    Stop Looking I found it :)

    It was the default path. I need to add this line before loading the UserName List.
    ES3Settings.defaultSettings.path = "UserName.es3";

    Thanks anyway Joel.
     
  50. VastnessVR

    VastnessVR

    Joined:
    Nov 21, 2017
    Posts:
    24
    Exactly. You got in before I could hit reply.

    Cheers Joel
     
    JoelAtMoodkie likes this.