From adc150efb13a0506f45a3c344c3ee2ef2dba8e90 Mon Sep 17 00:00:00 2001
From: wxr <464027401@qq.com>
Date: 星期四, 01 七月 2021 15:19:13 +0800
Subject: [PATCH] 合并嘉乐lc代码

---
 HDL_ON/UI/UI0-Public/PublicAssmebly.cs |  476 +++++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 425 insertions(+), 51 deletions(-)

diff --git a/HDL_ON/UI/UI0-Public/PublicAssmebly.cs b/HDL_ON/UI/UI0-Public/PublicAssmebly.cs
index 7d49bd1..ffff590 100644
--- a/HDL_ON/UI/UI0-Public/PublicAssmebly.cs
+++ b/HDL_ON/UI/UI0-Public/PublicAssmebly.cs
@@ -1,7 +1,9 @@
 锘縰sing System;
 using System.Collections.Generic;
+using System.Text.RegularExpressions;
 using System.Threading;
 using HDL_ON.Entity;
+using HDL_ON.Stan;
 using HDL_ON.UI.CSS;
 using Shared;
 
@@ -11,7 +13,7 @@
     {
 
         void EditParaterEvent(Button btnConfirm, int errorId_IsNullOrEmpty, int errorId_ContainsPar, List<string> list, EditText editText, Action<string> callBackAction,
-            FrameLayout contentView, Button btnLine, Button btnCancel, FrameLayout editView, Dialog dialog,int titleId)
+            FrameLayout contentView, Button btnLine, Button btnCancel, FrameLayout editView, Dialog dialog, int titleId)
         {
 
             var btnTip = new Button()
@@ -28,15 +30,18 @@
 
             btnConfirm.MouseUpEventHandler += (sender, e) =>
             {
-                //btnConfirm.IsSelected = false;
-                if (string.IsNullOrEmpty(editText.Text.Trim()) || list.Contains(editText.Text.Trim()))
+                var text = editText.Text.Trim();
+                Regex regtest = new Regex(@"\p{Cs}");
+                Match match = regtest.Match(text);
+                if (match.Success)
                 {
-                    if(titleId == StringId.ModifyMemberNickname)
-                    {
-                        return;
-                    }
+                    HDLCommon.Current.ShowAlert(Language.StringByID(StringId.CannotEnterSpecialCharacters));
+                    return;
+                }
+                if (string.IsNullOrEmpty(text) || list.Contains(text))
+                {
                     string tipMsgString = "";
-                    if (string.IsNullOrEmpty(editText.Text.Trim()))
+                    if (string.IsNullOrEmpty(text))
                     {
                         tipMsgString = Language.StringByID(errorId_IsNullOrEmpty);
                     }
@@ -58,7 +63,7 @@
                 }
 
 
-                callBackAction(editText.Text.Trim());
+                callBackAction(text);
                 dialog.Close();
             };
         }
@@ -69,7 +74,7 @@
         /// 淇濆瓨鎸夐挳浜嬩欢闇�瑕佸皢
         /// </summary>
         /// <param name="callBackAction">鍥炶皟鍑芥暟</param>
-        public void LoadDialog_EditParater(int titleId, string editParater, Action<string> callBackAction, int errorId_IsNullOrEmpty, int errorId_ContainsPar, List<string> baseList,bool encryption = false)
+        public void LoadDialog_EditParater(int titleId, string editParater, Action<string> callBackAction, int errorId_IsNullOrEmpty, int errorId_ContainsPar, List<string> baseList, bool encryption = false, string confirmText = "")
         {
             Dialog dialog = new Dialog()
             {
@@ -120,15 +125,39 @@
                 Text = editParater,
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextSize = CSS_FontSize.TextFontSize,
-                SecureTextEntry = encryption,
+                //SecureTextEntry = encryption,
                 //TextAlignment = TextAlignment.CenterLeft ,
             };
             editView.AddChidren(etParater);
+            if(encryption)
+            {
+                etParater.SecureTextEntry = encryption;
+            }
 
-            etParater.TextChangeEventHandler = (sender, e) => {
-                if(etParater.Text.Length > 20)
+            Button btnClear = new Button()
+            {
+                X = Application.GetRealWidth(218-25),
+                Gravity = Gravity.CenterVertical,
+                Width = Application.GetRealWidth(24),
+                Height = Application.GetRealWidth(24),
+                UnSelectedImagePath = "Public/ClearIcon.png",
+            };
+            editView.AddChidren(btnClear);
+
+            btnClear.MouseUpEventHandler = (sender, e) =>
+            {
+                etParater.Text = "";
+            };
+
+            etParater.TextChangeEventHandler = (sender, e) =>
+            {
+                if (etParater.Text.Length > 20)
                 {
                     etParater.Text = etParater.Text.Remove(20);
+
+#if __ANDROID__
+                    etParater.SetSelectionEnd();
+#endif
                 }
             };
 
@@ -168,33 +197,34 @@
             {
                 X = btnCancel.Right,
                 Y = btnLine.Y,
-                Width = Application.GetRealWidth(135),
-                Height = Application.GetRealHeight(43+1),
+                Width = Application.GetRealWidth(137),
+                Height = Application.GetRealHeight(43 + 1),
                 TextAlignment = TextAlignment.Center,
                 //TextColor = CSS_Color.TextualColor,
-                //TextSize = CSS_FontSize.SubheadingFontSize,
+                TextSize = CSS_FontSize.SubheadingFontSize,
                 TextColor = CSS_Color.MainBackgroundColor,
                 BackgroundColor = CSS_Color.MainColor,
                 TextID = StringId.Confirm,
             };
             contentView.AddChidren(btnConfirm);
+
+            //鑷畾涔塨tnConfirm鏍囬
+            if (!string.IsNullOrEmpty(confirmText))
+            {
+                btnConfirm.Text = confirmText;
+            }
+
             int mRectCornerID = HDLUtils.RectCornerBottomRight;
             btnConfirm.SetCornerWithSameRadius((uint)Application.GetMinRealAverage(10), mRectCornerID);
 
             dialog.Show();
 
-            //btnCancel.MouseDownEventHandler += (sender, e) => {
-            //    btnCancel.IsSelected = true;
-            //};
-            btnCancel.MouseUpEventHandler += (sender, e) => {
-                //btnCancel.IsSelected = false;
+            btnCancel.MouseUpEventHandler += (sender, e) =>
+            {
                 dialog.Close();
             };
-            //btnConfirm.MouseDownEventHandler += (sender, e) => {
-            //    btnConfirm.IsSelected = true;
-            //};
             EditParaterEvent(btnConfirm, errorId_IsNullOrEmpty, errorId_ContainsPar, baseList, etParater, callBackAction,
-                contentView, btnLine, btnCancel, editView, dialog,titleId);
+                contentView, btnLine, btnCancel, editView, dialog, titleId);
         }
 
         /// <summary>
@@ -203,7 +233,7 @@
         /// <param name="titleId"></param>
         /// <param name="msgId"></param>
         /// <param name="callBackAction"></param>
-        public void TipMsg(int titleId, int msgId, Action callBackAction)
+        public void TipOptionMsg(int titleId, int msgId, Action callBackAction)
         {
             Dialog dialog = new Dialog()
             {
@@ -244,6 +274,7 @@
                 TextColor = CSS_Color.TextualColor,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                 TextID = msgId,
+                IsMoreLines = true,
             };
             contentView.AddChidren(btnMsg);
 
@@ -251,7 +282,7 @@
             {
                 Y = Application.GetRealHeight(96),
                 Height = Application.GetRealHeight(1),
-                Width = Application.GetRealWidth(270/2),
+                Width = Application.GetRealWidth(270 / 2),
                 BackgroundColor = CSS.CSS_Color.DividingLineColor,
             };
             contentView.AddChidren(btnLine);
@@ -270,22 +301,12 @@
             };
             contentView.AddChidren(btnCancel);
 
-            //Button btnBottomLine = new Button()
-            //{
-            //    X = btnCancel.Right,
-            //    Y = btnLine.Bottom,
-            //    Height = Application.GetRealHeight(43),
-            //    Width = Application.GetRealWidth(1),
-            //    BackgroundColor = CSS_Color.DividingLineColor,
-            //};
-            //contentView.AddChidren(btnBottomLine);
-
             Button btnConfirm = new Button()
             {
                 X = btnCancel.Right,
                 Y = btnLine.Y,
                 Width = Application.GetRealWidth(135),
-                Height = Application.GetRealHeight(43+1),
+                Height = Application.GetRealHeight(45),
                 TextAlignment = TextAlignment.Center,
                 //TextColor = CSS_Color.TextualColor,
                 TextSize = CSS_FontSize.SubheadingFontSize,
@@ -295,7 +316,7 @@
             };
             contentView.AddChidren(btnConfirm);
             //渚嬶細鍙充笅鍦嗚 澶у皬涓�50
-            int mRectCornerID =  HDLUtils.RectCornerBottomRight;
+            int mRectCornerID = HDLUtils.RectCornerBottomRight;
             btnConfirm.SetCornerWithSameRadius((uint)Application.GetMinRealAverage(10), mRectCornerID);
             dialog.Show();
 
@@ -326,22 +347,33 @@
         /// </summary>
         /// <param name="msg"></param>
         /// <param name="isWhite"></param>
-        public void TipMsgAutoClose(string msg,bool isWhite,int closeTime = 1500)
+        public void TipMsgAutoClose(string msg, bool isWhite, int closeTime = 1500)
         {
-            Dialog dialog = new Dialog()
+            Dialog dialog = new Dialog();
+
+            FrameLayout dialogBody = new FrameLayout();
+            dialog.AddChidren(dialogBody);
+            dialogBody.MouseUpEventHandler = (sender, e) =>
+            {
+                dialog.Close();
+                dialog = null;
+            };
+
+            FrameLayout frame = new FrameLayout()
             {
                 X = Application.GetRealWidth(89),
                 Y = Application.GetRealHeight(285),
                 Width = Application.GetRealWidth(198),
                 Height = Application.GetRealHeight(98),
-            };
-
-            FrameLayout frame = new FrameLayout()
-            {
                 BackgroundColor = isWhite ? 0xE6FFFFFF : CSS_Color.DialogTransparentColor1,
                 Radius = (uint)Application.GetRealWidth(12),
             };
             dialog.AddChidren(frame);
+            frame.MouseUpEventHandler = (sender, e) =>
+            {
+                dialog.Close();
+                dialog = null;
+            };
 
             Button btnTipIcon = new Button()
             {
@@ -361,18 +393,24 @@
                 TextSize = CSS_FontSize.TextFontSize,
                 TextColor = isWhite ? CSS_Color.FirstLevelTitleColor : CSS_Color.MainBackgroundColor,
                 Text = msg,
+                IsMoreLines = true,
             };
             frame.AddChidren(btnTipMsg);
 
             dialog.Show();
 
-            new Thread(() => {
+            new Thread(() =>
+            {
                 Thread.Sleep(closeTime);
                 Application.RunOnMainThread(() =>
                 {
-                    dialog.Close();
+                    if(dialog!=null)
+                    {
+                        dialog.Close();
+                    }
                 });
-            }) { IsBackground = true }.Start();
+            })
+            { IsBackground = true }.Start();
         }
 
         /// <summary>
@@ -380,7 +418,7 @@
         /// </summary>
         /// <param name="titleId"></param>
         /// <param name="msgId"></param>
-        public void TipMsg(int titleId, int msgId)
+        public void TipMsg(int titleId, int msgId,Action action = null)
         {
             Dialog dialog = new Dialog()
             {
@@ -421,6 +459,7 @@
                 TextColor = CSS_Color.TextualColor,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                 TextID = msgId,
+                IsMoreLines = true,
             };
             contentView.AddChidren(btnMsg);
 
@@ -454,6 +493,7 @@
             btnConfirm.MouseUpEventHandler += (sender, e) =>
             {
                 btnConfirm.IsSelected = false;
+                action?.Invoke();
                 dialog.Close();
             };
 
@@ -523,10 +563,344 @@
             frame.AddChidren(btnTipMsg);
 
             dialog.Show();
-            return new Action(() => {
+            return new Action(() =>
+            {
                 dialog.Close();
             });
         }
 
+        /// <summary>
+        /// 鍦烘櫙寤舵椂璁剧疆寮圭獥
+        /// </summary>
+        /// <param name="function"></param>
+        public void SetSceneDelayDialog(Action<string> action,string curItemKey)//Dictionary<string,string>items, 
+        {
+            List<int> mRange = new List<int>();
+            List<int> sRange = new List<int>();
+            for (int i = 0; i <= 59; i++)
+            {
+                mRange.Add(i);
+                sRange.Add(i);
+            }
+            sRange.Add(60);
+            BottomTimeSelectControl timeControl = new BottomTimeSelectControl(mRange, sRange, 5, Language.StringByID(StringId.SceneDelay));
+            timeControl.RowHeight = Application.GetRealHeight(50);
+            timeControl.InitControl(0, 0, 262, false);
+            //timeControl.ChangePickerEvent2();
+            timeControl.FinishEvent = (type, hours, min) =>
+            {
+                if(type == 1)
+                {
+                    curItemKey = (hours * 60 + min).ToString();
+                    action(curItemKey);
+                }
+            };
+
+
+
+            return;
+
+            //    Button lastButton = new Button();
+            //Dialog dialog = new Dialog();
+            //var pView = new FrameLayout()
+            //{
+            //    BackgroundColor = CSS_Color.DialogTransparentColor1,
+            //};
+            //dialog.AddChidren(pView);
+
+            //var itemCount = items.Count;
+            //var optionBaseViewHeight = ((itemCount > 3 ? itemCount : 3) + 1) * Application.GetRealHeight(50);
+            //var optionBaseView = new FrameLayout()
+            //{
+            //    //Y = Application.GetRealHeight(439),
+            //    Y = Application.GetRealHeight(647) - optionBaseViewHeight,
+            //    Gravity = Gravity.CenterHorizontal,
+            //    Width = Application.GetRealWidth(343),
+            //    //Height = Application.GetRealHeight(208),
+            //    Height = optionBaseViewHeight,
+            //    //AnimateSpeed = 0.3f,
+            //    //Animate = Animate.DownToUp,
+            //    BackgroundColor = CSS_Color.MainBackgroundColor,
+            //    Radius = (uint)Application.GetRealWidth(12),
+            //};
+            //pView.AddChidren(optionBaseView);
+
+            //var topView = new FrameLayout()
+            //{
+            //    Gravity = Gravity.CenterHorizontal,
+            //    Width = Application.GetRealWidth(343),
+            //    Height = Application.GetRealHeight(50),
+            //    BackgroundColor = CSS_Color.MainBackgroundColor,
+            //    Radius = (uint)Application.GetRealWidth(12),
+            //};
+            //optionBaseView.AddChidren(topView);
+
+            //var btnTitle = new Button()
+            //{
+            //    Gravity = Gravity.CenterHorizontal,
+            //    TextAlignment = TextAlignment.Center,
+            //    Width = Application.GetRealWidth(100),
+            //    TextID = StringId.SceneDelay,
+            //    IsBold = true,
+            //    TextColor = CSS_Color.FirstLevelTitleColor,
+            //    TextSize = CSS_FontSize.SubheadingFontSize,
+            //};
+            //topView.AddChidren(btnTitle);
+
+            //var btnCancel = new Button()
+            //{
+            //    X = Application.GetRealWidth(21),
+            //    Width = Application.GetRealWidth(100),
+            //    TextAlignment = TextAlignment.CenterLeft,
+            //    TextColor = CSS_Color.PromptingColor1,
+            //    TextSize = CSS_FontSize.TextFontSize,
+            //    TextID = StringId.Cancel,
+            //};
+            //topView.AddChidren(btnCancel);
+
+            //var btnConfrim = new Button()
+            //{
+            //    X = Application.GetRealWidth(160),
+            //    Width = Application.GetRealWidth(160),
+            //    TextAlignment = TextAlignment.CenterRight,
+            //    TextColor = CSS_Color.MainColor,
+            //    TextSize = CSS_FontSize.TextFontSize,
+            //    TextID = StringId.Confirm,
+            //};
+            //topView.AddChidren(btnConfrim);
+
+            //var itemsView = new VerticalScrolViewLayout()
+            //{
+            //    Y = topView.Bottom,
+            //    Height = optionBaseViewHeight - Application.GetRealHeight(50),
+            //    ScrollEnabled = itemCount > 4,
+            //};
+            //optionBaseView.AddChidren(itemsView);
+
+            //bool isFrist = true;
+            //Button btnLastSelectedTip = null;
+
+            //foreach (var item in items)
+            //{
+            //    if (isFrist)
+            //    {
+            //        isFrist = false;
+            //    }
+            //    else
+            //    {
+            //        itemsView.AddChidren(new Button() { Height = 1, BackgroundColor = CSS_Color.DividingLineColor });
+            //    }
+            //    var row = new FrameLayout()
+            //    {
+            //        Height = Application.GetRealHeight(50),
+            //    };
+            //    itemsView.AddChidren(row);
+
+            //    var btnTipSelected = new Button()
+            //    {
+            //        X = Application.GetRealWidth(303),
+            //        Gravity = Gravity.CenterVertical,
+            //        Width = Application.GetRealWidth(28),
+            //        Height= Application.GetRealWidth(28),
+            //        UnSelectedImagePath = "Public/ChooseIcon.png",
+            //        SelectedImagePath = "Public/ChooseOnIcon.png",
+            //    };
+            //    row.AddChidren(btnTipSelected);
+            //    if( item.Key == curItemKey)
+            //    {
+            //        btnTipSelected.IsSelected = true;
+            //        btnLastSelectedTip = btnTipSelected;
+            //    }
+
+
+            //    var btnRowTitle = new Button()
+            //    {
+            //        X = Application.GetRealWidth(16),
+            //        Text = item.Value,
+            //        TextSize = CSS_FontSize.TextFontSize,
+            //        TextColor = CSS_Color.FirstLevelTitleColor,
+            //        TextAlignment = TextAlignment.CenterLeft,
+            //    };
+            //    row.AddChidren(btnRowTitle);
+
+            //    btnRowTitle.MouseUpEventHandler = (sender, e) =>
+            //    {
+            //        if (btnTipSelected.IsSelected)
+            //        {
+            //            curItemKey = "0";
+            //            btnTipSelected.IsSelected = false;
+            //            btnLastSelectedTip = null;
+            //        }
+            //        else
+            //        {
+            //            curItemKey = item.Key;
+            //            if (btnLastSelectedTip != null)
+            //            {
+            //                btnLastSelectedTip.IsSelected = false;
+            //            }
+            //            btnTipSelected.IsSelected = true;
+            //            btnLastSelectedTip = btnTipSelected;
+            //        }
+            //    };
+
+            //}
+
+            //Button btn1 = new Button()
+            //{
+            //    Width = Application.GetRealWidth(128),
+            //    Height = Application.GetRealWidth(44),
+            //    TextAlignment = TextAlignment.Center,
+            //    TextSize = CSS_FontSize.SubheadingFontSize,
+            //    TextColor = CSS_Color.FirstLevelTitleColor,
+            //    Text = "30s",
+            //    BorderColor = CSS_Color.PromptingColor1,
+            //    BorderWidth = 1,
+            //    Radius = (uint)Application.GetRealWidth(8),
+            //    SelectedTextColor = CSS_Color.MainBackgroundColor,
+            //    SelectedBackgroundColor = CSS_Color.MainColor,
+            //    X = Application.GetRealWidth(20),
+            //    Y = Application.GetRealHeight(80),
+            //    IsSelected = curItemKey == "30"
+            //};
+            //optionBaseView.AddChidren(btn1);
+
+
+            //Button btn2 = new Button()
+            //{
+            //    Width = Application.GetRealWidth(128),
+            //    Height = Application.GetRealWidth(44),
+            //    TextAlignment = TextAlignment.Center,
+            //    TextSize = CSS_FontSize.SubheadingFontSize,
+            //    TextColor = CSS_Color.FirstLevelTitleColor,
+            //    Text = "1min",
+            //    BorderColor = CSS_Color.PromptingColor1,
+            //    BorderWidth = 1,
+            //    Radius = (uint)Application.GetRealWidth(8),
+            //    SelectedTextColor = CSS_Color.MainBackgroundColor,
+            //    SelectedBackgroundColor = CSS_Color.MainColor,
+            //    X = Application.GetRealWidth(195),
+            //    Y = Application.GetRealHeight(80),
+            //    IsSelected = curItemKey == "60"
+            //};
+            //optionBaseView.AddChidren(btn2);
+
+
+            //Button btn3 = new Button()
+            //{
+            //    Width = Application.GetRealWidth(128),
+            //    Height = Application.GetRealWidth(44),
+            //    TextAlignment = TextAlignment.Center,
+            //    TextSize = CSS_FontSize.SubheadingFontSize,
+            //    TextColor = CSS_Color.FirstLevelTitleColor,
+            //    Text = "2min",
+            //    BorderColor = CSS_Color.PromptingColor1,
+            //    BorderWidth = 1,
+            //    Radius = (uint)Application.GetRealWidth(8),
+            //    SelectedTextColor = CSS_Color.MainBackgroundColor,
+            //    SelectedBackgroundColor = CSS_Color.MainColor,
+            //    X = Application.GetRealWidth(20),
+            //    Y = Application.GetRealHeight(140),
+            //    IsSelected = curItemKey == "120"
+            //};
+            //optionBaseView.AddChidren(btn3);
+
+
+            //Button btn4 = new Button()
+            //{
+            //    Width = Application.GetRealWidth(128),
+            //    Height = Application.GetRealWidth(44),
+            //    TextAlignment = TextAlignment.Center,
+            //    TextSize = CSS_FontSize.SubheadingFontSize,
+            //    TextColor = CSS_Color.FirstLevelTitleColor,
+            //    Text = "5min",
+            //    BorderColor = CSS_Color.PromptingColor1,
+            //    BorderWidth = 1,
+            //    Radius = (uint)Application.GetRealWidth(8),
+            //    SelectedTextColor = CSS_Color.MainBackgroundColor,
+            //    SelectedBackgroundColor = CSS_Color.MainColor,
+            //    X = Application.GetRealWidth(195),
+            //    Y = Application.GetRealHeight(140),
+            //    IsSelected = curItemKey == "300"
+            //};
+            //optionBaseView.AddChidren(btn4);
+
+
+
+
+            //dialog.Show();
+
+            //pView.MouseUpEventHandler = (sender, e) =>
+            //{
+            //    dialog.Close();
+            //};
+
+            //btnCancel.MouseUpEventHandler = (sender, e) =>
+            //{
+            //    dialog.Close();
+            //};
+            //btnConfrim.MouseUpEventHandler = (sender, e) =>
+            //{
+            //    action(curItemKey);
+            //    dialog.Close();
+            //};
+            //btn1.MouseUpEventHandler = (sender, e) => {
+            //    btn1.IsSelected = !btn1.IsSelected;
+            //    btn2.IsSelected = false;
+            //    btn3.IsSelected = false;
+            //    btn4.IsSelected = false;
+            //    if(btn1.IsSelected)
+            //    {
+            //        curItemKey = "30";
+            //    }
+            //    else
+            //    {
+            //        curItemKey = "0";
+            //    }       
+            //};
+            //btn2.MouseUpEventHandler = (sender, e) => {
+            //    btn2.IsSelected = !btn2.IsSelected;
+            //    btn1.IsSelected = false;
+            //    btn3.IsSelected = false;
+            //    btn4.IsSelected = false;
+            //    if (btn2.IsSelected)
+            //    {
+            //        curItemKey = "60";
+            //    }
+            //    else
+            //    {
+            //        curItemKey = "0";
+            //    }
+            //};
+            //btn3.MouseUpEventHandler = (sender, e) => {
+            //    btn3.IsSelected = !btn3.IsSelected;
+            //    btn2.IsSelected = false;
+            //    btn1.IsSelected = false;
+            //    btn4.IsSelected = false;
+            //    if (btn3.IsSelected)
+            //    {
+            //        curItemKey = "120";
+            //    }
+            //    else
+            //    {
+            //        curItemKey = "0";
+            //    }
+            //};
+            //btn4.MouseUpEventHandler = (sender, e) => {
+            //    btn4.IsSelected = !btn4.IsSelected;
+            //    btn2.IsSelected = false;
+            //    btn3.IsSelected = false;
+            //    btn1.IsSelected = false;
+            //    if (btn4.IsSelected)
+            //    {
+            //        curItemKey = "300";
+            //    }
+            //    else
+            //    {
+            //        curItemKey = "0";
+            //    }
+            //};
+
+        }
+
     }
-}
\ No newline at end of file
+}

--
Gitblit v1.8.0