update: 更新线程控制
							parent
							
								
									ef3a11c382
								
							
						
					
					
						commit
						baae2a6eb4
					
				| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
fileFormatVersion: 2
 | 
			
		||||
guid: 1d20da1a87484f37bc53360cc2414030
 | 
			
		||||
timeCreated: 1712622721
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
namespace Guru
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// 更新器
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public interface IUpdater
 | 
			
		||||
    {
 | 
			
		||||
        UpdaterState State { get; }
 | 
			
		||||
        void Start();
 | 
			
		||||
        void OnUpdate();
 | 
			
		||||
        void Pause(bool pause);
 | 
			
		||||
        void Kill();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public enum UpdaterState
 | 
			
		||||
    {
 | 
			
		||||
        Prepare,
 | 
			
		||||
        Running,
 | 
			
		||||
        Pause,
 | 
			
		||||
        Kill,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
fileFormatVersion: 2
 | 
			
		||||
guid: 6ab7dd209c3a494eab0dfbedce0700d8
 | 
			
		||||
timeCreated: 1712622736
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,82 @@
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace Guru
 | 
			
		||||
{
 | 
			
		||||
    using System;
 | 
			
		||||
    using System.Collections;
 | 
			
		||||
    using System.Collections.Generic;
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    public class ThreadHandler: IUpdater
 | 
			
		||||
    {
 | 
			
		||||
        private Queue<Action> _actions;
 | 
			
		||||
        public Queue<Action> Actions
 | 
			
		||||
        {
 | 
			
		||||
            get
 | 
			
		||||
            {
 | 
			
		||||
                if(_actions == null) 
 | 
			
		||||
                    _actions = new Queue<Action>(10);
 | 
			
		||||
                return _actions;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            set
 | 
			
		||||
            {
 | 
			
		||||
                if (value != null) _actions = value;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private UpdaterState _state;
 | 
			
		||||
        public UpdaterState State => _state;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 启动 Updater
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public void Start()
 | 
			
		||||
        {
 | 
			
		||||
            _state = UpdaterState.Running;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 执行方案
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public void OnUpdate()
 | 
			
		||||
        {
 | 
			
		||||
            if (Actions.Count > 0)
 | 
			
		||||
            {
 | 
			
		||||
                // 消耗对垒
 | 
			
		||||
                while (Actions.Count > 0)
 | 
			
		||||
                {
 | 
			
		||||
                    Actions.Dequeue()?.Invoke();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        public void Pause(bool pause = true)
 | 
			
		||||
        {
 | 
			
		||||
            _state = pause ? UpdaterState.Pause : UpdaterState.Running;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 删除对象
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public void Kill()
 | 
			
		||||
        {
 | 
			
		||||
            _state = UpdaterState.Kill;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void Dispose()
 | 
			
		||||
        {
 | 
			
		||||
            _actions.Clear();
 | 
			
		||||
            _state = UpdaterState.Kill;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        public void AddAction(Action action)
 | 
			
		||||
        {
 | 
			
		||||
            if (action == null) return;
 | 
			
		||||
            Actions.Enqueue(action);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
fileFormatVersion: 2
 | 
			
		||||
guid: dc05f1b1ff5947c19ce6af1db301398d
 | 
			
		||||
timeCreated: 1712624042
 | 
			
		||||
| 
						 | 
				
			
			@ -39,7 +39,7 @@ namespace Guru
 | 
			
		|||
        {
 | 
			
		||||
            if (!IsInitialSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                Debug.LogError($"{Tag} :: LogEvent {eventName} :: Please call <GuruSDK.Init()> first, before you call <LogEvent>.");
 | 
			
		||||
                Debug.LogError($"{Tag} :: LogEvent {eventName} :: Please call <GuruSDK.Start()> first, before you call <LogEvent>.");
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            Analytics.Track(eventName, data);
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +49,7 @@ namespace Guru
 | 
			
		|||
        {
 | 
			
		||||
            if (!IsInitialSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                Debug.LogError($"{Tag} :: SetScreen {screen} :: Please call <GuruSDK.Init()> first, before you call <SetScreen>.");
 | 
			
		||||
                Debug.LogError($"{Tag} :: SetScreen {screen} :: Please call <GuruSDK.Start()> first, before you call <SetScreen>.");
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            Analytics.SetCurrentScreen(screen, extra);
 | 
			
		||||
| 
						 | 
				
			
			@ -74,7 +74,7 @@ namespace Guru
 | 
			
		|||
        {
 | 
			
		||||
            if (!IsInitialSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                Debug.LogError($"{Tag} :: LogLevelStart {levelId} :: Please call <GuruSDK.Init()> first, before you call <LogLevelStart>.");
 | 
			
		||||
                Debug.LogError($"{Tag} :: LogLevelStart {levelId} :: Please call <GuruSDK.Start()> first, before you call <LogLevelStart>.");
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -116,7 +116,7 @@ namespace Guru
 | 
			
		|||
        {
 | 
			
		||||
            if (!IsInitialSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                Debug.LogError($"{Tag} :: LogLevelEnd {levelId} :: Please call <GuruSDK.Init()> first, before you call <LogLevelEnd>.");
 | 
			
		||||
                Debug.LogError($"{Tag} :: LogLevelEnd {levelId} :: Please call <GuruSDK.Start()> first, before you call <LogLevelEnd>.");
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
| 
						 | 
				
			
			@ -182,7 +182,7 @@ namespace Guru
 | 
			
		|||
        {
 | 
			
		||||
            if (!IsInitialSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                Debug.LogError($"{Tag} :: LogLevelUp {playerLevel} :: Please call <GuruSDK.Init()> first, before you call <LogLevelUp>.");
 | 
			
		||||
                Debug.LogError($"{Tag} :: LogLevelUp {playerLevel} :: Please call <GuruSDK.Start()> first, before you call <LogLevelUp>.");
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            Analytics.LevelUp(playerLevel, playerName);
 | 
			
		||||
| 
						 | 
				
			
			@ -196,7 +196,7 @@ namespace Guru
 | 
			
		|||
        {
 | 
			
		||||
            if (!IsInitialSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                Debug.LogError($"{Tag} :: LogAchievement {achievementName} :: Please call <GuruSDK.Init()> first, before you call <LogAchievement>.");
 | 
			
		||||
                Debug.LogError($"{Tag} :: LogAchievement {achievementName} :: Please call <GuruSDK.Start()> first, before you call <LogAchievement>.");
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            Analytics.UnlockAchievement(achievementName);
 | 
			
		||||
| 
						 | 
				
			
			@ -213,7 +213,7 @@ namespace Guru
 | 
			
		|||
        {
 | 
			
		||||
            if (!IsInitialSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                Debug.LogError($"{Tag} :: InitUserProperties :: Please call <GuruSDK.Init()> first, before you call <InitUserProperties>.");
 | 
			
		||||
                Debug.LogError($"{Tag} :: InitUserProperties :: Please call <GuruSDK.Start()> first, before you call <InitUserProperties>.");
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
| 
						 | 
				
			
			@ -233,7 +233,7 @@ namespace Guru
 | 
			
		|||
        {
 | 
			
		||||
            if (!IsInitialSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                Debug.LogError($"{Tag} :: SetUserProperty {key}:{value} ::Please call <GuruSDK.Init()> first, before you call <SetUserProperty>.");
 | 
			
		||||
                Debug.LogError($"{Tag} :: SetUserProperty {key}:{value} ::Please call <GuruSDK.Start()> first, before you call <SetUserProperty>.");
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            Analytics.SetUserProperty(key, value);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,7 +18,7 @@ namespace Guru
 | 
			
		|||
        public const string BuyFail_DuplicateTransaction = "DuplicateTransaction";
 | 
			
		||||
        public const string BuyFail_Unknown = "Unknown";
 | 
			
		||||
        
 | 
			
		||||
        #region Init
 | 
			
		||||
        #region Start
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 初始化IAP 功能
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,29 @@
 | 
			
		|||
namespace Guru
 | 
			
		||||
{
 | 
			
		||||
    using System;
 | 
			
		||||
    using UnityEngine;
 | 
			
		||||
    
 | 
			
		||||
    public partial class GuruSDK
 | 
			
		||||
    {
 | 
			
		||||
        private ThreadHandler _threadHandler;
 | 
			
		||||
 | 
			
		||||
        private void InitThreadHandler()
 | 
			
		||||
        {
 | 
			
		||||
            _threadHandler = new ThreadHandler();
 | 
			
		||||
            RegisterUpdater(_threadHandler);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void AddActionToMainThread(Action action)
 | 
			
		||||
        {
 | 
			
		||||
            _threadHandler?.AddAction(action);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public static void RunOnMainThread(Action action)
 | 
			
		||||
        {
 | 
			
		||||
           Instance.AddActionToMainThread(action);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
fileFormatVersion: 2
 | 
			
		||||
guid: 8a0605c6b4b64b37a0036b34cbadb9ca
 | 
			
		||||
timeCreated: 1712622534
 | 
			
		||||
| 
						 | 
				
			
			@ -131,11 +131,13 @@ namespace Guru
 | 
			
		|||
            _initConfig = config;
 | 
			
		||||
            _onCompleteCallback = onComplete;
 | 
			
		||||
            _isDebugEnabled = config.DebugMode;
 | 
			
		||||
 | 
			
		||||
            InitThreadHandler(); // 初始化线程处理器
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void Start()
 | 
			
		||||
        {
 | 
			
		||||
            //---- Init All tools ----
 | 
			
		||||
            //---- Start All tools ----
 | 
			
		||||
            LogI($"#2 --- InitFirebase ---");
 | 
			
		||||
            //---------- Start Firebase ------------
 | 
			
		||||
            FirebaseUtil.onInitComplete += OnFirebaseReady;
 | 
			
		||||
| 
						 | 
				
			
			@ -218,6 +220,14 @@ namespace Guru
 | 
			
		|||
            Callbacks.Remote._onRemoteFetchComplete?.Invoke(success);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        private void Update()
 | 
			
		||||
        {
 | 
			
		||||
            UpdateAllUpdates(); // 驱动所有的更新器
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        #endregion
 | 
			
		||||
 | 
			
		||||
        #region App Remote Update
 | 
			
		||||
| 
						 | 
				
			
			@ -248,7 +258,7 @@ namespace Guru
 | 
			
		|||
                
 | 
			
		||||
                Try(() =>
 | 
			
		||||
                {
 | 
			
		||||
                    LogI($"#4.1 --- Init apply services ---");
 | 
			
		||||
                    LogI($"#4.1 --- Start apply services ---");
 | 
			
		||||
                    //----------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
                    // 自打点设置错误上报
 | 
			
		||||
| 
						 | 
				
			
			@ -265,7 +275,7 @@ namespace Guru
 | 
			
		|||
                        GuruSettings.UpdateAdjustEvents(_appServicesConfig.adjust_settings.events);
 | 
			
		||||
                    }
 | 
			
		||||
                
 | 
			
		||||
                    LogI($"#4.2 --- Init GuruSttings ---");
 | 
			
		||||
                    LogI($"#4.2 --- Start GuruSttings ---");
 | 
			
		||||
                    // GuruSettings 设置
 | 
			
		||||
                    if (null != _appServicesConfig.app_settings)
 | 
			
		||||
                    {
 | 
			
		||||
| 
						 | 
				
			
			@ -313,7 +323,7 @@ namespace Guru
 | 
			
		|||
                // InitIAP(_initConfig.GoogleKeys, _initConfig.AppleRootCerts); // 初始化IAP
 | 
			
		||||
                Try(() =>
 | 
			
		||||
                {
 | 
			
		||||
                    LogI($"#4.3 --- Init IAP ---");
 | 
			
		||||
                    LogI($"#4.3 --- Start IAP ---");
 | 
			
		||||
                    InitIAP(_initConfig.GoogleKeys, _initConfig.AppleRootCerts); // 初始化IAP
 | 
			
		||||
                }, ex =>
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -326,7 +336,7 @@ namespace Guru
 | 
			
		|||
                // KeywordsManager.Install(Model.IsIAPUser, Model.SuccessLevelId); // 启动Keyword管理器
 | 
			
		||||
                Try(() =>
 | 
			
		||||
                {
 | 
			
		||||
                    LogI($"#4.4 --- Init Keywords ---");
 | 
			
		||||
                    LogI($"#4.4 --- Start Keywords ---");
 | 
			
		||||
                    KeywordsManager.Install(Model.IsIAPUser, Model.SuccessLevelId); // 启动Keyword管理器
 | 
			
		||||
                }, ex =>
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -597,5 +607,88 @@ namespace Guru
 | 
			
		|||
        
 | 
			
		||||
        #endregion
 | 
			
		||||
 | 
			
		||||
        #region 帧更新 Updater
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        private List<IUpdater> _updaterRunningList;
 | 
			
		||||
        private List<IUpdater> _updaterRemoveList;
 | 
			
		||||
 | 
			
		||||
        private void InitUpdaters()
 | 
			
		||||
        {
 | 
			
		||||
            _updaterRunningList = new List<IUpdater>(20);
 | 
			
		||||
            _updaterRemoveList = new List<IUpdater>(20);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void UpdateAllUpdates()
 | 
			
		||||
        {
 | 
			
		||||
            int i = 0;
 | 
			
		||||
            IUpdater updater;
 | 
			
		||||
            // ---- Updater Trigger ----
 | 
			
		||||
            if (_updaterRunningList.Count > 0)
 | 
			
		||||
            {
 | 
			
		||||
                i = 0;
 | 
			
		||||
                while (i < _updaterRunningList.Count)
 | 
			
		||||
                {
 | 
			
		||||
                    updater = _updaterRunningList[i];
 | 
			
		||||
                    if (updater != null) 
 | 
			
		||||
                    {
 | 
			
		||||
                        if (updater.State == UpdaterState.Running)
 | 
			
		||||
                        {
 | 
			
		||||
                            updater.OnUpdate();
 | 
			
		||||
                        }
 | 
			
		||||
                        else if(updater.State == UpdaterState.Kill)
 | 
			
		||||
                        {
 | 
			
		||||
                            _updaterRemoveList.Add(updater);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        _updaterRunningList.RemoveAt(i);
 | 
			
		||||
                        i--;
 | 
			
		||||
                    }
 | 
			
		||||
                    i++;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (_updaterRemoveList.Count > 0)
 | 
			
		||||
            {
 | 
			
		||||
                i = 0;
 | 
			
		||||
                while (i < _updaterRemoveList.Count)
 | 
			
		||||
                {
 | 
			
		||||
                    RemoveUpdater(_updaterRemoveList[i]);
 | 
			
		||||
                    i++;
 | 
			
		||||
                }
 | 
			
		||||
                _updaterRemoveList.Clear();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 注册帧更新器
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="updater"></param>
 | 
			
		||||
        public static void RegisterUpdater(IUpdater updater)
 | 
			
		||||
        {
 | 
			
		||||
            Instance.AddUpdater(updater);
 | 
			
		||||
            updater.Start();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        private void AddUpdater(IUpdater updater)
 | 
			
		||||
        {
 | 
			
		||||
            if (_updaterRunningList == null) _updaterRunningList = new List<IUpdater>(20);
 | 
			
		||||
            _updaterRunningList.Add(updater);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void RemoveUpdater(IUpdater updater)
 | 
			
		||||
        {
 | 
			
		||||
            if (_updaterRunningList != null && updater != null)
 | 
			
		||||
            {
 | 
			
		||||
                _updaterRunningList.Remove(updater);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #endregion
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -4,7 +4,8 @@
 | 
			
		|||
    "references": [
 | 
			
		||||
        "UnityEngine.TestRunner",
 | 
			
		||||
        "UnityEditor.TestRunner",
 | 
			
		||||
        "Guru.Runtime"
 | 
			
		||||
        "Guru.Runtime",
 | 
			
		||||
        "GuruSDK"
 | 
			
		||||
    ],
 | 
			
		||||
    "includePlatforms": [],
 | 
			
		||||
    "excludePlatforms": [],
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +0,0 @@
 | 
			
		|||
fileFormatVersion: 2
 | 
			
		||||
guid: c3f29532318446f2aa35c275859dad0d
 | 
			
		||||
timeCreated: 1712580248
 | 
			
		||||
| 
						 | 
				
			
			@ -1,8 +0,0 @@
 | 
			
		|||
fileFormatVersion: 2
 | 
			
		||||
guid: 80c78f22e10d0411d85fb2a24c69cab2
 | 
			
		||||
folderAsset: yes
 | 
			
		||||
DefaultImporter:
 | 
			
		||||
  externalObjects: {}
 | 
			
		||||
  userData: 
 | 
			
		||||
  assetBundleName: 
 | 
			
		||||
  assetBundleVariant: 
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,49 @@
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
namespace Guru.Tests
 | 
			
		||||
{
 | 
			
		||||
    using NUnit.Framework;
 | 
			
		||||
    using System.Threading;
 | 
			
		||||
    using UnityEngine;
 | 
			
		||||
    
 | 
			
		||||
    public class Test_Threading
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        private int TestCount
 | 
			
		||||
        {
 | 
			
		||||
            get => PlayerPrefs.GetInt(nameof(TestCount), 0);
 | 
			
		||||
            set => PlayerPrefs.SetInt(nameof(TestCount), value);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void Test_ThreadingCall()
 | 
			
		||||
        {
 | 
			
		||||
            GuruSDK.Init(success =>
 | 
			
		||||
            {
 | 
			
		||||
                GuruSDK.Delay(0.1f, () =>
 | 
			
		||||
                {
 | 
			
		||||
                    CallThreading();
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void CallThreading()
 | 
			
		||||
        {
 | 
			
		||||
            Debug.Log($"--------- CallThreading -------------");
 | 
			
		||||
            var t = new Thread(() =>
 | 
			
		||||
            {
 | 
			
		||||
                Debug.Log($"--------- Thread Start -------------");
 | 
			
		||||
                Thread.Sleep(2000);
 | 
			
		||||
                GuruSDK.RunOnMainThread(() =>
 | 
			
		||||
                {
 | 
			
		||||
                    TestCount++;
 | 
			
		||||
                    Debug.Log($">>>>> CallThreading: {TestCount}");
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
            
 | 
			
		||||
            t.Start();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
fileFormatVersion: 2
 | 
			
		||||
guid: 67d9cfd9949c48f3a8f6e6821b733ff1
 | 
			
		||||
timeCreated: 1712649738
 | 
			
		||||
		Loading…
	
		Reference in New Issue