diff --git a/.vs/ComputerResourceConsole/v15/.suo b/.vs/ComputerResourceConsole/v15/.suo
new file mode 100644
index 0000000000000000000000000000000000000000..fc97e1302eb1aba724be6a762a5fd8fe889a753f
Binary files /dev/null and b/.vs/ComputerResourceConsole/v15/.suo differ
diff --git a/.vs/ComputerResourceConsole/v15/Server/sqlite3/db.lock b/.vs/ComputerResourceConsole/v15/Server/sqlite3/db.lock
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide b/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide
new file mode 100644
index 0000000000000000000000000000000000000000..a7adb941dc66efc67bdadc58c9c8387ac17f9b33
Binary files /dev/null and b/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide differ
diff --git a/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide-shm b/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide-shm
new file mode 100644
index 0000000000000000000000000000000000000000..fb4b5cc538614aaaf039ba190c0eeae893d39a6b
Binary files /dev/null and b/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide-shm differ
diff --git a/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide-wal b/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide-wal
new file mode 100644
index 0000000000000000000000000000000000000000..9ff66f8e11f6067433b7556feee582a46e59f932
Binary files /dev/null and b/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide-wal differ
diff --git a/ComputerResourceConsole.csproj b/ComputerResourceConsole.csproj
index 16fe398d1e2027c33ef1cadad626c19e2c25ff28..e72633d30a67fa1b3ceec6f9908a3fd2c85e97ab 100644
--- a/ComputerResourceConsole.csproj
+++ b/ComputerResourceConsole.csproj
@@ -124,6 +124,23 @@
+
+
+
+
+
+
+
+
+ Form
+
+
+ Component
+
+
+ Component
+
+
@@ -132,6 +149,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
Form
@@ -165,12 +220,6 @@
frm_debug_text.cs
-
- Form
-
-
- frm_mdl.cs
-
Form
@@ -189,6 +238,16 @@
frm_version.cs
+
+ Form
+
+
+ Form
+
+
+
+ DataReference.cs
+
frm_about.cs
@@ -213,9 +272,6 @@
frm_debug_text.cs
-
- frm_mdl.cs
-
frm_packing.cs
@@ -225,6 +281,12 @@
frm_version.cs
+
+ frm_mdl.cs
+
+
+ StateInfomation.cs
+
Designer
diff --git a/MDL/MDL.Class/AttributePage.cs b/MDL/MDL.Class/AttributePage.cs
new file mode 100644
index 0000000000000000000000000000000000000000..94512a097f3518a884d3bf30823313bd1161e83a
--- /dev/null
+++ b/MDL/MDL.Class/AttributePage.cs
@@ -0,0 +1,358 @@
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace MDL.Class
+{
+ internal class AttributePage
+ {
+ private TabPage tabPage1;
+
+ private GroupBox groupBox3;
+
+ private DataGridView dataGridView3;
+
+ private Label label11;
+
+ private DataGridView dataGridView2;
+
+ private DataGridViewTextBoxColumn dataGridViewTextBoxColumn1;
+
+ private DataGridViewTextBoxColumn dataGridViewTextBoxColumn2;
+
+ private DataGridViewTextBoxColumn dataGridViewTextBoxColumn3;
+
+ private DataGridViewTextBoxColumn Column4;
+
+ private Label label10;
+
+ private ComboBox comboBox2;
+
+ private Label label9;
+
+ private Label label8;
+
+ private DataGridView dataGridView1;
+
+ private DataGridViewComboBoxColumn Column1;
+
+ private DataGridViewTextBoxColumn Column2;
+
+ private DataGridViewTextBoxColumn Column3;
+
+ private TextBox textBox5;
+
+ private Label label7;
+
+ private TextBox textBox4;
+
+ private Label label6;
+
+ private TextBox textBox3;
+
+ private Label label5;
+
+ private TextBox textBox2;
+
+ private Label label4;
+
+ private ComboBox comboBox1;
+
+ private Label label3;
+
+ private DataGridViewTextBoxColumn dataGridViewTextBoxColumn4;
+
+ private DataGridViewTextBoxColumn dataGridViewTextBoxColumn5;
+
+ private DataGridViewTextBoxColumn dataGridViewTextBoxColumn6;
+
+ private DataGridViewTextBoxColumn dataGridViewTextBoxColumn7;
+
+ private DataGridViewTextBoxColumn dataGridViewTextBoxColumn8;
+
+ private DataGridViewTextBoxColumn dataGridViewTextBoxColumn9;
+
+ private Label tip;
+
+ public TabPage getPage()
+ {
+ return tabPage1;
+ }
+
+ public void Init(Label tipLabel)
+ {
+ tip = tipLabel;
+ tabPage1 = new TabPage();
+ groupBox3 = new GroupBox();
+ dataGridView3 = new DataGridView();
+ dataGridViewTextBoxColumn4 = new DataGridViewTextBoxColumn();
+ dataGridViewTextBoxColumn5 = new DataGridViewTextBoxColumn();
+ dataGridViewTextBoxColumn6 = new DataGridViewTextBoxColumn();
+ dataGridViewTextBoxColumn7 = new DataGridViewTextBoxColumn();
+ dataGridViewTextBoxColumn8 = new DataGridViewTextBoxColumn();
+ dataGridViewTextBoxColumn9 = new DataGridViewTextBoxColumn();
+ label11 = new Label();
+ dataGridView2 = new DataGridView();
+ dataGridViewTextBoxColumn1 = new DataGridViewTextBoxColumn();
+ dataGridViewTextBoxColumn2 = new DataGridViewTextBoxColumn();
+ dataGridViewTextBoxColumn3 = new DataGridViewTextBoxColumn();
+ Column4 = new DataGridViewTextBoxColumn();
+ label10 = new Label();
+ comboBox2 = new ComboBox();
+ label9 = new Label();
+ label8 = new Label();
+ dataGridView1 = new DataGridView();
+ Column1 = new DataGridViewComboBoxColumn();
+ Column2 = new DataGridViewTextBoxColumn();
+ Column3 = new DataGridViewTextBoxColumn();
+ textBox5 = new TextBox();
+ label7 = new Label();
+ textBox4 = new TextBox();
+ label6 = new Label();
+ textBox3 = new TextBox();
+ label5 = new Label();
+ textBox2 = new TextBox();
+ label4 = new Label();
+ comboBox1 = new ComboBox();
+ label3 = new Label();
+ tabPage1.AutoScroll = true;
+ tabPage1.Controls.Add(groupBox3);
+ tabPage1.Controls.Add(label8);
+ tabPage1.Controls.Add(dataGridView1);
+ tabPage1.Controls.Add(textBox5);
+ tabPage1.Controls.Add(label7);
+ tabPage1.Controls.Add(textBox4);
+ tabPage1.Controls.Add(label6);
+ tabPage1.Controls.Add(textBox3);
+ tabPage1.Controls.Add(label5);
+ tabPage1.Controls.Add(textBox2);
+ tabPage1.Controls.Add(label4);
+ tabPage1.Controls.Add(comboBox1);
+ tabPage1.Controls.Add(label3);
+ tabPage1.Location = new Point(4, 29);
+ tabPage1.Name = "tabPage1";
+ tabPage1.Padding = new Padding(3);
+ tabPage1.Size = new Size(717, 615);
+ tabPage1.TabIndex = 0;
+ tabPage1.Text = "Attribute";
+ tabPage1.UseVisualStyleBackColor = true;
+ groupBox3.Controls.Add(dataGridView3);
+ groupBox3.Controls.Add(label11);
+ groupBox3.Controls.Add(dataGridView2);
+ groupBox3.Controls.Add(label10);
+ groupBox3.Controls.Add(comboBox2);
+ groupBox3.Controls.Add(label9);
+ groupBox3.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134);
+ groupBox3.Location = new Point(30, 512);
+ groupBox3.Name = "groupBox3";
+ groupBox3.Size = new Size(643, 463);
+ groupBox3.TabIndex = 14;
+ groupBox3.TabStop = false;
+ groupBox3.Text = "Application";
+ dataGridView3.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
+ dataGridView3.BackgroundColor = SystemColors.ActiveCaption;
+ dataGridView3.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ dataGridView3.Columns.AddRange(dataGridViewTextBoxColumn4, dataGridViewTextBoxColumn5, dataGridViewTextBoxColumn6, dataGridViewTextBoxColumn7, dataGridViewTextBoxColumn8, dataGridViewTextBoxColumn9);
+ dataGridView3.Location = new Point(24, 283);
+ dataGridView3.Name = "dataGridView3";
+ dataGridView3.RowTemplate.Height = 23;
+ dataGridView3.Size = new Size(601, 150);
+ dataGridView3.TabIndex = 17;
+ dataGridViewTextBoxColumn4.HeaderText = "RegionName";
+ dataGridViewTextBoxColumn4.Name = "dataGridViewTextBoxColumn4";
+ dataGridViewTextBoxColumn4.Width = 133;
+ dataGridViewTextBoxColumn5.HeaderText = "xMin";
+ dataGridViewTextBoxColumn5.Name = "dataGridViewTextBoxColumn5";
+ dataGridViewTextBoxColumn5.Width = 73;
+ dataGridViewTextBoxColumn6.HeaderText = "xMax";
+ dataGridViewTextBoxColumn6.Name = "dataGridViewTextBoxColumn6";
+ dataGridViewTextBoxColumn6.Width = 73;
+ dataGridViewTextBoxColumn7.HeaderText = "yMin";
+ dataGridViewTextBoxColumn7.Name = "dataGridViewTextBoxColumn7";
+ dataGridViewTextBoxColumn7.Width = 73;
+ dataGridViewTextBoxColumn8.HeaderText = "yMax";
+ dataGridViewTextBoxColumn8.Name = "dataGridViewTextBoxColumn8";
+ dataGridViewTextBoxColumn8.Width = 73;
+ dataGridViewTextBoxColumn9.HeaderText = "SpatialRef";
+ dataGridViewTextBoxColumn9.Name = "dataGridViewTextBoxColumn9";
+ dataGridViewTextBoxColumn9.Width = 133;
+ label11.AutoSize = true;
+ label11.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134);
+ label11.Location = new Point(21, 257);
+ label11.Name = "label11";
+ label11.Size = new Size(68, 18);
+ label11.TabIndex = 16;
+ label11.Text = "Scope:";
+ dataGridView2.AllowUserToAddRows = false;
+ dataGridView2.AllowUserToDeleteRows = false;
+ dataGridView2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
+ dataGridView2.BackgroundColor = SystemColors.ActiveCaption;
+ dataGridView2.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ dataGridView2.Columns.AddRange(dataGridViewTextBoxColumn1, dataGridViewTextBoxColumn2, dataGridViewTextBoxColumn3, Column4);
+ dataGridView2.Location = new Point(24, 114);
+ dataGridView2.Name = "dataGridView2";
+ dataGridView2.RowTemplate.Height = 23;
+ dataGridView2.Size = new Size(601, 120);
+ dataGridView2.TabIndex = 15;
+ dataGridViewTextBoxColumn1.HeaderText = "Dimension";
+ dataGridViewTextBoxColumn1.Name = "dataGridViewTextBoxColumn1";
+ dataGridViewTextBoxColumn1.ReadOnly = true;
+ dataGridViewTextBoxColumn2.HeaderText = "Min";
+ dataGridViewTextBoxColumn2.Name = "dataGridViewTextBoxColumn2";
+ dataGridViewTextBoxColumn3.HeaderText = "Max";
+ dataGridViewTextBoxColumn3.Name = "dataGridViewTextBoxColumn3";
+ Column4.HeaderText = "Unit";
+ Column4.Name = "Column4";
+ label10.AutoSize = true;
+ label10.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134);
+ label10.Location = new Point(21, 77);
+ label10.Name = "label10";
+ label10.Size = new Size(278, 18);
+ label10.TabIndex = 14;
+ label10.Text = "Spatiotemporal Step Length:";
+ comboBox2.DropDownStyle = ComboBoxStyle.DropDownList;
+ comboBox2.FormattingEnabled = true;
+ comboBox2.Items.AddRange(new object[4]
+ {
+ "Global",
+ "Regional/Large",
+ "Regional/Middle",
+ "Regional/Small"
+ });
+ comboBox2.Location = new Point(245, 35);
+ comboBox2.Name = "comboBox2";
+ comboBox2.Size = new Size(380, 25);
+ comboBox2.TabIndex = 13;
+ label9.AutoSize = true;
+ label9.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134);
+ label9.Location = new Point(21, 37);
+ label9.Name = "label9";
+ label9.Size = new Size(218, 18);
+ label9.TabIndex = 12;
+ label9.Text = "Spatiotemporal Scale:";
+ label8.AutoSize = true;
+ label8.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134);
+ label8.Location = new Point(47, 349);
+ label8.Name = "label8";
+ label8.Size = new Size(108, 18);
+ label8.TabIndex = 11;
+ label8.Text = "Mechanism:";
+ dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
+ dataGridView1.BackgroundColor = SystemColors.ActiveCaption;
+ dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ dataGridView1.Columns.AddRange(Column1, Column2, Column3);
+ dataGridView1.Location = new Point(172, 349);
+ dataGridView1.Name = "dataGridView1";
+ dataGridView1.RowTemplate.Height = 23;
+ dataGridView1.Size = new Size(501, 150);
+ dataGridView1.TabIndex = 10;
+ dataGridView1.DataError += dataGridView1_DataError;
+ Column1.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
+ Column1.HeaderText = "Type";
+ Column1.Items.AddRange("Text", "Algorithm", "Formula");
+ Column1.Name = "Column1";
+ Column1.Resizable = DataGridViewTriState.True;
+ Column1.SortMode = DataGridViewColumnSortMode.Automatic;
+ Column2.HeaderText = "Name";
+ Column2.Name = "Column2";
+ Column3.HeaderText = "Value";
+ Column3.Name = "Column3";
+ textBox5.Location = new Point(172, 236);
+ textBox5.Multiline = true;
+ textBox5.Name = "textBox5";
+ textBox5.Size = new Size(501, 90);
+ textBox5.TabIndex = 9;
+ label7.AutoSize = true;
+ label7.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134);
+ label7.Location = new Point(57, 240);
+ label7.Name = "label7";
+ label7.Size = new Size(98, 18);
+ label7.TabIndex = 8;
+ label7.Text = "Abstract:";
+ textBox4.Location = new Point(172, 189);
+ textBox4.Name = "textBox4";
+ textBox4.Size = new Size(501, 29);
+ textBox4.TabIndex = 7;
+ textBox4.Enter += keywords_Enter;
+ textBox4.Leave += Control_Leave;
+ label6.AutoSize = true;
+ label6.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134);
+ label6.Location = new Point(57, 192);
+ label6.Name = "label6";
+ label6.Size = new Size(98, 18);
+ label6.TabIndex = 6;
+ label6.Text = "Keywords:";
+ textBox3.Location = new Point(172, 138);
+ textBox3.Name = "textBox3";
+ textBox3.Size = new Size(501, 29);
+ textBox3.TabIndex = 5;
+ textBox3.Enter += wiki_Enter;
+ textBox3.Leave += Control_Leave;
+ label5.AutoSize = true;
+ label5.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134);
+ label5.Location = new Point(97, 143);
+ label5.Name = "label5";
+ label5.Size = new Size(58, 18);
+ label5.TabIndex = 4;
+ label5.Text = "Wiki:";
+ textBox2.Location = new Point(172, 87);
+ textBox2.Name = "textBox2";
+ textBox2.Size = new Size(501, 29);
+ textBox2.TabIndex = 3;
+ label4.AutoSize = true;
+ label4.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134);
+ label4.Location = new Point(37, 92);
+ label4.Name = "label4";
+ label4.Size = new Size(118, 18);
+ label4.TabIndex = 2;
+ label4.Text = "Lcoal Name:";
+ comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
+ comboBox1.FormattingEnabled = true;
+ comboBox1.Items.AddRange(new object[7]
+ {
+ "EN_US",
+ "ZH_CN",
+ "DE_DE",
+ "RU_RU",
+ "AR",
+ "ES",
+ "Others"
+ });
+ comboBox1.Location = new Point(172, 37);
+ comboBox1.Name = "comboBox1";
+ comboBox1.Size = new Size(501, 27);
+ comboBox1.TabIndex = 1;
+ label3.AutoSize = true;
+ label3.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134);
+ label3.Location = new Point(57, 41);
+ label3.Name = "label3";
+ label3.Size = new Size(98, 18);
+ label3.TabIndex = 0;
+ label3.Text = "Language:";
+ }
+
+ private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
+ {
+ }
+
+ private void keywords_Enter(object sender, EventArgs e)
+ {
+ showTip("Please separate the different keywords with ';'");
+ }
+
+ private void Control_Leave(object sender, EventArgs e)
+ {
+ showTip("");
+ }
+
+ private void wiki_Enter(object sender, EventArgs e)
+ {
+ showTip("eg.https://en.wikipedia.org/wiki/Nanjing");
+ }
+
+ private void showTip(string str)
+ {
+ tip.Text = str;
+ }
+ }
+}
diff --git a/MDL/MDL.Class/Dataset.cs b/MDL/MDL.Class/Dataset.cs
new file mode 100644
index 0000000000000000000000000000000000000000..227f9de554e56df12bab1ac6804b3650ac895a85
--- /dev/null
+++ b/MDL/MDL.Class/Dataset.cs
@@ -0,0 +1,61 @@
+namespace MDL.Class
+{
+ public class Dataset
+ {
+ private string name;
+
+ private string type;
+
+ private string description;
+
+ private string externalId;
+
+ public string Name
+ {
+ get
+ {
+ return name;
+ }
+ set
+ {
+ name = value;
+ }
+ }
+
+ public string Type
+ {
+ get
+ {
+ return type;
+ }
+ set
+ {
+ type = value;
+ }
+ }
+
+ public string Description
+ {
+ get
+ {
+ return description;
+ }
+ set
+ {
+ description = value;
+ }
+ }
+
+ public string ExternalId
+ {
+ get
+ {
+ return externalId;
+ }
+ set
+ {
+ externalId = value;
+ }
+ }
+ }
+}
diff --git a/MDL/MDL.Class/Event.cs b/MDL/MDL.Class/Event.cs
new file mode 100644
index 0000000000000000000000000000000000000000..2d64f0882a0225e86bd6e4fa3f13edca6dabf705
--- /dev/null
+++ b/MDL/MDL.Class/Event.cs
@@ -0,0 +1,75 @@
+namespace MDL.Class
+{
+ public class Event
+ {
+ private string name;
+
+ private string type;
+
+ private string optional;
+
+ private string description;
+
+ private Dataset datasetReference;
+
+ public string Name
+ {
+ get
+ {
+ return name;
+ }
+ set
+ {
+ name = value;
+ }
+ }
+
+ public string Type
+ {
+ get
+ {
+ return type;
+ }
+ set
+ {
+ type = value;
+ }
+ }
+
+ public string Optional
+ {
+ get
+ {
+ return optional;
+ }
+ set
+ {
+ optional = value;
+ }
+ }
+
+ public string Description
+ {
+ get
+ {
+ return description;
+ }
+ set
+ {
+ description = value;
+ }
+ }
+
+ internal Dataset DatasetReference
+ {
+ get
+ {
+ return datasetReference;
+ }
+ set
+ {
+ datasetReference = value;
+ }
+ }
+ }
+}
diff --git a/MDL/MDL.Class/EventPage.cs b/MDL/MDL.Class/EventPage.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6b125fb3af1c550cc8d877bc54f2e2345453e2cc
--- /dev/null
+++ b/MDL/MDL.Class/EventPage.cs
@@ -0,0 +1,298 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace MDL.Class
+{
+ internal class EventPage
+ {
+ private TabPage tabPage1;
+
+ private Button button4;
+
+ private Label label11;
+
+ private Label label10;
+
+ private ComboBox type;
+
+ private TextBox description;
+
+ private Label label6;
+
+ private ComboBox optional;
+
+ private Label label7;
+
+ private Label label8;
+
+ private TextBox name;
+
+ private Label label9;
+
+ private Dataset dataset;
+
+ private ComboBox ComboBox;
+
+ private Button button5;
+
+ private static List datasets = new List();
+
+ private static List uniqueDatasets = new List();
+
+ public Dataset Dataset
+ {
+ get
+ {
+ return dataset;
+ }
+ set
+ {
+ frm_TransfEvent(value);
+ }
+ }
+
+ public string Description
+ {
+ get
+ {
+ return description.Text;
+ }
+ set
+ {
+ description.Text = value;
+ }
+ }
+
+ public string Name
+ {
+ get
+ {
+ return name.Text;
+ }
+ set
+ {
+ name.Text = value;
+ }
+ }
+
+ public string Type
+ {
+ get
+ {
+ return type.Text;
+ }
+ set
+ {
+ type.Text = value;
+ }
+ }
+
+ public string Optional
+ {
+ get
+ {
+ return optional.Text;
+ }
+ set
+ {
+ optional.Text = value;
+ }
+ }
+
+ public TabPage getPage()
+ {
+ return tabPage1;
+ }
+
+ private void configure_Click(object sender, EventArgs e)
+ {
+ DataReference dataReference = new DataReference(dataset, type.Text);
+ dataReference.TransfEvent += frm_TransfEvent;
+ dataReference.ShowDialog();
+ }
+
+ private void connect_Click(object sender, EventArgs e)
+ {
+ if (ComboBox.SelectedIndex < 0)
+ {
+ MessageBox.Show("Nodata! Re-select the data and try again");
+ }
+ else
+ {
+ dataset = uniqueDatasets[ComboBox.SelectedIndex];
+ label11.Text = dataset.Name;
+ label11.BackColor = Color.LightGreen;
+
+ }
+ }
+
+ private void frm_TransfEvent(Dataset value)
+ {
+ dataset = value;
+ if (dataset.Name != "" || dataset.Type != "" || dataset.Description != "" || dataset.ExternalId != "")
+ {
+ label11.Text = dataset.Name;
+ label11.BackColor = Color.LightGreen;
+ datasets.Add(dataset);
+
+ }
+ else
+ {
+ label11.Text = "undefined";
+ label11.BackColor = Color.Silver;
+ }
+ uniqueDatasets = datasets
+ .GroupBy(d => d.Name)
+ .Select(g => g.First()) // ´Óÿ¸ö·Ö×éÖÐÑ¡ÔñµÚÒ»¸öÔªËØ
+ .ToList();
+ ComboBox.Items.Clear();
+ foreach (Dataset dataset in uniqueDatasets)
+ {
+ ComboBox.Items.Add(dataset.Name);
+ }
+ }
+
+ public void Init(int count)
+ {
+ tabPage1 = new TabPage();
+ button4 = new Button();
+ label11 = new Label();
+ label10 = new Label();
+ type = new ComboBox();
+ description = new TextBox();
+ label6 = new Label();
+ optional = new ComboBox();
+ label7 = new Label();
+ label8 = new Label();
+ name = new TextBox();
+ label9 = new Label();
+ dataset = new Dataset();
+ ComboBox = new ComboBox();
+ button5 = new Button();
+ tabPage1.Controls.Add(button4);
+ tabPage1.Controls.Add(label11);
+ tabPage1.Controls.Add(label10);
+ tabPage1.Controls.Add(type);
+ tabPage1.Controls.Add(description);
+ tabPage1.Controls.Add(label6);
+ tabPage1.Controls.Add(optional);
+ tabPage1.Controls.Add(label7);
+ tabPage1.Controls.Add(label8);
+ tabPage1.Controls.Add(name);
+ tabPage1.Controls.Add(label9);
+ tabPage1.Controls.Add(ComboBox);
+ tabPage1.Controls.Add(button5);
+ tabPage1.Location = new Point(4, 22);
+ tabPage1.Name = "tabPage" + count;
+ tabPage1.Padding = new Padding(3);
+ tabPage1.Size = new Size(493, 345);
+ tabPage1.TabIndex = 0;
+ tabPage1.Text = "NewEvent" + count;
+ tabPage1.UseVisualStyleBackColor = true;
+ button4.Location = new Point(357, 285);
+ button4.Name = "button4";
+ button4.Size = new Size(75, 23);
+ button4.TabIndex = 19;
+ button4.Text = "Configure";
+ button4.UseVisualStyleBackColor = true;
+ button4.Click += configure_Click;
+ button5.Location = new Point(357, 315);
+ button5.Name = "button5";
+ button5.Size = new Size(75, 23);
+ button5.TabIndex = 19;
+ button5.Text = "Connect";
+ button5.UseVisualStyleBackColor = true;
+ button5.Click += connect_Click;
+ label11.AutoSize = true;
+ label11.BackColor = Color.Silver;
+ label11.Location = new Point(191, 290);
+ label11.Name = "label11";
+ label11.Size = new Size(59, 12);
+ label11.TabIndex = 18;
+ label11.Text = "undefined";
+ label10.AutoSize = true;
+ label10.Font = new Font("Times New Roman", 12f, FontStyle.Regular, GraphicsUnit.Point, 134);
+ label10.Location = new Point(32, 287);
+ label10.Name = "label10";
+ label10.Size = new Size(152, 16);
+ label10.TabIndex = 17;
+ label10.Text = "Dataset Reference:";
+ type.FormattingEnabled = true;
+ type.Items.AddRange(new object[2]
+ {
+ "response(input)",
+ "noresponse(output)"
+ });
+ type.Location = new Point(86, 80);
+ type.Name = "comboBox3";
+ type.Size = new Size(378, 20);
+ type.TabIndex = 16;
+ type.DropDownStyle = ComboBoxStyle.DropDownList;
+ type.SelectedIndex = 0;
+ description.Location = new Point(35, 192);
+ description.Multiline = true;
+ description.Name = "textBox4";
+ description.Size = new Size(429, 67);
+ description.TabIndex = 15;
+ label6.AutoSize = true;
+ label6.Font = new Font("Times New Roman", 12f, FontStyle.Regular, GraphicsUnit.Point, 134);
+ label6.Location = new Point(32, 168);
+ label6.Name = "label6";
+ label6.Size = new Size(104, 16);
+ label6.TabIndex = 14;
+ label6.Text = "Description:";
+ ComboBox.FormattingEnabled = true;
+ ComboBox.Location = new Point(191, 315);
+ ComboBox.Items.Clear();
+
+ foreach (Dataset dataset in uniqueDatasets)
+ {
+ ComboBox.Items.Add(dataset.Name);
+ }
+ ComboBox.DropDownStyle = ComboBoxStyle.DropDownList; // ½ûÖ¹Óû§ÊäÈë
+ ComboBox.Name = "comboBox3";
+ ComboBox.Size = new Size(80, 16);
+ optional.FormattingEnabled = true;
+ optional.Items.AddRange(new object[2]
+ {
+ "False",
+ "True"
+ });
+ optional.Location = new Point(118, 125);
+ optional.Name = "comboBox2";
+ optional.Size = new Size(347, 20);
+ optional.TabIndex = 13;
+ optional.DropDownStyle = ComboBoxStyle.DropDownList;
+ optional.SelectedIndex = 0;
+ label7.AutoSize = true;
+ label7.Font = new Font("Times New Roman", 12f, FontStyle.Regular, GraphicsUnit.Point, 134);
+ label7.Location = new Point(32, 125);
+ label7.Name = "label7";
+ label7.Size = new Size(80, 16);
+ label7.TabIndex = 12;
+ label7.Text = "Optional:";
+ label8.AutoSize = true;
+ label8.Font = new Font("Times New Roman", 12f, FontStyle.Regular, GraphicsUnit.Point, 134);
+ label8.Location = new Point(32, 80);
+ label8.Name = "label8";
+ label8.Size = new Size(48, 16);
+ label8.TabIndex = 10;
+ label8.Text = "Type:";
+ name.Location = new Point(86, 29);
+ name.Name = "textBox6";
+ name.ReadOnly = false;
+ name.Size = new Size(379, 21);
+ name.TabIndex = 9;
+ label9.AutoSize = true;
+ label9.Font = new Font("Times New Roman", 12f, FontStyle.Regular, GraphicsUnit.Point, 134);
+ label9.Location = new Point(32, 31);
+ label9.Name = "label9";
+ label9.Size = new Size(48, 16);
+ label9.TabIndex = 8;
+ label9.Text = "Name:";
+ }
+ }
+}
diff --git a/MDL/MDL.Class/StateInfo.cs b/MDL/MDL.Class/StateInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..98f8aca34821877ea5d0dfec966cc8eb1f8e28c2
--- /dev/null
+++ b/MDL/MDL.Class/StateInfo.cs
@@ -0,0 +1,91 @@
+using System.Collections.Generic;
+
+namespace MDL.Class
+{
+ public class StateInfo
+ {
+ private string id;
+
+ private string name;
+
+ private string type;
+
+ private string description;
+
+ private Event[] events;
+
+ private List to = new List();
+
+ public string ID
+ {
+ get
+ {
+ return id;
+ }
+ set
+ {
+ id = value;
+ }
+ }
+
+ public string Name
+ {
+ get
+ {
+ return name;
+ }
+ set
+ {
+ name = value;
+ }
+ }
+
+ public string Type
+ {
+ get
+ {
+ return type;
+ }
+ set
+ {
+ type = value;
+ }
+ }
+
+ public string Description
+ {
+ get
+ {
+ return description;
+ }
+ set
+ {
+ description = value;
+ }
+ }
+
+ internal Event[] Events
+ {
+ get
+ {
+ return events;
+ }
+ set
+ {
+ events = value;
+ }
+ }
+
+ public List To
+ {
+ get
+ {
+ return to;
+ }
+ set
+ {
+ to = value;
+ }
+ }
+ }
+}
diff --git a/MDL/MDL.Properties/Resources.cs b/MDL/MDL.Properties/Resources.cs
new file mode 100644
index 0000000000000000000000000000000000000000..bd6c3994e717cbbc1de60f0dc132a9d4d4986dfe
--- /dev/null
+++ b/MDL/MDL.Properties/Resources.cs
@@ -0,0 +1,49 @@
+using System.CodeDom.Compiler;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Globalization;
+using System.Resources;
+using System.Runtime.CompilerServices;
+
+namespace MDL.Properties
+{
+ [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [DebuggerNonUserCode]
+ [CompilerGenerated]
+ internal class Resources
+ {
+ private static ResourceManager resourceMan;
+
+ private static CultureInfo resourceCulture;
+
+ [EditorBrowsable(EditorBrowsableState.Advanced)]
+ internal static ResourceManager ResourceManager
+ {
+ get
+ {
+ if (resourceMan == null)
+ {
+ ResourceManager resourceManager = resourceMan = new ResourceManager("MDL.Properties.Resources", typeof(Resources).Assembly);
+ }
+ return resourceMan;
+ }
+ }
+
+ [EditorBrowsable(EditorBrowsableState.Advanced)]
+ internal static CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+
+ internal Resources()
+ {
+ }
+ }
+}
diff --git a/MDL/MDL.Properties/Settings.cs b/MDL/MDL.Properties/Settings.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a1d3727670e4c339f3e60fd65c02578de574154a
--- /dev/null
+++ b/MDL/MDL.Properties/Settings.cs
@@ -0,0 +1,15 @@
+using System.CodeDom.Compiler;
+using System.Configuration;
+using System.Runtime.CompilerServices;
+
+namespace MDL.Properties
+{
+ [CompilerGenerated]
+ [GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
+ internal sealed class Settings : ApplicationSettingsBase
+ {
+ private static Settings defaultInstance = (Settings)SettingsBase.Synchronized(new Settings());
+
+ public static Settings Default => defaultInstance;
+ }
+}
diff --git a/MDL/MDL.view/About.cs b/MDL/MDL.view/About.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c47354de38c26ab2fb382f428bc8df7978e10627
--- /dev/null
+++ b/MDL/MDL.view/About.cs
@@ -0,0 +1,102 @@
+using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace MDL.view
+{
+ public class About : Form
+ {
+ private IContainer components = null;
+
+ private Button btn_close;
+
+ private Label label2;
+
+ private Label label3;
+
+ private Label label1;
+
+ private PictureBox pictureBox1;
+
+ public About()
+ {
+ InitializeComponent();
+ }
+
+ private void btn_close_Click(object sender, EventArgs e)
+ {
+ Close();
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && components != null)
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MDL.view.About));
+ btn_close = new System.Windows.Forms.Button();
+ label2 = new System.Windows.Forms.Label();
+ label3 = new System.Windows.Forms.Label();
+ label1 = new System.Windows.Forms.Label();
+ pictureBox1 = new System.Windows.Forms.PictureBox();
+ ((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
+ SuspendLayout();
+ btn_close.Location = new System.Drawing.Point(180, 65);
+ btn_close.Name = "btn_close";
+ btn_close.Size = new System.Drawing.Size(75, 23);
+ btn_close.TabIndex = 7;
+ btn_close.Text = "Close";
+ btn_close.UseVisualStyleBackColor = true;
+ btn_close.Click += new System.EventHandler(btn_close_Click);
+ label2.AutoSize = true;
+ label2.Font = new System.Drawing.Font("Times New Roman", 10f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134);
+ label2.Location = new System.Drawing.Point(12, 68);
+ label2.Name = "label2";
+ label2.Size = new System.Drawing.Size(161, 14);
+ label2.TabIndex = 4;
+ label2.Text = "Copyright: NNU OpenGMS";
+ label3.AutoSize = true;
+ label3.Font = new System.Drawing.Font("Times New Roman", 10f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134);
+ label3.Location = new System.Drawing.Point(61, 37);
+ label3.Name = "label3";
+ label3.Size = new System.Drawing.Size(98, 14);
+ label3.TabIndex = 5;
+ label3.Text = "Version: v1.0";
+ label1.AutoSize = true;
+ label1.Font = new System.Drawing.Font("Times New Roman", 10f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134);
+ label1.Location = new System.Drawing.Point(61, 12);
+ label1.Name = "label1";
+ label1.Size = new System.Drawing.Size(126, 14);
+ label1.TabIndex = 6;
+ label1.Text = "Service Container";
+ pictureBox1.Image = (System.Drawing.Image)resources.GetObject("pictureBox1.Image");
+ pictureBox1.Location = new System.Drawing.Point(12, 12);
+ pictureBox1.Name = "pictureBox1";
+ pictureBox1.Size = new System.Drawing.Size(43, 45);
+ pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ pictureBox1.TabIndex = 3;
+ pictureBox1.TabStop = false;
+ base.AutoScaleDimensions = new System.Drawing.SizeF(6f, 12f);
+ base.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ base.ClientSize = new System.Drawing.Size(266, 95);
+ base.Controls.Add(btn_close);
+ base.Controls.Add(label2);
+ base.Controls.Add(label3);
+ base.Controls.Add(label1);
+ base.Controls.Add(pictureBox1);
+ base.Icon = (System.Drawing.Icon)resources.GetObject("$this.Icon");
+ base.Name = "About";
+ Text = "About";
+ ((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
+ ResumeLayout(false);
+ PerformLayout();
+ }
+ }
+}
diff --git a/MDL/MDL.view/About.resx b/MDL/MDL.view/About.resx
new file mode 100644
index 0000000000000000000000000000000000000000..131bcdf87b502b88a1c726b3548364af7e755cf2
--- /dev/null
+++ b/MDL/MDL.view/About.resx
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+text/microsoft-resx1.3System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABNTeXN0ZW0uRHJhd2luZy5JY29uAgAAAAhJY29uRGF0YQhJY29uU2l6ZQcEAhNTeXN0ZW0uRHJhd2luZy5TaXplAgAAAAIAAAAJAwAAAAX8////E1N5c3RlbS5EcmF3aW5nLlNpemUCAAAABXdpZHRoBmhlaWdodAAACAgCAAAAAAAAAAAAAAAPAwAAAL6UAAACAAABAAEAYGAAAAEAIAColAAAFgAAACgAAABgAAAAwAAAAAEAIAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////Bv///wz///8Q/v7+FP7+/hj///8a/v7+Hv7+/hT+/v4GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Ev///0D+/v5U////cv///5H///+z////yf///9n+/v7n/v7++f///7////9q/v7+JP7+/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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/7yoEf+8qBH/vKgP/8GuH//Ux2X/7+rH//z79f///////////////+////98////EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4E/v7+Iv///3L////d/v7+//7+/P/49uf/5t6q/8azPv+6pBf/uKIT/7iiFP+4oRT/uKES/7egE/+3oBP/uKEU/7ehFf+3oRb/t6EW/7egFv+3oBb/t58U/7efFP+2nxb/tp8Y/8KvPv/u6Mn//v37/////+3+/v4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+BP///6f+/v79/Pv1/+/rxv/PwlL/wrEh/8GwH//BsB7/wbAf/8GwH//Brx//wK8e/8CuHf/Arh3/wa8e/7+sF/+9qhH/vKkR/7ypEf+8qRH/vKkQ/7yoDv+9qhT/xrQx/+fgqf/49+n//f35//7+/v/+/v7z////2f///53+/v5s////Xv///1j///9a/v7+ZP///3b+/v7J/v7+4/////H+/v79+/rz//Lu0//Wynb/wKwq/7mjE/+5oxL/uKIT/7iiE/+4ohT/uKET/7ihEv+4oRL/uKAT/7egFP+3oBX/t6AV/7ehFv+3oBb/t6AW/7efFP+2nxT/uaMf/9jMhf/6+PH///////7+/n7///8EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////JP///8P+/vz/6uSz/9nOc//YzG//4NeN/+HZlP/f147/4NiP/+DYj//g2I//4NeP/+DXj//g15D/4tqZ/87AT/++qxf/vaoQ/7ypEf+9qRH/vagQ/7ypEf+8qQ//vKgP/7+sG//Ov1D/5+Cr//Tx2P/5+Oz//f35//7+/v///////v7+///////////////////////+/v3/+/r0//f15f/y7tP/29CE/8OwLv+7pRT/uaQR/7mjEf+4ohH/uaMS/7mjEv+4ohP/uKIU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//f04f/18tr/9fLa//Xy2v/49+j//f36//7+/v3+/v6j////QP///9X9/fr/181u/8CvFv/ArxX/wK8V/7+uFv+/rhb/v64V/7+uFv+/rhf/ybo6/+LbmP/5+Ov//v79/9zTg//Brx7/vqwT/76sEv+9qxP/vqwT/72rEv++qxL/vaoR/7yqEP+8qhH/vaoR/72qEf+9qRH/vakR/7ypEf+8qBD/vKgO/7yoDv+7qA7/vKgO/7yoDv+7pw//u6cP/7unDv+6pw//u6YP/7umDv+7pg3/u6YN/7qlDv+5pRD/uaUQ/7qkEP+6pRD/uqUR/7qkEP+6pA//wq8v/9rPgv/29OT//v37/////+////+BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///17////j/v7+///////+/v7///////7+/v/+/v7//v7+/////9H///9G////Pv7+/tX9/fr/181v/8CuGP/Arhb/wK8V/8CvFv+/rhb/v64W/76uFv++rhb/v68Y/8a3Mf/e1or/9/Xj/93Uhv/BsB7/vawS/76rE/++rBP/vawS/76rE/++qxP/vaoS/72qEf+9qhH/vakR/72qEf+9qhH/vakQ/72pEf+8qRH/vKkR/7ypD/+8qA7/vKgO/7unDv+8qA//vKgO/7unD/+7pw//u6cP/7umD/+7pg7/uqUN/7qlDf+5pA//uqUQ/7mkEP+5pRD/uqUR/7yoG//JuUb/49qe//n36v/+/v7/////7////4/+/v4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wj+/v4i////OP///1r+/v5m/v7+Zv///2z///98////sf7+/rn+/v6X/v7+nf///+H9/fr/181v/7+vGf/Arxj/wK4X/7+uFv+/rhb/v64W/7+uFv+/rhb/v64W/7+uFv/CsSH/29F7/9vQev/FtSz/vqwT/76sE/++rBP/vqwS/72rE/+9qxP/vasS/72qEf+9qhH/vaoR/7ypEP+9qhH/vaoR/72pEP+9qRD/vKkR/7ypEf+8qA7/vKgO/7yoDv+8qA//vKgO/7unD/+7pw//u6cP/7unD/+7pg//u6YO/7qlDf+6pQ7/uqUP/7qlEP+6pRH/wa4r/9PFZ//w68z//Pv2//7+/v3////R////UP///xD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////av7+/uX+/v7//v7+//7+/v////////////7+/v/9/fv/185w/8CwGf/Arxr/wK8b/8CvGf/Arxj/wK8X/7+uF/+/rhf/v64X/7+uF/+/rhf/v60X/9XJZv/b0Xv/y7xC/8CvHf++rBP/vawT/76sE/++rBP/vqsS/76rE/+9qxL/vaoR/72qEf+9qhH/vakQ/72qEf+9qRH/vKkR/72pEf+8qRD/vKkP/7yoDv+8qA7/vKgP/7uoD/+7qA//u6cO/7unD/+7pw//u6cP/7umDf+6pg7/u6YQ/8GtJv/Lu0z/6eK1//38+P///////v7+6/7+/qf///8sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////4/7+/f/59+n/7+vG/+3ovf/u6sH/7unA/+7qwf/s57v/2tF5/9DFVv/Sx13/0sdd/9LGXf/Sxlz/0sZb/9LGW//Sxlv/0sZb/9LGW//SxVr/0cRX/+jirf/7+vD/7+rE/9nPdv/Mvkb/wrIl/72sE/+9qxL/vqwT/76sE/+9qxP/vqsS/72qEf+8qhD/vaoR/72qEf+9qhD/vakR/72pEf+9qRH/vKgR/7yoD/+8qA7/vKgO/7yoDv+8qA//u6cP/7unD/+7pw//u6cP/7unEv/EsjD/z8BW/+LZmf/39OP//fz5//////f////J////ZP7+/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K/v7++/39+//r5rb/zsJM/8i7Nf/JvDn/ybs4/8m7Of/Iujb/29J8//Xy2v/39eT/9/Xj//f14v/39eL/9/Xi//f14v/39eL/9/Xi//f14v/39eL/9vTg//v68v///////fz5//n36//x7cz/3tWJ/9HEWf/Juj3/wrEj/72sEv+9qxL/vqsT/72rEv+8qhD/vKkQ/7yqEP+8qhD/vKkQ/72pEf+9qRH/vKkR/7ypEP+8qA7/u6gO/7yoDv+8qA//vKgP/72pE//CsSj/yrtF/9PGZv/m36j/9fPe//v68v/+/v3/////+f///7f///8+/v7+BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4M////+/39+v/n4aj/yLs2/8GyG//AsRr/wbEa/8GwGf/BsRv/3NN9//r57v/+/v7//v7+/////////////v7+/////////////////////////////v7+//////3////t////9f/////+/vz/+vnw//f15P/s573/3dSF/8/DVf/Juz3/xbYv/8KxI/+/rRj/vaoS/72qEf+9qhH/vaoR/72pEP+8qRH/vakR/7ypEf+8qRL/vqwZ/8GwI//FszD/yrpB/9PGYf/h2Zf/8u7S//j26f/8+/b////+///////////h/v7+XP///yD///8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8M/v7++/39+v/o4qv/ybw6/8GyHP/Ashr/wbEa/8GxGf/BsRv/29J8//n47P///////v7+dP7+/kb///9G////Rv///0b///9G////Rv///0b///9G////TP///yT///8I////Hv///43+/v7X////5/7+/vv+/v3//v37//38+P/29OH/6+a5/+Pbmv/a0Hv/1cln/9DCVP/MvUf/y7xD/8u8Q//LvEX/zb5M/9HDWv/Wym3/3NKD/+Tdof/u6cP/+vnu//39+v/+/vz//v7+//7+/vX////f////wf///1b+/v4M/v7+AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4M////+/39+v/o4qz/yrw7/8GyHP/BsRr/wbIb/8GyGv/Bshz/29J8//n47P///////v7+VP7+/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wr///8Y/v7+Gv///xj///8g////Vv///5v///+3////5/7+/v/+/v7//v79//7+/P/+/vz//fz5//r58P/49+n/9/Xk//f14//49ub/+fjr//z79P/9/fv//v37//7+/P/+/v3//v7+//7+/vn+/v7R////r////3z///8cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4M/v7++/39+v/o4qr/yrw5/8KyG//Bshv/wbIb/8GyG//Bsh3/29J8//n46///////////VP///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8W////ZP7+/pX///+n////qf7+/qf///+r////o/7+/of+/v5U////dv///+n+/v7//v7+/////////////v7+//7+/v/+/v7////+/////v/+/v7///////////////////////7+/v//////////+f///7v///9E/v7+CP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8M/v7++/39+v/n4qj/yLoy/8KyG//Cshv/wbIb/8CxGv/Bsh3/2dB1//n46v//////////Vv///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v5w/v7+6f7+/v/+/v7///////7+/v////////////////v////N/v7+JP7+/jz///9K/v7+Sv///0z+/v5M/v7+Tv///2D+/v67/////f/////////r////jf///1b///9O/v7+TP///0z+/v5K/v7+Rv7+/ij///8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4I////9/79+//v7Mb/2M5t/9HFVf/UyF3/08hc/9LIW//QxVX/5d6f//v68v///////v7+Sv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wz+/v6r/v7+//b03//s57n/6uWz/+vltv/p5LL/7unC//r47f/////9////UgAAAAD///8A/v7+AP///wD+/v4A/v7+AP7+/gT///8Q/v7+Gv///xr///8W/v7+Cv///wL///8A////AP///wD+/v4A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////FP///73+/v77//////7+/v/+/v7//v7+//7+/v/////p////aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+BP///yj///9a/v7+h/7+/rH////B/v7+of7+/mb///9C////DgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////Cv7+/hD+/v4U////Dv///wT///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////4D/////////////+AA/////////////wAA////////////+AAA////////////4AAA////////////wAAA////////////gAAA///////////+AAAA///////////8AAAA///////////4AAAA///////////wAAAA///////////gAAAA///////////AAAAA//////////+AAAAA//////////8AAAAA//////////8AAAAA//////////4AAAAA//////////wAAAAA//////////wAAAAA//////////gAAAAA//////////gAAAAH//////////AAAAB///////////AAAAD///////////AAAAf//////////+AAAA///////////+AAAB///////////8AAAD///////////8AAAH///////////8AAAH///////////8AAAP///////////8AAAf///////////4AAAf///////////4AAAf///////////4AAA////////////4AAA/////wAAH///4AAA/////gAAH///4AAA/////gAAD///4AAA/////gAAD///4AAA/////gAAD///4AAAf////gAAD///4AAAf////AAAD///8AAAf////AAAD///8AAAP////AAAH///8AAAH///+AAAH///8AAAH///8AAAH///8AAAD///8AAAH///+AAAD///4AAAP///+AAAB///4AAAP////AAAA///gAAAP////AAAAH/+AAAAf////AAAAD/8AAAAf////AAAAAfgAAAA/////AAAAAAAAAAA/////AAAAAAAAAAA///wHAAAAAAAAAAB///gDADgAAAAAAAD///ABADgAAAAAAAD///ABABgAAAAAAAH///ABAAgAAAAAAAH///ABAAAAAAAAAAP///ABAAAAAAAAAA////ABAAAAAAAAAB////ABAAAAAAAAAB////gDAAAAAAAAAD/////wAAAAAAAAAP/////AAAAAAAAAAf////+AAAAAAAAAB/////+AAAAAAAAAD/////+AAAAAAAAAP/////+AB//AAAAA//////+AB//4AAAH//////+AB/4DAAAf//////+AB/wB/g////////+AB/gB//////////+AB/gA///////////AB/gA//////////////gA//////////v///gA/////////4B///gB/////////4A///gB/////////4A///gB/////////4A///wB/////////4A//////////////4A//////////////4B//////////////+H/////////////////////////////////////////////////////////////////////////////////////////////8LAAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABVTeXN0ZW0uRHJhd2luZy5CaXRtYXABAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAACkAAAKJUE5HDQoaCgAAAA1JSERSAAAAdgAAAHYIBgAAAB2nZxEAAAAEZ0FNQQAAsY58+1GTAAAAIGNIUk0AAIcPAACMDwAA/VIAAIFAAAB9eQAA6YsAADzlAAAZzHM8hXcAAAo5aUNDUFBob3Rvc2hvcCBJQ0MgcHJvZmlsZQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/vi5h3CAAAACXBIWXMAAAsTAAALEwEAmpwYAAAeMUlEQVR4Xu2dCXxdVZ3HAzPjjBstbZqkCy1bCwKFIlDAwRE7CKOCuIA4ggug4jCIbIqK4qCgqIw64s5SKHTf6Zo2zd4sTdKkTZN0S9p0Tem+0ZaC//n9zrvn5pz7znvv3pcESXn/z+f7uenJy3uv75v/Of9z77knWSKS4QTE2Zih9+NszND7cTZm6P04GzP0fpyNGXo/zsYAI8Gd4GkwBfwfuBm8C7gen+FtgLPR4z/BPpAsqsEHgevnM/wdcTZ6pJKqg3JdP5/h74izEbD7VbH6wGGZtLlDHm1qlbvrV8v/NLfKyv0H5fU3/+Y9QsW7Tl9QnhVk2PzyrMGvlIKSpAyaXZI1cFZxdGYWZ+WBnAgMmF6U1W/qkqxTyZQETNYUZPUFp4A+kxxMXJzVF/B4yoTFWe8HfUDf8YsUp4J+3rHPyzi+nJ/V76UY/UE2wGfXIzgbwaeBivyOXUroZYXL5ILFlXJ1SZ1M2bxDDr/xhvcIFe87HRI1Z4Bh88qyhswpg7juE4vX4bh+KsgF/T1yQDZ4t0tkkHe62K8CFVO37JAbKhoEwhTn5lfIn1o3y4Hjltg+ttRySKVQjVuoJpVYPD/HcXb5qaIWXOYSqnmni/0cUDEfGfu1umY5f1GlEjt6yTLVNSfKWJ2pg3yp3SI2jFQdtS6hmne62IuAiuYDh2T8pu3yvcZ1cntNk3y/cb2s3OcYY+eXYUxF1zsXIpmt3ZSxfO7YS4h6zX2vH5dXjx6TPcdeV+w8+rrsxvHIG296j1KRsFt+p4slB0CYqKZU4gvtXrHnxV5GZA0Kud+tbZcHMOY/2dymeLhhrfxkVauU79zrPUrFx1xSSUasyK0glVw1jz1ddb+G0O4Vy/m0ipko2sYU1sjZc8vk3LnlMgKcOacM/y6XX7Rs8B6l4jGXVJIR2wm75bvAX8E88BfwJaDOPLH7HWJ2v2mIJYnk4jVuByomtW+XS/IrBdMcwTRHBgDIUvwYQ4QRT5kyNZSaPa0QYgszYlMxZC4KJU8k/n0yeA94r3c0eR/4Z3CSSyzhvNQhlj2HiunI2CsXVyupEOWLHTy7RJ5oavMepeIJUygZMKMoqz+EkozYEHhCLwRLQdgoByMtscjYQRDJEw5KsAcex95BxdRNHXL5oirJNaQSZvBPMc4a8WQORGqYqf2RqRmx0RgN6kDUKLfEekCaBR73ldjDRSa3d8il+VW+UMWMIsVjdlf8yzipGbGR8aVyBvQaph2c4/Jocuj4G3LszTfFmiQ5umXKhDAfPIZXklTM3vKqjF5UrYQOmV0qQ2aVKKnM2Kfs4unROKkZsZHg2KmC8p5p2yI3VayQT5TWyy0VK+Vmj88tbZCPl9TJE5iecA5qRJ4vFV1xLrpiU6ondmDsoaLmrBW79sn8bTulcMduKezYLQv5NY4bD70We1AsxgyYbghNIhaPPUmTEdtJH6DiwPHjcnddi6AKDlDi83lIb7UFjBgCqYOYqUGpXlfqyV0Te3io2JrtScXXFMaC7h/AP3r8E+D75oUOjvVmqLEf8Pus+vlY/gx/ns9z0jtS7D3LV8vweUsNqbbYr1avkvUHLbHnMFPzZpVkoRhKJnYMCCN3K/gUcEnrrlDy3zliXz8u99evkXPmm2I7pZLbl62SDXbGns0pjfPSmxZrC+aVnH8DvPp0nQdF8ngmYIZeCUJL5ZiviRB8/ivAye8wsbZQMghzTWZsnFgICyXWxHgMnoPd5OUgTiZlvfm3v8kb4LgHzzfvx3vdcvgIeo/Dsnr/IWned0gd1x84LFtfO6q+z0KPj+XP8Of5PAnkc5r3IXDSCS62PE7qQEglDrHXh+QGwOr4fMrkyQZ8zTNiFSBh8MJANYqt8Ru2yc+b2uSemma5pWyFXLOkVi5dUCkXzF0q580p9xmJf4+eXyn/vrhGPltSL9+oWiWPrVwv49q2SsWre9UFiBTBX66RJ5zY/0bxNHyeLZaZqsXesawpKDad2AOs00w6mFHLIPLZ9VvkPryXz6I6v7pgmXwQEke8UiZDMC3KnlooqHzdTO6k3+QCyZtWKGdiSnURhF+1sFquL6yTu6qa5Per29XrMIsTRAu4+oQSa0kFWir5UlVj8AJ9l4PdZO3u/Urmd9Fj3IhMG4kCDlWxDYVONSS6UEJjR0xzBNMcBQoli7NnlcoNRXXy3brV8uzazVK1c1+ibroBXNkbxb4bqGC3N6F9u9yJAulWCPxmbbN8A10f+a/aFrmtcqV8G+J5Ir8Ic9DFHbtk0fZw5AOenOA4qGMbxsLKnXvlz+s2y01lDZIdFGkCqf2SSfVk6kz1pUIiCYpVTFysOBV8Cpn85zWblOBdmGsHohFc1dvEEi5HCRVPr20XVMGKocjmochiMgTwRL4Puj8TnlnC2Cr3I0N4Ub0VU6YfYewbMafMLdJESQ3X/cbolJpMKEFFrEBFrDhnZqk8tapNNuD9HYwfjx/vbWIvA6Hk/ry5zRc7GLIGAV6pyTWBwCCUmjO9SD5fvkIeQnd75aJqyUNbqiyNkqnEzNSwUlEJ+2JREcuAiQUyYnqx/BqC9x2Lk7sT3PR2FcszMlzVwGr1RvBJ7/hx8CCYCRaASYB3DhAVXPFAqaZQTFviTujHAamPNbbKL5o3yL8V1LhFmmihIaSy6w12v8mkaqH8mjK12D7jFwkqYZ/h04rlGhRc0zdu9/73VjzwdhIbdqUgg9OQi1Aw8eceVy0IJRYCiXnZLZnU09AVU+j2I0flhdatci6mJU6ZGi9TnTJNDLGU2ieCVKKlKrEBqSiWFKiI5Yo5S+WxhnWyxqgPvFgBOP8Nfs7dgrMxAVFWCjIqBs6KF6szNYzYy/Kr5Hdr2v1pxXOofM/GtMUpVEOpEcSa1W8YsSpTgS8VmFK1WEol/Dez+evljVK4bZf6fxhBuReD4GfdZZyNDqyVglxUtphXVlCt6uMSVLodR46p6YcRPCvki+UYGyfVIZRcDqkvtvHUb2c8s35z8oJJdcHhC6WU1a8n0pLqCdVSg12wma089n0ZYgEKJ7l0dpksRHXPqaERVcD1mXcJZ6MDrrxXwctuDzaskWFzS62TD6fjA5+A8eSgPU99P/DF/gxiU2Upi6WLF1TKHHwAwUgoFjJjUj2BLgJS06l+tVCXVC1US2UbhfaFUEolKJpkIH7uBcx9A8t3JwDX5542zkYHeUAFxX5reYucMbfMOvnAlYMvIMN4ntUInsBwiw0I1Vwwb6nko8s6inlxMJxifakpul/I5MmHdAolojOVRyUVJJLKo0uq5qzJhfKbxriTZ+WAV6Vcn39knI0OfLE7IPZezCfPmlveKRaV7giIHbdhW/DM0ikgXqxDKPkAnnPe1p34bbak1njHeLGe0H4ukRojS7taKOksdWWqHlODUk2hBNWw4nxUzb9BpR+IZeAS4HIQCWejA38VA8dRnjpUYr05KRkeNmMdQgnP5T7fusV7pB+Uek/sy4BYlamGwCCG0BhepkJeWKnMSi2VJBtPU0nVQhXjFsoAMAKZ+5fmjcHTkZTb5YLK2ejAEnsPxOpM1ZyGf4+F2JQZ65B6FqT+cMU671F+qMXoIKHYdE8+hBHLoxbqd78Ql0gsj6rdK5QSicXcVUkl/cCwCQUyAz3dMXvo6XJB5Wx0wFsXVfDS1e/XbZKPLFmmVuXfVN6gjtcW1arzv8F7aECn2KZ4sYNnlsjXq5uC51j/mDM9thgNX8eLDSlVj6npniY0xSaVCpmxTI2XamUq0FKZtf1exBFcOLVYSlBXBAqqfwVBD6FxNiZgFVDBi89cvKZXI/JI7PcltRDHn0ssdnqRXFdYJwWYMgW6o5MgTy08w9edYtdBLLI7TKHUCcR1o1Qt1JcKkhVKQanZlAqZWirJAV8oqJX6XdYmAiuB+flHwtmYgA8DX26KiN2nmkRsLqTmziiWsa1b8cthdd+sDgcbWGKHQ6xTJgkIjVoo8WstVQt1SQ2OqVpoIqm6+6VUCjWlDvAYiud5tKZF9tvnl7m4IOghFM7GJIwClSBZcKnIhZiP6qUrP1WtCK5i0FLRzcrtVatk0+Ej3ndTx18h9uzZpSmEknBS86YUyggMBSPxyzLylXJ8XaraUnW9hG1hCiXK9LtfCNRisz0oNefFBYqReO1xazZ5/1sVPFXFiyxBDylxNoaASzK5pljfo8MjORmFVFbuzM71SWj7NVDxo5Xr/C74ikXVatlKlHgR2T1itiNjA2L9QskQm43HXTqvQj5bXC93Y0x/fOV6+ePqdnlx/RaZjOJlEhiH52fbk5iG3FvVJF/AY6+aXymD+bxBqTw6xlRTrJmp5phqZqopNhfcsKBK1u476P2PVbD3i7wzj7MxChQZJCD2B0DFb1dvVCcgeGbpB6iC2w6+pk548KJ5MrYDPu43LRtTZmyw+j0HvwhjFi2Te5e1yETI44K1sLHt8FGZt/lVeaRujfwHnmPUrDLJRjbrbHVJNcX6mRqQqjPVFEupuS8skDPHL5YHK1ahCLWGJ84Q4j77ZDgboxAnlUJRzWrwGC4XVbEKv4lPo6v5IbLlvrrV8mMcH2lYJw8sXy3fqV9js7yTh8ETyKJPFS+XvGlFTqExYlKZobkosC7HL9Cf8HqBc7NpBQvG2e0dEFwjAyctkWzIDSUV4hJlqpaqxEJqDhgAzsPzL92+O3iiRt22GhZnYxRCiGW3rYIfDldAcNXgGcg8XpIbgjGOF9159JlBimUwGDQ9Br/OhVT/LFNAqJmpeVOL5LfI7h2Yc7MwC1TcjA7Asf8+8DVwm8cd4NvgURB3zo+nObk9wlS8/9EYk4MyTanJCiUt08xUCs0eiyM4A73BA0sbZTfevxHXgrjPPxHOxiiYUnkbJO+Z4c3FJnicv8KC99h8sriu87RgEG+OGuY0IeeowXO/t5Q2yIKtO9UvkCNYcQ9H4aQWeRNUw/5qflTDChRPavkoHsuq/DPAP63JeO34G1L56l55GN27KdQ6+WAIdRVKiaTmgoH49zno8su3W5f5eP7R+uyT4WyMgimWYyrkWOAx/mZgPHnBi+VKoAtIJU6ZJoZY1f2qrrdIHqxdLfV7Eu6uQKkjTampxGrwc5cCSy5j86Ej8tTKVhmBalZXv6pQgkAtNuF46pCa44nNHTtf8Uhlk2zHOG9E6CLK2RgFZqmSioKpX0AqwWP4gapo3HtQbi5rcEslKlujXSTnlOZ0dN3fQYHzqt11MZrBR0DnzVSexChiURGr9cF4Hue9wH9o3iAjpxXHMtWRrYnEKqmU6wml2Jjc+ZIHLp1cJMVbuEzKj9BFlLMxChTrylSC7/NeGhUc53iSn2Movhddqiezk1j3y2LqIW/1ohFclf4VX6aJJzEdsTxi3sr/1ydAO19Ix+9WtcmZ6DkSSbW6YMhkoaSlapkmA5+P8fSK1rSKKGdjFCjVlakE3+8HVLDo4C0WaI8TGpMKWS6hJCDVHFNvr2iUln3WeiLelTfGKZV4ErsilqAi5v9vrHpFBE/i/2T5Wl+qU6gn1czUoFRmqpY6CHy9cLm02MPLBcBy4MLZGIVEUgm+z0pOBW9O/lhhrVNqyjVKvtTOM0qQJJfMq5DSHXtUtW3ER+JkmngSu0MsKmL+H3mZTUUzhpo7Sxp8qTEcUiFTSzXF5nlCtVRyxZRimbPBWul4E7AcuHA2RiFJtnLDEb/g+F9MP4ZieoPv+VKTXiQ3MjQolZk6AAULz0QdtbupSqdME09iV8USTywvjKvgeq/ibbvkoqmYmo3LV0J9sRCq5qkhpGqxA5+bL0PwvZ+hKDSiCVgOXDgbo2DKNMH3/F1kOP/7amVjXLYmzdSAWL/7BZR6U0m96t6NYOaMcso08SR2ReypEIrpTVb/cflZ2QCv69/1dxhToZ/Xr5PBLy3yiyTVFXvZSqmxyrdTLLtfitVZqqSCXIjNfW6e3LmkTvbalzU5xFkegjgbo6BFmqCdt/Wr4NLRJoyBHzUXeqts9QS6SCQVmUounrtUFiMzAisiL3GKDOJJTFvseGTquIVZuS8uzEJXq8Br85bO5epdIDYcOCxXzSqTQaiQo46pGi2VXD+nQiq27/aeXQUrfctDEGdjFEyhGrRz2akKfviTNm6XSxZUGlLDjqmkUyrEqIvnt5ZzOa4VFXECE+FJTFfsqZ7YHEOsJ5c3X6vgL/MTy9fIuRPRu3hSOa4Gu18SlMqv8zypeWAguHJKkUywr/rwbzRYHoI4G6MQlErQbp1G5OU6XiCPJtV96W3knHL569rN3rOrUHcdWPKS4UlMRyy61CxkoBO8B+uXuRQ9CrM24ZhqSNViOabqTNVSB4FzXsqXJ2utLTg4zFkegjgbowBZcaDdP9vE/+TtGF9zp0fpfu3ThBDi8wmMN832Za3wUoknMaxYVr+YjyqQfVkYK53gfVhzdo61txbUurvfgNBOqbGu15RKhuD7D5SuCN5ozeHOcmHibIxCArH+2SZu3HUNxlenTGIJJZ5USNRAiM/9NS3C/SGMeFdQVhRSiWXlS6FhwHvx/9+Mx2pWyzBkWyqpuuvVmFIHPxvjlvlVsss+szYAWC5MnI1RQNdqgTbrN5dbE1w8v8ItlQTEBgslU2oOqmFuE2BEdVBUVBKJ5SYhOltdEl3g/VjbEE1Zv1WunF7SKRVoqVosj2b3G8xWLfa6mWWyZo/VU50PLBcmzsYoqB3ODNBmja9Vu/bJORHWKekxNSiVjML4Oq2dV9z8+EJQVFSSZSxl5T6PrnZsePCeuLpQRfWOPfKZBVW+WFNoMFu1UJdU8rEZZVLTwe03/Eh6p56zMQqQY4G2fwEqOH/llniRlrM4hComLpbr0KWXdFhl/xhTUjokEjsAhRK6zSwIiQTe0wdib03UEpfbMM4mytSgVC00KJV8dFqJFGza4T2zCt6XbLkwcTZGgTJN0Gbsr/iGzNjUIcODy1ksqYkLJVMq+Vzxcqndtd97dhWjtaB00WJPIeMXq0JIZapDWhjwnk6LvTWRrYeOyB0o9kyhSqoSGl4quXJykUxbZ90pwe1+LRcmzsYoaKEatPEOOxW8827Chm3x65QCUoNTGpdUfPjyZcxfm/Za48xILaYr4HXUlCYXXSkEKJit6YD35O+kw6Wk36tYJadhHnve+MUyauISuWjCErlwAqZtgMeLwCjNeDfD8MvAjH2lbZv3zCo+DywXJs7GKGihGrRZYl/GmzlrVmKxKlNDir1j6crgneHnMuu6wimTUCRRKrJ08HPzfLHpgvdkzWerMC4+27RRJmLuPRUZNwVM9uDXhO3JeL5pg8rWjfuthXhnAcuFibMxClqoBm2WWK5vUmJ9mTHMTHVK9YQSSiW3lSFj7TnsBXpcDAvHT/PffbxMHfScW1Q64H0l3TGuG4Kpa3kI4myMgkMs1xer4CR9KqpYbnhliw2XpaZUCJFPFy2XGnst8uWmpChwPCWsel1yugLeV8rtALsQlMrNXCwPQZyNUYAoC7RZm3rxzvQRs8rUOV4StlDSQrVUyJBrF8dXxczAKLx/YoG6QpMLATkodjguuuR0B3h/7JZ5a8y9gCsgv5wm3wIslpJ2vybOxig4xPr7VfAMUTFEUCyzNGymaqHq355USJHzMW2abF90vlWfIQrFhNiZJM43KZRVbE+KDYKKOAtTnCxUwwpUxHGfZ3fhbIxCv8kFFmgLXLI7KOe/Uhap+lVSPZmUSnhLBTfH4sZYRiyPXXEJR9+Ji7Kyxy2Mfbje9CQjNgHIwjjQ7l9k33n0mIxeUBmp+uVRC9XZqm+SuqdylRq7jXivS6ITdMEDXliouuGM2BQgC+NAO5fFqODSleuL6pCxS9xSPZFaKjEz1ZRKrsmvlmr779h92CnRoB+EEkrN8U4RZsSmIIFY63zxfTUtMmR6cXpSgZYKSf4+hUZw5cKFvF7qoj8LpRe9E/UQSjJiQwBBcaDdmqT/ChNs3vWG78VJ1UL5dTBLzUylVMK73a5HdRzojpe6pJKM2DTRMk3QbhVQvJfmsvmVCaWamRrsek2pEKU4b2aJ2nwycOH5Co6hRC8yIwPU+qSM2MiYQjVot67JcqcZrnzA95xio+xNyK9zUB1fm79MNtnb0NeDi5VYbx0SUctZMmKjYwo1wfes1QT3LGuW/iig4qR6Qv1sDYg1s5VHtumbjp9qbFUrNIyo4jw1I7ZnxVqrCZ5dt1nOnVVqidUnH1xStVBTamzPh5hUVLkyfEqhLNkat43OLWrVQ0as+xthgaSE4Pv8o0Mq+Fcvrl9S62eqFupLhbjUUu3dWXhP6o0opGp3WuePeQnkyxmxjsYoQFJC8H3rvPH3l6+JZawhNNkmzi6pzFRK1QzCc9xZukJa7Ou0jHszYruAS6gJHuPfzT4FlSz/IILO1GTjqZbKrteXaggl+k7yoXieb0Duit3W6goG7wLnjWEnZ8RGJNj9BsFjuE+RitaDh+WOpY1+tvZNIpZH1T0bY6pLrN4eIBfHrxTXS6l9K4QZav+pjNiQQFJK8Dj/ksyEtm1qk6xkc1UeKTSdLXc+NKtc5rZ3BG/x10G5/KOGfTNiU+ASGQSP41+PVLF2/2G5BZnV38tWLdSU6iqUkkqFUPNOcoyt8lBlk6zff0jdDR44kaGDf+iIf3XkEXA1eI9LRnfSu8bY8YFrng7wOP6BXRWcmszetCMtqVqolqq23PEy1ZRKho1fLKNnlMojmD+vs+94TxbcX2K0S0p3cMKJJXgs9+BV0fHaUfliSb3kTSxQQl1STaGm1DBb7hBUw4oReI2Pz62Uu0oa5C9NG6WGf1XSvVWQjjqXlO6gV4mFkFDgsdw1WwW7xuWoYC+fszSSVL0zd5gtdwimOZLD+1K9e1MvnFwon1lQLfeUrpTHalrkj6va5LcN69UuaNy7yYge6ZZPSLEEj/cvwDN+2dgqQ71CKlWhZGUqgUAzWxOJpVTzpmMNCif/TvKHyhtl2yFrF9YhLjFd5UQWywvwvlzuKn5H2UoZMKEgZbZqqXpcTSkVMpmt6qZjfm0I1eDDVnwbc2DehW7EWaaQ7uKEFUvwM9aVH/71qGvzq+Ok+t0v8LvfgFRTaEKpgSzVMFPxYSuYsZsOWleKTqeEnuCEFUvwc/7FAZ5qnNS6VZ3QD0o19/tl1+uqfk2hWqoeU83u1yWU4MOWB8vixVJAT9ErxOr1RFHAz/HKj3+qkX/S5ZnV7ZKLcdaXCpm6+6VILdasfn2ZGk+qvTehO0splPAGqQcxHATF6g+/J3l7i30JstIAP8tTjfyDBip4yyV3NhuK6YmZqTpbE2WqLxXo7ldna2zbHU8qMIUqqYB3vT2QERuPS1pY8PO8SdiXy2nQ95a1yNmTCmKZSqk8elJdhZKVqR66+zUzNpipBN2iupXRlbH80N8K8Fo9grMxCi5hUcBzcGczf9s6xvchdxC65USZqqUqsRSppTqEqmz1pGqxPGqp+HCdYgfiQ38rwGv1CM7GKLhkRQXPY02DuNX7r1e2Ss44jLcppAbH1ERSdZa6bjp+yCF2ED70twK8Vo/gbIyCS1S64Pn8nbl2HT0m49ZullHcBzgo1JTKo0MqhcYVS55QUyo+3IxYFy5B6YLn44YZLUAFF5tPb9smty2pg1hbqup+IdLZ/RpCtVRmKmVqsVoqcYkd/Oy8rLcCvFaP4GyMgktQumCaw+fkJTRfLqNpzwF5qHKVXDajxK9+w85VdRecbMudjFgHLkHpQrGY6vB5nX+R66U1m2TMK0vl7Amomh1CE0k1CyUKNaXiw82IdeESlC5aLKY5WaiI+fxfBP5CJp6C5MqIn2G+e/pLi+wsBVqolspjmN1ZMmIduASlS1AsKmK1hBSvYy0+3330ddU9/6p+nVw4aYkaU8NUvy6pJCPWgUtQuiQRay0+17HzyDEp2bpLfo+p0c0LqmUIMlhLpUyXVHyYcWTEOnAJSpdEYrk3MIomvh43YOafXImL6o498oeVbXI/JH16XpWMYiZ7YhNlqubB0hXSbl+2OwPtThHdDV6rR3A2RsElKF1SicU0JwsVMV93DLA28NXBcbju1b3yTNMGuRfCbpxbIWNmlKrNnLkZ1rnj8uWssQtlKLIaH6ziW8UNQbFnmh9+T4LX6hGcjVFwCUqXsGKzeRyrBOeAbwJnUPKO145K6dad8lJLuzxe3SJ3F9bLzchobjp5xaRCJfbh8kYUZdYKisFBAT0FXqtHcDb2Uq4CceNwGsHb5V3P36twNvZyuEKD+/OnI5lSrwOu5+1VOBtPICg5D1wD7gK/BBNBIWgAGwCjDPDPjLqeo1fibMzQ+3E2Zuj9OBsz9H6cjRl6P87GDL0fZ2OG3o5k/T9RaI5u/XXBKQAAAABJRU5ErkJgggs=
\ No newline at end of file
diff --git a/MDL/State.cs b/MDL/State.cs
new file mode 100644
index 0000000000000000000000000000000000000000..df8ef6a771e7c9f966441de509110e684a740593
--- /dev/null
+++ b/MDL/State.cs
@@ -0,0 +1,22 @@
+using MDL.Class;
+using System.Windows.Forms;
+
+namespace MDL
+{
+ public class State : PictureBox
+ {
+ private StateInfo stateInfo;
+
+ public StateInfo StateInfo
+ {
+ get
+ {
+ return stateInfo;
+ }
+ set
+ {
+ stateInfo = value;
+ }
+ }
+ }
+}
diff --git a/MDL/TextBoxEx.cs b/MDL/TextBoxEx.cs
new file mode 100644
index 0000000000000000000000000000000000000000..98d035e26c146be0abd3b4614309baaa2fafbfe8
--- /dev/null
+++ b/MDL/TextBoxEx.cs
@@ -0,0 +1,26 @@
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace MDL
+{
+ public class TextBoxEx : TextBox
+ {
+ public string PlaceHolderStr
+ {
+ get;
+ set;
+ }
+
+ protected override void OnPaint(PaintEventArgs e)
+ {
+ if (!string.IsNullOrEmpty(PlaceHolderStr))
+ {
+ e.Graphics.DrawString(PlaceHolderStr, Font, new SolidBrush(Color.LightGray), 0f, 0f);
+ }
+ else
+ {
+ base.OnPaint(e);
+ }
+ }
+ }
+}
diff --git a/MDL/TransfDelegate.cs b/MDL/TransfDelegate.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b5bf46d1ae74f8ee07da2264a9bd9439d1339ec1
--- /dev/null
+++ b/MDL/TransfDelegate.cs
@@ -0,0 +1,6 @@
+using MDL.Class;
+
+namespace MDL
+{
+ public delegate void TransfDelegate(Dataset value);
+}
diff --git a/NGIS.Model/EContactType.cs b/NGIS.Model/EContactType.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3c6c468c758d42ac191b03808ab5d9767c6316bb
--- /dev/null
+++ b/NGIS.Model/EContactType.cs
@@ -0,0 +1,10 @@
+namespace NGIS.Model
+{
+ public enum EContactType
+ {
+ ECT_Unknown,
+ ECT_Email,
+ ECT_Fax,
+ ECT_Phone
+ }
+}
diff --git a/NGIS.Model/EExecutionStyle.cs b/NGIS.Model/EExecutionStyle.cs
new file mode 100644
index 0000000000000000000000000000000000000000..592130f655fc3b23d87d5980b8d0492021577682
--- /dev/null
+++ b/NGIS.Model/EExecutionStyle.cs
@@ -0,0 +1,9 @@
+namespace NGIS.Model
+{
+ public enum EExecutionStyle
+ {
+ EES_STATE_SIMULATION,
+ EES_SIMPLE_CALCULATION,
+ EES_TIME_SERIES
+ }
+}
diff --git a/NGIS.Model/ELocalizationType.cs b/NGIS.Model/ELocalizationType.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b97c03bad68647e56570fd6cf0dc313ff0c63ccd
--- /dev/null
+++ b/NGIS.Model/ELocalizationType.cs
@@ -0,0 +1,14 @@
+namespace NGIS.Model
+{
+ public enum ELocalizationType
+ {
+ ELT_ZH_CN,
+ ELT_EN_US,
+ ELT_DE_DE,
+ ELT_RU_RU,
+ ELT_AR,
+ ELT_ES,
+ ELT_OTHERS,
+ ELT_COUNT
+ }
+}
diff --git a/NGIS.Model/EMechanismItemType.cs b/NGIS.Model/EMechanismItemType.cs
new file mode 100644
index 0000000000000000000000000000000000000000..93f1062d7eac0e4897e45b9d523381a3a5d1c154
--- /dev/null
+++ b/NGIS.Model/EMechanismItemType.cs
@@ -0,0 +1,10 @@
+namespace NGIS.Model
+{
+ public enum EMechanismItemType
+ {
+ EMIT_Unknown = 0,
+ EMIT_Text = 1,
+ EMIT_Algorithm = 2,
+ EMIT_Formula = 4
+ }
+}
diff --git a/NGIS.Model/EModelDatasetItemType.cs b/NGIS.Model/EModelDatasetItemType.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b16e7cf902a8630e44f4a6853be29d4190eecb7d
--- /dev/null
+++ b/NGIS.Model/EModelDatasetItemType.cs
@@ -0,0 +1,9 @@
+namespace NGIS.Model
+{
+ public enum EModelDatasetItemType
+ {
+ EMDIT_INTERNAL,
+ EMDIT_EXTERNAL,
+ EMDIT_RAW
+ }
+}
diff --git a/NGIS.Model/EModelEventType.cs b/NGIS.Model/EModelEventType.cs
new file mode 100644
index 0000000000000000000000000000000000000000..9dd73349a767a4fabce460639933b25c31485330
--- /dev/null
+++ b/NGIS.Model/EModelEventType.cs
@@ -0,0 +1,9 @@
+namespace NGIS.Model
+{
+ public enum EModelEventType
+ {
+ EMET_RESPONSE,
+ EMET_NORESPONSE,
+ EMET_CONTROL
+ }
+}
diff --git a/NGIS.Model/EModelStateType.cs b/NGIS.Model/EModelStateType.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3aaf9931e9179a703fc3f7a0d1401a531402e240
--- /dev/null
+++ b/NGIS.Model/EModelStateType.cs
@@ -0,0 +1,8 @@
+namespace NGIS.Model
+{
+ public enum EModelStateType
+ {
+ EMST_BASIC,
+ EMST_GROUP
+ }
+}
diff --git a/NGIS.Model/ESpatiotemporalScaleType.cs b/NGIS.Model/ESpatiotemporalScaleType.cs
new file mode 100644
index 0000000000000000000000000000000000000000..090de0af1602357b98b8e7f65ae53c48d5ef44b5
--- /dev/null
+++ b/NGIS.Model/ESpatiotemporalScaleType.cs
@@ -0,0 +1,11 @@
+namespace NGIS.Model
+{
+ public enum ESpatiotemporalScaleType
+ {
+ EMSST_Unknown,
+ EMSST_Global,
+ EMSST_Region_Large,
+ EMSST_Region_Middle,
+ EMSST_Region_Small
+ }
+}
diff --git a/NGIS.Model/HardwareRequirement.cs b/NGIS.Model/HardwareRequirement.cs
new file mode 100644
index 0000000000000000000000000000000000000000..2ead8aa8dbeafd1054c174223b72670e9173d335
--- /dev/null
+++ b/NGIS.Model/HardwareRequirement.cs
@@ -0,0 +1,32 @@
+namespace NGIS.Model
+{
+ public struct HardwareRequirement
+ {
+ public string requirementKey;
+
+ public string requirementValue;
+
+ public bool compareOther(HardwareRequirement pRequirement)
+ {
+ if (requirementKey != pRequirement.requirementKey)
+ {
+ return false;
+ }
+ if (requirementValue != pRequirement.requirementValue)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ public static bool operator ==(HardwareRequirement pRequirementA, HardwareRequirement pRequirementB)
+ {
+ return pRequirementA.compareOther(pRequirementB);
+ }
+
+ public static bool operator !=(HardwareRequirement pRequirementA, HardwareRequirement pRequirementB)
+ {
+ return !(pRequirementA == pRequirementB);
+ }
+ }
+}
diff --git a/NGIS.Model/IModelAttribute.cs b/NGIS.Model/IModelAttribute.cs
new file mode 100644
index 0000000000000000000000000000000000000000..bd51eb0ec6164677d488374e4a47d400e1286b20
--- /dev/null
+++ b/NGIS.Model/IModelAttribute.cs
@@ -0,0 +1,59 @@
+namespace NGIS.Model
+{
+ public interface IModelAttribute
+ {
+ int getLocalAttributeCount();
+
+ bool getLocalAttribute(int idx, ref LocalAttribute pLocalAttribute);
+
+ bool getLocalAttribute(ELocalizationType pLocalType, ref LocalAttribute pLocalAttribute);
+
+ bool addLocalAttributeInfo(ref LocalAttribute pLocalAttribute);
+
+ bool removeLocalAttribute(int idx);
+
+ bool removeLocalAttribute(ref LocalAttribute pLocalAttribute);
+
+ bool updateLocalAttribute(int idx, ref LocalAttribute pLocalAttribute);
+
+ bool updateLocalAttribute(ELocalizationType pLocalType, ref LocalAttribute pLocalAttribute);
+
+ int getCategoryCount();
+
+ bool getCategory(int idx, ref ModelCategory pModelCategory);
+
+ bool addCategoryInfo(ref ModelCategory pCategoryInfo);
+
+ bool removeCategory(int idx);
+
+ bool removeCategory(ref ModelCategory pCategoryInfo);
+
+ bool updateCategory(int idx, ref ModelCategory pCategoryInfo);
+
+ int getAuthorsCount();
+
+ bool getAuthor(int index, ref ModelUser author);
+
+ bool addAuthor(ref ModelUser author);
+
+ bool removeAuthor(int index);
+
+ int getBuildersCount();
+
+ bool getBuilder(int index, ref ModelUser builder);
+
+ bool addBuilder(ref ModelUser builder);
+
+ bool removeBuilder(int index);
+
+ int getWrappersCount();
+
+ bool getWrapper(int index, ref ModelUser wrapper);
+
+ bool addWrapper(ref ModelUser wrapper);
+
+ bool removeWrapper(int index);
+
+ bool compareOther(IModelAttribute pAttribute, ref string obj, ref string name);
+ }
+}
diff --git a/NGIS.Model/IModelBehavior.cs b/NGIS.Model/IModelBehavior.cs
new file mode 100644
index 0000000000000000000000000000000000000000..931e03311bb0eac1595493413e4c41890e0ef5a1
--- /dev/null
+++ b/NGIS.Model/IModelBehavior.cs
@@ -0,0 +1,73 @@
+namespace NGIS.Model
+{
+ public interface IModelBehavior
+ {
+ bool addModelDatasetItem(ref ModelDatasetItem pDataset);
+
+ bool removeModelDatasetItem(ref ModelDatasetItem pDataset);
+
+ int getModelDatasetItemCount();
+
+ bool getModelDatasetItem(int idx, ref ModelDatasetItem pDataset);
+
+ bool getModelDatasetItem(string pName, ref ModelDatasetItem pDataset);
+
+ bool updateModelDatasetItem(int idx, ref ModelDatasetItem pDataset);
+
+ bool addModelState(ref ModelState pState);
+
+ bool removeModelState(ref ModelState pState);
+
+ int getModelStateCount();
+
+ bool getModelState(int idx, ref ModelState pState);
+
+ bool getModelState(string pStateId, ref ModelState pState);
+
+ bool updateModelState(int idx, ref ModelState pState);
+
+ bool updateModelState(string pStateId, ref ModelState pState);
+
+ bool addModelStateTransition(string pFromStateId, string pToStateId);
+
+ bool addModelStateTransition(ref ModelState pFromState, ref ModelState pToState);
+
+ bool removeModelStateTransition(string pFromStateId, string pToStateId);
+
+ bool removeModelStateTransition(ref ModelState pFromState, ref ModelState pToState);
+
+ int getModelStateTransitionCount();
+
+ bool getModelStateTransition(int idx, ref ModelState pFromState, ref ModelState pToState);
+
+ bool getModelStateTransition(int idx, ref ModelStateTransition pStateTransition);
+
+ bool existModelStatetTransition(string pFromStateId, string pToStateId);
+
+ bool existModelStatetTransition(ref ModelState pFromState, ref ModelState pToState);
+
+ bool updateModelStateTransition(int idx, string pFromStateId, string pToStateId);
+
+ bool addProcessParameter(ModelParameter processparameter);
+
+ bool getProcessParameter(string key, ref ModelParameter parameter);
+
+ int getProcessParameterCount();
+
+ bool removeProcessParameter(ModelParameter processparameter);
+
+ bool updateProcessParameter(ModelParameter processparameter);
+
+ bool addControlParameter(ModelParameter processparameter);
+
+ bool getControlParameter(string key, ref ModelParameter parameter);
+
+ int getControlParameterCount();
+
+ bool removeControlParameter(ModelParameter controlparameter);
+
+ bool updateControlParameter(ModelParameter controlparameter);
+
+ bool compareOther(IModelBehavior pBehavior, ref string obj, ref string name);
+ }
+}
diff --git a/NGIS.Model/IModelClass.cs b/NGIS.Model/IModelClass.cs
new file mode 100644
index 0000000000000000000000000000000000000000..7eaa552a3ed1f070d13114a9ae67121db2db4a6c
--- /dev/null
+++ b/NGIS.Model/IModelClass.cs
@@ -0,0 +1,33 @@
+namespace NGIS.Model
+{
+ public interface IModelClass
+ {
+ void setName(string pName);
+
+ string getName();
+
+ void setUID(string pUID);
+
+ string getUID();
+
+ void setExecutionStyle(EExecutionStyle pStyle);
+
+ EExecutionStyle getExecutionStyle();
+
+ ModelAttribute getModelAttribute();
+
+ ModelBehavior getModelBehavior();
+
+ ModelRuntime getModelRuntime();
+
+ bool LoadFromXmlFile(string fileName);
+
+ bool FormatToXmlFile(string fileName);
+
+ bool LoadFromXmlStream(string xmlStr);
+
+ bool FormatToXmlStream(ref string xmlStr);
+
+ bool compareOther(IModelClass pClass, bool withRuntime, ref string obj, ref string name);
+ }
+}
diff --git a/NGIS.Model/IModelRuntime.cs b/NGIS.Model/IModelRuntime.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3d6ee56b63036b86edae7c2e2183fedb749ab05b
--- /dev/null
+++ b/NGIS.Model/IModelRuntime.cs
@@ -0,0 +1,63 @@
+namespace NGIS.Model
+{
+ public interface IModelRuntime
+ {
+ string getName();
+
+ void setName(string pName);
+
+ string getVersion();
+
+ void setVersion(string pVersion);
+
+ string getEntry();
+
+ void setEntry(string pEntry);
+
+ string getBaseDirectory();
+
+ void setBaseDirectory(string pDirectory);
+
+ bool addHardwareRequirement(ref HardwareRequirement pRequirement);
+
+ bool addSoftwareRequirement(ref SoftwareRequirement pRequirement);
+
+ bool addModelAssembly(ref ModelAssembly pRequirement);
+
+ bool addSupportiveResource(ref SupportiveResource pRequirement);
+
+ int getHardwareRequirementCount();
+
+ int getSoftwareRequirementCount();
+
+ int getModelAssemblyCount();
+
+ int getSupportiveResourceCount();
+
+ bool getHardwareRequirement(int idx, ref HardwareRequirement pRequirement);
+
+ bool getSoftwareRequirement(int idx, ref SoftwareRequirement pRequirement);
+
+ bool getModelAssembly(int idx, ref ModelAssembly pRequirement);
+
+ bool getSupportiveResource(int idx, ref SupportiveResource pRequirement);
+
+ bool removeHardwareRequirementref(HardwareRequirement pRequirement);
+
+ bool removeSoftwareRequirement(ref SoftwareRequirement pRequirement);
+
+ bool removeModelAssembly(ref ModelAssembly pRequirement);
+
+ bool removeSupportiveResource(ref SupportiveResource pRequirement);
+
+ bool removeHardwareRequirement(int idx);
+
+ bool removeSoftwareRequirement(int idx);
+
+ bool removeModelAssembly(int idx);
+
+ bool removeSupportiveResource(int idx);
+
+ bool compareOther(IModelRuntime pRuntime, ref string obj, ref string name);
+ }
+}
diff --git a/NGIS.Model/LocalAttribute.cs b/NGIS.Model/LocalAttribute.cs
new file mode 100644
index 0000000000000000000000000000000000000000..80dac560ca67ff909986237d8515ab3e76807c8a
--- /dev/null
+++ b/NGIS.Model/LocalAttribute.cs
@@ -0,0 +1,108 @@
+using System.Collections.Generic;
+
+namespace NGIS.Model
+{
+ public struct LocalAttribute
+ {
+ public ELocalizationType localType;
+
+ public string localName;
+
+ public string abstractInfo;
+
+ public string wikiUrl;
+
+ public List keywords;
+
+ public List mechanismItems;
+
+ public ESpatiotemporalScaleType sptimeScaleType;
+
+ public SpatiotemporalStepLength sslX;
+
+ public SpatiotemporalStepLength sslY;
+
+ public SpatiotemporalStepLength sslZ;
+
+ public SpatiotemporalStepLength sslT;
+
+ public SpatialScope spatialScope;
+
+ public bool compareOther(LocalAttribute pLocal)
+ {
+ if (localType != pLocal.localType)
+ {
+ return false;
+ }
+ if (localName != pLocal.localName)
+ {
+ return false;
+ }
+ if (abstractInfo != pLocal.abstractInfo)
+ {
+ return false;
+ }
+ if (wikiUrl != pLocal.wikiUrl)
+ {
+ return false;
+ }
+ if (keywords.Count != pLocal.keywords.Count)
+ {
+ return false;
+ }
+ for (int i = 0; i < keywords.Count; i++)
+ {
+ if (keywords[i] != pLocal.keywords[i])
+ {
+ return false;
+ }
+ }
+ if (mechanismItems.Count != pLocal.mechanismItems.Count)
+ {
+ return false;
+ }
+ foreach (ModelMechanismItem mechanismItem in mechanismItems)
+ {
+ if (!pLocal.mechanismItems.Contains(mechanismItem))
+ {
+ return false;
+ }
+ }
+ if (sptimeScaleType != pLocal.sptimeScaleType)
+ {
+ return false;
+ }
+ if (sslX != pLocal.sslX)
+ {
+ return false;
+ }
+ if (sslY != pLocal.sslY)
+ {
+ return false;
+ }
+ if (sslZ != pLocal.sslZ)
+ {
+ return false;
+ }
+ if (sslT != pLocal.sslT)
+ {
+ return false;
+ }
+ if (spatialScope != pLocal.spatialScope)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ public static bool operator ==(LocalAttribute laA, LocalAttribute laB)
+ {
+ return laA.compareOther(laB);
+ }
+
+ public static bool operator !=(LocalAttribute laA, LocalAttribute laB)
+ {
+ return !(laA == laB);
+ }
+ }
+}
diff --git a/NGIS.Model/LocalizationHelper.cs b/NGIS.Model/LocalizationHelper.cs
new file mode 100644
index 0000000000000000000000000000000000000000..9685d6498153f39f19f5c159b7525750c0816ab0
--- /dev/null
+++ b/NGIS.Model/LocalizationHelper.cs
@@ -0,0 +1,204 @@
+using System.Collections.Generic;
+using System.Xml;
+
+namespace NGIS.Model
+{
+ public class LocalizationHelper
+ {
+ public static string LocalizationType2String(ELocalizationType pType)
+ {
+ switch (pType)
+ {
+ case ELocalizationType.ELT_ZH_CN:
+ return "ZH_CN";
+ case ELocalizationType.ELT_EN_US:
+ return "EN_US";
+ case ELocalizationType.ELT_DE_DE:
+ return "DE_DE";
+ case ELocalizationType.ELT_RU_RU:
+ return "RU_RU";
+ case ELocalizationType.ELT_AR:
+ return "AR";
+ case ELocalizationType.ELT_ES:
+ return "ES";
+ default:
+ return "Unknown";
+ }
+ }
+
+ public static ELocalizationType String2LocalizationType(string pTypeStr)
+ {
+ if (pTypeStr == "ZH_CN")
+ {
+ return ELocalizationType.ELT_ZH_CN;
+ }
+ if (pTypeStr == "EN_US")
+ {
+ return ELocalizationType.ELT_EN_US;
+ }
+ if (pTypeStr == "DE_DE")
+ {
+ return ELocalizationType.ELT_DE_DE;
+ }
+ if (pTypeStr == "RU_RU")
+ {
+ return ELocalizationType.ELT_RU_RU;
+ }
+ if (pTypeStr == "AR")
+ {
+ return ELocalizationType.ELT_AR;
+ }
+ if (pTypeStr == "ES")
+ {
+ return ELocalizationType.ELT_ES;
+ }
+ return ELocalizationType.ELT_COUNT;
+ }
+
+ public static string MechanismType2String(EMechanismItemType mType)
+ {
+ switch (mType)
+ {
+ case EMechanismItemType.EMIT_Algorithm:
+ return "Algorithm";
+ case EMechanismItemType.EMIT_Formula:
+ return "Formula";
+ case EMechanismItemType.EMIT_Text:
+ return "Text";
+ default:
+ return "Unknown";
+ }
+ }
+
+ public static EMechanismItemType String2MechanismItemType(string sType)
+ {
+ if (sType == "Algorithm")
+ {
+ return EMechanismItemType.EMIT_Algorithm;
+ }
+ if (sType == "Formula")
+ {
+ return EMechanismItemType.EMIT_Formula;
+ }
+ if (sType == "Text")
+ {
+ return EMechanismItemType.EMIT_Text;
+ }
+ return EMechanismItemType.EMIT_Unknown;
+ }
+
+ public static string SpatiotemporalScaleType2String(ESpatiotemporalScaleType ssType)
+ {
+ switch (ssType)
+ {
+ case ESpatiotemporalScaleType.EMSST_Global:
+ return "Global";
+ case ESpatiotemporalScaleType.EMSST_Region_Large:
+ return "Region";
+ case ESpatiotemporalScaleType.EMSST_Region_Middle:
+ return "Region";
+ case ESpatiotemporalScaleType.EMSST_Region_Small:
+ return "Region";
+ default:
+ return "Unknown";
+ }
+ }
+
+ public static string SpatiotemporalScale2String(ESpatiotemporalScaleType ssType)
+ {
+ switch (ssType)
+ {
+ case ESpatiotemporalScaleType.EMSST_Global:
+ return "";
+ case ESpatiotemporalScaleType.EMSST_Region_Large:
+ return "Large";
+ case ESpatiotemporalScaleType.EMSST_Region_Middle:
+ return "Middle";
+ case ESpatiotemporalScaleType.EMSST_Region_Small:
+ return "Small";
+ default:
+ return "Unknown";
+ }
+ }
+
+ public static ESpatiotemporalScaleType String2SpatiotemporalScaleType(string sType, string sScale)
+ {
+ if (sType == "Global")
+ {
+ return ESpatiotemporalScaleType.EMSST_Global;
+ }
+ if (sType == "Regional" && sScale == "Large")
+ {
+ return ESpatiotemporalScaleType.EMSST_Region_Large;
+ }
+ if (sType == "Regional" && sScale == "Middle")
+ {
+ return ESpatiotemporalScaleType.EMSST_Region_Middle;
+ }
+ if (sType == "Regional" && sScale == "Small")
+ {
+ return ESpatiotemporalScaleType.EMSST_Region_Small;
+ }
+ return ESpatiotemporalScaleType.EMSST_Unknown;
+ }
+
+ public static EContactType String2ContactType(string sContact)
+ {
+ if (sContact == "Email")
+ {
+ return EContactType.ECT_Email;
+ }
+ if (sContact == "Fax")
+ {
+ return EContactType.ECT_Fax;
+ }
+ if (sContact == "Phone")
+ {
+ return EContactType.ECT_Phone;
+ }
+ return EContactType.ECT_Unknown;
+ }
+
+ public static string ContactType2String(EContactType eContact)
+ {
+ switch (eContact)
+ {
+ case EContactType.ECT_Email:
+ return "Email";
+ case EContactType.ECT_Fax:
+ return "Fax";
+ case EContactType.ECT_Phone:
+ return "Phone";
+ default:
+ return "Unknown";
+ }
+ }
+
+ public static List Xml2ModelUser(XmlElement mele)
+ {
+ List list = new List();
+ foreach (XmlElement childNode in mele.ChildNodes)
+ {
+ string attribute = childNode.GetAttribute("name");
+ string attribute2 = childNode.GetAttribute("account");
+ XmlElement xmlElement2 = (XmlElement)mele.ChildNodes[0];
+ string attribute3 = childNode.GetAttribute("name");
+ string attribute4 = childNode.GetAttribute("country");
+ string attribute5 = childNode.GetAttribute("city");
+ string attribute6 = childNode.GetAttribute("address");
+ ModelUserInstitution ins = new ModelUserInstitution(attribute3, attribute4, attribute5, attribute6);
+ XmlElement xmlElement3 = (XmlElement)mele.ChildNodes[0];
+ List list2 = new List();
+ foreach (XmlElement childNode2 in xmlElement3.ChildNodes)
+ {
+ string attribute7 = childNode2.GetAttribute("type");
+ string attribute8 = childNode2.GetAttribute("value");
+ list2.Add(new ModelUserContact(String2ContactType(attribute7), attribute8));
+ }
+ ModelUser item = new ModelUser(attribute, attribute2, ins, list2);
+ list.Add(item);
+ }
+ return list;
+ }
+ }
+}
diff --git a/NGIS.Model/ModelAssembly.cs b/NGIS.Model/ModelAssembly.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d4c3272516b74e3fc3cb01e50aa365f11945d69f
--- /dev/null
+++ b/NGIS.Model/ModelAssembly.cs
@@ -0,0 +1,32 @@
+namespace NGIS.Model
+{
+ public struct ModelAssembly
+ {
+ public string assemblyName;
+
+ public string assemblyPath;
+
+ public bool compareOther(ModelAssembly pAssembly)
+ {
+ if (assemblyName != pAssembly.assemblyName)
+ {
+ return false;
+ }
+ if (assemblyPath != pAssembly.assemblyPath)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ public static bool operator ==(ModelAssembly maA, ModelAssembly maB)
+ {
+ return maA.compareOther(maB);
+ }
+
+ public static bool operator !=(ModelAssembly maA, ModelAssembly maB)
+ {
+ return !(maA == maB);
+ }
+ }
+}
diff --git a/NGIS.Model/ModelAttribute.cs b/NGIS.Model/ModelAttribute.cs
new file mode 100644
index 0000000000000000000000000000000000000000..9603235d2a9de40538b21390990fd6b4641c42ea
--- /dev/null
+++ b/NGIS.Model/ModelAttribute.cs
@@ -0,0 +1,633 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Xml;
+
+namespace NGIS.Model
+{
+ public class ModelAttribute : IModelAttribute
+ {
+ private List mLocalAttributeList = new List();
+
+ private List mModelCategoryList = new List();
+
+ private List mAuthors = new List();
+
+ private List mBuilders = new List();
+
+ private List mWrappers = new List();
+
+ public bool loadFromXml(XmlElement pModelClassElement)
+ {
+ XmlElement xmlElement = (XmlElement)pModelClassElement.ChildNodes[0];
+ XmlElement xmlElement2 = (XmlElement)xmlElement.ChildNodes[0];
+ XmlElement xmlElement3 = (XmlElement)xmlElement.ChildNodes[1];
+ foreach (object childNode in xmlElement2.ChildNodes)
+ {
+ XmlElement xmlElement4 = childNode as XmlElement;
+ ModelCategory item = default(ModelCategory);
+ item.principle = xmlElement4.GetAttribute("principle");
+ item.path = xmlElement4.GetAttribute("path");
+ mModelCategoryList.Add(item);
+ }
+ foreach (object childNode2 in xmlElement3.ChildNodes)
+ {
+ XmlElement xmlElement5 = childNode2 as XmlElement;
+ LocalAttribute item2 = default(LocalAttribute);
+ item2.localName = xmlElement5.GetAttribute("localName");
+ item2.wikiUrl = xmlElement5.GetAttribute("wiki");
+ string attribute = xmlElement5.GetAttribute("local");
+ ELocalizationType eLocalizationType = item2.localType = LocalizationHelper.String2LocalizationType(attribute);
+ XmlElement xmlElement6 = (XmlElement)xmlElement5.ChildNodes[0];
+ XmlElement xmlElement7 = (XmlElement)xmlElement5.ChildNodes[1];
+ string innerText = xmlElement6.InnerText;
+ item2.abstractInfo = xmlElement7.InnerText;
+ List list = innerText.Split(';').ToList();
+ item2.keywords = new List();
+ for (int i = 0; i < list.Count; i++)
+ {
+ item2.keywords.Add(list[i]);
+ }
+ if (xmlElement5.ChildNodes.Count > 2)
+ {
+ XmlNodeList elementsByTagName = xmlElement5.GetElementsByTagName("Mechanism");
+ if (elementsByTagName.Count > 0)
+ {
+ XmlElement xmlElement8 = (XmlElement)elementsByTagName[0];
+ item2.mechanismItems = new List();
+ foreach (XmlElement item4 in xmlElement8)
+ {
+ string attribute2 = item4.GetAttribute("name");
+ EMechanismItemType eMechanismItemType = LocalizationHelper.String2MechanismItemType(item4.GetAttribute("type"));
+ string text = "";
+ text = ((eMechanismItemType != EMechanismItemType.EMIT_Text) ? item4.GetAttribute("value") : item4.InnerText);
+ ModelMechanismItem item3 = new ModelMechanismItem(attribute2, eMechanismItemType, text);
+ item2.mechanismItems.Add(item3);
+ }
+ }
+ XmlNodeList elementsByTagName2 = xmlElement5.GetElementsByTagName("Application");
+ if (elementsByTagName2.Count > 0)
+ {
+ XmlElement xmlElement10 = (XmlElement)elementsByTagName[0];
+ XmlNodeList elementsByTagName3 = xmlElement10.GetElementsByTagName("SpatiotemporalScale");
+ if (elementsByTagName3.Count > 0)
+ {
+ XmlElement xmlElement11 = (XmlElement)elementsByTagName3[0];
+ ESpatiotemporalScaleType eSpatiotemporalScaleType = item2.sptimeScaleType = LocalizationHelper.String2SpatiotemporalScaleType(xmlElement11.GetAttribute("type"), xmlElement11.GetAttribute("scale"));
+ }
+ XmlNodeList elementsByTagName4 = xmlElement10.GetElementsByTagName("SpatiotemporalStepLength");
+ if (elementsByTagName4.Count > 0)
+ {
+ XmlElement xmlElement12 = (XmlElement)elementsByTagName4[0];
+ foreach (XmlElement childNode3 in xmlElement12.ChildNodes)
+ {
+ string name = childNode3.Name;
+ string attribute3 = childNode3.GetAttribute("step");
+ string attribute4 = childNode3.GetAttribute("unit");
+ SpatiotemporalStepLength spatiotemporalStepLength = new SpatiotemporalStepLength(attribute3, attribute4);
+ if (name == "X")
+ {
+ item2.sslX = new SpatiotemporalStepLength(attribute3, attribute4);
+ }
+ else if (name == "Y")
+ {
+ item2.sslY = new SpatiotemporalStepLength(attribute3, attribute4);
+ }
+ else if (name == "Z")
+ {
+ item2.sslZ = new SpatiotemporalStepLength(attribute3, attribute4);
+ }
+ else if (name == "T")
+ {
+ item2.sslT = new SpatiotemporalStepLength(attribute3, attribute4);
+ }
+ }
+ }
+ XmlNodeList elementsByTagName5 = xmlElement10.GetElementsByTagName("Scope");
+ if (elementsByTagName5.Count > 0)
+ {
+ XmlElement xmlElement14 = (XmlElement)elementsByTagName5[0];
+ item2.spatialScope = default(SpatialScope);
+ item2.spatialScope.Extents = new List();
+ item2.spatialScope.AreaNames = new List();
+ XmlElement xmlElement15 = (XmlElement)xmlElement14.ChildNodes[0];
+ XmlElement xmlElement16 = (XmlElement)xmlElement14.ChildNodes[1];
+ foreach (XmlElement childNode4 in xmlElement15.ChildNodes)
+ {
+ double xmin = Convert.ToDouble(childNode4.GetAttribute("xMin"));
+ double xmax = Convert.ToDouble(childNode4.GetAttribute("xMax"));
+ double ymin = Convert.ToDouble(childNode4.GetAttribute("yMin"));
+ double ymax = Convert.ToDouble(childNode4.GetAttribute("yMax"));
+ string attribute5 = childNode4.GetAttribute("spatialReference");
+ item2.spatialScope.Extents.Add(new SpatialExtent(xmin, xmax, ymin, ymax, attribute5));
+ }
+ foreach (XmlElement childNode5 in xmlElement16.ChildNodes)
+ {
+ string attribute6 = childNode5.GetAttribute("name");
+ item2.spatialScope.AreaNames.Add(attribute6);
+ }
+ }
+ }
+ }
+ mLocalAttributeList.Add(item2);
+ }
+ if (xmlElement.ChildNodes.Count > 2)
+ {
+ XmlNodeList elementsByTagName6 = xmlElement.GetElementsByTagName("Authors");
+ if (elementsByTagName6.Count > 0)
+ {
+ XmlElement mele = (XmlElement)elementsByTagName6[0];
+ mAuthors = LocalizationHelper.Xml2ModelUser(mele);
+ }
+ XmlNodeList elementsByTagName7 = xmlElement.GetElementsByTagName("Builders");
+ if (elementsByTagName7.Count > 0)
+ {
+ XmlElement mele2 = (XmlElement)elementsByTagName7[0];
+ mBuilders = LocalizationHelper.Xml2ModelUser(mele2);
+ }
+ XmlNodeList elementsByTagName8 = xmlElement.GetElementsByTagName("Wrappers");
+ if (elementsByTagName8.Count > 0)
+ {
+ XmlElement mele3 = (XmlElement)elementsByTagName8[0];
+ mWrappers = LocalizationHelper.Xml2ModelUser(mele3);
+ }
+ }
+ return true;
+ }
+
+ public bool formatToXml(XmlElement pModelClassElement)
+ {
+ XmlDocument ownerDocument = pModelClassElement.OwnerDocument;
+ XmlElement xmlElement = ownerDocument.CreateElement("AttributeSet");
+ XmlElement xmlElement2 = ownerDocument.CreateElement("Categories");
+ XmlElement xmlElement3 = ownerDocument.CreateElement("LocalAttributes");
+ for (int i = 0; i < mModelCategoryList.Count; i++)
+ {
+ ModelCategory modelCategory = mModelCategoryList[i];
+ XmlElement xmlElement4 = ownerDocument.CreateElement("Category");
+ xmlElement4.SetAttribute("principle", modelCategory.principle);
+ xmlElement4.SetAttribute("path", modelCategory.path);
+ xmlElement2.AppendChild(xmlElement4);
+ }
+ for (int j = 0; j < mLocalAttributeList.Count; j++)
+ {
+ LocalAttribute localAttribute = mLocalAttributeList[j];
+ XmlElement xmlElement5 = ownerDocument.CreateElement("LocalAttribute");
+ xmlElement5.SetAttribute("local", LocalizationHelper.LocalizationType2String(localAttribute.localType));
+ xmlElement5.SetAttribute("localName", localAttribute.localName);
+ xmlElement5.SetAttribute("wiki", localAttribute.wikiUrl);
+ XmlElement xmlElement6 = ownerDocument.CreateElement("Keywords");
+ XmlElement xmlElement7 = ownerDocument.CreateElement("Abstract");
+ XmlElement xmlElement8 = ownerDocument.CreateElement("Mechanism");
+ XmlElement xmlElement9 = ownerDocument.CreateElement("Application");
+ string text = "";
+ for (int k = 0; k < localAttribute.keywords.Count; k++)
+ {
+ string str = localAttribute.keywords[k];
+ text += str;
+ if (k != localAttribute.keywords.Count - 1)
+ {
+ text += "; ";
+ }
+ }
+ xmlElement6.InnerText = text;
+ xmlElement7.InnerText = localAttribute.abstractInfo;
+ if (localAttribute.mechanismItems != null)
+ {
+ for (int l = 0; l < localAttribute.mechanismItems.Count; l++)
+ {
+ XmlElement xmlElement10 = ownerDocument.CreateElement("Add");
+ xmlElement10.SetAttribute("name", localAttribute.mechanismItems[l].Name);
+ xmlElement10.SetAttribute("type", LocalizationHelper.MechanismType2String(localAttribute.mechanismItems[l].Type));
+ xmlElement10.SetAttribute("value", localAttribute.mechanismItems[l].Value);
+ xmlElement8.AppendChild(xmlElement10);
+ }
+ }
+ XmlElement xmlElement11 = ownerDocument.CreateElement("SpatiotemporalScale");
+ xmlElement11.SetAttribute("type", LocalizationHelper.SpatiotemporalScaleType2String(localAttribute.sptimeScaleType));
+ xmlElement11.SetAttribute("scale", LocalizationHelper.SpatiotemporalScale2String(localAttribute.sptimeScaleType));
+ xmlElement9.AppendChild(xmlElement11);
+ XmlElement xmlElement12 = ownerDocument.CreateElement("SpatiotemporalStepLength");
+ XmlElement xmlElement13 = ownerDocument.CreateElement("X");
+ xmlElement13.SetAttribute("step", "[" + localAttribute.sslX.Min.ToString() + "," + localAttribute.sslX.Max.ToString() + "]");
+ xmlElement13.SetAttribute("unit", localAttribute.sslX.Unit);
+ xmlElement12.AppendChild(xmlElement13);
+ XmlElement xmlElement14 = ownerDocument.CreateElement("Y");
+ xmlElement14.SetAttribute("step", "[" + localAttribute.sslY.Min.ToString() + "," + localAttribute.sslY.Max.ToString() + "]");
+ xmlElement14.SetAttribute("unit", localAttribute.sslY.Unit);
+ xmlElement12.AppendChild(xmlElement14);
+ XmlElement xmlElement15 = ownerDocument.CreateElement("Z");
+ xmlElement15.SetAttribute("step", "[" + localAttribute.sslZ.Min.ToString() + "," + localAttribute.sslZ.Max.ToString() + "]");
+ xmlElement15.SetAttribute("unit", localAttribute.sslZ.Unit);
+ xmlElement12.AppendChild(xmlElement15);
+ XmlElement xmlElement16 = ownerDocument.CreateElement("T");
+ xmlElement16.SetAttribute("step", "[" + localAttribute.sslT.Min.ToString() + "," + localAttribute.sslT.Max.ToString() + "]");
+ xmlElement16.SetAttribute("unit", localAttribute.sslT.Unit);
+ xmlElement12.AppendChild(xmlElement16);
+ xmlElement9.AppendChild(xmlElement12);
+ XmlElement xmlElement17 = ownerDocument.CreateElement("Scope");
+ XmlElement xmlElement18 = ownerDocument.CreateElement("ExtentGroup");
+ if (localAttribute.spatialScope.Extents != null)
+ {
+ foreach (SpatialExtent extent in localAttribute.spatialScope.Extents)
+ {
+ XmlElement xmlElement19 = ownerDocument.CreateElement("Extent");
+ double xMin = extent.XMin;
+ xmlElement19.SetAttribute("xMin", xMin.ToString());
+ xMin = extent.XMax;
+ xmlElement19.SetAttribute("xMax", xMin.ToString());
+ xMin = extent.YMin;
+ xmlElement19.SetAttribute("yMin", xMin.ToString());
+ xMin = extent.YMax;
+ xmlElement19.SetAttribute("yMax", xMin.ToString());
+ xmlElement19.SetAttribute("spatialReference", extent.SpatialReference.ToString());
+ xmlElement18.AppendChild(xmlElement19);
+ }
+ }
+ xmlElement17.AppendChild(xmlElement18);
+ XmlElement xmlElement20 = ownerDocument.CreateElement("AreaGroup");
+ if (localAttribute.spatialScope.AreaNames != null)
+ {
+ foreach (string areaName in localAttribute.spatialScope.AreaNames)
+ {
+ XmlElement xmlElement21 = ownerDocument.CreateElement("Area");
+ xmlElement21.SetAttribute("name", areaName);
+ xmlElement20.AppendChild(xmlElement21);
+ }
+ }
+ xmlElement17.AppendChild(xmlElement20);
+ xmlElement9.AppendChild(xmlElement17);
+ xmlElement5.AppendChild(xmlElement6);
+ xmlElement5.AppendChild(xmlElement7);
+ xmlElement5.AppendChild(xmlElement8);
+ xmlElement5.AppendChild(xmlElement9);
+ xmlElement3.AppendChild(xmlElement5);
+ }
+ xmlElement.AppendChild(xmlElement2);
+ xmlElement.AppendChild(xmlElement3);
+ XmlElement xmlElement22 = ownerDocument.CreateElement("Authors");
+ foreach (ModelUser mAuthor in mAuthors)
+ {
+ XmlElement xmlElement23 = ownerDocument.CreateElement("Author");
+ xmlElement23.SetAttribute("name", mAuthor.Name);
+ xmlElement23.SetAttribute("account", mAuthor.Account);
+ XmlElement xmlElement24 = ownerDocument.CreateElement("Institution");
+ xmlElement24.SetAttribute("name", mAuthor.Institution.Name);
+ xmlElement24.SetAttribute("country", mAuthor.Institution.Country);
+ xmlElement24.SetAttribute("city", mAuthor.Institution.City);
+ xmlElement24.SetAttribute("address", mAuthor.Institution.Address);
+ xmlElement23.AppendChild(xmlElement24);
+ XmlElement xmlElement25 = ownerDocument.CreateElement("Contacts");
+ foreach (ModelUserContact contact in mAuthor.Contacts)
+ {
+ XmlElement xmlElement26 = ownerDocument.CreateElement("Add");
+ xmlElement26.SetAttribute("type", LocalizationHelper.ContactType2String(contact.Type));
+ xmlElement26.SetAttribute("value", contact.Value);
+ xmlElement25.AppendChild(xmlElement26);
+ }
+ xmlElement23.AppendChild(xmlElement25);
+ xmlElement22.AppendChild(xmlElement23);
+ }
+ xmlElement.AppendChild(xmlElement22);
+ XmlElement xmlElement27 = ownerDocument.CreateElement("Builders");
+ foreach (ModelUser mBuilder in mBuilders)
+ {
+ XmlElement xmlElement28 = ownerDocument.CreateElement("Builder");
+ xmlElement28.SetAttribute("name", mBuilder.Name);
+ xmlElement28.SetAttribute("account", mBuilder.Account);
+ XmlElement xmlElement29 = ownerDocument.CreateElement("Institution");
+ xmlElement29.SetAttribute("name", mBuilder.Institution.Name);
+ xmlElement29.SetAttribute("country", mBuilder.Institution.Country);
+ xmlElement29.SetAttribute("city", mBuilder.Institution.City);
+ xmlElement29.SetAttribute("address", mBuilder.Institution.Address);
+ xmlElement28.AppendChild(xmlElement29);
+ XmlElement xmlElement30 = ownerDocument.CreateElement("Contacts");
+ foreach (ModelUserContact contact2 in mBuilder.Contacts)
+ {
+ XmlElement xmlElement31 = ownerDocument.CreateElement("Add");
+ xmlElement31.SetAttribute("type", LocalizationHelper.ContactType2String(contact2.Type));
+ xmlElement31.SetAttribute("value", contact2.Value);
+ xmlElement30.AppendChild(xmlElement31);
+ }
+ xmlElement28.AppendChild(xmlElement30);
+ xmlElement27.AppendChild(xmlElement28);
+ }
+ xmlElement.AppendChild(xmlElement27);
+ XmlElement newChild = ownerDocument.CreateElement("Wrappers");
+ foreach (ModelUser mWrapper in mWrappers)
+ {
+ XmlElement xmlElement32 = ownerDocument.CreateElement("Wrapper");
+ xmlElement32.SetAttribute("name", mWrapper.Name);
+ xmlElement32.SetAttribute("account", mWrapper.Account);
+ XmlElement xmlElement33 = ownerDocument.CreateElement("Institution");
+ xmlElement33.SetAttribute("name", mWrapper.Institution.Name);
+ xmlElement33.SetAttribute("country", mWrapper.Institution.Country);
+ xmlElement33.SetAttribute("city", mWrapper.Institution.City);
+ xmlElement33.SetAttribute("address", mWrapper.Institution.Address);
+ xmlElement32.AppendChild(xmlElement33);
+ XmlElement xmlElement34 = ownerDocument.CreateElement("Contacts");
+ foreach (ModelUserContact contact3 in mWrapper.Contacts)
+ {
+ XmlElement xmlElement35 = ownerDocument.CreateElement("Add");
+ xmlElement35.SetAttribute("type", LocalizationHelper.ContactType2String(contact3.Type));
+ xmlElement35.SetAttribute("value", contact3.Value);
+ xmlElement34.AppendChild(xmlElement35);
+ }
+ xmlElement32.AppendChild(xmlElement34);
+ xmlElement27.AppendChild(xmlElement32);
+ }
+ xmlElement.AppendChild(newChild);
+ pModelClassElement.AppendChild(xmlElement);
+ return true;
+ }
+
+ public int getLocalAttributeCount()
+ {
+ return mLocalAttributeList.Count;
+ }
+
+ public bool getLocalAttribute(int idx, ref LocalAttribute pLocalAttribute)
+ {
+ if (idx < 0 || idx >= mLocalAttributeList.Count)
+ {
+ return false;
+ }
+ pLocalAttribute = mLocalAttributeList[idx];
+ return true;
+ }
+
+ public bool getLocalAttribute(ELocalizationType pLocalType, ref LocalAttribute pLocalAttribute)
+ {
+ for (int i = 0; i < mLocalAttributeList.Count; i++)
+ {
+ if (mLocalAttributeList[i].localType == pLocalType)
+ {
+ pLocalAttribute = mLocalAttributeList[i];
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public bool addLocalAttributeInfo(ref LocalAttribute pLocalAttribute)
+ {
+ for (int i = 0; i < mLocalAttributeList.Count; i++)
+ {
+ if (mLocalAttributeList[i].localType == pLocalAttribute.localType)
+ {
+ return false;
+ }
+ }
+ mLocalAttributeList.Add(pLocalAttribute);
+ return true;
+ }
+
+ public bool removeLocalAttribute(int idx)
+ {
+ if (idx < 0 || idx >= mLocalAttributeList.Count)
+ {
+ return false;
+ }
+ mLocalAttributeList.RemoveAt(idx);
+ return true;
+ }
+
+ public bool removeLocalAttribute(ref LocalAttribute pLocalAttribute)
+ {
+ if (mLocalAttributeList.Contains(pLocalAttribute))
+ {
+ mLocalAttributeList.Remove(pLocalAttribute);
+ return true;
+ }
+ return false;
+ }
+
+ public bool updateLocalAttribute(int idx, ref LocalAttribute pLocalAttribute)
+ {
+ if (idx < 0 || idx >= mLocalAttributeList.Count)
+ {
+ return false;
+ }
+ mLocalAttributeList[idx] = pLocalAttribute;
+ return true;
+ }
+
+ public bool updateLocalAttribute(ELocalizationType pLocalType, ref LocalAttribute pLocalAttribute)
+ {
+ for (int i = 0; i < mLocalAttributeList.Count; i++)
+ {
+ if (mLocalAttributeList[i].localType == pLocalType)
+ {
+ mLocalAttributeList[i] = pLocalAttribute;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public int getCategoryCount()
+ {
+ return mModelCategoryList.Count;
+ }
+
+ public bool getCategory(int idx, ref ModelCategory pModelCategory)
+ {
+ if (idx < 0 || idx >= mModelCategoryList.Count)
+ {
+ return false;
+ }
+ pModelCategory = mModelCategoryList[idx];
+ return true;
+ }
+
+ public bool addCategoryInfo(ref ModelCategory pCategoryInfo)
+ {
+ for (int i = 0; i < mModelCategoryList.Count; i++)
+ {
+ ModelCategory modelCategory = mModelCategoryList[i];
+ if (modelCategory.principle == pCategoryInfo.principle && modelCategory.path == pCategoryInfo.path)
+ {
+ return false;
+ }
+ }
+ mModelCategoryList.Add(pCategoryInfo);
+ return true;
+ }
+
+ public bool removeCategory(int idx)
+ {
+ if (idx < 0 || idx >= mModelCategoryList.Count)
+ {
+ return false;
+ }
+ mModelCategoryList.RemoveAt(idx);
+ return true;
+ }
+
+ public bool removeCategory(ref ModelCategory pCategoryInfo)
+ {
+ if (mModelCategoryList.Contains(pCategoryInfo))
+ {
+ mModelCategoryList.Remove(pCategoryInfo);
+ return true;
+ }
+ return false;
+ }
+
+ public bool updateCategory(int idx, ref ModelCategory pCategoryInfo)
+ {
+ if (idx < 0 || idx >= mModelCategoryList.Count)
+ {
+ return false;
+ }
+ mModelCategoryList[idx] = pCategoryInfo;
+ return true;
+ }
+
+ public bool compareOther(IModelAttribute pAttribute, ref string obj, ref string name)
+ {
+ if (pAttribute.getCategoryCount() != mModelCategoryList.Count)
+ {
+ obj = "Categories";
+ name = "CategoryCount";
+ return false;
+ }
+ for (int i = 0; i < mModelCategoryList.Count; i++)
+ {
+ ModelCategory modelCategory = mModelCategoryList[i];
+ ModelCategory pModelCategory = default(ModelCategory);
+ pAttribute.getCategory(i, ref pModelCategory);
+ if (!modelCategory.compareOther(pModelCategory))
+ {
+ obj = "Category";
+ name = modelCategory.principle + "<->" + pModelCategory.principle;
+ return false;
+ }
+ }
+ if (pAttribute.getLocalAttributeCount() != mLocalAttributeList.Count)
+ {
+ obj = "LocalAttributes";
+ name = "LocalAttributeCount";
+ return false;
+ }
+ for (int j = 0; j < mLocalAttributeList.Count; j++)
+ {
+ LocalAttribute localAttribute = mLocalAttributeList[j];
+ LocalAttribute pLocalAttribute = default(LocalAttribute);
+ pAttribute.getLocalAttribute(j, ref pLocalAttribute);
+ if (!localAttribute.compareOther(pLocalAttribute))
+ {
+ obj = "Category";
+ name = localAttribute.localType + "<->" + pLocalAttribute.localType;
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public int getAuthorsCount()
+ {
+ return mAuthors.Count;
+ }
+
+ public bool getAuthor(int index, ref ModelUser author)
+ {
+ if (mAuthors.Count - 1 < index)
+ {
+ return false;
+ }
+ author = mAuthors[index];
+ return true;
+ }
+
+ public bool addAuthor(ref ModelUser author)
+ {
+ if (!mAuthors.Contains(author))
+ {
+ mAuthors.Add(author);
+ return true;
+ }
+ return false;
+ }
+
+ public bool removeAuthor(int index)
+ {
+ if (mAuthors.Count - 1 < index)
+ {
+ return false;
+ }
+ mAuthors.RemoveAt(index);
+ return true;
+ }
+
+ public int getBuildersCount()
+ {
+ return mBuilders.Count;
+ }
+
+ public bool getBuilder(int index, ref ModelUser builder)
+ {
+ if (mBuilders.Count - 1 < index)
+ {
+ return false;
+ }
+ builder = mBuilders[index];
+ return true;
+ }
+
+ public bool addBuilder(ref ModelUser builder)
+ {
+ if (!mBuilders.Contains(builder))
+ {
+ mBuilders.Add(builder);
+ return true;
+ }
+ return false;
+ }
+
+ public bool removeBuilder(int index)
+ {
+ if (mBuilders.Count - 1 < index)
+ {
+ return false;
+ }
+ mBuilders.RemoveAt(index);
+ return true;
+ }
+
+ public int getWrappersCount()
+ {
+ return mWrappers.Count;
+ }
+
+ public bool getWrapper(int index, ref ModelUser wrapper)
+ {
+ if (mWrappers.Count - 1 < index)
+ {
+ return false;
+ }
+ wrapper = mWrappers[index];
+ return true;
+ }
+
+ public bool addWrapper(ref ModelUser wrapper)
+ {
+ if (!mWrappers.Contains(wrapper))
+ {
+ mWrappers.Add(wrapper);
+ return true;
+ }
+ return false;
+ }
+
+ public bool removeWrapper(int index)
+ {
+ if (mWrappers.Count - 1 < index)
+ {
+ return false;
+ }
+ mWrappers.RemoveAt(index);
+ return true;
+ }
+ }
+}
diff --git a/NGIS.Model/ModelBehavior.cs b/NGIS.Model/ModelBehavior.cs
new file mode 100644
index 0000000000000000000000000000000000000000..074375fc27150a41dd8c80cd21e1c99989f75fc6
--- /dev/null
+++ b/NGIS.Model/ModelBehavior.cs
@@ -0,0 +1,680 @@
+using NGIS.Data.Schema;
+using System;
+using System.Collections.Generic;
+using System.Xml;
+
+namespace NGIS.Model
+{
+ public class ModelBehavior : IModelBehavior
+ {
+ private List mModelDatasetItemList = new List();
+
+ private List mModelStateList = new List();
+
+ private List mModelStateTransitionList = new List();
+
+ private List mProcessParameters = new List();
+
+ private List mControlParameters = new List();
+
+ public bool loadFromXml(XmlElement pModelClassElement)
+ {
+ XmlElement xmlElement = (XmlElement)pModelClassElement.ChildNodes[1];
+ XmlNodeList elementsByTagName = xmlElement.GetElementsByTagName("RelatedDatasets");
+ if (elementsByTagName.Count > 0)
+ {
+ XmlElement xmlElement2 = (XmlElement)elementsByTagName[0];
+ for (int i = 0; i < xmlElement2.ChildNodes.Count; i++)
+ {
+ XmlElement xmlElement3 = (XmlElement)xmlElement2.ChildNodes[i];
+ ModelDatasetItem pDataset = default(ModelDatasetItem);
+ pDataset.datasetName = xmlElement3.GetAttribute("name");
+ pDataset.datasetItemDescription = xmlElement3.GetAttribute("description");
+ string attribute = xmlElement3.GetAttribute("type");
+ if (attribute == "internal")
+ {
+ pDataset.datasetItemType = EModelDatasetItemType.EMDIT_INTERNAL;
+ pDataset.externalId = "";
+ UdxDatasetSchema udxDatasetSchema = new UdxDatasetSchema(null, "UdxDeclaration");
+ udxDatasetSchema.LoadFromXmlElement(xmlElement3.FirstChild as XmlElement);
+ pDataset.datasetItem = udxDatasetSchema;
+ }
+ else if (attribute == "external")
+ {
+ pDataset.datasetItemType = EModelDatasetItemType.EMDIT_EXTERNAL;
+ pDataset.externalId = xmlElement3.GetAttribute("externalId");
+ pDataset.datasetItem = null;
+ }
+ else if (attribute == "raw")
+ {
+ pDataset.datasetItemType = EModelDatasetItemType.EMDIT_RAW;
+ pDataset.externalId = "";
+ pDataset.datasetItem = null;
+ }
+ addModelDatasetItem(ref pDataset);
+ }
+ }
+ XmlNodeList elementsByTagName2 = xmlElement.GetElementsByTagName("RelatedDatasets");
+ if (elementsByTagName.Count > 0)
+ {
+ XmlElement xmlElement4 = (XmlElement)elementsByTagName2[0];
+ XmlElement xmlElement5 = (XmlElement)xmlElement4.FirstChild;
+ for (int j = 0; j < xmlElement5.ChildNodes.Count; j++)
+ {
+ XmlElement xmlElement6 = (XmlElement)xmlElement5.ChildNodes[j];
+ ModelState pState = default(ModelState);
+ pState.stateId = xmlElement6.GetAttribute("id");
+ pState.stateName = xmlElement6.GetAttribute("name");
+ pState.stateDecription = xmlElement6.GetAttribute("description");
+ string attribute2 = xmlElement6.GetAttribute("type");
+ if (attribute2 == "basic")
+ {
+ pState.stateType = EModelStateType.EMST_BASIC;
+ }
+ else if (attribute2 == "group")
+ {
+ pState.stateType = EModelStateType.EMST_GROUP;
+ }
+ for (int k = 0; k < xmlElement6.ChildNodes.Count; k++)
+ {
+ XmlElement xmlElement7 = (XmlElement)xmlElement6.ChildNodes[k];
+ ModelEvent item = default(ModelEvent);
+ item.eventName = xmlElement7.GetAttribute("name");
+ item.eventDescription = xmlElement7.GetAttribute("description");
+ string attribute3 = xmlElement7.GetAttribute("type");
+ if (attribute3 == "response")
+ {
+ item.eventType = EModelEventType.EMET_RESPONSE;
+ }
+ else if (attribute3 == "noresponse")
+ {
+ item.eventType = EModelEventType.EMET_NORESPONSE;
+ }
+ else if (attribute3 == "control")
+ {
+ item.eventType = EModelEventType.EMET_CONTROL;
+ }
+ XmlElement xmlElement8 = (XmlElement)xmlElement7.FirstChild;
+ if (xmlElement8.HasAttribute("description"))
+ {
+ item.parameterDescription = xmlElement8.GetAttribute("description");
+ }
+ else
+ {
+ item.parameterDescription = "";
+ }
+ item.datasetReference = xmlElement8.GetAttribute("datasetReference");
+ string attribute4 = xmlElement7.GetAttribute("optional");
+ if (attribute4 == "")
+ {
+ item.optional = false;
+ }
+ else
+ {
+ item.optional = Convert.ToBoolean(attribute4);
+ }
+ pState.modelEvents = new List();
+ pState.modelEvents.Add(item);
+ }
+ addModelState(ref pState);
+ }
+ XmlElement xmlElement9 = (XmlElement)xmlElement4.ChildNodes[1];
+ for (int l = 0; l < xmlElement9.ChildNodes.Count; l++)
+ {
+ XmlElement xmlElement10 = (XmlElement)xmlElement9.ChildNodes[l];
+ string attribute5 = xmlElement10.GetAttribute("from");
+ string attribute6 = xmlElement10.GetAttribute("to");
+ addModelStateTransition(attribute5, attribute6);
+ }
+ }
+ XmlNodeList elementsByTagName3 = xmlElement.GetElementsByTagName("RelatedDatasets");
+ if (elementsByTagName.Count > 0)
+ {
+ XmlElement xmlElement11 = (XmlElement)elementsByTagName3[0];
+ XmlElement xmlElement12 = (XmlElement)xmlElement11.ChildNodes[0];
+ foreach (XmlElement childNode in xmlElement12.ChildNodes)
+ {
+ ModelParameter item2 = default(ModelParameter);
+ item2.Key = childNode.GetAttribute("key");
+ item2.Description = childNode.GetAttribute("description");
+ item2.DefaultValue = childNode.GetAttribute("defaultValue");
+ mProcessParameters.Add(item2);
+ }
+ XmlElement xmlElement14 = (XmlElement)xmlElement11.ChildNodes[1];
+ foreach (XmlElement childNode2 in xmlElement14.ChildNodes)
+ {
+ ModelParameter item3 = default(ModelParameter);
+ item3.Key = childNode2.GetAttribute("key");
+ item3.Description = childNode2.GetAttribute("description");
+ item3.DefaultValue = childNode2.GetAttribute("defaultValue");
+ mProcessParameters.Add(item3);
+ }
+ }
+ return true;
+ }
+
+ public bool formatToXml(XmlElement pModelClassElement)
+ {
+ XmlDocument ownerDocument = pModelClassElement.OwnerDocument;
+ XmlElement xmlElement = ownerDocument.CreateElement("Behavior");
+ XmlElement xmlElement2 = ownerDocument.CreateElement("RelatedDatasets");
+ XmlElement xmlElement3 = ownerDocument.CreateElement("StateGroup");
+ XmlElement xmlElement4 = ownerDocument.CreateElement("Parameters");
+ for (int i = 0; i < mModelDatasetItemList.Count; i++)
+ {
+ ModelDatasetItem modelDatasetItem = mModelDatasetItemList[i];
+ XmlElement xmlElement5 = ownerDocument.CreateElement("DatasetItem");
+ xmlElement5.SetAttribute("name", modelDatasetItem.datasetName);
+ if (modelDatasetItem.datasetItemType == EModelDatasetItemType.EMDIT_EXTERNAL)
+ {
+ xmlElement5.SetAttribute("type", "external");
+ xmlElement5.SetAttribute("externalId", modelDatasetItem.externalId);
+ xmlElement5.SetAttribute("description", modelDatasetItem.datasetItemDescription);
+ }
+ else if (modelDatasetItem.datasetItemType == EModelDatasetItemType.EMDIT_INTERNAL)
+ {
+ xmlElement5.SetAttribute("type", "internal");
+ xmlElement5.SetAttribute("description", modelDatasetItem.datasetItemDescription);
+ if (modelDatasetItem.datasetItem != null)
+ {
+ modelDatasetItem.datasetItem.FormatToXmlElement(ref xmlElement5);
+ }
+ }
+ else if (modelDatasetItem.datasetItemType == EModelDatasetItemType.EMDIT_RAW)
+ {
+ xmlElement5.SetAttribute("type", "raw");
+ xmlElement5.SetAttribute("description", modelDatasetItem.datasetItemDescription);
+ }
+ xmlElement2.AppendChild(xmlElement5);
+ }
+ XmlElement xmlElement6 = ownerDocument.CreateElement("States");
+ xmlElement3.AppendChild(xmlElement6);
+ for (int j = 0; j < mModelStateList.Count; j++)
+ {
+ ModelState modelState = mModelStateList[j];
+ XmlElement xmlElement7 = ownerDocument.CreateElement("State");
+ xmlElement7.SetAttribute("id", modelState.stateId);
+ xmlElement7.SetAttribute("name", modelState.stateName);
+ if (modelState.stateType == EModelStateType.EMST_BASIC)
+ {
+ xmlElement7.SetAttribute("type", "basic");
+ }
+ else if (modelState.stateType == EModelStateType.EMST_GROUP)
+ {
+ xmlElement7.SetAttribute("type", "group");
+ }
+ else
+ {
+ xmlElement7.SetAttribute("type", "unknown");
+ }
+ xmlElement7.SetAttribute("description", modelState.stateDecription);
+ for (int k = 0; k < modelState.modelEvents.Count; k++)
+ {
+ ModelEvent modelEvent = modelState.modelEvents[k];
+ EModelEventType eventType = modelEvent.eventType;
+ XmlElement xmlElement8 = ownerDocument.CreateElement("Event");
+ xmlElement8.SetAttribute("name", modelEvent.eventName);
+ switch (eventType)
+ {
+ case EModelEventType.EMET_RESPONSE:
+ {
+ xmlElement8.SetAttribute("type", "response");
+ XmlElement xmlElement11 = ownerDocument.CreateElement("ResponseParameter");
+ xmlElement11.SetAttribute("datasetReference", modelEvent.datasetReference);
+ xmlElement11.SetAttribute("description", modelEvent.parameterDescription);
+ xmlElement8.AppendChild(xmlElement11);
+ break;
+ }
+ case EModelEventType.EMET_NORESPONSE:
+ {
+ xmlElement8.SetAttribute("type", "noresponse");
+ XmlElement xmlElement10 = ownerDocument.CreateElement("DispatchParameter");
+ xmlElement10.SetAttribute("datasetReference", modelEvent.datasetReference);
+ xmlElement10.SetAttribute("description", modelEvent.parameterDescription);
+ xmlElement8.AppendChild(xmlElement10);
+ break;
+ }
+ case EModelEventType.EMET_CONTROL:
+ {
+ xmlElement8.SetAttribute("type", "control");
+ XmlElement xmlElement9 = ownerDocument.CreateElement("ControlParameter");
+ xmlElement9.SetAttribute("datasetReference", modelEvent.datasetReference);
+ xmlElement9.SetAttribute("description", modelEvent.parameterDescription);
+ xmlElement8.AppendChild(xmlElement9);
+ break;
+ }
+ }
+ xmlElement8.SetAttribute("optional", modelEvent.optional.ToString());
+ xmlElement8.SetAttribute("description", modelEvent.eventDescription);
+ xmlElement7.AppendChild(xmlElement8);
+ }
+ xmlElement6.AppendChild(xmlElement7);
+ }
+ XmlElement xmlElement12 = ownerDocument.CreateElement("StateTransitions");
+ xmlElement3.AppendChild(xmlElement12);
+ foreach (ModelStateTransition mModelStateTransition in mModelStateTransitionList)
+ {
+ string stateId = mModelStateTransition.fromState.stateId;
+ string stateId2 = mModelStateTransition.toState.stateId;
+ XmlElement xmlElement13 = ownerDocument.CreateElement("Add");
+ xmlElement13.SetAttribute("from", stateId);
+ xmlElement13.SetAttribute("to", stateId2);
+ xmlElement12.AppendChild(xmlElement13);
+ }
+ XmlElement xmlElement14 = ownerDocument.CreateElement("ProcessParameters");
+ foreach (ModelParameter mProcessParameter in mProcessParameters)
+ {
+ XmlElement xmlElement15 = ownerDocument.CreateElement("Add");
+ xmlElement15.SetAttribute("key", mProcessParameter.Key);
+ xmlElement15.SetAttribute("description", mProcessParameter.Description);
+ xmlElement15.SetAttribute("defaultValue", mProcessParameter.DefaultValue);
+ xmlElement14.AppendChild(xmlElement15);
+ }
+ xmlElement4.AppendChild(xmlElement14);
+ XmlElement xmlElement16 = ownerDocument.CreateElement("ControlParameters");
+ foreach (ModelParameter mControlParameter in mControlParameters)
+ {
+ XmlElement xmlElement17 = ownerDocument.CreateElement("Add");
+ xmlElement17.SetAttribute("key", mControlParameter.Key);
+ xmlElement17.SetAttribute("description", mControlParameter.Description);
+ xmlElement17.SetAttribute("defaultValue", mControlParameter.DefaultValue);
+ xmlElement16.AppendChild(xmlElement17);
+ }
+ xmlElement4.AppendChild(xmlElement16);
+ xmlElement.AppendChild(xmlElement2);
+ xmlElement.AppendChild(xmlElement3);
+ xmlElement.AppendChild(xmlElement4);
+ pModelClassElement.AppendChild(xmlElement);
+ return true;
+ }
+
+ public bool addModelDatasetItem(ref ModelDatasetItem pDataset)
+ {
+ for (int i = 0; i < mModelDatasetItemList.Count; i++)
+ {
+ if (mModelDatasetItemList[i].datasetName == pDataset.datasetName)
+ {
+ return false;
+ }
+ }
+ mModelDatasetItemList.Add(pDataset);
+ return true;
+ }
+
+ public bool removeModelDatasetItem(ref ModelDatasetItem pDataset)
+ {
+ if (mModelDatasetItemList.Contains(pDataset))
+ {
+ mModelDatasetItemList.Remove(pDataset);
+ return true;
+ }
+ return false;
+ }
+
+ public int getModelDatasetItemCount()
+ {
+ return mModelDatasetItemList.Count;
+ }
+
+ public bool getModelDatasetItem(int idx, ref ModelDatasetItem pDataset)
+ {
+ if (idx < 0 || idx >= mModelDatasetItemList.Count)
+ {
+ return false;
+ }
+ pDataset = mModelDatasetItemList[idx];
+ return true;
+ }
+
+ public bool getModelDatasetItem(string pName, ref ModelDatasetItem pDataset)
+ {
+ for (int i = 0; i < mModelDatasetItemList.Count; i++)
+ {
+ if (mModelDatasetItemList[i].datasetName == pName)
+ {
+ pDataset = mModelDatasetItemList[i];
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public bool updateModelDatasetItem(int idx, ref ModelDatasetItem pDataset)
+ {
+ if (idx < 0 || idx >= mModelDatasetItemList.Count)
+ {
+ return false;
+ }
+ mModelDatasetItemList[idx] = pDataset;
+ return true;
+ }
+
+ public bool addModelState(ref ModelState pState)
+ {
+ for (int i = 0; i < mModelStateList.Count; i++)
+ {
+ if (mModelStateList[i].stateId == pState.stateId)
+ {
+ return false;
+ }
+ }
+ mModelStateList.Add(pState);
+ return true;
+ }
+
+ public bool removeModelState(ref ModelState pState)
+ {
+ if (mModelStateList.Contains(pState))
+ {
+ mModelStateList.Remove(pState);
+ }
+ return false;
+ }
+
+ public int getModelStateCount()
+ {
+ return mModelStateList.Count;
+ }
+
+ public bool getModelState(int idx, ref ModelState pState)
+ {
+ if (idx < 0 || idx >= mModelStateList.Count)
+ {
+ return false;
+ }
+ pState = mModelStateList[idx];
+ return true;
+ }
+
+ public bool getModelState(string pStateId, ref ModelState pState)
+ {
+ for (int i = 0; i < mModelStateList.Count; i++)
+ {
+ if (mModelStateList[i].stateId == pStateId)
+ {
+ pState = mModelStateList[i];
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public bool updateModelState(int idx, ref ModelState pState)
+ {
+ if (idx < 0 || idx >= mModelStateList.Count)
+ {
+ return false;
+ }
+ mModelStateList[idx] = pState;
+ return true;
+ }
+
+ public bool updateModelState(string pStateId, ref ModelState pState)
+ {
+ for (int i = 0; i < mModelStateList.Count; i++)
+ {
+ if (mModelStateList[i].stateId == pStateId)
+ {
+ mModelStateList[i] = pState;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public bool addModelStateTransition(string pFromStateId, string pToStateId)
+ {
+ ModelState pState = default(ModelState);
+ ModelState pState2 = default(ModelState);
+ bool modelState = getModelState(pFromStateId, ref pState);
+ bool modelState2 = getModelState(pToStateId, ref pState2);
+ if (modelState && modelState2)
+ {
+ for (int i = 0; i < mModelStateTransitionList.Count; i++)
+ {
+ if (mModelStateTransitionList[i].fromState.stateId == pFromStateId && mModelStateTransitionList[i].toState.stateId == pToStateId)
+ {
+ return false;
+ }
+ }
+ ModelStateTransition item = default(ModelStateTransition);
+ item.fromState = pState;
+ item.toState = pState2;
+ mModelStateTransitionList.Add(item);
+ return true;
+ }
+ return false;
+ }
+
+ public bool addModelStateTransition(ref ModelState pFromState, ref ModelState pToState)
+ {
+ return addModelStateTransition(pFromState.stateId, pToState.stateId);
+ }
+
+ public bool removeModelStateTransition(string pFromStateId, string pToStateId)
+ {
+ for (int i = 0; i < mModelStateTransitionList.Count; i++)
+ {
+ ModelStateTransition item = mModelStateTransitionList[i];
+ if (item.fromState.stateId == pFromStateId && item.toState.stateId == pToStateId)
+ {
+ mModelStateTransitionList.Remove(item);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public bool removeModelStateTransition(ref ModelState pFromState, ref ModelState pToState)
+ {
+ return removeModelStateTransition(pFromState.stateId, pToState.stateId);
+ }
+
+ public int getModelStateTransitionCount()
+ {
+ return mModelStateTransitionList.Count;
+ }
+
+ public bool getModelStateTransition(int idx, ref ModelState pFromState, ref ModelState pToState)
+ {
+ if (idx < 0 || idx >= mModelStateTransitionList.Count)
+ {
+ return false;
+ }
+ ModelStateTransition modelStateTransition = mModelStateTransitionList[idx];
+ pFromState = modelStateTransition.fromState;
+ pToState = modelStateTransition.toState;
+ return true;
+ }
+
+ public bool getModelStateTransition(int idx, ref ModelStateTransition pStateTransition)
+ {
+ if (idx < 0 || idx >= mModelStateTransitionList.Count)
+ {
+ return false;
+ }
+ pStateTransition = mModelStateTransitionList[idx];
+ return true;
+ }
+
+ public bool existModelStatetTransition(string pFromStateId, string pToStateId)
+ {
+ for (int i = 0; i < mModelStateTransitionList.Count; i++)
+ {
+ ModelStateTransition modelStateTransition = mModelStateTransitionList[i];
+ if (modelStateTransition.fromState.stateId == pFromStateId && modelStateTransition.toState.stateId == pToStateId)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public bool existModelStatetTransition(ref ModelState pFromState, ref ModelState pToState)
+ {
+ return existModelStatetTransition(pFromState.stateId, pToState.stateId);
+ }
+
+ public bool updateModelStateTransition(int idx, string pFromStateId, string pToStateId)
+ {
+ if (idx < 0 || idx >= mModelStateTransitionList.Count)
+ {
+ return false;
+ }
+ ModelStateTransition pStateTransition = default(ModelStateTransition);
+ getModelStateTransition(idx, ref pStateTransition);
+ removeModelStateTransition(ref pStateTransition.fromState, ref pStateTransition.toState);
+ addModelStateTransition(pFromStateId, pToStateId);
+ return true;
+ }
+
+ public bool compareOther(IModelBehavior pBehavior, ref string obj, ref string name)
+ {
+ if (mModelDatasetItemList.Count != pBehavior.getModelDatasetItemCount())
+ {
+ obj = "RelatedDatasets";
+ name = "DatasetItemCount";
+ return false;
+ }
+ for (int i = 0; i < mModelDatasetItemList.Count; i++)
+ {
+ ModelDatasetItem modelDatasetItem = mModelDatasetItemList[i];
+ ModelDatasetItem pDataset = default(ModelDatasetItem);
+ pBehavior.getModelDatasetItem(i, ref pDataset);
+ if (!modelDatasetItem.compareOther(pDataset))
+ {
+ obj = "DatasetItem";
+ name = modelDatasetItem.datasetName + "<->" + pDataset.datasetName;
+ return false;
+ }
+ }
+ if (mModelStateList.Count != pBehavior.getModelStateCount())
+ {
+ obj = "States";
+ name = "StateCount";
+ return false;
+ }
+ for (int j = 0; j < mModelStateList.Count; j++)
+ {
+ ModelState modelState = mModelStateList[j];
+ ModelState pState = default(ModelState);
+ pBehavior.getModelState(j, ref pState);
+ if (!modelState.compareOther(pState))
+ {
+ obj = "State";
+ name = modelState.stateName + "<->" + pState.stateName;
+ return false;
+ }
+ }
+ if (mModelStateTransitionList.Count != pBehavior.getModelStateTransitionCount())
+ {
+ obj = "StateTransitions";
+ name = "StateTransitionCount";
+ return false;
+ }
+ for (int k = 0; k < mModelStateTransitionList.Count; k++)
+ {
+ ModelStateTransition modelStateTransition = mModelStateTransitionList[k];
+ ModelStateTransition pStateTransition = default(ModelStateTransition);
+ pBehavior.getModelStateTransition(k, ref pStateTransition);
+ if (!modelStateTransition.compareOther(pStateTransition))
+ {
+ obj = "StateTransition";
+ name = modelStateTransition.fromState.stateId + "<->" + pStateTransition.fromState.stateId;
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public bool addProcessParameter(ModelParameter processparameter)
+ {
+ if (!mProcessParameters.Contains(processparameter))
+ {
+ mProcessParameters.Add(processparameter);
+ }
+ return true;
+ }
+
+ public bool getProcessParameter(string key, ref ModelParameter parameter)
+ {
+ for (int i = 0; i < mProcessParameters.Count; i++)
+ {
+ if (mProcessParameters[i].Key == key)
+ {
+ parameter = mProcessParameters[i];
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public int getProcessParameterCount()
+ {
+ return mProcessParameters.Count;
+ }
+
+ public bool removeProcessParameter(ModelParameter processparameter)
+ {
+ return mProcessParameters.Remove(processparameter);
+ }
+
+ public bool updateProcessParameter(ModelParameter processparameter)
+ {
+ for (int i = 0; i < mProcessParameters.Count; i++)
+ {
+ if (mProcessParameters[i].Key == processparameter.Key)
+ {
+ mProcessParameters[i] = processparameter;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public bool addControlParameter(ModelParameter controlparameter)
+ {
+ if (!mControlParameters.Contains(controlparameter))
+ {
+ mControlParameters.Add(controlparameter);
+ }
+ return true;
+ }
+
+ public bool getControlParameter(string key, ref ModelParameter parameter)
+ {
+ for (int i = 0; i < mControlParameters.Count; i++)
+ {
+ if (mControlParameters[i].Key == key)
+ {
+ parameter = mControlParameters[i];
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public int getControlParameterCount()
+ {
+ return mControlParameters.Count;
+ }
+
+ public bool removeControlParameter(ModelParameter controlparameter)
+ {
+ return mControlParameters.Remove(controlparameter);
+ }
+
+ public bool updateControlParameter(ModelParameter controlparameter)
+ {
+ for (int i = 0; i < mControlParameters.Count; i++)
+ {
+ if (mControlParameters[i].Key == controlparameter.Key)
+ {
+ mControlParameters[i] = controlparameter;
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+}
diff --git a/NGIS.Model/ModelCategory.cs b/NGIS.Model/ModelCategory.cs
new file mode 100644
index 0000000000000000000000000000000000000000..974f8b7b3a368c8d85b517a69ebc39d23551a8f8
--- /dev/null
+++ b/NGIS.Model/ModelCategory.cs
@@ -0,0 +1,38 @@
+namespace NGIS.Model
+{
+ public struct ModelCategory
+ {
+ public string principle;
+
+ public string path;
+
+ public ModelCategory(string pPrinciple, string pPath)
+ {
+ principle = pPrinciple;
+ path = pPath;
+ }
+
+ public bool compareOther(ModelCategory pCategory)
+ {
+ if (principle != pCategory.principle)
+ {
+ return false;
+ }
+ if (path != pCategory.path)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ public static bool operator ==(ModelCategory mcA, ModelCategory mcB)
+ {
+ return mcA.compareOther(mcB);
+ }
+
+ public static bool operator !=(ModelCategory mcA, ModelCategory mcB)
+ {
+ return !(mcA == mcB);
+ }
+ }
+}
diff --git a/NGIS.Model/ModelClass.cs b/NGIS.Model/ModelClass.cs
new file mode 100644
index 0000000000000000000000000000000000000000..433d19014e9fa5b32328accbbac8e1dce4b94934
--- /dev/null
+++ b/NGIS.Model/ModelClass.cs
@@ -0,0 +1,205 @@
+using System.Xml;
+
+namespace NGIS.Model
+{
+ public class ModelClass : IModelClass
+ {
+ private string mName;
+
+ private string mUID;
+
+ private EExecutionStyle mExecutionStyle;
+
+ private ModelAttribute mModelAttribute;
+
+ private ModelBehavior mModelBehavior;
+
+ private ModelRuntime mModelRuntime;
+
+ public ModelClass()
+ {
+ mName = "Model Name";
+ mUID = "";
+ mExecutionStyle = EExecutionStyle.EES_SIMPLE_CALCULATION;
+ mModelAttribute = new ModelAttribute();
+ mModelBehavior = new ModelBehavior();
+ mModelRuntime = new ModelRuntime();
+ }
+
+ public void setName(string pName)
+ {
+ mName = pName;
+ }
+
+ public string getName()
+ {
+ return mName;
+ }
+
+ public void setUID(string pUID)
+ {
+ mUID = pUID;
+ }
+
+ public string getUID()
+ {
+ return mUID;
+ }
+
+ public void setExecutionStyle(EExecutionStyle pStyle)
+ {
+ mExecutionStyle = pStyle;
+ }
+
+ public EExecutionStyle getExecutionStyle()
+ {
+ return mExecutionStyle;
+ }
+
+ public ModelAttribute getModelAttribute()
+ {
+ return mModelAttribute;
+ }
+
+ public ModelBehavior getModelBehavior()
+ {
+ return mModelBehavior;
+ }
+
+ public ModelRuntime getModelRuntime()
+ {
+ return mModelRuntime;
+ }
+
+ public bool LoadFromXmlFile(string fileName)
+ {
+ XmlDocument xmlDocument = new XmlDocument();
+ xmlDocument.Prefix = "";
+ xmlDocument.Load(fileName);
+ XmlElement documentElement = xmlDocument.DocumentElement;
+ mName = documentElement.GetAttribute("name");
+ mUID = documentElement.GetAttribute("uid");
+ string a = "";
+ if (documentElement.HasAttribute("style"))
+ {
+ a = documentElement.GetAttribute("style");
+ }
+ else if (documentElement.HasAttribute("type"))
+ {
+ a = documentElement.GetAttribute("type");
+ }
+ if (a == "SimpleCalculation")
+ {
+ mExecutionStyle = EExecutionStyle.EES_SIMPLE_CALCULATION;
+ }
+ else if (a == "TimeSeries")
+ {
+ mExecutionStyle = EExecutionStyle.EES_TIME_SERIES;
+ }
+ else
+ {
+ mExecutionStyle = EExecutionStyle.EES_STATE_SIMULATION;
+ }
+ mModelAttribute.loadFromXml(documentElement);
+ mModelBehavior.loadFromXml(documentElement);
+ mModelRuntime.loadFromXml(documentElement);
+ return true;
+ }
+
+ public bool FormatToXmlFile(string fileName)
+ {
+ XmlDocument xmlDocument = new XmlDocument();
+ XmlElement xmlElement = xmlDocument.CreateElement("ModelClass");
+ xmlElement.SetAttribute("name", mName);
+ xmlElement.SetAttribute("uid", mUID);
+ if (mExecutionStyle == EExecutionStyle.EES_SIMPLE_CALCULATION)
+ {
+ xmlElement.SetAttribute("style", "SimpleCalculation");
+ }
+ else if (mExecutionStyle == EExecutionStyle.EES_TIME_SERIES)
+ {
+ xmlElement.SetAttribute("style", "TimeSeries");
+ }
+ else
+ {
+ xmlElement.SetAttribute("style", "StateSimulation");
+ }
+ xmlDocument.AppendChild(xmlElement);
+ mModelAttribute.formatToXml(xmlElement);
+ mModelBehavior.formatToXml(xmlElement);
+ mModelRuntime.formatToXml(xmlElement);
+ xmlDocument.Save(fileName);
+ return true;
+ }
+
+ public bool LoadFromXmlStream(string xmlStr)
+ {
+ XmlDocument xmlDocument = new XmlDocument();
+ xmlDocument.LoadXml(xmlStr);
+ XmlElement documentElement = xmlDocument.DocumentElement;
+ mName = documentElement.GetAttribute("name");
+ mUID = documentElement.GetAttribute("uid");
+ string attribute = documentElement.GetAttribute("style");
+ if (attribute == "SimpleCalculation")
+ {
+ mExecutionStyle = EExecutionStyle.EES_SIMPLE_CALCULATION;
+ }
+ else if (attribute == "TimeSeries")
+ {
+ mExecutionStyle = EExecutionStyle.EES_TIME_SERIES;
+ }
+ else
+ {
+ mExecutionStyle = EExecutionStyle.EES_STATE_SIMULATION;
+ }
+ mModelAttribute.loadFromXml(documentElement);
+ mModelBehavior.loadFromXml(documentElement);
+ mModelRuntime.loadFromXml(documentElement);
+ return true;
+ }
+
+ public bool FormatToXmlStream(ref string xmlStr)
+ {
+ XmlDocument xmlDocument = new XmlDocument();
+ XmlElement xmlElement = xmlDocument.CreateElement("ModelClass");
+ xmlElement.SetAttribute("name", mName);
+ xmlElement.SetAttribute("uid", mUID);
+ if (mExecutionStyle == EExecutionStyle.EES_SIMPLE_CALCULATION)
+ {
+ xmlElement.SetAttribute("style", "SimpleCalculation");
+ }
+ else if (mExecutionStyle == EExecutionStyle.EES_TIME_SERIES)
+ {
+ xmlElement.SetAttribute("style", "TimeSeries");
+ }
+ else
+ {
+ xmlElement.SetAttribute("style", "StateSimulation");
+ }
+ xmlDocument.AppendChild(xmlElement);
+ mModelAttribute.formatToXml(xmlElement);
+ mModelBehavior.formatToXml(xmlElement);
+ mModelRuntime.formatToXml(xmlElement);
+ xmlStr = xmlDocument.InnerXml;
+ return true;
+ }
+
+ public bool compareOther(IModelClass pClass, bool withRuntime, ref string obj, ref string name)
+ {
+ bool flag = false;
+ if (mModelAttribute != null && !mModelAttribute.compareOther(pClass.getModelAttribute(), ref obj, ref name))
+ {
+ return false;
+ }
+ if (mModelBehavior != null && !mModelBehavior.compareOther(pClass.getModelBehavior(), ref obj, ref name))
+ {
+ return false;
+ }
+ if (withRuntime && mModelRuntime != null && !mModelRuntime.compareOther(pClass.getModelRuntime(), ref obj, ref name))
+ {
+ return false;
+ }
+ return true;
+ }
+ }
+}
diff --git a/NGIS.Model/ModelDatasetItem.cs b/NGIS.Model/ModelDatasetItem.cs
new file mode 100644
index 0000000000000000000000000000000000000000..60e80b7fc950bf7e68590599083b4ca41249b3c6
--- /dev/null
+++ b/NGIS.Model/ModelDatasetItem.cs
@@ -0,0 +1,46 @@
+using NGIS.Data.Schema;
+
+namespace NGIS.Model
+{
+ public struct ModelDatasetItem
+ {
+ public UdxDatasetSchema datasetItem;
+
+ public string datasetName;
+
+ public EModelDatasetItemType datasetItemType;
+
+ public string datasetItemDescription;
+
+ public string externalId;
+
+ public bool compareOther(ModelDatasetItem pDatasetItem)
+ {
+ if ((datasetItem == null && pDatasetItem.datasetItem != null) || (datasetItem != null && pDatasetItem.datasetItem == null))
+ {
+ return false;
+ }
+ if (datasetItem != null && pDatasetItem.datasetItem != null && !datasetItem.compareOther(pDatasetItem.datasetItem))
+ {
+ return false;
+ }
+ if (datasetName != pDatasetItem.datasetName)
+ {
+ return false;
+ }
+ if (datasetItemType != pDatasetItem.datasetItemType)
+ {
+ return false;
+ }
+ if (datasetItemDescription != pDatasetItem.datasetItemDescription)
+ {
+ return false;
+ }
+ if (externalId != pDatasetItem.externalId)
+ {
+ return false;
+ }
+ return true;
+ }
+ }
+}
diff --git a/NGIS.Model/ModelEvent.cs b/NGIS.Model/ModelEvent.cs
new file mode 100644
index 0000000000000000000000000000000000000000..eb147a436b1298e99cd45adfc6de16bb58d57528
--- /dev/null
+++ b/NGIS.Model/ModelEvent.cs
@@ -0,0 +1,46 @@
+namespace NGIS.Model
+{
+ public struct ModelEvent
+ {
+ public string eventName;
+
+ public EModelEventType eventType;
+
+ public string eventDescription;
+
+ public string datasetReference;
+
+ public string parameterDescription;
+
+ public bool optional;
+
+ public bool compareOther(ModelEvent pEvent)
+ {
+ if (eventName != pEvent.eventName)
+ {
+ return false;
+ }
+ if (eventType != pEvent.eventType)
+ {
+ return false;
+ }
+ if (eventDescription != pEvent.eventDescription)
+ {
+ return false;
+ }
+ if (datasetReference != pEvent.datasetReference)
+ {
+ return false;
+ }
+ if (parameterDescription != pEvent.parameterDescription)
+ {
+ return false;
+ }
+ if (optional != pEvent.optional)
+ {
+ return false;
+ }
+ return true;
+ }
+ }
+}
diff --git a/NGIS.Model/ModelMechanismItem.cs b/NGIS.Model/ModelMechanismItem.cs
new file mode 100644
index 0000000000000000000000000000000000000000..2455b45ecf92a35d513762765cad12914df725fe
--- /dev/null
+++ b/NGIS.Model/ModelMechanismItem.cs
@@ -0,0 +1,32 @@
+namespace NGIS.Model
+{
+ public struct ModelMechanismItem
+ {
+ public string Name;
+
+ public EMechanismItemType Type;
+
+ public string Value;
+
+ public ModelMechanismItem(string name, EMechanismItemType type, string value)
+ {
+ Name = name;
+ Type = type;
+ Value = value;
+ }
+
+ public static bool operator ==(ModelMechanismItem itemA, ModelMechanismItem itemB)
+ {
+ if (itemA.Name == itemB.Name && itemA.Type == itemB.Type && itemA.Value == itemB.Value)
+ {
+ return true;
+ }
+ return false;
+ }
+
+ public static bool operator !=(ModelMechanismItem itemA, ModelMechanismItem itemB)
+ {
+ return !(itemA == itemB);
+ }
+ }
+}
diff --git a/NGIS.Model/ModelParameter.cs b/NGIS.Model/ModelParameter.cs
new file mode 100644
index 0000000000000000000000000000000000000000..1d94063a314ee9b4f5e23e41a6f58e17dd165750
--- /dev/null
+++ b/NGIS.Model/ModelParameter.cs
@@ -0,0 +1,32 @@
+namespace NGIS.Model
+{
+ public struct ModelParameter
+ {
+ public string Key;
+
+ public string Description;
+
+ public string DefaultValue;
+
+ public ModelParameter(string key, string description, string defaultValue)
+ {
+ Key = key;
+ Description = description;
+ DefaultValue = defaultValue;
+ }
+
+ public static bool operator ==(ModelParameter mpA, ModelParameter mpB)
+ {
+ if (mpA.Key == mpB.Key && mpA.Description == mpB.Description && mpA.DefaultValue == mpB.DefaultValue)
+ {
+ return true;
+ }
+ return false;
+ }
+
+ public static bool operator !=(ModelParameter mpA, ModelParameter mpB)
+ {
+ return !(mpA != mpB);
+ }
+ }
+}
diff --git a/NGIS.Model/ModelRuntime.cs b/NGIS.Model/ModelRuntime.cs
new file mode 100644
index 0000000000000000000000000000000000000000..5f77f8ff090ed45a6b5965c7c2b9928b16fbc176
--- /dev/null
+++ b/NGIS.Model/ModelRuntime.cs
@@ -0,0 +1,453 @@
+using System.Collections.Generic;
+using System.Xml;
+
+namespace NGIS.Model
+{
+ public class ModelRuntime : IModelRuntime
+ {
+ private string mName;
+
+ private string mVersion;
+
+ private string mEntry;
+
+ private string mBaseDirectory;
+
+ private List mHardwareRequirementList = new List();
+
+ private List mSoftwareRequirementList = new List();
+
+ private List mModelAssemblyList = new List();
+
+ private List mSupportiveResourceList = new List();
+
+ public bool loadFromXml(XmlElement pModelClassElement)
+ {
+ XmlElement xmlElement = pModelClassElement.ChildNodes[2] as XmlElement;
+ mName = xmlElement.GetAttribute("name");
+ mVersion = xmlElement.GetAttribute("version");
+ mBaseDirectory = xmlElement.GetAttribute("baseDir");
+ mEntry = xmlElement.GetAttribute("entry");
+ XmlElement xmlElement2 = xmlElement.ChildNodes[0] as XmlElement;
+ XmlElement xmlElement3 = xmlElement.ChildNodes[1] as XmlElement;
+ XmlElement xmlElement4 = xmlElement.ChildNodes[2] as XmlElement;
+ XmlElement xmlElement5 = xmlElement.ChildNodes[3] as XmlElement;
+ foreach (object childNode in xmlElement2.ChildNodes)
+ {
+ XmlElement xmlElement6 = childNode as XmlElement;
+ HardwareRequirement item = default(HardwareRequirement);
+ item.requirementKey = xmlElement6.GetAttribute("key");
+ item.requirementValue = xmlElement6.GetAttribute("value");
+ mHardwareRequirementList.Add(item);
+ }
+ foreach (object childNode2 in xmlElement3.ChildNodes)
+ {
+ XmlElement xmlElement7 = childNode2 as XmlElement;
+ SoftwareRequirement item2 = default(SoftwareRequirement);
+ item2.requirementKey = xmlElement7.GetAttribute("key");
+ item2.requirementValue = xmlElement7.GetAttribute("value");
+ item2.requirementPlatform = xmlElement7.GetAttribute("platform");
+ mSoftwareRequirementList.Add(item2);
+ }
+ foreach (object childNode3 in xmlElement4.ChildNodes)
+ {
+ XmlElement xmlElement8 = childNode3 as XmlElement;
+ ModelAssembly item3 = default(ModelAssembly);
+ item3.assemblyName = xmlElement8.GetAttribute("name");
+ item3.assemblyPath = xmlElement8.GetAttribute("path");
+ mModelAssemblyList.Add(item3);
+ }
+ foreach (object childNode4 in xmlElement5.ChildNodes)
+ {
+ XmlElement xmlElement9 = childNode4 as XmlElement;
+ SupportiveResource item4 = default(SupportiveResource);
+ item4.resourceType = xmlElement9.GetAttribute("type");
+ item4.resourceName = xmlElement9.GetAttribute("name");
+ mSupportiveResourceList.Add(item4);
+ }
+ return true;
+ }
+
+ public bool formatToXml(XmlElement pModelClassElement)
+ {
+ XmlDocument ownerDocument = pModelClassElement.OwnerDocument;
+ XmlElement xmlElement = ownerDocument.CreateElement("Runtime");
+ xmlElement.SetAttribute("name", mName);
+ xmlElement.SetAttribute("version", mVersion);
+ xmlElement.SetAttribute("baseDir", mBaseDirectory);
+ xmlElement.SetAttribute("entry", mEntry);
+ XmlElement xmlElement2 = ownerDocument.CreateElement("HardwareConfigures");
+ XmlElement xmlElement3 = ownerDocument.CreateElement("SoftwareConfigures");
+ XmlElement xmlElement4 = ownerDocument.CreateElement("Assemblies");
+ XmlElement xmlElement5 = ownerDocument.CreateElement("SupportiveResources");
+ for (int i = 0; i < mHardwareRequirementList.Count; i++)
+ {
+ XmlElement xmlElement6 = ownerDocument.CreateElement("Add");
+ xmlElement6.SetAttribute("key", mHardwareRequirementList[i].requirementKey);
+ xmlElement6.SetAttribute("value", mHardwareRequirementList[i].requirementValue);
+ xmlElement2.AppendChild(xmlElement6);
+ }
+ for (int j = 0; j < mSoftwareRequirementList.Count; j++)
+ {
+ XmlElement xmlElement7 = ownerDocument.CreateElement("Add");
+ xmlElement7.SetAttribute("key", mSoftwareRequirementList[j].requirementKey);
+ xmlElement7.SetAttribute("value", mSoftwareRequirementList[j].requirementValue);
+ xmlElement7.SetAttribute("platform", mSoftwareRequirementList[j].requirementPlatform);
+ xmlElement3.AppendChild(xmlElement7);
+ }
+ for (int k = 0; k < mModelAssemblyList.Count; k++)
+ {
+ XmlElement xmlElement8 = ownerDocument.CreateElement("Assembly");
+ xmlElement8.SetAttribute("name", mModelAssemblyList[k].assemblyName);
+ xmlElement8.SetAttribute("path", mModelAssemblyList[k].assemblyPath);
+ xmlElement4.AppendChild(xmlElement8);
+ }
+ for (int l = 0; l < mSupportiveResourceList.Count; l++)
+ {
+ XmlElement xmlElement9 = ownerDocument.CreateElement("Add");
+ xmlElement9.SetAttribute("type", mSupportiveResourceList[l].resourceType);
+ xmlElement9.SetAttribute("name", mSupportiveResourceList[l].resourceName);
+ xmlElement5.AppendChild(xmlElement9);
+ }
+ xmlElement.AppendChild(xmlElement2);
+ xmlElement.AppendChild(xmlElement3);
+ xmlElement.AppendChild(xmlElement4);
+ xmlElement.AppendChild(xmlElement5);
+ pModelClassElement.AppendChild(xmlElement);
+ return true;
+ }
+
+ public string getName()
+ {
+ return mName;
+ }
+
+ public void setName(string pName)
+ {
+ mName = pName;
+ }
+
+ public string getVersion()
+ {
+ return mVersion;
+ }
+
+ public void setVersion(string pVersion)
+ {
+ mVersion = pVersion;
+ }
+
+ public string getEntry()
+ {
+ return mEntry;
+ }
+
+ public void setEntry(string pEntry)
+ {
+ mEntry = pEntry;
+ }
+
+ public string getBaseDirectory()
+ {
+ return mBaseDirectory;
+ }
+
+ public void setBaseDirectory(string pDirectory)
+ {
+ mBaseDirectory = pDirectory;
+ }
+
+ public bool addHardwareRequirement(ref HardwareRequirement pRequirement)
+ {
+ for (int i = 0; i < mHardwareRequirementList.Count; i++)
+ {
+ if (mHardwareRequirementList[i].requirementKey == pRequirement.requirementKey && mHardwareRequirementList[i].requirementValue == pRequirement.requirementValue)
+ {
+ return false;
+ }
+ }
+ mHardwareRequirementList.Add(pRequirement);
+ return true;
+ }
+
+ public bool addSoftwareRequirement(ref SoftwareRequirement pRequirement)
+ {
+ for (int i = 0; i < mSoftwareRequirementList.Count; i++)
+ {
+ if (mSoftwareRequirementList[i].requirementKey == pRequirement.requirementKey && mSoftwareRequirementList[i].requirementValue == pRequirement.requirementValue)
+ {
+ return false;
+ }
+ }
+ mSoftwareRequirementList.Add(pRequirement);
+ return true;
+ }
+
+ public bool addModelAssembly(ref ModelAssembly pRequirement)
+ {
+ for (int i = 0; i < mModelAssemblyList.Count; i++)
+ {
+ if (mModelAssemblyList[i].assemblyName == pRequirement.assemblyName && mModelAssemblyList[i].assemblyPath == pRequirement.assemblyPath)
+ {
+ return false;
+ }
+ }
+ mModelAssemblyList.Add(pRequirement);
+ return true;
+ }
+
+ public bool addSupportiveResource(ref SupportiveResource pRequirement)
+ {
+ for (int i = 0; i < mSupportiveResourceList.Count; i++)
+ {
+ if (mSupportiveResourceList[i].resourceType == pRequirement.resourceType && mSupportiveResourceList[i].resourceName == pRequirement.resourceName)
+ {
+ return false;
+ }
+ }
+ mSupportiveResourceList.Add(pRequirement);
+ return true;
+ }
+
+ public int getHardwareRequirementCount()
+ {
+ return mHardwareRequirementList.Count;
+ }
+
+ public int getSoftwareRequirementCount()
+ {
+ return mSoftwareRequirementList.Count;
+ }
+
+ public int getModelAssemblyCount()
+ {
+ return mModelAssemblyList.Count;
+ }
+
+ public int getSupportiveResourceCount()
+ {
+ return mSupportiveResourceList.Count;
+ }
+
+ public bool getHardwareRequirement(int idx, ref HardwareRequirement pRequirement)
+ {
+ if (idx < 0 || idx >= mHardwareRequirementList.Count)
+ {
+ return false;
+ }
+ pRequirement = mHardwareRequirementList[idx];
+ return true;
+ }
+
+ public bool getSoftwareRequirement(int idx, ref SoftwareRequirement pRequirement)
+ {
+ if (idx < 0 || idx >= mSoftwareRequirementList.Count)
+ {
+ return false;
+ }
+ pRequirement = mSoftwareRequirementList[idx];
+ return true;
+ }
+
+ public bool getModelAssembly(int idx, ref ModelAssembly pRequirement)
+ {
+ if (idx < 0 || idx >= mModelAssemblyList.Count)
+ {
+ return false;
+ }
+ pRequirement = mModelAssemblyList[idx];
+ return true;
+ }
+
+ public bool getSupportiveResource(int idx, ref SupportiveResource pRequirement)
+ {
+ if (idx < 0 || idx >= mSupportiveResourceList.Count)
+ {
+ return false;
+ }
+ pRequirement = mSupportiveResourceList[idx];
+ return true;
+ }
+
+ public bool removeHardwareRequirementref(HardwareRequirement pRequirement)
+ {
+ if (mHardwareRequirementList.Contains(pRequirement))
+ {
+ mHardwareRequirementList.Remove(pRequirement);
+ return true;
+ }
+ return false;
+ }
+
+ public bool removeSoftwareRequirement(ref SoftwareRequirement pRequirement)
+ {
+ if (mSoftwareRequirementList.Contains(pRequirement))
+ {
+ mSoftwareRequirementList.Remove(pRequirement);
+ return true;
+ }
+ return false;
+ }
+
+ public bool removeModelAssembly(ref ModelAssembly pRequirement)
+ {
+ if (mModelAssemblyList.Contains(pRequirement))
+ {
+ mModelAssemblyList.Remove(pRequirement);
+ return true;
+ }
+ return false;
+ }
+
+ public bool removeSupportiveResource(ref SupportiveResource pRequirement)
+ {
+ if (mSupportiveResourceList.Contains(pRequirement))
+ {
+ mSupportiveResourceList.Remove(pRequirement);
+ return true;
+ }
+ return false;
+ }
+
+ public bool removeHardwareRequirement(int idx)
+ {
+ if (idx < 0 || idx >= mHardwareRequirementList.Count)
+ {
+ return false;
+ }
+ mHardwareRequirementList.RemoveAt(idx);
+ return true;
+ }
+
+ public bool removeSoftwareRequirement(int idx)
+ {
+ if (idx < 0 || idx >= mSoftwareRequirementList.Count)
+ {
+ return false;
+ }
+ mSoftwareRequirementList.RemoveAt(idx);
+ return true;
+ }
+
+ public bool removeModelAssembly(int idx)
+ {
+ if (idx < 0 || idx >= mModelAssemblyList.Count)
+ {
+ return false;
+ }
+ mModelAssemblyList.RemoveAt(idx);
+ return true;
+ }
+
+ public bool removeSupportiveResource(int idx)
+ {
+ if (idx < 0 || idx >= mSupportiveResourceList.Count)
+ {
+ return false;
+ }
+ mSupportiveResourceList.RemoveAt(idx);
+ return true;
+ }
+
+ public bool compareOther(IModelRuntime pRuntime, ref string obj, ref string name)
+ {
+ if (mName != pRuntime.getName())
+ {
+ obj = "Runtime";
+ name = "name";
+ return false;
+ }
+ if (mVersion != pRuntime.getVersion())
+ {
+ obj = "Runtime";
+ name = "version";
+ return false;
+ }
+ if (mEntry != pRuntime.getEntry())
+ {
+ obj = "Runtime";
+ name = "entry";
+ return false;
+ }
+ if (mBaseDirectory != pRuntime.getBaseDirectory())
+ {
+ obj = "Runtime";
+ name = "baseDir";
+ return false;
+ }
+ if (mHardwareRequirementList.Count != pRuntime.getHardwareRequirementCount())
+ {
+ obj = "HardwareConfigures";
+ name = "HardwareRequirementCount";
+ return false;
+ }
+ for (int i = 0; i < mHardwareRequirementList.Count; i++)
+ {
+ HardwareRequirement hardwareRequirement = mHardwareRequirementList[i];
+ HardwareRequirement pRequirement = default(HardwareRequirement);
+ pRuntime.getHardwareRequirement(i, ref pRequirement);
+ if (!hardwareRequirement.compareOther(pRequirement))
+ {
+ obj = "Hardware";
+ name = hardwareRequirement.requirementKey + "<-->" + pRequirement.requirementKey;
+ return false;
+ }
+ }
+ if (mSoftwareRequirementList.Count != pRuntime.getSoftwareRequirementCount())
+ {
+ obj = "SoftwareConfigures";
+ name = "SoftwareRequirementCount";
+ return false;
+ }
+ for (int j = 0; j < mSoftwareRequirementList.Count; j++)
+ {
+ SoftwareRequirement softwareRequirement = mSoftwareRequirementList[j];
+ SoftwareRequirement pRequirement2 = default(SoftwareRequirement);
+ pRuntime.getSoftwareRequirement(j, ref pRequirement2);
+ if (!softwareRequirement.compareOther(pRequirement2))
+ {
+ obj = "Software";
+ name = softwareRequirement.requirementKey + "<-->" + pRequirement2.requirementKey;
+ return false;
+ }
+ }
+ if (mModelAssemblyList.Count != pRuntime.getModelAssemblyCount())
+ {
+ obj = "Assemblies";
+ name = "AssemblyCount";
+ return false;
+ }
+ for (int k = 0; k < mModelAssemblyList.Count; k++)
+ {
+ ModelAssembly modelAssembly = mModelAssemblyList[k];
+ ModelAssembly pRequirement3 = default(ModelAssembly);
+ pRuntime.getModelAssembly(k, ref pRequirement3);
+ if (!modelAssembly.compareOther(pRequirement3))
+ {
+ obj = "Assembly";
+ name = modelAssembly.assemblyName + "<-->" + pRequirement3.assemblyName;
+ return false;
+ }
+ }
+ if (mSupportiveResourceList.Count != pRuntime.getSupportiveResourceCount())
+ {
+ obj = "SupportiveResources";
+ name = "SupportiveResourceCount";
+ return false;
+ }
+ for (int l = 0; l < mSupportiveResourceList.Count; l++)
+ {
+ SupportiveResource supportiveResource = mSupportiveResourceList[l];
+ SupportiveResource pRequirement4 = default(SupportiveResource);
+ pRuntime.getSupportiveResource(l, ref pRequirement4);
+ if (!supportiveResource.compareOther(pRequirement4))
+ {
+ obj = "SupportiveResource";
+ name = supportiveResource.resourceName + "<-->" + pRequirement4.resourceName;
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+}
diff --git a/NGIS.Model/ModelState.cs b/NGIS.Model/ModelState.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b3983968ae777044b9af14513597f56081881c1a
--- /dev/null
+++ b/NGIS.Model/ModelState.cs
@@ -0,0 +1,51 @@
+using System.Collections.Generic;
+
+namespace NGIS.Model
+{
+ public struct ModelState
+ {
+ public string stateId;
+
+ public string stateName;
+
+ public EModelStateType stateType;
+
+ public string stateDecription;
+
+ public List modelEvents;
+
+ public bool compareOther(ModelState pState)
+ {
+ if (stateId != pState.stateId)
+ {
+ return false;
+ }
+ if (stateName != pState.stateName)
+ {
+ return false;
+ }
+ if (stateType != pState.stateType)
+ {
+ return false;
+ }
+ if (stateDecription != pState.stateDecription)
+ {
+ return false;
+ }
+ if (modelEvents.Count != pState.modelEvents.Count)
+ {
+ return false;
+ }
+ for (int i = 0; i < modelEvents.Count; i++)
+ {
+ ModelEvent modelEvent = modelEvents[i];
+ ModelEvent pEvent = pState.modelEvents[i];
+ if (!modelEvent.compareOther(pEvent))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+}
diff --git a/NGIS.Model/ModelStateTransition.cs b/NGIS.Model/ModelStateTransition.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6f0675470ff7deaf75b0005b84d582cda07bf118
--- /dev/null
+++ b/NGIS.Model/ModelStateTransition.cs
@@ -0,0 +1,22 @@
+namespace NGIS.Model
+{
+ public struct ModelStateTransition
+ {
+ public ModelState fromState;
+
+ public ModelState toState;
+
+ public bool compareOther(ModelStateTransition pTrans)
+ {
+ if (!fromState.compareOther(pTrans.fromState))
+ {
+ return false;
+ }
+ if (!toState.compareOther(pTrans.toState))
+ {
+ return false;
+ }
+ return true;
+ }
+ }
+}
diff --git a/NGIS.Model/ModelUser.cs b/NGIS.Model/ModelUser.cs
new file mode 100644
index 0000000000000000000000000000000000000000..5791f6b1330bb6b1511f56a110298b372de16dfa
--- /dev/null
+++ b/NGIS.Model/ModelUser.cs
@@ -0,0 +1,37 @@
+using System.Collections.Generic;
+
+namespace NGIS.Model
+{
+ public struct ModelUser
+ {
+ public string Name;
+
+ public string Account;
+
+ public ModelUserInstitution Institution;
+
+ public List Contacts;
+
+ public ModelUser(string name, string account, ModelUserInstitution ins, List contacts)
+ {
+ Name = name;
+ Account = account;
+ Institution = ins;
+ Contacts = contacts;
+ }
+
+ public static bool operator ==(ModelUser userA, ModelUser userB)
+ {
+ if (userA.Name == userB.Name && userA.Name == userB.Name && userA.Name == userB.Name && userA.Name == userB.Name && userA.Name == userB.Name && userA.Name == userB.Name)
+ {
+ return true;
+ }
+ return false;
+ }
+
+ public static bool operator !=(ModelUser userA, ModelUser userB)
+ {
+ return !(userA != userB);
+ }
+ }
+}
diff --git a/NGIS.Model/ModelUserContact.cs b/NGIS.Model/ModelUserContact.cs
new file mode 100644
index 0000000000000000000000000000000000000000..197b95fcc03a1ea5d010e4e0a3961f34a449f6b3
--- /dev/null
+++ b/NGIS.Model/ModelUserContact.cs
@@ -0,0 +1,29 @@
+namespace NGIS.Model
+{
+ public struct ModelUserContact
+ {
+ public EContactType Type;
+
+ public string Value;
+
+ public ModelUserContact(EContactType type, string value)
+ {
+ Type = type;
+ Value = value;
+ }
+
+ public static bool operator ==(ModelUserContact mucA, ModelUserContact mucB)
+ {
+ if (mucA.Type == mucB.Type && mucA.Value == mucB.Value)
+ {
+ return true;
+ }
+ return false;
+ }
+
+ public static bool operator !=(ModelUserContact mucA, ModelUserContact mucB)
+ {
+ return !(mucA == mucB);
+ }
+ }
+}
diff --git a/NGIS.Model/ModelUserInstitution.cs b/NGIS.Model/ModelUserInstitution.cs
new file mode 100644
index 0000000000000000000000000000000000000000..48fd0168290f5f8ca8ef9398eb73e7c8049a5bd5
--- /dev/null
+++ b/NGIS.Model/ModelUserInstitution.cs
@@ -0,0 +1,35 @@
+namespace NGIS.Model
+{
+ public struct ModelUserInstitution
+ {
+ public string Name;
+
+ public string Country;
+
+ public string City;
+
+ public string Address;
+
+ public ModelUserInstitution(string name, string country, string city, string address)
+ {
+ Name = name;
+ Country = country;
+ City = city;
+ Address = address;
+ }
+
+ public static bool operator ==(ModelUserInstitution insA, ModelUserInstitution insB)
+ {
+ if (insA.Name == insB.Name && insA.Country == insB.Country && insA.City == insB.City && insA.Address == insB.Address)
+ {
+ return true;
+ }
+ return false;
+ }
+
+ public static bool operator !=(ModelUserInstitution insA, ModelUserInstitution insB)
+ {
+ return !(insA == insB);
+ }
+ }
+}
diff --git a/NGIS.Model/SoftwareRequirement.cs b/NGIS.Model/SoftwareRequirement.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c182704e394c79dc4bd10157fe15dc9c7a00b387
--- /dev/null
+++ b/NGIS.Model/SoftwareRequirement.cs
@@ -0,0 +1,38 @@
+namespace NGIS.Model
+{
+ public struct SoftwareRequirement
+ {
+ public string requirementKey;
+
+ public string requirementValue;
+
+ public string requirementPlatform;
+
+ public bool compareOther(SoftwareRequirement pRequirement)
+ {
+ if (requirementKey != pRequirement.requirementKey)
+ {
+ return false;
+ }
+ if (requirementValue != pRequirement.requirementValue)
+ {
+ return false;
+ }
+ if (requirementPlatform != pRequirement.requirementPlatform)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ public static bool operator ==(SoftwareRequirement srA, SoftwareRequirement srB)
+ {
+ return srA.compareOther(srB);
+ }
+
+ public static bool operator !=(SoftwareRequirement srA, SoftwareRequirement srB)
+ {
+ return !(srA == srB);
+ }
+ }
+}
diff --git a/NGIS.Model/SpatialExtent.cs b/NGIS.Model/SpatialExtent.cs
new file mode 100644
index 0000000000000000000000000000000000000000..8b0d95efa4aefbd72969dc9c53e5b8d369f69b58
--- /dev/null
+++ b/NGIS.Model/SpatialExtent.cs
@@ -0,0 +1,38 @@
+namespace NGIS.Model
+{
+ public struct SpatialExtent
+ {
+ public double XMin;
+
+ public double XMax;
+
+ public double YMin;
+
+ public double YMax;
+
+ public string SpatialReference;
+
+ public SpatialExtent(double xmin, double xmax, double ymin, double ymax, string sreference)
+ {
+ XMin = xmin;
+ XMax = xmax;
+ YMin = ymin;
+ YMax = ymax;
+ SpatialReference = sreference;
+ }
+
+ public static bool operator ==(SpatialExtent seA, SpatialExtent seB)
+ {
+ if (seA.XMin == seB.XMin && seA.XMax == seB.XMax && seA.YMin == seB.YMin && seA.YMax == seB.YMax && seA.SpatialReference == seB.SpatialReference)
+ {
+ return true;
+ }
+ return false;
+ }
+
+ public static bool operator !=(SpatialExtent seA, SpatialExtent seB)
+ {
+ return !(seA == seB);
+ }
+ }
+}
diff --git a/NGIS.Model/SpatialScope.cs b/NGIS.Model/SpatialScope.cs
new file mode 100644
index 0000000000000000000000000000000000000000..1379c4bf6086dede19f18bd6cdb9693e5c79a5dc
--- /dev/null
+++ b/NGIS.Model/SpatialScope.cs
@@ -0,0 +1,43 @@
+using System.Collections.Generic;
+
+namespace NGIS.Model
+{
+ public struct SpatialScope
+ {
+ public List Extents;
+
+ public List AreaNames;
+
+ public static bool operator ==(SpatialScope ssA, SpatialScope ssB)
+ {
+ if (ssA.Extents.Count != ssB.Extents.Count)
+ {
+ return false;
+ }
+ for (int i = 0; i < ssA.Extents.Count; i++)
+ {
+ if (!ssB.Extents.Contains(ssA.Extents[i]))
+ {
+ return false;
+ }
+ }
+ if (ssA.AreaNames.Count != ssB.AreaNames.Count)
+ {
+ return false;
+ }
+ for (int j = 0; j < ssA.AreaNames.Count; j++)
+ {
+ if (!ssB.AreaNames.Contains(ssA.AreaNames[j]))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static bool operator !=(SpatialScope ssA, SpatialScope ssB)
+ {
+ return !(ssA == ssB);
+ }
+ }
+}
diff --git a/NGIS.Model/SpatiotemporalStepLength.cs b/NGIS.Model/SpatiotemporalStepLength.cs
new file mode 100644
index 0000000000000000000000000000000000000000..5803c9338d3d9d1b6a52aeb4ad0e36b6d8bb972c
--- /dev/null
+++ b/NGIS.Model/SpatiotemporalStepLength.cs
@@ -0,0 +1,51 @@
+using System;
+
+namespace NGIS.Model
+{
+ public struct SpatiotemporalStepLength
+ {
+ public double Min;
+
+ public double Max;
+
+ public string Unit;
+
+ public SpatiotemporalStepLength(double min, double max, string unit)
+ {
+ Min = min;
+ Max = max;
+ Unit = unit;
+ }
+
+ public SpatiotemporalStepLength(string step, string unit)
+ {
+ if (step.Trim() == "")
+ {
+ Min = 0.0;
+ Max = 0.0;
+ }
+ else
+ {
+ string text = step.Substring(1, step.Length - 2);
+ string[] array = text.Split(',');
+ Min = Convert.ToDouble(array[0]);
+ Max = Convert.ToDouble(array[1]);
+ }
+ Unit = unit;
+ }
+
+ public static bool operator ==(SpatiotemporalStepLength sslA, SpatiotemporalStepLength sslB)
+ {
+ if (sslA.Min == sslB.Min && sslA.Max == sslB.Max && sslA.Unit == sslB.Unit)
+ {
+ return true;
+ }
+ return false;
+ }
+
+ public static bool operator !=(SpatiotemporalStepLength sslA, SpatiotemporalStepLength sslB)
+ {
+ return !(sslA == sslB);
+ }
+ }
+}
diff --git a/NGIS.Model/SupportiveResource.cs b/NGIS.Model/SupportiveResource.cs
new file mode 100644
index 0000000000000000000000000000000000000000..7d9831209713c87adbf7e47a7e1dea2e07df85db
--- /dev/null
+++ b/NGIS.Model/SupportiveResource.cs
@@ -0,0 +1,32 @@
+namespace NGIS.Model
+{
+ public struct SupportiveResource
+ {
+ public string resourceType;
+
+ public string resourceName;
+
+ public bool compareOther(SupportiveResource pResource)
+ {
+ if (resourceType != pResource.resourceType)
+ {
+ return false;
+ }
+ if (resourceName != pResource.resourceName)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ public static bool operator ==(SupportiveResource srA, SupportiveResource srB)
+ {
+ return srA.compareOther(srB);
+ }
+
+ public static bool operator !=(SupportiveResource srA, SupportiveResource srB)
+ {
+ return !(srA == srB);
+ }
+ }
+}
diff --git a/view/DataReference.cs b/view/DataReference.cs
new file mode 100644
index 0000000000000000000000000000000000000000..446f4ae0d68b5aee3e4130fb69ce30634d1c1a61
--- /dev/null
+++ b/view/DataReference.cs
@@ -0,0 +1,183 @@
+using MDL.Class;
+using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace MDL
+{
+ public class DataReference : Form
+ {
+ private Dataset dataset;
+
+ private IContainer components = null;
+
+ private ComboBox comboBox3;
+
+ private TextBox textBox4;
+
+ private Label label6;
+
+ private Label label8;
+
+ private TextBox textBox6;
+
+ private Label label9;
+
+ private Button button2;
+
+ private Button button1;
+
+ private TextBox textBox1;
+
+ private Label label1;
+
+ public event TransfDelegate TransfEvent;
+
+ public DataReference(Dataset d, string type)
+ {
+ dataset = d;
+ InitializeComponent();
+ textBox6.Text = dataset.Name;
+ comboBox3.Text = dataset.Type;
+ textBox4.Text = dataset.Description;
+ textBox1.Text = dataset.ExternalId;
+ if (type == "response(input)")
+ {
+ label1.Text = "Schema:";
+ }
+ else
+ {
+ label1.Text = "ExternalId:";
+ }
+ }
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ dataset.Name = textBox6.Text;
+ dataset.Type = comboBox3.Text;
+ dataset.Description = textBox4.Text;
+ dataset.ExternalId = textBox1.Text;
+ this.TransfEvent(dataset);
+ Close();
+ }
+
+ private void button2_Click(object sender, EventArgs e)
+ {
+ Close();
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && components != null)
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MDL.DataReference));
+ comboBox3 = new System.Windows.Forms.ComboBox();
+ textBox4 = new System.Windows.Forms.TextBox();
+ label6 = new System.Windows.Forms.Label();
+ label8 = new System.Windows.Forms.Label();
+ textBox6 = new System.Windows.Forms.TextBox();
+ label9 = new System.Windows.Forms.Label();
+ button2 = new System.Windows.Forms.Button();
+ button1 = new System.Windows.Forms.Button();
+ textBox1 = new System.Windows.Forms.TextBox();
+ label1 = new System.Windows.Forms.Label();
+ SuspendLayout();
+ comboBox3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ comboBox3.FormattingEnabled = true;
+ comboBox3.Items.AddRange(new object[2]
+ {
+ "internal",
+ "external"
+ });
+ comboBox3.Location = new System.Drawing.Point(74, 84);
+ comboBox3.Name = "comboBox3";
+ comboBox3.Size = new System.Drawing.Size(261, 20);
+ comboBox3.TabIndex = 24;
+ textBox4.Location = new System.Drawing.Point(23, 152);
+ textBox4.Multiline = true;
+ textBox4.Name = "textBox4";
+ textBox4.Size = new System.Drawing.Size(312, 76);
+ textBox4.TabIndex = 23;
+ label6.AutoSize = true;
+ label6.Font = new System.Drawing.Font("Times New Roman", 12f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134);
+ label6.Location = new System.Drawing.Point(20, 128);
+ label6.Name = "label6";
+ label6.Size = new System.Drawing.Size(104, 16);
+ label6.TabIndex = 22;
+ label6.Text = "Description:";
+ label8.AutoSize = true;
+ label8.Font = new System.Drawing.Font("Times New Roman", 12f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134);
+ label8.Location = new System.Drawing.Point(20, 84);
+ label8.Name = "label8";
+ label8.Size = new System.Drawing.Size(48, 16);
+ label8.TabIndex = 19;
+ label8.Text = "Type:";
+ textBox6.Location = new System.Drawing.Point(74, 33);
+ textBox6.Name = "textBox6";
+ textBox6.Size = new System.Drawing.Size(262, 21);
+ textBox6.TabIndex = 18;
+ label9.AutoSize = true;
+ label9.Font = new System.Drawing.Font("Times New Roman", 12f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134);
+ label9.Location = new System.Drawing.Point(20, 35);
+ label9.Name = "label9";
+ label9.Size = new System.Drawing.Size(48, 16);
+ label9.TabIndex = 17;
+ label9.Text = "Name:";
+ button2.Font = new System.Drawing.Font("宋体", 10f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134);
+ button2.Location = new System.Drawing.Point(218, 379);
+ button2.Name = "button2";
+ button2.Size = new System.Drawing.Size(75, 23);
+ button2.TabIndex = 26;
+ button2.Text = "Cancel";
+ button2.UseVisualStyleBackColor = true;
+ button2.Click += new System.EventHandler(button2_Click);
+ button1.Font = new System.Drawing.Font("宋体", 10f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134);
+ button1.Location = new System.Drawing.Point(58, 379);
+ button1.Name = "button1";
+ button1.Size = new System.Drawing.Size(75, 23);
+ button1.TabIndex = 25;
+ button1.Text = "Save";
+ button1.UseVisualStyleBackColor = true;
+ button1.Click += new System.EventHandler(button1_Click);
+ textBox1.Location = new System.Drawing.Point(23, 274);
+ textBox1.Multiline = true;
+ textBox1.Name = "textBox1";
+ textBox1.Size = new System.Drawing.Size(312, 75);
+ textBox1.TabIndex = 28;
+ label1.AutoSize = true;
+ label1.Font = new System.Drawing.Font("Times New Roman", 12f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134);
+ label1.Location = new System.Drawing.Point(20, 250);
+ label1.Name = "label1";
+ label1.Size = new System.Drawing.Size(96, 16);
+ label1.TabIndex = 27;
+ label1.Text = "ExternalId:";
+ base.AutoScaleDimensions = new System.Drawing.SizeF(6f, 12f);
+ base.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ BackColor = System.Drawing.SystemColors.GradientActiveCaption;
+ base.ClientSize = new System.Drawing.Size(358, 422);
+ base.Controls.Add(textBox1);
+ base.Controls.Add(label1);
+ base.Controls.Add(button2);
+ base.Controls.Add(button1);
+ base.Controls.Add(comboBox3);
+ base.Controls.Add(textBox4);
+ base.Controls.Add(label6);
+ base.Controls.Add(label8);
+ base.Controls.Add(textBox6);
+ base.Controls.Add(label9);
+ base.Icon = (System.Drawing.Icon)resources.GetObject("$this.Icon");
+ base.Name = "DataReference";
+ Text = "Data Reference";
+ ResumeLayout(false);
+ PerformLayout();
+ }
+ }
+}
diff --git a/view/DataReference.resx b/view/DataReference.resx
new file mode 100644
index 0000000000000000000000000000000000000000..9d61c9f5a2e9b4efe4475c7a1969bb966f6b6630
--- /dev/null
+++ b/view/DataReference.resx
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+text/microsoft-resx1.3System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABNTeXN0ZW0uRHJhd2luZy5JY29uAgAAAAhJY29uRGF0YQhJY29uU2l6ZQcEAhNTeXN0ZW0uRHJhd2luZy5TaXplAgAAAAIAAAAJAwAAAAX8////E1N5c3RlbS5EcmF3aW5nLlNpemUCAAAABXdpZHRoBmhlaWdodAAACAgCAAAAAAAAAAAAAAAPAwAAAL6UAAACAAABAAEAYGAAAAEAIAColAAAFgAAACgAAABgAAAAwAAAAAEAIAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////Bv///wz///8Q/v7+FP7+/hj///8a/v7+Hv7+/hT+/v4GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Ev///0D+/v5U////cv///5H///+z////yf///9n+/v7n/v7++f///7////9q/v7+JP7+/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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/7yoEf+8qBH/vKgP/8GuH//Ux2X/7+rH//z79f///////////////+////98////EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4E/v7+Iv///3L////d/v7+//7+/P/49uf/5t6q/8azPv+6pBf/uKIT/7iiFP+4oRT/uKES/7egE/+3oBP/uKEU/7ehFf+3oRb/t6EW/7egFv+3oBb/t58U/7efFP+2nxb/tp8Y/8KvPv/u6Mn//v37/////+3+/v4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+BP///6f+/v79/Pv1/+/rxv/PwlL/wrEh/8GwH//BsB7/wbAf/8GwH//Brx//wK8e/8CuHf/Arh3/wa8e/7+sF/+9qhH/vKkR/7ypEf+8qRH/vKkQ/7yoDv+9qhT/xrQx/+fgqf/49+n//f35//7+/v/+/v7z////2f///53+/v5s////Xv///1j///9a/v7+ZP///3b+/v7J/v7+4/////H+/v79+/rz//Lu0//Wynb/wKwq/7mjE/+5oxL/uKIT/7iiE/+4ohT/uKET/7ihEv+4oRL/uKAT/7egFP+3oBX/t6AV/7ehFv+3oBb/t6AW/7efFP+2nxT/uaMf/9jMhf/6+PH///////7+/n7///8EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////JP///8P+/vz/6uSz/9nOc//YzG//4NeN/+HZlP/f147/4NiP/+DYj//g2I//4NeP/+DXj//g15D/4tqZ/87AT/++qxf/vaoQ/7ypEf+9qRH/vagQ/7ypEf+8qQ//vKgP/7+sG//Ov1D/5+Cr//Tx2P/5+Oz//f35//7+/v///////v7+///////////////////////+/v3/+/r0//f15f/y7tP/29CE/8OwLv+7pRT/uaQR/7mjEf+4ohH/uaMS/7mjEv+4ohP/uKIU/7ehFP+3oRL/uKES/7ihE/+3oBT/uKEU/7ihFf+3oRX/t6AW/7agFv+3oBf/wa03//Pv2f/+/vz/////9////zz///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+AP///wT///8E////BP///wT///8C/v7+AAAAAAAAAAAA/v7+Pv7+/tX9/fr/181x/8KyI//Mvkf/7Oe6//v68f/6+fD/+vnw//r58P/6+fD/+vnw//r58P/6+fD/+/rx/9vRf//Arh3/vaoR/72qEP+9qRD/vakR/72pEf+8qRD/vKgO/7uoDf+9qhT/wrAm/8q6Qv/a0H7/5+Gs/+7qxv/x7dD/8/DX//Tx2v/08dj/8u/U//DszP/r5bv/4diY/9LEZP/Fszf/vqog/7qlEv+5pA//uaQQ/7mjEf+5oxH/uaIS/7mjEv+5oxL/uKIT/7iiFP+4oRT/uKES/7ehEv+4oRP/uKEU/7ihFf+3oRX/t6AW/7egFv+9qCn/3NGO//39+//////3////s////yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/gL///80/v7+if7+/p////+f/v7+n////5////+f////g/7+/iAAAAAA/v7+QP///9f9/fr/1str/7+tFv/BsB3/2M5y//n47P/////////////////////////////////+/v7//v79/9zThP/Arh3/vaoR/72qEf+9qRH/vakR/72pEf+8qRH/vKgQ/7ypD/+8qA7/vKcO/7yoEP/ArR//xLIs/8a2OP/KukX/zsBV/9DDXf/Qwln/zL1N/8i3Pv/DsTL/wK0n/7yoGf+6pRH/uaQR/7mkEf+5pBD/uqQP/7mkEP+4oxH/uKMR/7iiEf+4ohL/uaMT/7iiE/+4ohT/uKIU/7ehEv+3oBL/uKET/7ihFP+3oBX/t6EW/7ijHP/Nvl//9PHd//7+/v3+/v7B/v7+Ov7+/gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///zD+/v7D////+f/////+/v7///////7+/v/+/v7/////9/7+/qX///8e////Pv7+/tX9/fr/18xt/7+tFv+/rRb/wrEi/+rks//9/fr///////7+/t////9W/v7+SP///2b+/v7V/v79/9zSgv/Arh3/vKoR/72qEf+9qRH/vKkR/72pEf+9qRH/vKkQ/7ypEP+8qA//u6gO/7yoDv+8qA//u6gO/7unD/+7pxD/vKgT/7ypFf+8qBT/u6cR/7umDf+6pQ7/uqUP/7mkD/+5pBD/uqUR/7mkEf+5pBH/uqQQ/7mkD/+4oxH/uaMR/7ijEf+4oxL/uaMS/7iiE/+4ohP/uKIU/7ehE/+3oBH/uKES/7egE/+3oBT/uKEX/8SyQf/p4rf//fz5//7+/uP+/v5K/v7+BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Av///7/+/v7//Pv0//bz3v/z8db/9fLZ//Px1//49uX//f36//7+/vn///+X////QP///9X9/fr/18xt/7+uFv+/rRb/v60W/8/BUP/w7Mj//v79///////+/v4u////AP///zL+/v7L/v79/9zSg//Brx7/vaoR/7yqEf+8qhH/vKkQ/72pEP+9qRD/vKkR/7yoEf+8qBH/vKgP/7yoDv+8pw7/vKgO/7yoD/+7pw//u6cP/7qnD/+7pw//u6YP/7umDv+6pQ3/uqUN/7qlDv+6pQ//uqUQ/7qlEP+5pBD/uqUR/7mkEf+5pA//uaQQ/7mjEP+5oxH/uaMS/7miEv+5ohP/uKIT/7iiFP+4oRP/uKES/7ihEv+4oRP/v6sv/+DWmv/6+O///v7+/f///5X+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////DP7+/t/9/fr/7urB/8/EUv/HuDP/ybw8/8e5NP/a0Xn/9/Xi//7+/v////+5////RP7+/tX9/fr/18xt/7+tFv+/rRb/v64W/8KxIf/ZznX/9/Xj///////+/v65////OP7+/jz////L/v79/9zTg//BsB7/vasS/72qEf+9qhH/vaoQ/72qEf+9qhH/vakQ/72pEf+8qRH/vKkR/7ypD/+8qA7/u6gO/7yoDv+8qA//u6cP/7unDv+7pw//u6cP/7umD/+6pg7/u6YM/7umDf+6pQ7/uqUP/7mkEP+5pRD/uaQQ/7mkEf+6pBD/uaQP/7mkEP+5oxD/uaMR/7mjEv+5oxL/uaMS/7iiE/+4ohT/uKIU/7ihEv+6pBz/18p8//f15v/+/v3//v7+6////x4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EP///9/9/fn/6uWz/8q8PP/AsBr/wLAZ/8CwG//VymX/9fLb//7+/f////+5/v7+Rv7+/tX9/fr/181t/7+tFv+/rhb/v64V/7+uFv/FtSz/4NeP//r57//+/v79////zf///3r////L/v79/9zTg//BsB7/vasT/72qEv+9qhH/vKoQ/72qEf+8qhH/vakQ/7ypEf+9qRH/vakR/7ypEP+8qA7/vKgO/7yoDv+8qA//vKgP/7yoD/+7pw7/u6cP/7unD/+7pg//u6YN/7umDf+7pQ3/uqUP/7qlEP+5pBD/uqUQ/7mkEf+5pBH/uaUR/7mkD/+5pBD/uaMR/7iiEf+4ohH/uaMS/7ijE/+4ohP/uKIU/7qkGv/QwWT/9vPi//7+/f/+/v7t/v7+hwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EP///9/9/fn/6uW0/8u9P//BsRv/wLAY/8GxHf/Vy2j/9fPb//7+/f////+5////Rv///9X9/fr/181t/7+uFf++rRX/v64W/7+uFv+/rhf/xrcy/+bfpP/8+/b/////+/7+/tP////j/v79/9zTg//BsB7/vqsT/72rE/+9qhH/vaoR/72qEP+9qRH/vKkR/7ypEP+8qRD/vakR/7ypEf+7qBH/vKgP/7uoDv+7qA7/vKgP/7yoD/+7pw7/u6cP/7unD/+6pg//u6YP/7qmDv+6pg3/uqUO/7qlD/+5pQ//uqUQ/7mlEP+6pRH/uqUR/7qkEP+5pA//uaMQ/7mjEf+5oxL/uaIS/7miEv+4ohP/u6Yc/86+XP/z8Nr////+//7+/u3///+J/v7+GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EP///9/9/fn/6ua1/8q+Pv/BsRr/wLAZ/8GxHP/Vymf/9fLb//7+/f/+/v65////Rv7+/tX9/fr/181t/7+uFv+/rhb/v64W/7+uFv++rhb/v64W/8W1LP/n4Kn//Pv1//////3+/v79/v79/9zTg//BsB7/vqwT/76rE/+9qxL/vaoS/72qEf+9qhH/vaoR/72qEf+9qRH/vKkQ/7ypEP+8qRH/vKkR/7yoD/+8qA7/vKgO/7uoDv+7pw7/u6cP/7unD/+7pg//u6cP/7umD/+7pg7/uqUN/7qlDf+6pQ7/uqUP/7mkEP+6pBD/uqUR/7mkEf+5pBH/uaQP/7mjEP+4oxH/uaMR/7mjEv+7phz/0MFi//Pv2P/+/v7/////5f///3r///8W////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////DP///9/9/fv/7+zG/9XLZv/NwUj/zcBH/83BSf/e1of/+Pbl//7+/v////+5////RP7+/tX9/fr/181t/8CuFv/ArhX/v64V/7+uFv++rhX/v64W/76uFv/Gti//5t+m//r58P///////v79/9zTg//BsB7/vawT/76sE/++qxP/vasT/72rEv+9qhH/vaoR/72qEf+9qhH/vKoR/72pEf+9qRH/vKkR/7ypEf+8qQ//vKgO/7yoDv+8qA7/u6gO/7unD/+7pw//u6cO/7umD/+7pw//u6YN/7umDf+7pg3/uqUO/7qlD/+5pBD/uqUQ/7mkEP+5pRH/uaQQ/7mkD/+5pBD/uaQQ/72pIf/Txm3/9PHb//7+/f/////n////VgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Av///8n+/v7//Pv1//f04f/18tr/9fLa//Xy2v/49+j//f36//7+/v3+/v6j////QP///9X9/fr/181u/8CvFv/ArxX/wK8V/7+uFv+/rhb/v64V/7+uFv+/rhf/ybo6/+LbmP/5+Ov//v79/9zTg//Brx7/vqwT/76sEv+9qxP/vqwT/72rEv++qxL/vaoR/7yqEP+8qhH/vaoR/72qEf+9qRH/vakR/7ypEf+8qBD/vKgO/7yoDv+7qA7/vKgO/7yoDv+7pw//u6cP/7unDv+6pw//u6YP/7umDv+7pg3/u6YN/7qlDv+5pRD/uaUQ/7qkEP+6pRD/uqUR/7qkEP+6pA//wq8v/9rPgv/29OT//v37/////+////+BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///17////j/v7+///////+/v7///////7+/v/+/v7//v7+/////9H///9G////Pv7+/tX9/fr/181v/8CuGP/Arhb/wK8V/8CvFv+/rhb/v64W/76uFv++rhb/v68Y/8a3Mf/e1or/9/Xj/93Uhv/BsB7/vawS/76rE/++rBP/vawS/76rE/++qxP/vaoS/72qEf+9qhH/vakR/72qEf+9qhH/vakQ/72pEf+8qRH/vKkR/7ypD/+8qA7/vKgO/7unDv+8qA//vKgO/7unD/+7pw//u6cP/7umD/+7pg7/uqUN/7qlDf+5pA//uqUQ/7mkEP+5pRD/uqUR/7yoG//JuUb/49qe//n36v/+/v7/////7////4/+/v4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wj+/v4i////OP///1r+/v5m/v7+Zv///2z///98////sf7+/rn+/v6X/v7+nf///+H9/fr/181v/7+vGf/Arxj/wK4X/7+uFv+/rhb/v64W/7+uFv+/rhb/v64W/7+uFv/CsSH/29F7/9vQev/FtSz/vqwT/76sE/++rBP/vqwS/72rE/+9qxP/vasS/72qEf+9qhH/vaoR/7ypEP+9qhH/vaoR/72pEP+9qRD/vKkR/7ypEf+8qA7/vKgO/7yoDv+8qA//vKgO/7unD/+7pw//u6cP/7unD/+7pg//u6YO/7qlDf+6pQ7/uqUP/7qlEP+6pRH/wa4r/9PFZ//w68z//Pv2//7+/v3////R////UP///xD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////av7+/uX+/v7//v7+//7+/v////////////7+/v/9/fv/185w/8CwGf/Arxr/wK8b/8CvGf/Arxj/wK8X/7+uF/+/rhf/v64X/7+uF/+/rhf/v60X/9XJZv/b0Xv/y7xC/8CvHf++rBP/vawT/76sE/++rBP/vqsS/76rE/+9qxL/vaoR/72qEf+9qhH/vakQ/72qEf+9qRH/vKkR/72pEf+8qRD/vKkP/7yoDv+8qA7/vKgP/7uoD/+7qA//u6cO/7unD/+7pw//u6cP/7umDf+6pg7/u6YQ/8GtJv/Lu0z/6eK1//38+P///////v7+6/7+/qf///8sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////4/7+/f/59+n/7+vG/+3ovf/u6sH/7unA/+7qwf/s57v/2tF5/9DFVv/Sx13/0sdd/9LGXf/Sxlz/0sZb/9LGW//Sxlv/0sZb/9LGW//SxVr/0cRX/+jirf/7+vD/7+rE/9nPdv/Mvkb/wrIl/72sE/+9qxL/vqwT/76sE/+9qxP/vqsS/72qEf+8qhD/vaoR/72qEf+9qhD/vakR/72pEf+9qRH/vKgR/7yoD/+8qA7/vKgO/7yoDv+8qA//u6cP/7unD/+7pw//u6cP/7unEv/EsjD/z8BW/+LZmf/39OP//fz5//////f////J////ZP7+/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K/v7++/39+//r5rb/zsJM/8i7Nf/JvDn/ybs4/8m7Of/Iujb/29J8//Xy2v/39eT/9/Xj//f14v/39eL/9/Xi//f14v/39eL/9/Xi//f14v/39eL/9vTg//v68v///////fz5//n36//x7cz/3tWJ/9HEWf/Juj3/wrEj/72sEv+9qxL/vqsT/72rEv+8qhD/vKkQ/7yqEP+8qhD/vKkQ/72pEf+9qRH/vKkR/7ypEP+8qA7/u6gO/7yoDv+8qA//vKgP/72pE//CsSj/yrtF/9PGZv/m36j/9fPe//v68v/+/v3/////+f///7f///8+/v7+BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4M////+/39+v/n4aj/yLs2/8GyG//AsRr/wbEa/8GwGf/BsRv/3NN9//r57v/+/v7//v7+/////////////v7+/////////////////////////////v7+//////3////t////9f/////+/vz/+vnw//f15P/s573/3dSF/8/DVf/Juz3/xbYv/8KxI/+/rRj/vaoS/72qEf+9qhH/vaoR/72pEP+8qRH/vakR/7ypEf+8qRL/vqwZ/8GwI//FszD/yrpB/9PGYf/h2Zf/8u7S//j26f/8+/b////+///////////h/v7+XP///yD///8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8M/v7++/39+v/o4qv/ybw6/8GyHP/Ashr/wbEa/8GxGf/BsRv/29J8//n47P///////v7+dP7+/kb///9G////Rv///0b///9G////Rv///0b///9G////TP///yT///8I////Hv///43+/v7X////5/7+/vv+/v3//v37//38+P/29OH/6+a5/+Pbmv/a0Hv/1cln/9DCVP/MvUf/y7xD/8u8Q//LvEX/zb5M/9HDWv/Wym3/3NKD/+Tdof/u6cP/+vnu//39+v/+/vz//v7+//7+/vX////f////wf///1b+/v4M/v7+AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4M////+/39+v/o4qz/yrw7/8GyHP/BsRr/wbIb/8GyGv/Bshz/29J8//n47P///////v7+VP7+/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wr///8Y/v7+Gv///xj///8g////Vv///5v///+3////5/7+/v/+/v7//v79//7+/P/+/vz//fz5//r58P/49+n/9/Xk//f14//49ub/+fjr//z79P/9/fv//v37//7+/P/+/v3//v7+//7+/vn+/v7R////r////3z///8cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4M/v7++/39+v/o4qr/yrw5/8KyG//Bshv/wbIb/8GyG//Bsh3/29J8//n46///////////VP///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8W////ZP7+/pX///+n////qf7+/qf///+r////o/7+/of+/v5U////dv///+n+/v7//v7+/////////////v7+//7+/v/+/v7////+/////v/+/v7///////////////////////7+/v//////////+f///7v///9E/v7+CP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8M/v7++/39+v/n4qj/yLoy/8KyG//Cshv/wbIb/8CxGv/Bsh3/2dB1//n46v//////////Vv///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v5w/v7+6f7+/v/+/v7///////7+/v////////////////v////N/v7+JP7+/jz///9K/v7+Sv///0z+/v5M/v7+Tv///2D+/v67/////f/////////r////jf///1b///9O/v7+TP///0z+/v5K/v7+Rv7+/ij///8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4I////9/79+//v7Mb/2M5t/9HFVf/UyF3/08hc/9LIW//QxVX/5d6f//v68v///////v7+Sv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wz+/v6r/v7+//b03//s57n/6uWz/+vltv/p5LL/7unC//r47f/////9////UgAAAAD///8A/v7+AP///wD+/v4A/v7+AP7+/gT///8Q/v7+Gv///xr///8W/v7+Cv///wL///8A////AP///wD+/v4A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////FP///73+/v77//////7+/v/+/v7//v7+//7+/v/////p////aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+BP///yj///9a/v7+h/7+/rH////B/v7+of7+/mb///9C////DgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////Cv7+/hD+/v4U////Dv///wT///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////4D/////////////+AA/////////////wAA////////////+AAA////////////4AAA////////////wAAA////////////gAAA///////////+AAAA///////////8AAAA///////////4AAAA///////////wAAAA///////////gAAAA///////////AAAAA//////////+AAAAA//////////8AAAAA//////////8AAAAA//////////4AAAAA//////////wAAAAA//////////wAAAAA//////////gAAAAA//////////gAAAAH//////////AAAAB///////////AAAAD///////////AAAAf//////////+AAAA///////////+AAAB///////////8AAAD///////////8AAAH///////////8AAAH///////////8AAAP///////////8AAAf///////////4AAAf///////////4AAAf///////////4AAA////////////4AAA/////wAAH///4AAA/////gAAH///4AAA/////gAAD///4AAA/////gAAD///4AAA/////gAAD///4AAAf////gAAD///4AAAf////AAAD///8AAAf////AAAD///8AAAP////AAAH///8AAAH///+AAAH///8AAAH///8AAAH///8AAAD///8AAAH///+AAAD///4AAAP///+AAAB///4AAAP////AAAA///gAAAP////AAAAH/+AAAAf////AAAAD/8AAAAf////AAAAAfgAAAA/////AAAAAAAAAAA/////AAAAAAAAAAA///wHAAAAAAAAAAB///gDADgAAAAAAAD///ABADgAAAAAAAD///ABABgAAAAAAAH///ABAAgAAAAAAAH///ABAAAAAAAAAAP///ABAAAAAAAAAA////ABAAAAAAAAAB////ABAAAAAAAAAB////gDAAAAAAAAAD/////wAAAAAAAAAP/////AAAAAAAAAAf////+AAAAAAAAAB/////+AAAAAAAAAD/////+AAAAAAAAAP/////+AB//AAAAA//////+AB//4AAAH//////+AB/4DAAAf//////+AB/wB/g////////+AB/gB//////////+AB/gA///////////AB/gA//////////////gA//////////v///gA/////////4B///gB/////////4A///gB/////////4A///gB/////////4A///wB/////////4A//////////////4A//////////////4B//////////////+H/////////////////////////////////////////////////////////////////////////////////////////////8L
\ No newline at end of file
diff --git a/view/StateInfomation.cs b/view/StateInfomation.cs
new file mode 100644
index 0000000000000000000000000000000000000000..2b634a03e2eb81fd06424f8d58689969206b1cda
--- /dev/null
+++ b/view/StateInfomation.cs
@@ -0,0 +1,327 @@
+using MDL.Class;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace MDL
+{
+ public class StateInfomation : Form
+ {
+ public static StateInfo stateInfo;
+
+ private List tabPages;
+
+ private IContainer components = null;
+
+ private Label label1;
+
+ private TextBox textBox1;
+
+ private TextBox textBox2;
+
+ private Label label2;
+
+ private Label label3;
+
+ private ComboBox comboBox1;
+
+ private Label label4;
+
+ private TextBox textBox3;
+
+ private Button button1;
+
+ private Button button2;
+
+ private Label label5;
+
+ private Button button3;
+
+ private TabControl tabControl1;
+
+ private Button button4;
+
+ public StateInfomation(StateInfo s)
+ {
+ InitializeComponent();
+ stateInfo = s;
+ tabPages = new List();
+ textBox1.Text = stateInfo.ID;
+ textBox2.Text = stateInfo.Name;
+ comboBox1.Text = stateInfo.Type;
+ textBox3.Text = stateInfo.Description;
+ Event[] events = stateInfo.Events;
+ if (events.Length == 0)
+ {
+ button3_Click(null, null);
+ return;
+ }
+ for (int i = 0; i < events.Length; i++)
+ {
+ EventPage eventPage = new EventPage();
+ eventPage.Init(i + 1);
+ eventPage.Name = events[i].Name;
+ eventPage.Type = events[i].Type;
+ eventPage.Description = events[i].Description;
+ eventPage.Optional = events[i].Optional;
+ eventPage.Dataset = events[i].DatasetReference;
+ tabControl1.Controls.Add(eventPage.getPage());
+ tabPages.Add(eventPage);
+ }
+ }
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ List states = frm_mdl.States;
+ List