Content-Security-Policy: default-src 'none'
Content-Type: text/plain; charset=UTF-8
Content-Length: 1028
Content-Disposition: inline; filename="AboutViewVM.cs"
Last-Modified: Mon, 06 Jul 2026 19:54:54 GMT
Expires: Thu, 03 Jul 2036 19:54:54 GMT
ETag: "c05ce9982ec9104fb5800dd5bc28399e59847b66"

﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.BL;
using Tango.Core;
using Tango.MachineStudio.Common;
using Tango.MachineStudio.Common.StudioApplication;
using Tango.Settings;
using Tango.SharedUI;

namespace Tango.MachineStudio.UI.ViewModels
{
    public class AboutViewVM : DialogViewVM
    {
        public IStudioApplicationManager ApplicationManager { get; set; }

        public CoreSettings Settings { get; set; }

        public MachineStudioSettings MachineStudioSettings { get; set; }

        public DataSource DataSource { get; set; }

        public AboutViewVM(IStudioApplicationManager applicationManager)
        {
            ApplicationManager = applicationManager;
            Settings = SettingsManager.Default.GetOrCreate<CoreSettings>();
            MachineStudioSettings = SettingsManager.Default.GetOrCreate<MachineStudioSettings>();
            DataSource = ObservablesContext.GetActualDataSource();
        }
    }
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               <style>pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span><span class="c1">// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)</span>
<span class="c1">// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)</span>

<span class="k">using</span><span class="w"> </span><span class="nn">System</span><span class="p">;</span>
<span class="k">using</span><span class="w"> </span><span class="nn">System.Collections.Generic</span><span class="p">;</span>
<span class="k">using</span><span class="w"> </span><span class="nn">System.Diagnostics</span><span class="p">;</span>
<span class="k">using</span><span class="w"> </span><span class="nn">System.Text</span><span class="p">;</span>

<span class="k">namespace</span><span class="w"> </span><span class="nn">Tango.Scripting.Editors.Document</span>
<span class="p">{</span>
<span class="w">	</span><span class="k">using</span><span class="w"> </span><span class="nn">LineNode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">DocumentLine</span><span class="p">;</span>
<span class="w">	</span>
<span class="w">	</span><span class="c1">/// &lt;summary&gt;</span>
<span class="w">	</span><span class="c1">/// Data structure for efficient management of the document lines (most operations are O(lg n)).</span>
<span class="w">	</span><span class="c1">/// This implements an augmented red-black tree.</span>
<span class="w">	</span><span class="c1">/// See &lt;see cref=&quot;LineNode&quot;/&gt; for the augmented data.</span>
<span class="w">	</span><span class="c1">/// </span>
<span class="w">	</span><span class="c1">/// NOTE: The tree is never empty, initially it contains an empty line.</span>
<span class="w">	</span><span class="c1">/// &lt;/summary&gt;</span>
<span class="w">	</span><span class="k">sealed</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">DocumentLineTree</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">IList</span><span class="o">&lt;</span><span class="n">DocumentLine</span><span class="o">&gt;</span>
<span class="w">	</span><span class="p">{</span>
<span class="w">		</span><span class="cp">#region Constructor</span>
<span class="w">		</span><span class="k">readonly</span><span class="w"> </span><span class="n">TextDocument</span><span class="w"> </span><span class="n">document</span><span class="p">;</span>
<span class="w">		</span><span class="n">LineNode</span><span class="w"> </span><span class="n">root</span><span class="p">;</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">public</span><span class="w"> </span><span class="nf">DocumentLineTree</span><span class="p">(</span><span class="n">TextDocument</span><span class="w"> </span><span class="n">document</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">this</span><span class="p">.</span><span class="n">document</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">document</span><span class="p">;</span>
<span class="w">			</span>
<span class="w">			</span><span class="n">DocumentLine</span><span class="w"> </span><span class="n">emptyLine</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">DocumentLine</span><span class="p">(</span><span class="n">document</span><span class="p">);</span>
<span class="w">			</span><span class="n">root</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">emptyLine</span><span class="p">.</span><span class="n">InitLineNode</span><span class="p">();</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="cp">#endregion</span>
<span class="w">		</span>
<span class="w">		</span><span class="cp">#region Rotation callbacks</span>
<span class="w">		</span><span class="k">internal</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">UpdateAfterChildrenChange</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="kt">int</span><span class="w"> </span><span class="n">totalCount</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">;</span>
<span class="w">			</span><span class="kt">int</span><span class="w"> </span><span class="n">totalLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">TotalLength</span><span class="p">;</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">totalCount</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">nodeTotalCount</span><span class="p">;</span>
<span class="w">				</span><span class="n">totalLength</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">nodeTotalLength</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">totalCount</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">.</span><span class="n">nodeTotalCount</span><span class="p">;</span>
<span class="w">				</span><span class="n">totalLength</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">.</span><span class="n">nodeTotalLength</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">totalCount</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">nodeTotalCount</span>
<span class="w">			    </span><span class="o">||</span><span class="w"> </span><span class="n">totalLength</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">nodeTotalLength</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">				</span><span class="n">node</span><span class="p">.</span><span class="n">nodeTotalCount</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">totalCount</span><span class="p">;</span>
<span class="w">				</span><span class="n">node</span><span class="p">.</span><span class="n">nodeTotalLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">totalLength</span><span class="p">;</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="n">UpdateAfterChildrenChange</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">UpdateAfterRotateLeft</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">UpdateAfterChildrenChange</span><span class="p">(</span><span class="n">node</span><span class="p">);</span>
<span class="w">			</span>
<span class="w">			</span><span class="c1">// not required: rotations only happen on insertions/deletions</span>
<span class="w">			</span><span class="c1">// -&gt; totalCount changes -&gt; the parent is always updated</span>
<span class="w">			</span><span class="c1">//UpdateAfterChildrenChange(node.parent);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">UpdateAfterRotateRight</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">UpdateAfterChildrenChange</span><span class="p">(</span><span class="n">node</span><span class="p">);</span>
<span class="w">			</span>
<span class="w">			</span><span class="c1">// not required: rotations only happen on insertions/deletions</span>
<span class="w">			</span><span class="c1">// -&gt; totalCount changes -&gt; the parent is always updated</span>
<span class="w">			</span><span class="c1">//UpdateAfterChildrenChange(node.parent);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="cp">#endregion</span>
<span class="w">		</span>
<span class="w">		</span><span class="cp">#region RebuildDocument</span>
<span class="w">		</span><span class="c1">/// &lt;summary&gt;</span>
<span class="w">		</span><span class="c1">/// Rebuild the tree, in O(n).</span>
<span class="w">		</span><span class="c1">/// &lt;/summary&gt;</span>
<span class="w">		</span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">RebuildTree</span><span class="p">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">DocumentLine</span><span class="o">&gt;</span><span class="w"> </span><span class="n">documentLines</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">LineNode</span><span class="p">[]</span><span class="w"> </span><span class="n">nodes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">LineNode</span><span class="p">[</span><span class="n">documentLines</span><span class="p">.</span><span class="n">Count</span><span class="p">];</span>
<span class="w">			</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">documentLines</span><span class="p">.</span><span class="n">Count</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">DocumentLine</span><span class="w"> </span><span class="n">ls</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">documentLines</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
<span class="w">				</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ls</span><span class="p">.</span><span class="n">InitLineNode</span><span class="p">();</span>
<span class="w">				</span><span class="n">nodes</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">nodes</span><span class="p">.</span><span class="n">Length</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="m">0</span><span class="p">);</span>
<span class="w">			</span><span class="c1">// now build the corresponding balanced tree</span>
<span class="w">			</span><span class="kt">int</span><span class="w"> </span><span class="n">height</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">GetTreeHeight</span><span class="p">(</span><span class="n">nodes</span><span class="p">.</span><span class="n">Length</span><span class="p">);</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;DocumentLineTree will have height: &quot;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">height</span><span class="p">);</span>
<span class="w">			</span><span class="n">root</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BuildTree</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">nodes</span><span class="p">.</span><span class="n">Length</span><span class="p">,</span><span class="w"> </span><span class="n">height</span><span class="p">);</span>
<span class="w">			</span><span class="n">root</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLACK</span><span class="p">;</span>
<span class="w">			</span><span class="cp">#if DEBUG</span>
<span class="w">			</span><span class="n">CheckProperties</span><span class="p">();</span>
<span class="w">			</span><span class="cp">#endif</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">internal</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">GetTreeHeight</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">size</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">0</span><span class="p">)</span>
<span class="w">				</span><span class="k">return</span><span class="w"> </span><span class="m">0</span><span class="p">;</span>
<span class="w">			</span><span class="k">else</span>
<span class="w">				</span><span class="k">return</span><span class="w"> </span><span class="nf">GetTreeHeight</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">2</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">1</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="c1">/// &lt;summary&gt;</span>
<span class="w">		</span><span class="c1">/// build a tree from a list of nodes</span>
<span class="w">		</span><span class="c1">/// &lt;/summary&gt;</span>
<span class="w">		</span><span class="n">LineNode</span><span class="w"> </span><span class="nf">BuildTree</span><span class="p">(</span><span class="n">LineNode</span><span class="p">[]</span><span class="w"> </span><span class="n">nodes</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">start</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">end</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">subtreeHeight</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">start</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="n">end</span><span class="p">);</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">start</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">end</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">return</span><span class="w"> </span><span class="k">null</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="kt">int</span><span class="w"> </span><span class="n">middle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">start</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">end</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">2</span><span class="p">;</span>
<span class="w">			</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">nodes</span><span class="p">[</span><span class="n">middle</span><span class="p">];</span>
<span class="w">			</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BuildTree</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span><span class="w"> </span><span class="n">start</span><span class="p">,</span><span class="w"> </span><span class="n">middle</span><span class="p">,</span><span class="w"> </span><span class="n">subtreeHeight</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">);</span>
<span class="w">			</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BuildTree</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span><span class="w"> </span><span class="n">middle</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">end</span><span class="p">,</span><span class="w"> </span><span class="n">subtreeHeight</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">);</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">;</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">;</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">subtreeHeight</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">1</span><span class="p">)</span>
<span class="w">				</span><span class="n">node</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RED</span><span class="p">;</span>
<span class="w">			</span><span class="n">UpdateAfterChildrenChange</span><span class="p">(</span><span class="n">node</span><span class="p">);</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="n">node</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="cp">#endregion</span>
<span class="w">		</span>
<span class="w">		</span><span class="cp">#region GetNodeBy... / Get...FromNode</span>
<span class="w">		</span><span class="n">LineNode</span><span class="w"> </span><span class="nf">GetNodeByIndex</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="m">0</span><span class="p">);</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="n">nodeTotalCount</span><span class="p">);</span>
<span class="w">			</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">root</span><span class="p">;</span>
<span class="w">			</span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="k">true</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">nodeTotalCount</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">;</span>
<span class="w">				</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">						</span><span class="n">index</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">nodeTotalCount</span><span class="p">;</span>
<span class="w">					</span><span class="p">}</span>
<span class="w">					</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">0</span><span class="p">)</span>
<span class="w">						</span><span class="k">return</span><span class="w"> </span><span class="n">node</span><span class="p">;</span>
<span class="w">					</span><span class="n">index</span><span class="o">--</span><span class="p">;</span>
<span class="w">					</span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">;</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">internal</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">GetIndexFromNode</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">nodeTotalCount</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="m">0</span><span class="p">;</span>
<span class="w">			</span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="p">.</span><span class="n">right</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span>
<span class="w">						</span><span class="n">index</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">nodeTotalCount</span><span class="p">;</span>
<span class="w">					</span><span class="n">index</span><span class="o">++</span><span class="p">;</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">				</span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="n">index</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="n">LineNode</span><span class="w"> </span><span class="nf">GetNodeByOffset</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">offset</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">offset</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="m">0</span><span class="p">);</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">offset</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="n">nodeTotalLength</span><span class="p">);</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">offset</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="n">nodeTotalLength</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">return</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="n">RightMost</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">root</span><span class="p">;</span>
<span class="w">			</span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="k">true</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">offset</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">nodeTotalLength</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">;</span>
<span class="w">				</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">						</span><span class="n">offset</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">nodeTotalLength</span><span class="p">;</span>
<span class="w">					</span><span class="p">}</span>
<span class="w">					</span><span class="n">offset</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">TotalLength</span><span class="p">;</span>
<span class="w">					</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">offset</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="m">0</span><span class="p">)</span>
<span class="w">						</span><span class="k">return</span><span class="w"> </span><span class="n">node</span><span class="p">;</span>
<span class="w">					</span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">;</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">internal</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">GetOffsetFromNode</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="kt">int</span><span class="w"> </span><span class="n">offset</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">nodeTotalLength</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="m">0</span><span class="p">;</span>
<span class="w">			</span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="p">.</span><span class="n">right</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span>
<span class="w">						</span><span class="n">offset</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">nodeTotalLength</span><span class="p">;</span>
<span class="w">					</span><span class="n">offset</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="p">.</span><span class="n">TotalLength</span><span class="p">;</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">				</span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="n">offset</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="cp">#endregion</span>
<span class="w">		</span>
<span class="w">		</span><span class="cp">#region GetLineBy</span>
<span class="w">		</span><span class="k">public</span><span class="w"> </span><span class="n">DocumentLine</span><span class="w"> </span><span class="nf">GetByNumber</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">number</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="nf">GetNodeByIndex</span><span class="p">(</span><span class="n">number</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">public</span><span class="w"> </span><span class="n">DocumentLine</span><span class="w"> </span><span class="nf">GetByOffset</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">offset</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="nf">GetNodeByOffset</span><span class="p">(</span><span class="n">offset</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="cp">#endregion</span>
<span class="w">		</span>
<span class="w">		</span><span class="cp">#region LineCount</span>
<span class="w">		</span><span class="k">public</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">LineCount</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">get</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">return</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="n">nodeTotalCount</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="cp">#endregion</span>
<span class="w">		</span>
<span class="w">		</span><span class="cp">#region CheckProperties</span>
<span class="w">		</span><span class="cp">#if DEBUG</span>
<span class="w">		</span><span class="na">[Conditional(&quot;DATACONSISTENCYTEST&quot;)]</span>
<span class="w">		</span><span class="k">internal</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">CheckProperties</span><span class="p">()</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">nodeTotalLength</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">document</span><span class="p">.</span><span class="n">TextLength</span><span class="p">);</span>
<span class="w">			</span><span class="n">CheckProperties</span><span class="p">(</span><span class="n">root</span><span class="p">);</span>
<span class="w">			</span>
<span class="w">			</span><span class="c1">// check red-black property:</span>
<span class="w">			</span><span class="kt">int</span><span class="w"> </span><span class="n">blackCount</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="m">1</span><span class="p">;</span>
<span class="w">			</span><span class="n">CheckNodeProperties</span><span class="p">(</span><span class="n">root</span><span class="p">,</span><span class="w"> </span><span class="k">null</span><span class="p">,</span><span class="w"> </span><span class="n">RED</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="k">ref</span><span class="w"> </span><span class="n">blackCount</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">void</span><span class="w"> </span><span class="nf">CheckProperties</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="kt">int</span><span class="w"> </span><span class="n">totalCount</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">;</span>
<span class="w">			</span><span class="kt">int</span><span class="w"> </span><span class="n">totalLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">TotalLength</span><span class="p">;</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">CheckProperties</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">);</span>
<span class="w">				</span><span class="n">totalCount</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">nodeTotalCount</span><span class="p">;</span>
<span class="w">				</span><span class="n">totalLength</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">nodeTotalLength</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">CheckProperties</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">);</span>
<span class="w">				</span><span class="n">totalCount</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">.</span><span class="n">nodeTotalCount</span><span class="p">;</span>
<span class="w">				</span><span class="n">totalLength</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">.</span><span class="n">nodeTotalLength</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">nodeTotalCount</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">totalCount</span><span class="p">);</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">nodeTotalLength</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">totalLength</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="cm">/*</span>
<span class="cm">		1. A node is either red or black.</span>
<span class="cm">		2. The root is black.</span>
<span class="cm">		3. All leaves are black. (The leaves are the NIL children.)</span>
<span class="cm">		4. Both children of every red node are black. (So every red node must have a black parent.)</span>
<span class="cm">		5. Every simple path from a node to a descendant leaf contains the same number of black nodes. (Not counting the leaf node.)</span>
<span class="cm">		 */</span>
<span class="w">		</span><span class="k">void</span><span class="w"> </span><span class="nf">CheckNodeProperties</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="p">,</span><span class="w"> </span><span class="n">LineNode</span><span class="w"> </span><span class="n">parentNode</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">parentColor</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">blackCount</span><span class="p">,</span><span class="w"> </span><span class="k">ref</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">expectedBlackCount</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="w">			</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">parentNode</span><span class="p">);</span>
<span class="w">			</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">parentColor</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">RED</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">blackCount</span><span class="o">++</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// node is a leaf node:</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">expectedBlackCount</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">-</span><span class="m">1</span><span class="p">)</span>
<span class="w">					</span><span class="n">expectedBlackCount</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">blackCount</span><span class="p">;</span>
<span class="w">				</span><span class="k">else</span>
<span class="w">					</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">expectedBlackCount</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">blackCount</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="n">CheckNodeProperties</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">,</span><span class="w"> </span><span class="n">node</span><span class="p">,</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">color</span><span class="p">,</span><span class="w"> </span><span class="n">blackCount</span><span class="p">,</span><span class="w"> </span><span class="k">ref</span><span class="w"> </span><span class="n">expectedBlackCount</span><span class="p">);</span>
<span class="w">			</span><span class="n">CheckNodeProperties</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">,</span><span class="w"> </span><span class="n">node</span><span class="p">,</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">color</span><span class="p">,</span><span class="w"> </span><span class="n">blackCount</span><span class="p">,</span><span class="w"> </span><span class="k">ref</span><span class="w"> </span><span class="n">expectedBlackCount</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="na">[System.Diagnostics.CodeAnalysis.SuppressMessage(&quot;Microsoft.Performance&quot;, &quot;CA1811:AvoidUncalledPrivateCode&quot;)]</span>
<span class="w">		</span><span class="k">public</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="nf">GetTreeAsString</span><span class="p">()</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">StringBuilder</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">StringBuilder</span><span class="p">();</span>
<span class="w">			</span><span class="n">AppendTreeToString</span><span class="p">(</span><span class="n">root</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">);</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">ToString</span><span class="p">();</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">AppendTreeToString</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="p">,</span><span class="w"> </span><span class="n">StringBuilder</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">indent</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">RED</span><span class="p">)</span>
<span class="w">				</span><span class="n">b</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="s">&quot;RED   &quot;</span><span class="p">);</span>
<span class="w">			</span><span class="k">else</span>
<span class="w">				</span><span class="n">b</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="s">&quot;BLACK &quot;</span><span class="p">);</span>
<span class="w">			</span><span class="n">b</span><span class="p">.</span><span class="n">AppendLine</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">ToString</span><span class="p">());</span>
<span class="w">			</span><span class="n">indent</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="m">2</span><span class="p">;</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">b</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="sc">&#39; &#39;</span><span class="p">,</span><span class="w"> </span><span class="n">indent</span><span class="p">);</span>
<span class="w">				</span><span class="n">b</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="s">&quot;L: &quot;</span><span class="p">);</span>
<span class="w">				</span><span class="n">AppendTreeToString</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="n">indent</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">b</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="sc">&#39; &#39;</span><span class="p">,</span><span class="w"> </span><span class="n">indent</span><span class="p">);</span>
<span class="w">				</span><span class="n">b</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="s">&quot;R: &quot;</span><span class="p">);</span>
<span class="w">				</span><span class="n">AppendTreeToString</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="n">indent</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="cp">#endif</span>
<span class="w">		</span><span class="cp">#endregion</span>
<span class="w">		</span>
<span class="w">		</span><span class="cp">#region Insert/Remove lines</span>
<span class="w">		</span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">RemoveLine</span><span class="p">(</span><span class="n">DocumentLine</span><span class="w"> </span><span class="n">line</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">RemoveNode</span><span class="p">(</span><span class="n">line</span><span class="p">);</span>
<span class="w">			</span><span class="n">line</span><span class="p">.</span><span class="n">isDeleted</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">true</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">public</span><span class="w"> </span><span class="n">DocumentLine</span><span class="w"> </span><span class="nf">InsertLineAfter</span><span class="p">(</span><span class="n">DocumentLine</span><span class="w"> </span><span class="n">line</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">totalLength</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">DocumentLine</span><span class="w"> </span><span class="n">newLine</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">DocumentLine</span><span class="p">(</span><span class="n">document</span><span class="p">);</span>
<span class="w">			</span><span class="n">newLine</span><span class="p">.</span><span class="n">TotalLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">totalLength</span><span class="p">;</span>
<span class="w">			</span>
<span class="w">			</span><span class="n">InsertAfter</span><span class="p">(</span><span class="n">line</span><span class="p">,</span><span class="w"> </span><span class="n">newLine</span><span class="p">);</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="n">newLine</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">void</span><span class="w"> </span><span class="nf">InsertAfter</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="p">,</span><span class="w"> </span><span class="n">DocumentLine</span><span class="w"> </span><span class="n">newLine</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">LineNode</span><span class="w"> </span><span class="n">newNode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">newLine</span><span class="p">.</span><span class="n">InitLineNode</span><span class="p">();</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">InsertAsRight</span><span class="p">(</span><span class="n">node</span><span class="p">,</span><span class="w"> </span><span class="n">newNode</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">InsertAsLeft</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">.</span><span class="n">LeftMost</span><span class="p">,</span><span class="w"> </span><span class="n">newNode</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="cp">#endregion</span>
<span class="w">		</span>
<span class="w">		</span><span class="cp">#region Red/Black Tree</span>
<span class="w">		</span><span class="k">internal</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">RED</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">true</span><span class="p">;</span>
<span class="w">		</span><span class="k">internal</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">BLACK</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">false</span><span class="p">;</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">void</span><span class="w"> </span><span class="nf">InsertAsLeft</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">parentNode</span><span class="p">,</span><span class="w"> </span><span class="n">LineNode</span><span class="w"> </span><span class="n">newNode</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">parentNode</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="p">);</span>
<span class="w">			</span><span class="n">parentNode</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">newNode</span><span class="p">;</span>
<span class="w">			</span><span class="n">newNode</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">parentNode</span><span class="p">;</span>
<span class="w">			</span><span class="n">newNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RED</span><span class="p">;</span>
<span class="w">			</span><span class="n">UpdateAfterChildrenChange</span><span class="p">(</span><span class="n">parentNode</span><span class="p">);</span>
<span class="w">			</span><span class="n">FixTreeOnInsert</span><span class="p">(</span><span class="n">newNode</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">void</span><span class="w"> </span><span class="nf">InsertAsRight</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">parentNode</span><span class="p">,</span><span class="w"> </span><span class="n">LineNode</span><span class="w"> </span><span class="n">newNode</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">parentNode</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="p">);</span>
<span class="w">			</span><span class="n">parentNode</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">newNode</span><span class="p">;</span>
<span class="w">			</span><span class="n">newNode</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">parentNode</span><span class="p">;</span>
<span class="w">			</span><span class="n">newNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RED</span><span class="p">;</span>
<span class="w">			</span><span class="n">UpdateAfterChildrenChange</span><span class="p">(</span><span class="n">parentNode</span><span class="p">);</span>
<span class="w">			</span><span class="n">FixTreeOnInsert</span><span class="p">(</span><span class="n">newNode</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">void</span><span class="w"> </span><span class="nf">FixTreeOnInsert</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">node</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">);</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">RED</span><span class="p">);</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span><span class="p">);</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span><span class="p">);</span>
<span class="w">			</span>
<span class="w">			</span><span class="n">LineNode</span><span class="w"> </span><span class="n">parentNode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="p">;</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">parentNode</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// we inserted in the root -&gt; the node must be black</span>
<span class="w">				</span><span class="c1">// since this is a root node, making the node black increments the number of black nodes</span>
<span class="w">				</span><span class="c1">// on all paths by one, so it is still the same for all paths.</span>
<span class="w">				</span><span class="n">node</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLACK</span><span class="p">;</span>
<span class="w">				</span><span class="k">return</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">parentNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// if the parent node where we inserted was black, our red node is placed correctly.</span>
<span class="w">				</span><span class="c1">// since we inserted a red node, the number of black nodes on each path is unchanged</span>
<span class="w">				</span><span class="c1">// -&gt; the tree is still balanced</span>
<span class="w">				</span><span class="k">return</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="c1">// parentNode is red, so there is a conflict here!</span>
<span class="w">			</span>
<span class="w">			</span><span class="c1">// because the root is black, parentNode is not the root -&gt; there is a grandparent node</span>
<span class="w">			</span><span class="n">LineNode</span><span class="w"> </span><span class="n">grandparentNode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">parentNode</span><span class="p">.</span><span class="n">parent</span><span class="p">;</span>
<span class="w">			</span><span class="n">LineNode</span><span class="w"> </span><span class="n">uncleNode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Sibling</span><span class="p">(</span><span class="n">parentNode</span><span class="p">);</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">uncleNode</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">uncleNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">RED</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">parentNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLACK</span><span class="p">;</span>
<span class="w">				</span><span class="n">uncleNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLACK</span><span class="p">;</span>
<span class="w">				</span><span class="n">grandparentNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RED</span><span class="p">;</span>
<span class="w">				</span><span class="n">FixTreeOnInsert</span><span class="p">(</span><span class="n">grandparentNode</span><span class="p">);</span>
<span class="w">				</span><span class="k">return</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="c1">// now we know: parent is red but uncle is black</span>
<span class="w">			</span><span class="c1">// First rotation:</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">parentNode</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">parentNode</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">grandparentNode</span><span class="p">.</span><span class="n">left</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">RotateLeft</span><span class="p">(</span><span class="n">parentNode</span><span class="p">);</span>
<span class="w">				</span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">parentNode</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">parentNode</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">grandparentNode</span><span class="p">.</span><span class="n">right</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">RotateRight</span><span class="p">(</span><span class="n">parentNode</span><span class="p">);</span>
<span class="w">				</span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="c1">// because node might have changed, reassign variables:</span>
<span class="w">			</span><span class="n">parentNode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="p">;</span>
<span class="w">			</span><span class="n">grandparentNode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">parentNode</span><span class="p">.</span><span class="n">parent</span><span class="p">;</span>
<span class="w">			</span>
<span class="w">			</span><span class="c1">// Now recolor a bit:</span>
<span class="w">			</span><span class="n">parentNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLACK</span><span class="p">;</span>
<span class="w">			</span><span class="n">grandparentNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RED</span><span class="p">;</span>
<span class="w">			</span><span class="c1">// Second rotation:</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">parentNode</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">parentNode</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">grandparentNode</span><span class="p">.</span><span class="n">left</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">RotateRight</span><span class="p">(</span><span class="n">grandparentNode</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// because of the first rotation, this is guaranteed:</span>
<span class="w">				</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">node</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">parentNode</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">parentNode</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">grandparentNode</span><span class="p">.</span><span class="n">right</span><span class="p">);</span>
<span class="w">				</span><span class="n">RotateLeft</span><span class="p">(</span><span class="n">grandparentNode</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">void</span><span class="w"> </span><span class="nf">RemoveNode</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">removedNode</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">removedNode</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">removedNode</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// replace removedNode with it&#39;s in-order successor</span>
<span class="w">				</span>
<span class="w">				</span><span class="n">LineNode</span><span class="w"> </span><span class="n">leftMost</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">removedNode</span><span class="p">.</span><span class="n">right</span><span class="p">.</span><span class="n">LeftMost</span><span class="p">;</span>
<span class="w">				</span><span class="n">RemoveNode</span><span class="p">(</span><span class="n">leftMost</span><span class="p">);</span><span class="w"> </span><span class="c1">// remove leftMost from its current location</span>
<span class="w">				</span>
<span class="w">				</span><span class="c1">// and overwrite the removedNode with it</span>
<span class="w">				</span><span class="n">ReplaceNode</span><span class="p">(</span><span class="n">removedNode</span><span class="p">,</span><span class="w"> </span><span class="n">leftMost</span><span class="p">);</span>
<span class="w">				</span><span class="n">leftMost</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">removedNode</span><span class="p">.</span><span class="n">left</span><span class="p">;</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">leftMost</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="n">leftMost</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">leftMost</span><span class="p">;</span>
<span class="w">				</span><span class="n">leftMost</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">removedNode</span><span class="p">.</span><span class="n">right</span><span class="p">;</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">leftMost</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="n">leftMost</span><span class="p">.</span><span class="n">right</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">leftMost</span><span class="p">;</span>
<span class="w">				</span><span class="n">leftMost</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">removedNode</span><span class="p">.</span><span class="n">color</span><span class="p">;</span>
<span class="w">				</span>
<span class="w">				</span><span class="n">UpdateAfterChildrenChange</span><span class="p">(</span><span class="n">leftMost</span><span class="p">);</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">leftMost</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="n">UpdateAfterChildrenChange</span><span class="p">(</span><span class="n">leftMost</span><span class="p">.</span><span class="n">parent</span><span class="p">);</span>
<span class="w">				</span><span class="k">return</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span>
<span class="w">			</span><span class="c1">// now either removedNode.left or removedNode.right is null</span>
<span class="w">			</span><span class="c1">// get the remaining child</span>
<span class="w">			</span><span class="n">LineNode</span><span class="w"> </span><span class="n">parentNode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">removedNode</span><span class="p">.</span><span class="n">parent</span><span class="p">;</span>
<span class="w">			</span><span class="n">LineNode</span><span class="w"> </span><span class="n">childNode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">removedNode</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">??</span><span class="w"> </span><span class="n">removedNode</span><span class="p">.</span><span class="n">right</span><span class="p">;</span>
<span class="w">			</span><span class="n">ReplaceNode</span><span class="p">(</span><span class="n">removedNode</span><span class="p">,</span><span class="w"> </span><span class="n">childNode</span><span class="p">);</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">parentNode</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="n">UpdateAfterChildrenChange</span><span class="p">(</span><span class="n">parentNode</span><span class="p">);</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">removedNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">childNode</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">childNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">RED</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">childNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLACK</span><span class="p">;</span>
<span class="w">				</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">FixTreeOnDelete</span><span class="p">(</span><span class="n">childNode</span><span class="p">,</span><span class="w"> </span><span class="n">parentNode</span><span class="p">);</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">void</span><span class="w"> </span><span class="nf">FixTreeOnDelete</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="p">,</span><span class="w"> </span><span class="n">LineNode</span><span class="w"> </span><span class="n">parentNode</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">node</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">parentNode</span><span class="p">);</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">parentNode</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="p">)</span>
<span class="w">				</span><span class="k">return</span><span class="p">;</span>
<span class="w">			</span>
<span class="w">			</span><span class="c1">// warning: node may be null</span>
<span class="w">			</span><span class="n">LineNode</span><span class="w"> </span><span class="n">sibling</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Sibling</span><span class="p">(</span><span class="n">node</span><span class="p">,</span><span class="w"> </span><span class="n">parentNode</span><span class="p">);</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">sibling</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">RED</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">parentNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RED</span><span class="p">;</span>
<span class="w">				</span><span class="n">sibling</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLACK</span><span class="p">;</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">parentNode</span><span class="p">.</span><span class="n">left</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">RotateLeft</span><span class="p">(</span><span class="n">parentNode</span><span class="p">);</span>
<span class="w">				</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">RotateRight</span><span class="p">(</span><span class="n">parentNode</span><span class="p">);</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">				</span>
<span class="w">				</span><span class="n">sibling</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Sibling</span><span class="p">(</span><span class="n">node</span><span class="p">,</span><span class="w"> </span><span class="n">parentNode</span><span class="p">);</span><span class="w"> </span><span class="c1">// update value of sibling after rotation</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">parentNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span>
<span class="w">			    </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">sibling</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span>
<span class="w">			    </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">GetColor</span><span class="p">(</span><span class="n">sibling</span><span class="p">.</span><span class="n">left</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span>
<span class="w">			    </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">GetColor</span><span class="p">(</span><span class="n">sibling</span><span class="p">.</span><span class="n">right</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">				</span><span class="n">sibling</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RED</span><span class="p">;</span>
<span class="w">				</span><span class="n">FixTreeOnDelete</span><span class="p">(</span><span class="n">parentNode</span><span class="p">,</span><span class="w"> </span><span class="n">parentNode</span><span class="p">.</span><span class="n">parent</span><span class="p">);</span>
<span class="w">				</span><span class="k">return</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">parentNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">RED</span>
<span class="w">			    </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">sibling</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span>
<span class="w">			    </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">GetColor</span><span class="p">(</span><span class="n">sibling</span><span class="p">.</span><span class="n">left</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span>
<span class="w">			    </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">GetColor</span><span class="p">(</span><span class="n">sibling</span><span class="p">.</span><span class="n">right</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">				</span><span class="n">sibling</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RED</span><span class="p">;</span>
<span class="w">				</span><span class="n">parentNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLACK</span><span class="p">;</span>
<span class="w">				</span><span class="k">return</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">parentNode</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">&amp;&amp;</span>
<span class="w">			    </span><span class="n">sibling</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span><span class="w"> </span><span class="o">&amp;&amp;</span>
<span class="w">			    </span><span class="n">GetColor</span><span class="p">(</span><span class="n">sibling</span><span class="p">.</span><span class="n">left</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">RED</span><span class="w"> </span><span class="o">&amp;&amp;</span>
<span class="w">			    </span><span class="n">GetColor</span><span class="p">(</span><span class="n">sibling</span><span class="p">.</span><span class="n">right</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">				</span><span class="n">sibling</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RED</span><span class="p">;</span>
<span class="w">				</span><span class="n">sibling</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLACK</span><span class="p">;</span>
<span class="w">				</span><span class="n">RotateRight</span><span class="p">(</span><span class="n">sibling</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">else</span><span class="w"> </span><span class="nf">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">parentNode</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">&amp;&amp;</span>
<span class="w">			         </span><span class="n">sibling</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span><span class="w"> </span><span class="o">&amp;&amp;</span>
<span class="w">			         </span><span class="n">GetColor</span><span class="p">(</span><span class="n">sibling</span><span class="p">.</span><span class="n">right</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">RED</span><span class="w"> </span><span class="o">&amp;&amp;</span>
<span class="w">			         </span><span class="n">GetColor</span><span class="p">(</span><span class="n">sibling</span><span class="p">.</span><span class="n">left</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">BLACK</span><span class="p">)</span>
<span class="w">			</span><span class="p">{</span>
<span class="w">				</span><span class="n">sibling</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RED</span><span class="p">;</span>
<span class="w">				</span><span class="n">sibling</span><span class="p">.</span><span class="n">right</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLACK</span><span class="p">;</span>
<span class="w">				</span><span class="n">RotateLeft</span><span class="p">(</span><span class="n">sibling</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="n">sibling</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Sibling</span><span class="p">(</span><span class="n">node</span><span class="p">,</span><span class="w"> </span><span class="n">parentNode</span><span class="p">);</span><span class="w"> </span><span class="c1">// update value of sibling after rotation</span>
<span class="w">			</span>
<span class="w">			</span><span class="n">sibling</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">parentNode</span><span class="p">.</span><span class="n">color</span><span class="p">;</span>
<span class="w">			</span><span class="n">parentNode</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLACK</span><span class="p">;</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">parentNode</span><span class="p">.</span><span class="n">left</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">sibling</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">sibling</span><span class="p">.</span><span class="n">right</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">RED</span><span class="p">);</span>
<span class="w">					</span><span class="n">sibling</span><span class="p">.</span><span class="n">right</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLACK</span><span class="p">;</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">				</span><span class="n">RotateLeft</span><span class="p">(</span><span class="n">parentNode</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">sibling</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">sibling</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">RED</span><span class="p">);</span>
<span class="w">					</span><span class="n">sibling</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BLACK</span><span class="p">;</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">				</span><span class="n">RotateRight</span><span class="p">(</span><span class="n">parentNode</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">void</span><span class="w"> </span><span class="nf">ReplaceNode</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">replacedNode</span><span class="p">,</span><span class="w"> </span><span class="n">LineNode</span><span class="w"> </span><span class="n">newNode</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">replacedNode</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">replacedNode</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">root</span><span class="p">);</span>
<span class="w">				</span><span class="n">root</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">newNode</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">replacedNode</span><span class="p">.</span><span class="n">parent</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">replacedNode</span><span class="p">)</span>
<span class="w">					</span><span class="n">replacedNode</span><span class="p">.</span><span class="n">parent</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">newNode</span><span class="p">;</span>
<span class="w">				</span><span class="k">else</span>
<span class="w">					</span><span class="n">replacedNode</span><span class="p">.</span><span class="n">parent</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">newNode</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">newNode</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">newNode</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">replacedNode</span><span class="p">.</span><span class="n">parent</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="n">replacedNode</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">null</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">void</span><span class="w"> </span><span class="nf">RotateLeft</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">p</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="c1">// let q be p&#39;s right child</span>
<span class="w">			</span><span class="n">LineNode</span><span class="w"> </span><span class="n">q</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">right</span><span class="p">;</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">q</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">);</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">q</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">p</span><span class="p">);</span>
<span class="w">			</span><span class="c1">// set q to be the new root</span>
<span class="w">			</span><span class="n">ReplaceNode</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="n">q</span><span class="p">);</span>
<span class="w">			</span>
<span class="w">			</span><span class="c1">// set p&#39;s right child to be q&#39;s left child</span>
<span class="w">			</span><span class="n">p</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">q</span><span class="p">.</span><span class="n">left</span><span class="p">;</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">p</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">right</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">p</span><span class="p">;</span>
<span class="w">			</span><span class="c1">// set q&#39;s left child to be p</span>
<span class="w">			</span><span class="n">q</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">p</span><span class="p">;</span>
<span class="w">			</span><span class="n">p</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">q</span><span class="p">;</span>
<span class="w">			</span><span class="n">UpdateAfterRotateLeft</span><span class="p">(</span><span class="n">p</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">void</span><span class="w"> </span><span class="nf">RotateRight</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">p</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="c1">// let q be p&#39;s left child</span>
<span class="w">			</span><span class="n">LineNode</span><span class="w"> </span><span class="n">q</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">left</span><span class="p">;</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">q</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">);</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">q</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">p</span><span class="p">);</span>
<span class="w">			</span><span class="c1">// set q to be the new root</span>
<span class="w">			</span><span class="n">ReplaceNode</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="n">q</span><span class="p">);</span>
<span class="w">			</span>
<span class="w">			</span><span class="c1">// set p&#39;s left child to be q&#39;s right child</span>
<span class="w">			</span><span class="n">p</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">q</span><span class="p">.</span><span class="n">right</span><span class="p">;</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">p</span><span class="p">.</span><span class="n">left</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">left</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">p</span><span class="p">;</span>
<span class="w">			</span><span class="c1">// set q&#39;s right child to be p</span>
<span class="w">			</span><span class="n">q</span><span class="p">.</span><span class="n">right</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">p</span><span class="p">;</span>
<span class="w">			</span><span class="n">p</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">q</span><span class="p">;</span>
<span class="w">			</span><span class="n">UpdateAfterRotateRight</span><span class="p">(</span><span class="n">p</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">static</span><span class="w"> </span><span class="n">LineNode</span><span class="w"> </span><span class="nf">Sibling</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="p">.</span><span class="n">left</span><span class="p">)</span>
<span class="w">				</span><span class="k">return</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="p">.</span><span class="n">right</span><span class="p">;</span>
<span class="w">			</span><span class="k">else</span>
<span class="w">				</span><span class="k">return</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="p">.</span><span class="n">left</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">static</span><span class="w"> </span><span class="n">LineNode</span><span class="w"> </span><span class="nf">Sibling</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="p">,</span><span class="w"> </span><span class="n">LineNode</span><span class="w"> </span><span class="n">parentNode</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">node</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">parent</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">parentNode</span><span class="p">);</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">parentNode</span><span class="p">.</span><span class="n">left</span><span class="p">)</span>
<span class="w">				</span><span class="k">return</span><span class="w"> </span><span class="n">parentNode</span><span class="p">.</span><span class="n">right</span><span class="p">;</span>
<span class="w">			</span><span class="k">else</span>
<span class="w">				</span><span class="k">return</span><span class="w"> </span><span class="n">parentNode</span><span class="p">.</span><span class="n">left</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">static</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="nf">GetColor</span><span class="p">(</span><span class="n">LineNode</span><span class="w"> </span><span class="n">node</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="n">node</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">color</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">BLACK</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="cp">#endregion</span>
<span class="w">		</span>
<span class="w">		</span><span class="cp">#region IList implementation</span>
<span class="w">		</span><span class="n">DocumentLine</span><span class="w"> </span><span class="n">IList</span><span class="o">&lt;</span><span class="n">DocumentLine</span><span class="o">&gt;</span><span class="p">.</span><span class="k">this</span><span class="p">[</span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">get</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">document</span><span class="p">.</span><span class="n">VerifyAccess</span><span class="p">();</span>
<span class="w">				</span><span class="k">return</span><span class="w"> </span><span class="nf">GetByNumber</span><span class="p">(</span><span class="m">1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">index</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">set</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">NotSupportedException</span><span class="p">();</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="kt">int</span><span class="w"> </span><span class="n">ICollection</span><span class="o">&lt;</span><span class="n">DocumentLine</span><span class="o">&gt;</span><span class="p">.</span><span class="n">Count</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">get</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">document</span><span class="p">.</span><span class="n">VerifyAccess</span><span class="p">();</span>
<span class="w">				</span><span class="k">return</span><span class="w"> </span><span class="n">LineCount</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="kt">bool</span><span class="w"> </span><span class="n">ICollection</span><span class="o">&lt;</span><span class="n">DocumentLine</span><span class="o">&gt;</span><span class="p">.</span><span class="n">IsReadOnly</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">get</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">true</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="kt">int</span><span class="w"> </span><span class="n">IList</span><span class="o">&lt;</span><span class="n">DocumentLine</span><span class="o">&gt;</span><span class="p">.</span><span class="n">IndexOf</span><span class="p">(</span><span class="n">DocumentLine</span><span class="w"> </span><span class="n">item</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">document</span><span class="p">.</span><span class="n">VerifyAccess</span><span class="p">();</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">item</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">item</span><span class="p">.</span><span class="n">IsDeleted</span><span class="p">)</span>
<span class="w">				</span><span class="k">return</span><span class="w"> </span><span class="o">-</span><span class="m">1</span><span class="p">;</span>
<span class="w">			</span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">item</span><span class="p">.</span><span class="n">LineNumber</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">;</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">LineCount</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">GetNodeByIndex</span><span class="p">(</span><span class="n">index</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">item</span><span class="p">)</span>
<span class="w">				</span><span class="k">return</span><span class="w"> </span><span class="n">index</span><span class="p">;</span>
<span class="w">			</span><span class="k">else</span>
<span class="w">				</span><span class="k">return</span><span class="w"> </span><span class="o">-</span><span class="m">1</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">void</span><span class="w"> </span><span class="n">IList</span><span class="o">&lt;</span><span class="n">DocumentLine</span><span class="o">&gt;</span><span class="p">.</span><span class="n">Insert</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="p">,</span><span class="w"> </span><span class="n">DocumentLine</span><span class="w"> </span><span class="n">item</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">NotSupportedException</span><span class="p">();</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">void</span><span class="w"> </span><span class="n">IList</span><span class="o">&lt;</span><span class="n">DocumentLine</span><span class="o">&gt;</span><span class="p">.</span><span class="n">RemoveAt</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">NotSupportedException</span><span class="p">();</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">void</span><span class="w"> </span><span class="n">ICollection</span><span class="o">&lt;</span><span class="n">DocumentLine</span><span class="o">&gt;</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">DocumentLine</span><span class="w"> </span><span class="n">item</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">NotSupportedException</span><span class="p">();</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">void</span><span class="w"> </span><span class="n">ICollection</span><span class="o">&lt;</span><span class="n">DocumentLine</span><span class="o">&gt;</span><span class="p">.</span><span class="n">Clear</span><span class="p">()</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">NotSupportedException</span><span class="p">();</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="kt">bool</span><span class="w"> </span><span class="n">ICollection</span><span class="o">&lt;</span><span class="n">DocumentLine</span><span class="o">&gt;</span><span class="p">.</span><span class="n">Contains</span><span class="p">(</span><span class="n">DocumentLine</span><span class="w"> </span><span class="n">item</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">IList</span><span class="o">&lt;</span><span class="n">DocumentLine</span><span class="o">&gt;</span><span class="w"> </span><span class="n">self</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">;</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">IndexOf</span><span class="p">(</span><span class="n">item</span><span class="p">)</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="m">0</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">void</span><span class="w"> </span><span class="n">ICollection</span><span class="o">&lt;</span><span class="n">DocumentLine</span><span class="o">&gt;</span><span class="p">.</span><span class="n">CopyTo</span><span class="p">(</span><span class="n">DocumentLine</span><span class="p">[]</span><span class="w"> </span><span class="n">array</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">arrayIndex</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">array</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="p">)</span>
<span class="w">				</span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">ArgumentNullException</span><span class="p">(</span><span class="s">&quot;array&quot;</span><span class="p">);</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">array</span><span class="p">.</span><span class="n">Length</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">LineCount</span><span class="p">)</span>
<span class="w">				</span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">ArgumentException</span><span class="p">(</span><span class="s">&quot;The array is too small&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;array&quot;</span><span class="p">);</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">arrayIndex</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">arrayIndex</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">LineCount</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">array</span><span class="p">.</span><span class="n">Length</span><span class="p">)</span>
<span class="w">				</span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">ArgumentOutOfRangeException</span><span class="p">(</span><span class="s">&quot;arrayIndex&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrayIndex</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Value must be between 0 and &quot;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="n">array</span><span class="p">.</span><span class="n">Length</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">LineCount</span><span class="p">));</span>
<span class="w">			</span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">DocumentLine</span><span class="w"> </span><span class="n">ls</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="k">this</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">array</span><span class="p">[</span><span class="n">arrayIndex</span><span class="o">++</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ls</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="kt">bool</span><span class="w"> </span><span class="n">ICollection</span><span class="o">&lt;</span><span class="n">DocumentLine</span><span class="o">&gt;</span><span class="p">.</span><span class="n">Remove</span><span class="p">(</span><span class="n">DocumentLine</span><span class="w"> </span><span class="n">item</span><span class="p">)</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">NotSupportedException</span><span class="p">();</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="k">public</span><span class="w"> </span><span class="n">IEnumerator</span><span class="o">&lt;</span><span class="n">DocumentLine</span><span class="o">&gt;</span><span class="w"> </span><span class="n">GetEnumerator</span><span class="p">()</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">document</span><span class="p">.</span><span class="n">VerifyAccess</span><span class="p">();</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="nf">Enumerate</span><span class="p">();</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="n">IEnumerator</span><span class="o">&lt;</span><span class="n">DocumentLine</span><span class="o">&gt;</span><span class="w"> </span><span class="n">Enumerate</span><span class="p">()</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="n">document</span><span class="p">.</span><span class="n">VerifyAccess</span><span class="p">();</span>
<span class="w">			</span><span class="n">DocumentLine</span><span class="w"> </span><span class="n">line</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="n">LeftMost</span><span class="p">;</span>
<span class="w">			</span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">line</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">yield</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">line</span><span class="p">;</span>
<span class="w">				</span><span class="n">line</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">line</span><span class="p">.</span><span class="n">NextLine</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span>
<span class="w">		</span><span class="n">System</span><span class="p">.</span><span class="n">Collections</span><span class="p">.</span><span class="n">IEnumerator</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="n">Collections</span><span class="p">.</span><span class="n">IEnumerable</span><span class="p">.</span><span class="n">GetEnumerator</span><span class="p">()</span>
<span class="w">		</span><span class="p">{</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">GetEnumerator</span><span class="p">();</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="cp">#endregion</span>
<span class="w">	</span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.3.1</a> (<a href='https://git-scm.com/'>git 2.54.0</a>) at 2026-07-06 19:54:54 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
