Пример #1
0
        private void LoadAddLoginWPF()
        {
            // define UI elements.
            Header = Properties_Resources.Where;

            System.Uri  resourceLocater = new System.Uri("/DataSpaceSync;component/SetupAddLoginWPF.xaml", System.UriKind.Relative);
            UserControl LoadAddLoginWPF = Application.LoadComponent(resourceLocater) as UserControl;

            address_label       = LoadAddLoginWPF.FindName("address_label") as TextBlock;
            address_box         = LoadAddLoginWPF.FindName("address_box") as TextBox;
            address_help_label  = LoadAddLoginWPF.FindName("address_help_label") as TextBlock;
            user_label          = LoadAddLoginWPF.FindName("user_label") as TextBlock;
            user_box            = LoadAddLoginWPF.FindName("user_box") as TextBox;
            user_help_label     = LoadAddLoginWPF.FindName("user_help_label") as TextBlock;
            password_label      = LoadAddLoginWPF.FindName("password_label") as TextBlock;
            password_box        = LoadAddLoginWPF.FindName("password_box") as PasswordBox;
            password_progress   = LoadAddLoginWPF.FindName("password_progress") as CircularProgressBar;
            password_help_label = LoadAddLoginWPF.FindName("password_help_label") as TextBlock;
            address_error_label = LoadAddLoginWPF.FindName("address_error_label") as TextBox;
            continue_button     = LoadAddLoginWPF.FindName("continue_button") as Button;
            cancel_button       = LoadAddLoginWPF.FindName("cancel_button") as Button;

            ContentCanvas.Children.Add(LoadAddLoginWPF);

            address_box.Text = (Controller.PreviousAddress != null) ? Controller.PreviousAddress.ToString() : String.Empty;

            if (Controller.saved_user == String.Empty || Controller.saved_user == null)
            {
                user_box.Text = DefaultEntries.Defaults.Name;
            }
            else
            {
                user_box.Text = Controller.saved_user;
            }

            TaskbarItemInfo.ProgressValue = 0.0;
            TaskbarItemInfo.ProgressState = TaskbarItemProgressState.None;
            if (!DefaultEntries.Defaults.CanModifyUrl)
            {
                address_box.IsEnabled         = false;
                address_box.Visibility        = Visibility.Hidden;
                address_help_label.Visibility = Visibility.Hidden;
                address_label.Visibility      = Visibility.Hidden;
            }

            if (Controller.PreviousAddress == null || Controller.PreviousAddress.ToString() == String.Empty)
            {
                address_box.Text = DefaultEntries.Defaults.Url;
            }
            else
            {
                address_box.Text = Controller.PreviousAddress.ToString();
            }
            address_box.Focus();
            address_box.Select(address_box.Text.Length, 0);

            // Actions.
            ControllerLoginInsertAction();
            Controller.CheckAddPage(address_box.Text);

            address_box.TextChanged += delegate {
                string error = Controller.CheckAddPage(address_box.Text);
                if (!String.IsNullOrEmpty(error))
                {
                    address_error_label.Text       = Properties_Resources.ResourceManager.GetString(error, CultureInfo.CurrentCulture);
                    address_error_label.Visibility = Visibility.Visible;
                }
                else
                {
                    address_error_label.Visibility = Visibility.Hidden;
                }
            };

            cancel_button.Click += delegate {
                ControllerLoginRemoveAction();
                Controller.PageCancelled();
            };

            string binding = Controller.saved_binding;

            if (binding == null)
            {
                binding = CmisRepoCredentials.BindingBrowser;
            }

            continue_button.Click += delegate {
                // Show wait cursor
                password_progress.Visibility        = Visibility.Visible;
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;

                // Try to find the CMIS server (asynchronously)
                GetRepositoriesDelegate dlgt =
                    new GetRepositoriesDelegate(SetupController.GetRepositories);
                ServerCredentials credentials = new ServerCredentials()
                {
                    UserName = user_box.Text,
                    Password = password_box.Password,
                    Address  = new Uri(address_box.Text),
                    Binding  = binding,
                };
                IAsyncResult ar = dlgt.BeginInvoke(credentials, null, null);
                while (!ar.AsyncWaitHandle.WaitOne(100))
                {
                    System.Windows.Forms.Application.DoEvents();
                }

                var result = dlgt.EndInvoke(ar);
                Controller.repositories = result.Repositories.WithoutHiddenOnce();

                address_box.Text = result.Credentials.Address.ToString();
                binding          = result.Credentials.Binding;

                // Hide wait cursor
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;
                password_progress.Visibility        = Visibility.Hidden;

                if (Controller.repositories == null)
                {
                    // Could not retrieve repositories list from server, show warning.
                    string warning = Controller.GetConnectionsProblemWarning(result.FailedException);
                    address_error_label.Text       = warning;
                    address_error_label.Visibility = Visibility.Visible;
                }
                else
                {
                    ControllerLoginRemoveAction();
                    // Continue to next step, which is choosing a particular folder.
                    Controller.Add1PageCompleted(
                        new Uri(address_box.Text),
                        binding,
                        user_box.Text,
                        password_box.Password);
                }
            };
        }
Пример #2
0
        private void ShowAdd1Page() {
            this.Present();
            this.Header = Properties_Resources.Where;

            VBox layout_vertical   = new VBox(false, 12);
            HBox layout_fields     = new HBox(true, 12);
            VBox layout_address    = new VBox(true, 0);
            HBox layout_address_help = new HBox(false, 3);
            VBox layout_user       = new VBox(true, 0);
            VBox layout_password   = new VBox(true, 0);

            // Address
            Label address_label = new Label() {
                UseMarkup = true,
                Xalign = 0,
                Markup = "<b>" +
                Properties_Resources.EnterWebAddress +
                "</b>"
            };

            Entry address_entry = new Entry() {
                Text = (this.controller.PreviousAddress == null || string.IsNullOrEmpty(this.controller.PreviousAddress.ToString())) ? DefaultEntries.Defaults.Url : this.controller.PreviousAddress.ToString(),
                IsEditable = DefaultEntries.Defaults.CanModifyUrl,
                ActivatesDefault = false
            };

            Label address_help_label = new Label() {
                Xalign = 0,
                UseMarkup = true,
                Markup = "<span foreground=\"#808080\" size=\"small\">" +
                Properties_Resources.Help + ": " +
                "</span>"
            };
            EventBox address_help_urlbox = new EventBox();
            Label address_help_urllabel = new Label() {
                Xalign = 0,
                UseMarkup = true,
                Markup = "<span foreground=\"blue\" underline=\"single\" size=\"small\">" +
                Properties_Resources.WhereToFind +
                "</span>"
            };
            address_help_urlbox.Add(address_help_urllabel);
            address_help_urlbox.ButtonPressEvent += delegate(object o, ButtonPressEventArgs args) {
                Process process = new Process();
                process.StartInfo.FileName  = "xdg-open";
                process.StartInfo.Arguments = "https://github.com/nicolas-raoul/CmisSync/wiki/What-address";
                process.Start();
            };
            address_help_urlbox.EnterNotifyEvent += delegate(object o, EnterNotifyEventArgs args) {
                address_help_urlbox.GdkWindow.Cursor = handCursor;
            };

            Label address_error_label = new Label() {
                Xalign = 0,
                UseMarkup = true,
                Markup = string.Empty
            };
            address_error_label.Hide();

            // User
            Entry user_entry = new Entry() {
                Text = this.controller.PreviousPath,
                ActivatesDefault = false
            };

            if (string.IsNullOrEmpty(this.controller.saved_user)) {
                user_entry.Text = DefaultEntries.Defaults.Name;
            } else {
                user_entry.Text = this.controller.saved_user;
            }

            // Password
            Entry password_entry = new Entry() {
                Visibility = false,
                ActivatesDefault = true
            };

            this.controller.ChangeAddressFieldEvent += delegate(string text, string example_text) {
                Application.Invoke(delegate {
                    address_entry.Text = text;
                });
            };

            this.controller.ChangeUserFieldEvent += delegate(string text, string example_text) {
                Application.Invoke(delegate {
                    user_entry.Text = text;
                });
            };

            this.controller.ChangePasswordFieldEvent += delegate(string text, string example_text) {
                Application.Invoke(delegate {
                    password_entry.Text = text;
                });
            };

            address_entry.Changed += delegate {
                string error = this.controller.CheckAddPage(address_entry.Text);
                if (!string.IsNullOrEmpty(error)) {
                    address_error_label.Markup = "<span foreground=\"red\">" + Properties_Resources.ResourceManager.GetString(error, CultureInfo.CurrentCulture) + "</span>";
                    address_error_label.Show();
                } else {
                    address_error_label.Hide();
                }
            };

            // Address
            layout_address_help.PackStart(address_help_label, false, false, 0);
            layout_address_help.PackStart(address_help_urlbox, false, false, 0);
            layout_address.PackStart(address_label, true, true, 0);
            layout_address.PackStart(address_entry, true, true, 0);
            layout_address.PackStart(layout_address_help, true, true, 0);

            // User
            layout_user.PackStart(
                new Label() {
                Markup = "<b>" + Properties_Resources.User + ":</b>",
                Xalign = 0
            },
            true,
            true,
            0);
            layout_user.PackStart(user_entry, false, false, 0);

            // Password
            layout_password.PackStart(
                new Label() {
                Markup = "<b>" + Properties_Resources.Password + ":</b>",
                Xalign = 0
            },
            true,
            true,
            0);
            layout_password.PackStart(password_entry, false, false, 0);
            layout_fields.PackStart(layout_user);
            layout_fields.PackStart(layout_password);
            layout_vertical.PackStart(layout_address, false, false, 0);
            layout_vertical.PackStart(layout_fields, false, false, 0);
            layout_vertical.PackStart(address_error_label, true, true, 0);
            this.Add(layout_vertical);

            // Cancel button
            Button cancel_button = new Button(this.cancelText);

            cancel_button.Clicked += delegate {
                this.controller.PageCancelled();
            };

            // Continue button
            Button continue_button = new Button(this.continueText) {
                Sensitive = string.IsNullOrEmpty(this.controller.CheckAddPage(address_entry.Text))
            };

            continue_button.Clicked += delegate {
                // Show wait cursor
                this.GdkWindow.Cursor = waitCursor;

                // Try to find the CMIS server (asynchronous using a delegate)
                GetRepositoriesDelegate dlgt =
                    new GetRepositoriesDelegate(SetupController.GetRepositories);
                ServerCredentials credentials = new ServerCredentials() {
                    UserName = user_entry.Text,
                    Password = password_entry.Text,
                    Address = new Uri(address_entry.Text),
                    Binding = this.controller.saved_binding ?? ServerCredentials.BindingBrowser
                };
                IAsyncResult ar = dlgt.BeginInvoke(credentials, null, null);
                while (!ar.AsyncWaitHandle.WaitOne(100)) {
                    while (Application.EventsPending()) {
                        Application.RunIteration();
                    }
                }

                var result = dlgt.EndInvoke(ar);
                if (result.Repositories != null) {
                    this.controller.repositories = result.Repositories.WithoutHiddenOnce();
                    address_entry.Text = result.Credentials.Address.ToString();
                } else {
                    this.controller.repositories = null;

                    // Show best found Url
                    address_entry.Text = result.Credentials.Address.ToString();

                    // Show warning
                    string warning = this.controller.GetConnectionsProblemWarning(result.FailedException);
                    address_error_label.Markup = "<span foreground=\"red\">" + warning + "</span>";
                    address_error_label.Show();
                }

                // Hide wait cursor
                this.GdkWindow.Cursor = defaultCursor;

                if (this.controller.repositories != null) {
                    // Continue to folder selection
                    this.controller.Add1PageCompleted(
                        new Uri(address_entry.Text), result.Credentials.Binding, user_entry.Text, password_entry.Text);
                }
            };

            this.controller.UpdateAddProjectButtonEvent += delegate(bool button_enabled) {
                Application.Invoke(delegate {
                    continue_button.Sensitive = button_enabled;
                    if (button_enabled) {
                        continue_button.SetFlag(Gtk.WidgetFlags.CanFocus);
                        continue_button.SetFlag(Gtk.WidgetFlags.CanDefault);
                        continue_button.GrabDefault();
                    }
                });
            };

            this.AddButton(cancel_button);
            this.AddButton(continue_button);

            this.controller.CheckAddPage(address_entry.Text);
            address_entry.GrabFocus();
        }
Пример #3
0
        private void ShowAdd1Page()
        {
            this.Present();
            this.Header = Properties_Resources.Where;

            VBox layout_vertical     = new VBox(false, 12);
            HBox layout_fields       = new HBox(true, 12);
            VBox layout_address      = new VBox(true, 0);
            HBox layout_address_help = new HBox(false, 3);
            VBox layout_user         = new VBox(true, 0);
            VBox layout_password     = new VBox(true, 0);

            // Address
            Label address_label = new Label()
            {
                UseMarkup = true,
                Xalign    = 0,
                Markup    = "<b>" +
                            Properties_Resources.EnterWebAddress +
                            "</b>"
            };

            Entry address_entry = new Entry()
            {
                Text             = (this.controller.PreviousAddress == null || string.IsNullOrEmpty(this.controller.PreviousAddress.ToString())) ? DefaultEntries.Defaults.Url : this.controller.PreviousAddress.ToString(),
                IsEditable       = DefaultEntries.Defaults.CanModifyUrl,
                ActivatesDefault = false
            };

            Label address_help_label = new Label()
            {
                Xalign    = 0,
                UseMarkup = true,
                Markup    = "<span foreground=\"#808080\" size=\"small\">" +
                            Properties_Resources.Help + ": " +
                            "</span>"
            };
            EventBox address_help_urlbox   = new EventBox();
            Label    address_help_urllabel = new Label()
            {
                Xalign    = 0,
                UseMarkup = true,
                Markup    = "<span foreground=\"blue\" underline=\"single\" size=\"small\">" +
                            Properties_Resources.WhereToFind +
                            "</span>"
            };

            address_help_urlbox.Add(address_help_urllabel);
            address_help_urlbox.ButtonPressEvent += delegate(object o, ButtonPressEventArgs args) {
                Process process = new Process();
                process.StartInfo.FileName  = "xdg-open";
                process.StartInfo.Arguments = "https://github.com/nicolas-raoul/CmisSync/wiki/What-address";
                process.Start();
            };
            address_help_urlbox.EnterNotifyEvent += delegate(object o, EnterNotifyEventArgs args) {
                address_help_urlbox.GdkWindow.Cursor = handCursor;
            };

            Label address_error_label = new Label()
            {
                Xalign    = 0,
                UseMarkup = true,
                Markup    = string.Empty
            };

            address_error_label.Hide();

            // User
            Entry user_entry = new Entry()
            {
                Text             = this.controller.PreviousPath,
                ActivatesDefault = false
            };

            if (string.IsNullOrEmpty(this.controller.saved_user))
            {
                user_entry.Text = DefaultEntries.Defaults.Name;
            }
            else
            {
                user_entry.Text = this.controller.saved_user;
            }

            // Password
            Entry password_entry = new Entry()
            {
                Visibility       = false,
                ActivatesDefault = true
            };

            this.controller.ChangeAddressFieldEvent += delegate(string text, string example_text) {
                Application.Invoke(delegate {
                    address_entry.Text = text;
                });
            };

            this.controller.ChangeUserFieldEvent += delegate(string text, string example_text) {
                Application.Invoke(delegate {
                    user_entry.Text = text;
                });
            };

            this.controller.ChangePasswordFieldEvent += delegate(string text, string example_text) {
                Application.Invoke(delegate {
                    password_entry.Text = text;
                });
            };

            address_entry.Changed += delegate {
                string error = this.controller.CheckAddPage(address_entry.Text);
                if (!string.IsNullOrEmpty(error))
                {
                    address_error_label.Markup = "<span foreground=\"red\">" + Properties_Resources.ResourceManager.GetString(error, CultureInfo.CurrentCulture) + "</span>";
                    address_error_label.Show();
                }
                else
                {
                    address_error_label.Hide();
                }
            };

            // Address
            layout_address_help.PackStart(address_help_label, false, false, 0);
            layout_address_help.PackStart(address_help_urlbox, false, false, 0);
            layout_address.PackStart(address_label, true, true, 0);
            layout_address.PackStart(address_entry, true, true, 0);
            layout_address.PackStart(layout_address_help, true, true, 0);

            // User
            layout_user.PackStart(
                new Label()
            {
                Markup = "<b>" + Properties_Resources.User + ":</b>",
                Xalign = 0
            },
                true,
                true,
                0);
            layout_user.PackStart(user_entry, false, false, 0);

            // Password
            layout_password.PackStart(
                new Label()
            {
                Markup = "<b>" + Properties_Resources.Password + ":</b>",
                Xalign = 0
            },
                true,
                true,
                0);
            layout_password.PackStart(password_entry, false, false, 0);
            layout_fields.PackStart(layout_user);
            layout_fields.PackStart(layout_password);
            layout_vertical.PackStart(layout_address, false, false, 0);
            layout_vertical.PackStart(layout_fields, false, false, 0);
            layout_vertical.PackStart(address_error_label, true, true, 0);
            this.Add(layout_vertical);

            // Cancel button
            Button cancel_button = new Button(this.cancelText);

            cancel_button.Clicked += delegate {
                this.controller.PageCancelled();
            };

            // Continue button
            Button continue_button = new Button(this.continueText)
            {
                Sensitive = string.IsNullOrEmpty(this.controller.CheckAddPage(address_entry.Text))
            };

            continue_button.Clicked += delegate {
                // Show wait cursor
                this.GdkWindow.Cursor = waitCursor;

                // Try to find the CMIS server (asynchronous using a delegate)
                GetRepositoriesDelegate dlgt =
                    new GetRepositoriesDelegate(SetupController.GetRepositories);
                ServerCredentials credentials = new ServerCredentials()
                {
                    UserName = user_entry.Text,
                    Password = password_entry.Text,
                    Address  = new Uri(address_entry.Text),
                    Binding  = this.controller.saved_binding ?? ServerCredentials.BindingBrowser
                };
                IAsyncResult ar = dlgt.BeginInvoke(credentials, null, null);
                while (!ar.AsyncWaitHandle.WaitOne(100))
                {
                    while (Application.EventsPending())
                    {
                        Application.RunIteration();
                    }
                }

                var result = dlgt.EndInvoke(ar);
                if (result.Repositories != null)
                {
                    this.controller.repositories = result.Repositories.WithoutHiddenOnce();
                    address_entry.Text           = result.Credentials.Address.ToString();
                }
                else
                {
                    this.controller.repositories = null;

                    // Show best found Url
                    address_entry.Text = result.Credentials.Address.ToString();

                    // Show warning
                    string warning = this.controller.GetConnectionsProblemWarning(result.FailedException);
                    address_error_label.Markup = "<span foreground=\"red\">" + warning + "</span>";
                    address_error_label.Show();
                }

                // Hide wait cursor
                this.GdkWindow.Cursor = defaultCursor;

                if (this.controller.repositories != null)
                {
                    // Continue to folder selection
                    this.controller.Add1PageCompleted(
                        new Uri(address_entry.Text), result.Credentials.Binding, user_entry.Text, password_entry.Text);
                }
            };

            this.controller.UpdateAddProjectButtonEvent += delegate(bool button_enabled) {
                Application.Invoke(delegate {
                    continue_button.Sensitive = button_enabled;
                    if (button_enabled)
                    {
                        continue_button.SetFlag(Gtk.WidgetFlags.CanFocus);
                        continue_button.SetFlag(Gtk.WidgetFlags.CanDefault);
                        continue_button.GrabDefault();
                    }
                });
            };

            this.AddButton(cancel_button);
            this.AddButton(continue_button);

            this.controller.CheckAddPage(address_entry.Text);
            address_entry.GrabFocus();
        }
Пример #4
0
        private void LoadAddLoginWPF() {
            // define UI elements.
            Header = Properties_Resources.Where;

            System.Uri resourceLocater = new System.Uri("/DataSpaceSync;component/SetupAddLoginWPF.xaml", System.UriKind.Relative);
            UserControl LoadAddLoginWPF = Application.LoadComponent(resourceLocater) as UserControl;

            address_label = LoadAddLoginWPF.FindName("address_label") as TextBlock;
            address_box = LoadAddLoginWPF.FindName("address_box") as TextBox;
            address_help_label = LoadAddLoginWPF.FindName("address_help_label") as TextBlock;
            user_label = LoadAddLoginWPF.FindName("user_label") as TextBlock;
            user_box = LoadAddLoginWPF.FindName("user_box") as TextBox;
            user_help_label = LoadAddLoginWPF.FindName("user_help_label") as TextBlock;
            password_label = LoadAddLoginWPF.FindName("password_label") as TextBlock;
            password_box = LoadAddLoginWPF.FindName("password_box") as PasswordBox;
            password_progress = LoadAddLoginWPF.FindName("password_progress") as CircularProgressBar;
            password_help_label = LoadAddLoginWPF.FindName("password_help_label") as TextBlock;
            address_error_label = LoadAddLoginWPF.FindName("address_error_label") as TextBox;
            continue_button = LoadAddLoginWPF.FindName("continue_button") as Button;
            cancel_button = LoadAddLoginWPF.FindName("cancel_button") as Button;

            ContentCanvas.Children.Add(LoadAddLoginWPF);

            address_box.Text = (Controller.PreviousAddress != null) ? Controller.PreviousAddress.ToString() : String.Empty;

            if (Controller.saved_user == String.Empty || Controller.saved_user == null) {
                user_box.Text = DefaultEntries.Defaults.Name;
            } else {
                user_box.Text = Controller.saved_user;
            }

            TaskbarItemInfo.ProgressValue = 0.0;
            TaskbarItemInfo.ProgressState = TaskbarItemProgressState.None;
            if (!DefaultEntries.Defaults.CanModifyUrl) {
                address_box.IsEnabled = false;
                address_box.Visibility = Visibility.Hidden;
                address_help_label.Visibility = Visibility.Hidden;
                address_label.Visibility = Visibility.Hidden;
            }

            if (Controller.PreviousAddress == null || Controller.PreviousAddress.ToString() == String.Empty) {
                address_box.Text = DefaultEntries.Defaults.Url;
            } else {
                address_box.Text = Controller.PreviousAddress.ToString();
            }
            address_box.Focus();
            address_box.Select(address_box.Text.Length, 0);

            // Actions.
            ControllerLoginInsertAction();
            Controller.CheckAddPage(address_box.Text);

            address_box.TextChanged += delegate {
                string error = Controller.CheckAddPage(address_box.Text);
                if (!String.IsNullOrEmpty(error)) {
                    address_error_label.Text = Properties_Resources.ResourceManager.GetString(error, CultureInfo.CurrentCulture);
                    address_error_label.Visibility = Visibility.Visible;
                } else {
                    address_error_label.Visibility = Visibility.Hidden;
                }
            };

            cancel_button.Click += delegate {
                ControllerLoginRemoveAction();
                Controller.PageCancelled();
            };

            string binding = Controller.saved_binding;
            if (binding == null) {
                binding = CmisRepoCredentials.BindingBrowser;
            }

            continue_button.Click += delegate {
                // Show wait cursor
                password_progress.Visibility = Visibility.Visible;
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;

                // Try to find the CMIS server (asynchronously)
                GetRepositoriesDelegate dlgt =
                    new GetRepositoriesDelegate(SetupController.GetRepositories);
                ServerCredentials credentials = new ServerCredentials() {
                    UserName = user_box.Text,
                    Password = password_box.Password,
                    Address = new Uri(address_box.Text),
                    Binding = binding,
                };
                IAsyncResult ar = dlgt.BeginInvoke(credentials, null, null);
                while (!ar.AsyncWaitHandle.WaitOne(100)) {
                    System.Windows.Forms.Application.DoEvents();
                }

                var result = dlgt.EndInvoke(ar);
                Controller.repositories = result.Repositories.WithoutHiddenOnce();

                address_box.Text = result.Credentials.Address.ToString();
                binding = result.Credentials.Binding;

                // Hide wait cursor
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;
                password_progress.Visibility = Visibility.Hidden;

                if (Controller.repositories == null) {
                    // Could not retrieve repositories list from server, show warning.
                    string warning = Controller.GetConnectionsProblemWarning(result.FailedException);
                    address_error_label.Text = warning;
                    address_error_label.Visibility = Visibility.Visible;
                } else {
                    ControllerLoginRemoveAction();
                    // Continue to next step, which is choosing a particular folder.
                    Controller.Add1PageCompleted(
                        new Uri(address_box.Text),
                        binding,
                        user_box.Text,
                        password_box.Password);
                }
            };
        }