Change on 2010-11-10 08:59:11-08:00 by elbaum
Skip contents of noscript tags.
Tested:
All tests pass.
R=aharon
DELTA=31 (25 added, 1 deleted, 5 changed)
Change on 2010-12-09 01:29:56-08:00 by elbaum
Support FakeBiDi when identifying undeclared opposite-directionality text.
Tested:
New tests added and pass.
R=aharon
DELTA=18 (13 added, 0 deleted, 5 changed)
Change on 2011-01-20 03:48:07-08:00 by elbaum
Support filtering by XPath expressions for browsers that support them natively.
(Attempting to use them on IE will throw an exception.)
Tested:
All tests pass.
R=aharon
DELTA=500 (477 added, 2 deleted, 21 changed)
Change on 2011-01-22 13:23:00-08:00 by elbaum
Test fix: Disable an XPath test on IE.
Tested:
Ran test suite successfully on IE.
R=aharon
DELTA=42 (4 added, 0 deleted, 38 changed)
Change on 2011-01-30 08:35:37-08:00 by elbaum
Update open-source user's guide with recent changes.
Tested:
Looks okay in Firefox.
R=aharon
DELTA=13 (5 added, 3 deleted, 5 changed)
Revision created by MOE tool push_codebase.
MOE_MIGRATION=468
git-svn-id: http://bidichecker.googlecode.com/svn/trunk@4 b0874413-a7f4-6be4-17d0-addd11b1e57e
diff --git a/docs/jsdoc/_01.html b/docs/jsdoc/_01.html
index e77e21c..fe91210 100644
--- a/docs/jsdoc/_01.html
+++ b/docs/jsdoc/_01.html
@@ -313,7 +313,7 @@
</div>
</div>
<div class="finePrint">
- Generated by <a href="http://jsdoctoolkit.org/" target="_blank">JsDoc Toolkit</a> 1.3.3 on Sun, 31 Oct 2010 11:00:20 GMT.
+ Generated by <a href="http://jsdoctoolkit.org/" target="_blank">JsDoc Toolkit</a> 1.3.3 on Tue, 08 Feb 2011 17:39:01 GMT.
</div>
</body>
</html>
diff --git a/docs/jsdoc/_02.html b/docs/jsdoc/_02.html
index e45ae2c..0554eac 100644
--- a/docs/jsdoc/_02.html
+++ b/docs/jsdoc/_02.html
@@ -94,7 +94,7 @@
</div>
</div>
<div class="finePrint">
- Generated by <a href="http://jsdoctoolkit.org/" target="_blank">JsDoc Toolkit</a> 1.3.3 on Sun, 31 Oct 2010 11:00:20 GMT.
+ Generated by <a href="http://jsdoctoolkit.org/" target="_blank">JsDoc Toolkit</a> 1.3.3 on Tue, 08 Feb 2011 17:39:02 GMT.
</div>
</body>
</html>
diff --git a/docs/jsdoc/_03.html b/docs/jsdoc/_03.html
index 5522871..2f150c3 100644
--- a/docs/jsdoc/_03.html
+++ b/docs/jsdoc/_03.html
@@ -152,6 +152,10 @@
+
+
+
+
<div class="sectionHead">Functions</div>
@@ -895,6 +899,62 @@
<div class="section function">
<div class="itemTitle">
+ <a name="bidichecker.FilterFactory.locationXpath"></a>
+
+
+ bidichecker.FilterFactory.locationXpath(<span class="signature">xpath</span>)
+
+ </div>
+
+
+ <div class="desc">Create a filter which suppresses errors by matching an XPath expression to
+the error's location.</div>
+
+
+
+
+
+ <div class="detailHead">parameters</div>
+ <table class="params">
+
+ <tr>
+ <td class="type">
+ string
+ </td>
+ <td>
+ xpath
+ </td>
+ <td>
+ An XPath expression. Must not be empty or null.
+ </td>
+ </tr>
+
+ </table>
+
+
+
+ <div class="detailHead">returns</div>
+ <table class="params">
+
+ <tr>
+ <td class="type">
+ !bidichecker.FilterFactory.ComposableFilter
+ </td>
+ <td>
+ A filter object.
+ </td>
+ </tr>
+
+ </table>
+
+
+
+ </div>
+
+
+
+ <div class="section function">
+ <div class="itemTitle">
<a name="bidichecker.FilterFactory.not"></a>
@@ -1722,6 +1782,59 @@
<div class="section function">
<div class="itemTitle">
+ <a name="bidichecker.FilterFactory.LocationXpathFilter_.isSuppressed"></a>
+
+ <i><a href="#bidichecker.FilterFactory.LocationXpathFilter_" class="type">bidichecker.FilterFactory.LocationXpathFilter_.</a></i>isSuppressed(<span class="signature">error, locationElements</span>)
+
+
+ </div>
+
+
+ <div class="desc"></div>
+
+
+
+
+
+ <div class="detailHead">parameters</div>
+ <table class="params">
+
+ <tr>
+ <td class="type">
+
+ </td>
+ <td>
+ error
+ </td>
+ <td>
+
+ </td>
+ </tr>
+
+ <tr>
+ <td class="type">
+
+ </td>
+ <td>
+ locationElements
+ </td>
+ <td>
+
+ </td>
+ </tr>
+
+ </table>
+
+
+
+
+
+ </div>
+
+
+
+ <div class="section function">
+ <div class="itemTitle">
<a name="bidichecker.FilterFactory.NotFilter_.isSuppressed"></a>
<i><a href="#bidichecker.FilterFactory.NotFilter_" class="type">bidichecker.FilterFactory.NotFilter_.</a></i>isSuppressed(<span class="signature">error, locationElements</span>)
@@ -2167,10 +2280,16 @@
+
+
+
+
+
+
</div>
</div>
<div class="finePrint">
- Generated by <a href="http://jsdoctoolkit.org/" target="_blank">JsDoc Toolkit</a> 1.3.3 on Sun, 31 Oct 2010 11:00:20 GMT.
+ Generated by <a href="http://jsdoctoolkit.org/" target="_blank">JsDoc Toolkit</a> 1.3.3 on Tue, 08 Feb 2011 17:39:02 GMT.
</div>
</body>
</html>
diff --git a/docs/jsdoc/src_03.html b/docs/jsdoc/src_03.html
index c6db67e..6251e33 100644
--- a/docs/jsdoc/src_03.html
+++ b/docs/jsdoc/src_03.html
@@ -33,963 +33,1027 @@
<span class='linenumber'> 26</span> </span><span class="NAME">goog.provide</span><span class="PUNC">(</span><span class="STRN">'bidichecker.FilterFactory.ComposableFilter'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'> 27</span>
<span class='linenumber'> 28</span> </span><span class="NAME">goog.require</span><span class="PUNC">(</span><span class="STRN">'bidichecker.Filter'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'> 29</span> </span><span class="NAME">goog.require</span><span class="PUNC">(</span><span class="STRN">'goog.json'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'> 30</span>
+<span class='linenumber'> 29</span> </span><span class="NAME">goog.require</span><span class="PUNC">(</span><span class="STRN">'bidichecker.XpathMatcher'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'> 30</span> </span><span class="NAME">goog.require</span><span class="PUNC">(</span><span class="STRN">'goog.json'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'> 31</span>
-<span class='linenumber'> 32</span> </span><span class="COMM">/**
-<span class='linenumber'> 33</span> * Abstract base class for custom filter classes, providing them with
-<span class='linenumber'> 34</span> * <code>and()</code>, <code>or()</code> and <code>not()</code> methods.
-<span class='linenumber'> 35</span> * @constructor
-<span class='linenumber'> 36</span> * @implements {bidichecker.Filter}
-<span class='linenumber'> 37</span> * @export
-<span class='linenumber'> 38</span> */</span><span class="WHIT">
-<span class='linenumber'> 39</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'> 40</span>
+<span class='linenumber'> 32</span>
+<span class='linenumber'> 33</span> </span><span class="COMM">/**
+<span class='linenumber'> 34</span> * Abstract base class for custom filter classes, providing them with
+<span class='linenumber'> 35</span> * <code>and()</code>, <code>or()</code> and <code>not()</code> methods.
+<span class='linenumber'> 36</span> * @constructor
+<span class='linenumber'> 37</span> * @implements {bidichecker.Filter}
+<span class='linenumber'> 38</span> * @export
+<span class='linenumber'> 39</span> */</span><span class="WHIT">
+<span class='linenumber'> 40</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'> 41</span>
-<span class='linenumber'> 42</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
-<span class='linenumber'> 43</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'> 44</span> </span><span class="NAME">goog.abstractMethod</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'> 45</span>
+<span class='linenumber'> 42</span>
+<span class='linenumber'> 43</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
+<span class='linenumber'> 44</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'> 45</span> </span><span class="NAME">goog.abstractMethod</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'> 46</span>
-<span class='linenumber'> 47</span> </span><span class="COMM">/**
-<span class='linenumber'> 48</span> * Create a filter which ands this filter with another.
-<span class='linenumber'> 49</span> * @param {!bidichecker.Filter} other The second subfilter.
-<span class='linenumber'> 50</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'> 51</span> * @export
-<span class='linenumber'> 52</span> */</span><span class="WHIT">
-<span class='linenumber'> 53</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter.prototype.and</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">other</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'> 54</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.and</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">other</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'> 55</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'> 56</span>
+<span class='linenumber'> 47</span>
+<span class='linenumber'> 48</span> </span><span class="COMM">/**
+<span class='linenumber'> 49</span> * Create a filter which ands this filter with another.
+<span class='linenumber'> 50</span> * @param {!bidichecker.Filter} other The second subfilter.
+<span class='linenumber'> 51</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'> 52</span> * @export
+<span class='linenumber'> 53</span> */</span><span class="WHIT">
+<span class='linenumber'> 54</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter.prototype.and</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">other</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'> 55</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.and</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">other</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'> 56</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'> 57</span>
-<span class='linenumber'> 58</span> </span><span class="COMM">/**
-<span class='linenumber'> 59</span> * Create a filter which inverts this filter.
-<span class='linenumber'> 60</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'> 61</span> * @export
-<span class='linenumber'> 62</span> */</span><span class="WHIT">
-<span class='linenumber'> 63</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter.prototype.not</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'> 64</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.not</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'> 65</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'> 66</span>
+<span class='linenumber'> 58</span>
+<span class='linenumber'> 59</span> </span><span class="COMM">/**
+<span class='linenumber'> 60</span> * Create a filter which inverts this filter.
+<span class='linenumber'> 61</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'> 62</span> * @export
+<span class='linenumber'> 63</span> */</span><span class="WHIT">
+<span class='linenumber'> 64</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter.prototype.not</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'> 65</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.not</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'> 66</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'> 67</span>
-<span class='linenumber'> 68</span> </span><span class="COMM">/**
-<span class='linenumber'> 69</span> * Create a filter which ors this filter with another.
-<span class='linenumber'> 70</span> * @param {!bidichecker.Filter} other The second subfilter.
-<span class='linenumber'> 71</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'> 72</span> * @export
-<span class='linenumber'> 73</span> */</span><span class="WHIT">
-<span class='linenumber'> 74</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter.prototype.or</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">other</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'> 75</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.or</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">other</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'> 76</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'> 77</span>
+<span class='linenumber'> 68</span>
+<span class='linenumber'> 69</span> </span><span class="COMM">/**
+<span class='linenumber'> 70</span> * Create a filter which ors this filter with another.
+<span class='linenumber'> 71</span> * @param {!bidichecker.Filter} other The second subfilter.
+<span class='linenumber'> 72</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'> 73</span> * @export
+<span class='linenumber'> 74</span> */</span><span class="WHIT">
+<span class='linenumber'> 75</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter.prototype.or</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">other</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'> 76</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.or</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">other</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'> 77</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'> 78</span>
-<span class='linenumber'> 79</span> </span><span class="COMM">/**
-<span class='linenumber'> 80</span> * Constructs a suppression filter from a bare object with suitable contents.
-<span class='linenumber'> 81</span> * For use in deserializing filters from JSON. Throws a string exception if an
-<span class='linenumber'> 82</span> * invalid filter is encountered.
-<span class='linenumber'> 83</span> * @param {!Object} bareFilter The object representing the filter. Must contain
-<span class='linenumber'> 84</span> * an <code>'opcode'</code> field with a string indicating the filter type.
-<span class='linenumber'> 85</span> * Other supported field names and types are dependent on the filter type.
-<span class='linenumber'> 86</span> * @return {!bidichecker.FilterFactory.ComposableFilter} The new filter.
-<span class='linenumber'> 87</span> * @private
-<span class='linenumber'> 88</span> */</span><span class="WHIT">
-<span class='linenumber'> 89</span> </span><span class="NAME">bidichecker.FilterFactory.constructFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'> 90</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">opcode</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">bareFilter</span><span class="PUNC">[</span><span class="STRN">'opcode'</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'> 91</span> </span><span class="KEYW">switch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">opcode</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'> 92</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'AND'</span><span class="PUNC">:</span><span class="WHIT">
-<span class='linenumber'> 93</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.AndFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'> 94</span>
-<span class='linenumber'> 95</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'AT_TEXT'</span><span class="PUNC">:</span><span class="WHIT">
-<span class='linenumber'> 96</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.AtTextFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'> 97</span>
-<span class='linenumber'> 98</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'AT_TEXT_REGEXP'</span><span class="PUNC">:</span><span class="WHIT">
-<span class='linenumber'> 99</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.AtTextRegexpFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>100</span>
-<span class='linenumber'>101</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'FOLLOWED_BY_TEXT'</span><span class="PUNC">:</span><span class="WHIT">
-<span class='linenumber'>102</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.FollowedByTextFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>103</span>
-<span class='linenumber'>104</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'FOLLOWED_BY_TEXT_REGEXP'</span><span class="PUNC">:</span><span class="WHIT">
-<span class='linenumber'>105</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.FollowedByTextRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>106</span> </span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>107</span>
-<span class='linenumber'>108</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'LOCATION_CLASS'</span><span class="PUNC">:</span><span class="WHIT">
-<span class='linenumber'>109</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationClassFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>110</span>
-<span class='linenumber'>111</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'LOCATION_CLASS_REGEXP'</span><span class="PUNC">:</span><span class="WHIT">
-<span class='linenumber'>112</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationClassRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>113</span> </span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>114</span>
-<span class='linenumber'>115</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'LOCATION_ID'</span><span class="PUNC">:</span><span class="WHIT">
-<span class='linenumber'>116</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationIdFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>117</span>
-<span class='linenumber'>118</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'LOCATION_ID_REGEXP'</span><span class="PUNC">:</span><span class="WHIT">
-<span class='linenumber'>119</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationIdRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>120</span> </span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>121</span>
-<span class='linenumber'>122</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'NOT'</span><span class="PUNC">:</span><span class="WHIT">
-<span class='linenumber'>123</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.NotFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>124</span>
-<span class='linenumber'>125</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'OR'</span><span class="PUNC">:</span><span class="WHIT">
-<span class='linenumber'>126</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.OrFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>127</span>
-<span class='linenumber'>128</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'PRECEDED_BY_TEXT'</span><span class="PUNC">:</span><span class="WHIT">
-<span class='linenumber'>129</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.PrecededByTextFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>130</span>
-<span class='linenumber'>131</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'PRECEDED_BY_TEXT_REGEXP'</span><span class="PUNC">:</span><span class="WHIT">
-<span class='linenumber'>132</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.PrecededByTextRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>133</span> </span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>134</span>
-<span class='linenumber'>135</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'SEVERITY'</span><span class="PUNC">:</span><span class="WHIT">
-<span class='linenumber'>136</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.SeverityFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>137</span>
-<span class='linenumber'>138</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'TYPE'</span><span class="PUNC">:</span><span class="WHIT">
-<span class='linenumber'>139</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.TypeFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>140</span>
-<span class='linenumber'>141</span> </span><span class="KEYW">default</span><span class="PUNC">:</span><span class="WHIT">
-<span class='linenumber'>142</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Unknown filter opcode: \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">opcode</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\''</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>143</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>144</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'> 79</span>
+<span class='linenumber'> 80</span> </span><span class="COMM">/**
+<span class='linenumber'> 81</span> * Constructs a suppression filter from a bare object with suitable contents.
+<span class='linenumber'> 82</span> * For use in deserializing filters from JSON. Throws a string exception if an
+<span class='linenumber'> 83</span> * invalid filter is encountered.
+<span class='linenumber'> 84</span> * @param {!Object} bareFilter The object representing the filter. Must contain
+<span class='linenumber'> 85</span> * an <code>'opcode'</code> field with a string indicating the filter type.
+<span class='linenumber'> 86</span> * Other supported field names and types are dependent on the filter type.
+<span class='linenumber'> 87</span> * @return {!bidichecker.FilterFactory.ComposableFilter} The new filter.
+<span class='linenumber'> 88</span> * @private
+<span class='linenumber'> 89</span> */</span><span class="WHIT">
+<span class='linenumber'> 90</span> </span><span class="NAME">bidichecker.FilterFactory.constructFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'> 91</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">opcode</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">bareFilter</span><span class="PUNC">[</span><span class="STRN">'opcode'</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'> 92</span> </span><span class="KEYW">switch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">opcode</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'> 93</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'AND'</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'> 94</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.AndFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'> 95</span>
+<span class='linenumber'> 96</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'AT_TEXT'</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'> 97</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.AtTextFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'> 98</span>
+<span class='linenumber'> 99</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'AT_TEXT_REGEXP'</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'>100</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.AtTextRegexpFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>101</span>
+<span class='linenumber'>102</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'FOLLOWED_BY_TEXT'</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'>103</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.FollowedByTextFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>104</span>
+<span class='linenumber'>105</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'FOLLOWED_BY_TEXT_REGEXP'</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'>106</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.FollowedByTextRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>107</span> </span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>108</span>
+<span class='linenumber'>109</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'LOCATION_CLASS'</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'>110</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationClassFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>111</span>
+<span class='linenumber'>112</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'LOCATION_CLASS_REGEXP'</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'>113</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationClassRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>114</span> </span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>115</span>
+<span class='linenumber'>116</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'LOCATION_ID'</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'>117</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationIdFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>118</span>
+<span class='linenumber'>119</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'LOCATION_ID_REGEXP'</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'>120</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationIdRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>121</span> </span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>122</span>
+<span class='linenumber'>123</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'LOCATION_XPATH'</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'>124</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationXpathFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>125</span> </span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>126</span>
+<span class='linenumber'>127</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'NOT'</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'>128</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.NotFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>129</span>
+<span class='linenumber'>130</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'OR'</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'>131</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.OrFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>132</span>
+<span class='linenumber'>133</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'PRECEDED_BY_TEXT'</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'>134</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.PrecededByTextFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>135</span>
+<span class='linenumber'>136</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'PRECEDED_BY_TEXT_REGEXP'</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'>137</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.PrecededByTextRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>138</span> </span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>139</span>
+<span class='linenumber'>140</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'SEVERITY'</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'>141</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.SeverityFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>142</span>
+<span class='linenumber'>143</span> </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'TYPE'</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'>144</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.TypeFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'>145</span>
-<span class='linenumber'>146</span>
-<span class='linenumber'>147</span> </span><span class="COMM">/**
-<span class='linenumber'>148</span> * Deserializes a list of suppression filters from a JSON-format string.
-<span class='linenumber'>149</span> * Throws a string exception if an unknown filter is encountered.
-<span class='linenumber'>150</span> * @param {string=} opt_filtersJson The input string, if provided.
-<span class='linenumber'>151</span> * @return {Array.<!bidichecker.Filter>} The error suppression filters.
-<span class='linenumber'>152</span> */</span><span class="WHIT">
-<span class='linenumber'>153</span> </span><span class="NAME">bidichecker.FilterFactory.readFiltersFromJson</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">opt_filtersJson</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>154</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">opt_filtersJson</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>155</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>156</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>157</span>
-<span class='linenumber'>158</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">bareFilters</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>159</span> </span><span class="PUNC">(</span><span class="COMM">/** @type {Array.<!Object>} */</span><span class="WHIT"> </span><span class="NAME">goog.json.parse</span><span class="PUNC">(</span><span class="NAME">opt_filtersJson</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>160</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">goog.array.map</span><span class="PUNC">(</span><span class="NAME">bareFilters</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>161</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.constructFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>162</span> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>163</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>164</span>
-<span class='linenumber'>165</span>
-<span class='linenumber'>166</span> </span><span class="COMM">/**
-<span class='linenumber'>167</span> * Create a filter which suppresses errors by and-ing component filters.
-<span class='linenumber'>168</span> * @param {!bidichecker.Filter} filter1 The first subfilter.
-<span class='linenumber'>169</span> * @param {!bidichecker.Filter} filter2 The second subfilter.
-<span class='linenumber'>170</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'>171</span> * @export
-<span class='linenumber'>172</span> */</span><span class="WHIT">
-<span class='linenumber'>173</span> </span><span class="NAME">bidichecker.FilterFactory.and</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">filter1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">filter2</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>174</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.AndFilter_</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>175</span> </span><span class="PUNC">{</span><span class="STRN">'filter1'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">filter1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'filter2'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">filter2</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>176</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>177</span>
-<span class='linenumber'>178</span>
-<span class='linenumber'>179</span> </span><span class="COMM">/**
-<span class='linenumber'>180</span> * Create a filter which suppresses errors based on a literal match of their
-<span class='linenumber'>181</span> * <code>atText</code> fields.
-<span class='linenumber'>182</span> * @param {?string} atText A string which must match the entire <code>atText</code>
-<span class='linenumber'>183</span> * field. If empty or null, will only match an empty or null <code>atText</code>.
-<span class='linenumber'>184</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'>185</span> * @export
-<span class='linenumber'>186</span> */</span><span class="WHIT">
-<span class='linenumber'>187</span> </span><span class="NAME">bidichecker.FilterFactory.atText</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">atText</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>188</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.AtTextFilter_</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">'atText'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">atText</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>189</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>190</span>
-<span class='linenumber'>191</span>
-<span class='linenumber'>192</span> </span><span class="COMM">/**
-<span class='linenumber'>193</span> * Create a filter which suppresses errors by applying a regular expression to
-<span class='linenumber'>194</span> * their <code>atText</code> fields.
-<span class='linenumber'>195</span> * @param {string|RegExp} atTextRegexp A regular expression, which must match
-<span class='linenumber'>196</span> * the entire <code>atText</code> field. If empty or null, will only match an
-<span class='linenumber'>197</span> * empty or null <code>atText</code>.
-<span class='linenumber'>198</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'>199</span> * @export
-<span class='linenumber'>200</span> */</span><span class="WHIT">
-<span class='linenumber'>201</span> </span><span class="NAME">bidichecker.FilterFactory.atTextRegexp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">atTextRegexp</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>202</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.AtTextRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>203</span> </span><span class="PUNC">{</span><span class="STRN">'atTextRegexp'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">atTextRegexp</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>204</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>205</span>
-<span class='linenumber'>206</span>
-<span class='linenumber'>207</span> </span><span class="COMM">/**
-<span class='linenumber'>208</span> * Create a filter which suppresses errors based on a literal match of their
-<span class='linenumber'>209</span> * <code>followedByText</code> fields.
-<span class='linenumber'>210</span> * @param {?string} followedByText A string which must match the entire
-<span class='linenumber'>211</span> * <code>followedByText</code> field. If empty or null, will only match an empty
-<span class='linenumber'>212</span> * or null <code>followedByText</code>.
-<span class='linenumber'>213</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'>214</span> * @export
-<span class='linenumber'>215</span> */</span><span class="WHIT">
-<span class='linenumber'>216</span> </span><span class="NAME">bidichecker.FilterFactory.followedByText</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">followedByText</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>217</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.FollowedByTextFilter_</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>218</span> </span><span class="PUNC">{</span><span class="STRN">'followedByText'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">followedByText</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>219</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>220</span>
-<span class='linenumber'>221</span>
-<span class='linenumber'>222</span> </span><span class="COMM">/**
-<span class='linenumber'>223</span> * Create a filter which suppresses errors by applying a regular expression to
-<span class='linenumber'>224</span> * their <code>followedByText</code> fields.
-<span class='linenumber'>225</span> * @param {string|RegExp} followedByTextRegexp A regular expression, which must
-<span class='linenumber'>226</span> * match the entire <code>followedByText</code> field. If empty or null, will
-<span class='linenumber'>227</span> * only match an empty or null <code>followedByText</code>.
-<span class='linenumber'>228</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'>229</span> * @export
-<span class='linenumber'>230</span> */</span><span class="WHIT">
-<span class='linenumber'>231</span> </span><span class="NAME">bidichecker.FilterFactory.followedByTextRegexp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>232</span> </span><span class="NAME">followedByTextRegexp</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>233</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.FollowedByTextRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>234</span> </span><span class="PUNC">{</span><span class="STRN">'followedByTextRegexp'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">followedByTextRegexp</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>235</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>236</span>
-<span class='linenumber'>237</span>
-<span class='linenumber'>238</span> </span><span class="COMM">/**
-<span class='linenumber'>239</span> * Create a filter which suppresses errors based on a literal match of one of
-<span class='linenumber'>240</span> * the class names of any parent node of the error location in the DOM.
-<span class='linenumber'>241</span> * @param {string} className A string which must match one of the class names in
-<span class='linenumber'>242</span> * the <code>class</code> attribute of the location or one of its ancestors. Must
-<span class='linenumber'>243</span> * not be empty or null.
-<span class='linenumber'>244</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'>245</span> * @export
-<span class='linenumber'>246</span> */</span><span class="WHIT">
-<span class='linenumber'>247</span> </span><span class="NAME">bidichecker.FilterFactory.locationClass</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">className</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>248</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">className</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">className</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>249</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Empty or null argument to bidichecker.FilterFactory.locationClass'</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>250</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>251</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationClassFilter_</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>252</span> </span><span class="PUNC">{</span><span class="STRN">'className'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">className</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>253</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>254</span>
-<span class='linenumber'>255</span>
-<span class='linenumber'>256</span> </span><span class="COMM">/**
-<span class='linenumber'>257</span> * Create a filter which suppresses errors based on a regular expression match
-<span class='linenumber'>258</span> * of one of the class names of any parent node of the error location in the
-<span class='linenumber'>259</span> * DOM.
-<span class='linenumber'>260</span> * @param {string|RegExp} classRegexp A regular expression, which must match
-<span class='linenumber'>261</span> * one of the class names in the <code>class</code> attribute of the location or
-<span class='linenumber'>262</span> * one of its ancestors. Must not be empty or null.
-<span class='linenumber'>263</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'>264</span> * @export
-<span class='linenumber'>265</span> */</span><span class="WHIT">
-<span class='linenumber'>266</span> </span><span class="NAME">bidichecker.FilterFactory.locationClassRegexp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">classRegexp</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>267</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">classRegexp</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">classRegexp</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>268</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Empty or null argument to '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
-<span class='linenumber'>269</span> </span><span class="STRN">'bidichecker.FilterFactory.locationClassRegexp'</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>270</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>271</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationClassRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>272</span> </span><span class="PUNC">{</span><span class="STRN">'classRegexp'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">classRegexp</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>273</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>274</span>
-<span class='linenumber'>275</span>
-<span class='linenumber'>276</span> </span><span class="COMM">/**
-<span class='linenumber'>277</span> * Create a filter which suppresses errors based on a literal match of the error
-<span class='linenumber'>278</span> * location's (or one of its DOM ancestors') <code>id</code> attribute.
-<span class='linenumber'>279</span> * @param {string} id A string which must match the entire <code>id</code> attribute
-<span class='linenumber'>280</span> * of the location or one of its ancestors. Must not be empty or null.
-<span class='linenumber'>281</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'>282</span> * @export
-<span class='linenumber'>283</span> */</span><span class="WHIT">
-<span class='linenumber'>284</span> </span><span class="NAME">bidichecker.FilterFactory.locationId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">id</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>285</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">id</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">id</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>286</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Empty or null argument to bidichecker.FilterFactory.locationId'</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>287</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>288</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationIdFilter_</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">'id'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">id</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>289</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>290</span>
-<span class='linenumber'>291</span>
-<span class='linenumber'>292</span> </span><span class="COMM">/**
-<span class='linenumber'>293</span> * Create a filter which suppresses errors by applying a regular expression to
-<span class='linenumber'>294</span> * the error location's (or one of its DOM ancestors') <code>id</code> attribute.
-<span class='linenumber'>295</span> * @param {string|RegExp} idRegexp A regular expression, which must match the
-<span class='linenumber'>296</span> * entire <code>id</code> attribute of the location or one of its ancestors. Must
-<span class='linenumber'>297</span> * not be empty or null.
-<span class='linenumber'>298</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'>299</span> * @export
-<span class='linenumber'>300</span> */</span><span class="WHIT">
-<span class='linenumber'>301</span> </span><span class="NAME">bidichecker.FilterFactory.locationIdRegexp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">idRegexp</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>302</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">idRegexp</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">idRegexp</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>303</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Empty or null argument to '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
-<span class='linenumber'>304</span> </span><span class="STRN">'bidichecker.FilterFactory.locationIdRegexp'</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>305</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>306</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationIdRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>307</span> </span><span class="PUNC">{</span><span class="STRN">'idRegexp'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">idRegexp</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>308</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>309</span>
-<span class='linenumber'>310</span>
-<span class='linenumber'>311</span> </span><span class="COMM">/**
-<span class='linenumber'>312</span> * Create a filter which suppresses errors by inverting another filter.
-<span class='linenumber'>313</span> * @param {!bidichecker.Filter} filter The subfilter.
-<span class='linenumber'>314</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'>315</span> * @export
-<span class='linenumber'>316</span> */</span><span class="WHIT">
-<span class='linenumber'>317</span> </span><span class="NAME">bidichecker.FilterFactory.not</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">filter</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>318</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.NotFilter_</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">'filter'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">filter</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>319</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>320</span>
-<span class='linenumber'>321</span>
-<span class='linenumber'>322</span> </span><span class="COMM">/**
-<span class='linenumber'>323</span> * Create a filter which suppresses errors by or-ing component filters.
-<span class='linenumber'>324</span> * @param {!bidichecker.Filter} filter1 The first subfilter.
-<span class='linenumber'>325</span> * @param {!bidichecker.Filter} filter2 The second subfilter.
-<span class='linenumber'>326</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'>327</span> * @export
-<span class='linenumber'>328</span> */</span><span class="WHIT">
-<span class='linenumber'>329</span> </span><span class="NAME">bidichecker.FilterFactory.or</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">filter1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">filter2</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>330</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.OrFilter_</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>331</span> </span><span class="PUNC">{</span><span class="STRN">'filter1'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">filter1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'filter2'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">filter2</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>332</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>333</span>
-<span class='linenumber'>334</span>
-<span class='linenumber'>335</span> </span><span class="COMM">/**
-<span class='linenumber'>336</span> * Create a filter which suppresses errors based on a literal match of their
-<span class='linenumber'>337</span> * <code>precededByText</code> fields.
-<span class='linenumber'>338</span> * @param {?string} precededByText A string which must match the entire
-<span class='linenumber'>339</span> * <code>precededByText</code> field. If empty or null, will only match an empty
-<span class='linenumber'>340</span> * or null <code>precededByText</code>.
-<span class='linenumber'>341</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'>342</span> * @export
-<span class='linenumber'>343</span> */</span><span class="WHIT">
-<span class='linenumber'>344</span> </span><span class="NAME">bidichecker.FilterFactory.precededByText</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">precededByText</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>345</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.PrecededByTextFilter_</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>346</span> </span><span class="PUNC">{</span><span class="STRN">'precededByText'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">precededByText</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>347</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>348</span>
-<span class='linenumber'>349</span>
-<span class='linenumber'>350</span> </span><span class="COMM">/**
-<span class='linenumber'>351</span> * Create a filter which suppresses errors by applying a regular expression to
-<span class='linenumber'>352</span> * their <code>precededByText</code> fields.
-<span class='linenumber'>353</span> * @param {string|RegExp} precededByTextRegexp A regular expression, which must
-<span class='linenumber'>354</span> * match the entire <code>precededByText</code> field. If empty or null, will
-<span class='linenumber'>355</span> * only match an empty or null <code>precededByText</code>.
-<span class='linenumber'>356</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'>357</span> * @export
-<span class='linenumber'>358</span> */</span><span class="WHIT">
-<span class='linenumber'>359</span> </span><span class="NAME">bidichecker.FilterFactory.precededByTextRegexp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>360</span> </span><span class="NAME">precededByTextRegexp</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>361</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.PrecededByTextRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>362</span> </span><span class="PUNC">{</span><span class="STRN">'precededByTextRegexp'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">precededByTextRegexp</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>363</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>364</span>
-<span class='linenumber'>365</span>
-<span class='linenumber'>366</span> </span><span class="COMM">/**
-<span class='linenumber'>367</span> * Create a filter which suppresses errors based on their severity levels.
-<span class='linenumber'>368</span> * @param {number} severityThreshold the severity level from which errors should
-<span class='linenumber'>369</span> * be suppressed. At level 1, all messages will be filtered out. Note that
-<span class='linenumber'>370</span> * higher values indicate lower severities.
-<span class='linenumber'>371</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'>372</span> * @export
-<span class='linenumber'>373</span> */</span><span class="WHIT">
-<span class='linenumber'>374</span> </span><span class="NAME">bidichecker.FilterFactory.severityFrom</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">severityThreshold</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>375</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.SeverityFilter_</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>376</span> </span><span class="PUNC">{</span><span class="STRN">'severityThreshold'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">severityThreshold</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>377</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>378</span>
-<span class='linenumber'>379</span>
-<span class='linenumber'>380</span> </span><span class="COMM">/**
-<span class='linenumber'>381</span> * Create a filter which suppresses errors based on their type fields.
-<span class='linenumber'>382</span> * @param {string} type The error type name to be matched exactly.
-<span class='linenumber'>383</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
-<span class='linenumber'>384</span> * @export
-<span class='linenumber'>385</span> */</span><span class="WHIT">
-<span class='linenumber'>386</span> </span><span class="NAME">bidichecker.FilterFactory.type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>387</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.TypeFilter_</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">'type'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">type</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>388</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>389</span>
-<span class='linenumber'>390</span>
-<span class='linenumber'>391</span> </span><span class="COMM">/**
-<span class='linenumber'>392</span> * Checks that a required field exists in an object representing a filter, or
-<span class='linenumber'>393</span> * else throws a string exception.
-<span class='linenumber'>394</span> * @param {!Object} bareObject The object representing the filter.
-<span class='linenumber'>395</span> * @param {string} field The name of the field.
-<span class='linenumber'>396</span> * @private
-<span class='linenumber'>397</span> */</span><span class="WHIT">
-<span class='linenumber'>398</span> </span><span class="NAME">bidichecker.FilterFactory.checkParamExists_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>399</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">field</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>400</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'No \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">field</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\' parameter found for \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
-<span class='linenumber'>401</span> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="STRN">'opcode'</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\' filter'</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>402</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>403</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>404</span>
-<span class='linenumber'>405</span>
-<span class='linenumber'>406</span> </span><span class="COMM">/**
-<span class='linenumber'>407</span> * Checks that a required field of a given type exists in an object representing
-<span class='linenumber'>408</span> * a filter, or else throws a string exception.
-<span class='linenumber'>409</span> * @param {!Object} bareObject The object representing the filter.
-<span class='linenumber'>410</span> * @param {string} field The name of the field.
-<span class='linenumber'>411</span> * @param {string} type The required type of the field.
-<span class='linenumber'>412</span> * @private
-<span class='linenumber'>413</span> */</span><span class="WHIT">
-<span class='linenumber'>414</span> </span><span class="NAME">bidichecker.FilterFactory.checkParam_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>415</span> </span><span class="NAME">bidichecker.FilterFactory.checkParamExists_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>416</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="NAME">field</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>417</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Wrong type for \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">field</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\' parameter of \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
-<span class='linenumber'>418</span> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="STRN">'opcode'</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\' filter; expected '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">type</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>419</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>420</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>421</span>
-<span class='linenumber'>422</span>
-<span class='linenumber'>423</span> </span><span class="COMM">/**
-<span class='linenumber'>424</span> * Reads a string-valued field from an object representing a filter.
-<span class='linenumber'>425</span> * @param {!Object} bareObject The object representing the filter.
-<span class='linenumber'>426</span> * @param {string} field The name of the field.
-<span class='linenumber'>427</span> * @return {string} The field value.
-<span class='linenumber'>428</span> * @private
-<span class='linenumber'>429</span> */</span><span class="WHIT">
-<span class='linenumber'>430</span> </span><span class="NAME">bidichecker.FilterFactory.getStringParam_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>431</span> </span><span class="NAME">bidichecker.FilterFactory.checkParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>432</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="COMM">/** @type {string} */</span><span class="WHIT"> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="NAME">field</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>433</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>434</span>
-<span class='linenumber'>435</span>
-<span class='linenumber'>436</span> </span><span class="COMM">/**
-<span class='linenumber'>437</span> * Reads a number-valued field from an object representing a filter.
-<span class='linenumber'>438</span> * @param {!Object} bareObject The object representing the filter.
-<span class='linenumber'>439</span> * @param {string} field The name of the field.
-<span class='linenumber'>440</span> * @return {number} The field value.
-<span class='linenumber'>441</span> * @private
-<span class='linenumber'>442</span> */</span><span class="WHIT">
-<span class='linenumber'>443</span> </span><span class="NAME">bidichecker.FilterFactory.getNumberParam_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>444</span> </span><span class="NAME">bidichecker.FilterFactory.checkParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'number'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>445</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="COMM">/** @type {number} */</span><span class="WHIT"> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="NAME">field</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>446</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>447</span>
-<span class='linenumber'>448</span>
-<span class='linenumber'>449</span> </span><span class="COMM">/**
-<span class='linenumber'>450</span> * Reads a regular expression field from an object representing a filter.
-<span class='linenumber'>451</span> * The field contents must be a string or a RegExp object.
-<span class='linenumber'>452</span> * @param {!Object} bareObject The object representing the filter.
-<span class='linenumber'>453</span> * @param {string} fieldName The name of the field.
-<span class='linenumber'>454</span> * @return {!RegExp} A regular expression anchored at both ends of the string.
-<span class='linenumber'>455</span> * @private
-<span class='linenumber'>456</span> */</span><span class="WHIT">
-<span class='linenumber'>457</span> </span><span class="NAME">bidichecker.FilterFactory.getRegexpParam_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">fieldName</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>458</span> </span><span class="NAME">bidichecker.FilterFactory.checkParamExists_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">fieldName</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>459</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">field</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="NAME">fieldName</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>460</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">pattern</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>461</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">field</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>462</span> </span><span class="NAME">pattern</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="COMM">/** @type {string} */</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>463</span> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">field</span><span class="WHIT"> </span><span class="KEYW">instanceof</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>464</span> </span><span class="NAME">pattern</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">field.source</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>465</span> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>466</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Wrong type for \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">fieldName</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\' parameter of \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
-<span class='linenumber'>467</span> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="STRN">'opcode'</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\' filter; expected string or RegExp'</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>468</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>469</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="STRN">'^('</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">pattern</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">')$'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>470</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>471</span>
-<span class='linenumber'>472</span>
-<span class='linenumber'>473</span> </span><span class="COMM">/**
-<span class='linenumber'>474</span> * Reads a field representing a subfilter from an object representing a filter.
-<span class='linenumber'>475</span> * The field contents can either be a bare object representing a serialized
-<span class='linenumber'>476</span> * filter, or an object supporting an <code>isSuppressed()</code> method.
-<span class='linenumber'>477</span> * @param {!Object} bareObject The object representing the filter.
-<span class='linenumber'>478</span> * @param {string} field The name of the field.
-<span class='linenumber'>479</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter constructed
-<span class='linenumber'>480</span> * from the field's contents.
-<span class='linenumber'>481</span> * @private
-<span class='linenumber'>482</span> */</span><span class="WHIT">
-<span class='linenumber'>483</span> </span><span class="NAME">bidichecker.FilterFactory.getFilterParam_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>484</span> </span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>485</span> </span><span class="NAME">bidichecker.FilterFactory.checkParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>486</span>
-<span class='linenumber'>487</span> </span><span class="COMM">// Recursively build any subfilters referred to by this one.</span><span class="WHIT">
-<span class='linenumber'>488</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">subfilterObject</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="NAME">field</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>489</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">subfilterObject</span><span class="WHIT"> </span><span class="KEYW">instanceof</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>490</span> </span><span class="COMM">// Found a constructed filter object.</span><span class="WHIT">
-<span class='linenumber'>491</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">subfilterObject</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>492</span> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">subfilterObject</span><span class="PUNC">[</span><span class="STRN">'opcode'</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>493</span> </span><span class="COMM">// Found a raw filter object.</span><span class="WHIT">
-<span class='linenumber'>494</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.constructFilter_</span><span class="PUNC">(</span><span class="NAME">subfilterObject</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>495</span> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>496</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Can\'t make a filter out of the \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">field</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\' parameter of \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
-<span class='linenumber'>497</span> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="STRN">'opcode'</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\' filter'</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>498</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>499</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>500</span>
-<span class='linenumber'>501</span>
-<span class='linenumber'>502</span> </span><span class="COMM">/**
-<span class='linenumber'>503</span> * A filter which suppresses errors by and-ing component filters.
-<span class='linenumber'>504</span> * @param {!Object} bareObject An object containing 'filter1' and 'filter2'
-<span class='linenumber'>505</span> * fields, each containing a bare object representing a component filter.
-<span class='linenumber'>506</span> * @constructor
-<span class='linenumber'>507</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
-<span class='linenumber'>508</span> * @private
-<span class='linenumber'>509</span> */</span><span class="WHIT">
-<span class='linenumber'>510</span> </span><span class="NAME">bidichecker.FilterFactory.AndFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>511</span> </span><span class="COMM">/**
-<span class='linenumber'>512</span> * @type {!bidichecker.Filter}
-<span class='linenumber'>513</span> * @private
-<span class='linenumber'>514</span> */</span><span class="WHIT">
-<span class='linenumber'>515</span> </span><span class="NAME">this.filter1_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>516</span> </span><span class="NAME">bidichecker.FilterFactory.getFilterParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'filter1'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>517</span>
-<span class='linenumber'>518</span> </span><span class="COMM">/**
-<span class='linenumber'>519</span> * @type {!bidichecker.Filter}
-<span class='linenumber'>520</span> * @private
-<span class='linenumber'>521</span> */</span><span class="WHIT">
-<span class='linenumber'>522</span> </span><span class="NAME">this.filter2_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>523</span> </span><span class="NAME">bidichecker.FilterFactory.getFilterParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'filter2'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>524</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>525</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.AndFilter_</span><span class="PUNC">,</span><span class="WHIT">
-<span class='linenumber'>526</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>527</span>
-<span class='linenumber'>528</span>
-<span class='linenumber'>529</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
-<span class='linenumber'>530</span> </span><span class="NAME">bidichecker.FilterFactory.AndFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>531</span> </span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>532</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.filter1_.isSuppressed</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT">
-<span class='linenumber'>533</span> </span><span class="NAME">this.filter2_.isSuppressed</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>534</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>535</span>
-<span class='linenumber'>536</span>
-<span class='linenumber'>537</span> </span><span class="COMM">/**
-<span class='linenumber'>538</span> * A filter which suppresses errors by a literal match of their <code>atText</code>
-<span class='linenumber'>539</span> * fields.
-<span class='linenumber'>540</span> * @param {!Object} bareObject An object containing an 'atText' field, which
-<span class='linenumber'>541</span> * must match the entire <code>atText</code> field value. If empty, will only
-<span class='linenumber'>542</span> * match an empty or null <code>atText</code>.
-<span class='linenumber'>543</span> * @constructor
-<span class='linenumber'>544</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
-<span class='linenumber'>545</span> * @private
-<span class='linenumber'>546</span> */</span><span class="WHIT">
-<span class='linenumber'>547</span> </span><span class="NAME">bidichecker.FilterFactory.AtTextFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>548</span> </span><span class="COMM">/**
-<span class='linenumber'>549</span> * @type {string}
-<span class='linenumber'>550</span> * @private
-<span class='linenumber'>551</span> */</span><span class="WHIT">
-<span class='linenumber'>552</span> </span><span class="NAME">this.atText_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>553</span> </span><span class="NAME">bidichecker.FilterFactory.getStringParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'atText'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>554</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>555</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.AtTextFilter_</span><span class="PUNC">,</span><span class="WHIT">
-<span class='linenumber'>556</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>146</span> </span><span class="KEYW">default</span><span class="PUNC">:</span><span class="WHIT">
+<span class='linenumber'>147</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Unknown filter opcode: \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">opcode</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\''</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>148</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>149</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>150</span>
+<span class='linenumber'>151</span>
+<span class='linenumber'>152</span> </span><span class="COMM">/**
+<span class='linenumber'>153</span> * Deserializes a list of suppression filters from a JSON-format string.
+<span class='linenumber'>154</span> * Throws a string exception if an unknown filter is encountered.
+<span class='linenumber'>155</span> * @param {string=} opt_filtersJson The input string, if provided.
+<span class='linenumber'>156</span> * @return {Array.<!bidichecker.Filter>} The error suppression filters.
+<span class='linenumber'>157</span> */</span><span class="WHIT">
+<span class='linenumber'>158</span> </span><span class="NAME">bidichecker.FilterFactory.readFiltersFromJson</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">opt_filtersJson</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>159</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">opt_filtersJson</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>160</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>161</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>162</span>
+<span class='linenumber'>163</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">bareFilters</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>164</span> </span><span class="PUNC">(</span><span class="COMM">/** @type {Array.<!Object>} */</span><span class="WHIT"> </span><span class="NAME">goog.json.parse</span><span class="PUNC">(</span><span class="NAME">opt_filtersJson</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>165</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">goog.array.map</span><span class="PUNC">(</span><span class="NAME">bareFilters</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>166</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.constructFilter_</span><span class="PUNC">(</span><span class="NAME">bareFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>167</span> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>168</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>169</span>
+<span class='linenumber'>170</span>
+<span class='linenumber'>171</span> </span><span class="COMM">/**
+<span class='linenumber'>172</span> * Create a filter which suppresses errors by and-ing component filters.
+<span class='linenumber'>173</span> * @param {!bidichecker.Filter} filter1 The first subfilter.
+<span class='linenumber'>174</span> * @param {!bidichecker.Filter} filter2 The second subfilter.
+<span class='linenumber'>175</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'>176</span> * @export
+<span class='linenumber'>177</span> */</span><span class="WHIT">
+<span class='linenumber'>178</span> </span><span class="NAME">bidichecker.FilterFactory.and</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">filter1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">filter2</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>179</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.AndFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>180</span> </span><span class="PUNC">{</span><span class="STRN">'filter1'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">filter1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'filter2'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">filter2</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>181</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>182</span>
+<span class='linenumber'>183</span>
+<span class='linenumber'>184</span> </span><span class="COMM">/**
+<span class='linenumber'>185</span> * Create a filter which suppresses errors based on a literal match of their
+<span class='linenumber'>186</span> * <code>atText</code> fields.
+<span class='linenumber'>187</span> * @param {?string} atText A string which must match the entire <code>atText</code>
+<span class='linenumber'>188</span> * field. If empty or null, will only match an empty or null <code>atText</code>.
+<span class='linenumber'>189</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'>190</span> * @export
+<span class='linenumber'>191</span> */</span><span class="WHIT">
+<span class='linenumber'>192</span> </span><span class="NAME">bidichecker.FilterFactory.atText</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">atText</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>193</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.AtTextFilter_</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">'atText'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">atText</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>194</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>195</span>
+<span class='linenumber'>196</span>
+<span class='linenumber'>197</span> </span><span class="COMM">/**
+<span class='linenumber'>198</span> * Create a filter which suppresses errors by applying a regular expression to
+<span class='linenumber'>199</span> * their <code>atText</code> fields.
+<span class='linenumber'>200</span> * @param {string|RegExp} atTextRegexp A regular expression, which must match
+<span class='linenumber'>201</span> * the entire <code>atText</code> field. If empty or null, will only match an
+<span class='linenumber'>202</span> * empty or null <code>atText</code>.
+<span class='linenumber'>203</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'>204</span> * @export
+<span class='linenumber'>205</span> */</span><span class="WHIT">
+<span class='linenumber'>206</span> </span><span class="NAME">bidichecker.FilterFactory.atTextRegexp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">atTextRegexp</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>207</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.AtTextRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>208</span> </span><span class="PUNC">{</span><span class="STRN">'atTextRegexp'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">atTextRegexp</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>209</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>210</span>
+<span class='linenumber'>211</span>
+<span class='linenumber'>212</span> </span><span class="COMM">/**
+<span class='linenumber'>213</span> * Create a filter which suppresses errors based on a literal match of their
+<span class='linenumber'>214</span> * <code>followedByText</code> fields.
+<span class='linenumber'>215</span> * @param {?string} followedByText A string which must match the entire
+<span class='linenumber'>216</span> * <code>followedByText</code> field. If empty or null, will only match an empty
+<span class='linenumber'>217</span> * or null <code>followedByText</code>.
+<span class='linenumber'>218</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'>219</span> * @export
+<span class='linenumber'>220</span> */</span><span class="WHIT">
+<span class='linenumber'>221</span> </span><span class="NAME">bidichecker.FilterFactory.followedByText</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">followedByText</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>222</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.FollowedByTextFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>223</span> </span><span class="PUNC">{</span><span class="STRN">'followedByText'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">followedByText</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>224</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>225</span>
+<span class='linenumber'>226</span>
+<span class='linenumber'>227</span> </span><span class="COMM">/**
+<span class='linenumber'>228</span> * Create a filter which suppresses errors by applying a regular expression to
+<span class='linenumber'>229</span> * their <code>followedByText</code> fields.
+<span class='linenumber'>230</span> * @param {string|RegExp} followedByTextRegexp A regular expression, which must
+<span class='linenumber'>231</span> * match the entire <code>followedByText</code> field. If empty or null, will
+<span class='linenumber'>232</span> * only match an empty or null <code>followedByText</code>.
+<span class='linenumber'>233</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'>234</span> * @export
+<span class='linenumber'>235</span> */</span><span class="WHIT">
+<span class='linenumber'>236</span> </span><span class="NAME">bidichecker.FilterFactory.followedByTextRegexp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>237</span> </span><span class="NAME">followedByTextRegexp</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>238</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.FollowedByTextRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>239</span> </span><span class="PUNC">{</span><span class="STRN">'followedByTextRegexp'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">followedByTextRegexp</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>240</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>241</span>
+<span class='linenumber'>242</span>
+<span class='linenumber'>243</span> </span><span class="COMM">/**
+<span class='linenumber'>244</span> * Create a filter which suppresses errors based on a literal match of one of
+<span class='linenumber'>245</span> * the class names of any parent node of the error location in the DOM.
+<span class='linenumber'>246</span> * @param {string} className A string which must match one of the class names in
+<span class='linenumber'>247</span> * the <code>class</code> attribute of the location or one of its ancestors. Must
+<span class='linenumber'>248</span> * not be empty or null.
+<span class='linenumber'>249</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'>250</span> * @export
+<span class='linenumber'>251</span> */</span><span class="WHIT">
+<span class='linenumber'>252</span> </span><span class="NAME">bidichecker.FilterFactory.locationClass</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">className</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>253</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">className</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>254</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Empty or null argument to bidichecker.FilterFactory.locationClass'</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>255</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>256</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationClassFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>257</span> </span><span class="PUNC">{</span><span class="STRN">'className'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">className</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>258</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>259</span>
+<span class='linenumber'>260</span>
+<span class='linenumber'>261</span> </span><span class="COMM">/**
+<span class='linenumber'>262</span> * Create a filter which suppresses errors based on a regular expression match
+<span class='linenumber'>263</span> * of one of the class names of any parent node of the error location in the
+<span class='linenumber'>264</span> * DOM.
+<span class='linenumber'>265</span> * @param {string|RegExp} classRegexp A regular expression, which must match
+<span class='linenumber'>266</span> * one of the class names in the <code>class</code> attribute of the location or
+<span class='linenumber'>267</span> * one of its ancestors. Must not be empty or null.
+<span class='linenumber'>268</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'>269</span> * @export
+<span class='linenumber'>270</span> */</span><span class="WHIT">
+<span class='linenumber'>271</span> </span><span class="NAME">bidichecker.FilterFactory.locationClassRegexp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">classRegexp</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>272</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">classRegexp</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>273</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Empty or null argument to '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
+<span class='linenumber'>274</span> </span><span class="STRN">'bidichecker.FilterFactory.locationClassRegexp'</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>275</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>276</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationClassRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>277</span> </span><span class="PUNC">{</span><span class="STRN">'classRegexp'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">classRegexp</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>278</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>279</span>
+<span class='linenumber'>280</span>
+<span class='linenumber'>281</span> </span><span class="COMM">/**
+<span class='linenumber'>282</span> * Create a filter which suppresses errors based on a literal match of the error
+<span class='linenumber'>283</span> * location's (or one of its DOM ancestors') <code>id</code> attribute.
+<span class='linenumber'>284</span> * @param {string} id A string which must match the entire <code>id</code> attribute
+<span class='linenumber'>285</span> * of the location or one of its ancestors. Must not be empty or null.
+<span class='linenumber'>286</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'>287</span> * @export
+<span class='linenumber'>288</span> */</span><span class="WHIT">
+<span class='linenumber'>289</span> </span><span class="NAME">bidichecker.FilterFactory.locationId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">id</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>290</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">id</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>291</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Empty or null argument to bidichecker.FilterFactory.locationId'</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>292</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>293</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationIdFilter_</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">'id'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">id</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>294</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>295</span>
+<span class='linenumber'>296</span>
+<span class='linenumber'>297</span> </span><span class="COMM">/**
+<span class='linenumber'>298</span> * Create a filter which suppresses errors by applying a regular expression to
+<span class='linenumber'>299</span> * the error location's (or one of its DOM ancestors') <code>id</code> attribute.
+<span class='linenumber'>300</span> * @param {string|RegExp} idRegexp A regular expression, which must match the
+<span class='linenumber'>301</span> * entire <code>id</code> attribute of the location or one of its ancestors. Must
+<span class='linenumber'>302</span> * not be empty or null.
+<span class='linenumber'>303</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'>304</span> * @export
+<span class='linenumber'>305</span> */</span><span class="WHIT">
+<span class='linenumber'>306</span> </span><span class="NAME">bidichecker.FilterFactory.locationIdRegexp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">idRegexp</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>307</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">idRegexp</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>308</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Empty or null argument to '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
+<span class='linenumber'>309</span> </span><span class="STRN">'bidichecker.FilterFactory.locationIdRegexp'</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>310</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>311</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationIdRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>312</span> </span><span class="PUNC">{</span><span class="STRN">'idRegexp'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">idRegexp</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>313</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>314</span>
+<span class='linenumber'>315</span>
+<span class='linenumber'>316</span> </span><span class="COMM">/**
+<span class='linenumber'>317</span> * Create a filter which suppresses errors by matching an XPath expression to
+<span class='linenumber'>318</span> * the error's location.
+<span class='linenumber'>319</span> * @param {string} xpath An XPath expression. Must not be empty or null.
+<span class='linenumber'>320</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'>321</span> * @export
+<span class='linenumber'>322</span> */</span><span class="WHIT">
+<span class='linenumber'>323</span> </span><span class="NAME">bidichecker.FilterFactory.locationXpath</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">xpath</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>324</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">xpath</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>325</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Empty or null argument to '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
+<span class='linenumber'>326</span> </span><span class="STRN">'bidichecker.FilterFactory.locationXpath'</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>327</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>328</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.LocationXpathFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>329</span> </span><span class="PUNC">{</span><span class="STRN">'xpath'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">xpath</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>330</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>331</span>
+<span class='linenumber'>332</span>
+<span class='linenumber'>333</span> </span><span class="COMM">/**
+<span class='linenumber'>334</span> * Create a filter which suppresses errors by inverting another filter.
+<span class='linenumber'>335</span> * @param {!bidichecker.Filter} filter The subfilter.
+<span class='linenumber'>336</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'>337</span> * @export
+<span class='linenumber'>338</span> */</span><span class="WHIT">
+<span class='linenumber'>339</span> </span><span class="NAME">bidichecker.FilterFactory.not</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">filter</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>340</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.NotFilter_</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">'filter'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">filter</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>341</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>342</span>
+<span class='linenumber'>343</span>
+<span class='linenumber'>344</span> </span><span class="COMM">/**
+<span class='linenumber'>345</span> * Create a filter which suppresses errors by or-ing component filters.
+<span class='linenumber'>346</span> * @param {!bidichecker.Filter} filter1 The first subfilter.
+<span class='linenumber'>347</span> * @param {!bidichecker.Filter} filter2 The second subfilter.
+<span class='linenumber'>348</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'>349</span> * @export
+<span class='linenumber'>350</span> */</span><span class="WHIT">
+<span class='linenumber'>351</span> </span><span class="NAME">bidichecker.FilterFactory.or</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">filter1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">filter2</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>352</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.OrFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>353</span> </span><span class="PUNC">{</span><span class="STRN">'filter1'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">filter1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'filter2'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">filter2</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>354</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>355</span>
+<span class='linenumber'>356</span>
+<span class='linenumber'>357</span> </span><span class="COMM">/**
+<span class='linenumber'>358</span> * Create a filter which suppresses errors based on a literal match of their
+<span class='linenumber'>359</span> * <code>precededByText</code> fields.
+<span class='linenumber'>360</span> * @param {?string} precededByText A string which must match the entire
+<span class='linenumber'>361</span> * <code>precededByText</code> field. If empty or null, will only match an empty
+<span class='linenumber'>362</span> * or null <code>precededByText</code>.
+<span class='linenumber'>363</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'>364</span> * @export
+<span class='linenumber'>365</span> */</span><span class="WHIT">
+<span class='linenumber'>366</span> </span><span class="NAME">bidichecker.FilterFactory.precededByText</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">precededByText</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>367</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.PrecededByTextFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>368</span> </span><span class="PUNC">{</span><span class="STRN">'precededByText'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">precededByText</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>369</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>370</span>
+<span class='linenumber'>371</span>
+<span class='linenumber'>372</span> </span><span class="COMM">/**
+<span class='linenumber'>373</span> * Create a filter which suppresses errors by applying a regular expression to
+<span class='linenumber'>374</span> * their <code>precededByText</code> fields.
+<span class='linenumber'>375</span> * @param {string|RegExp} precededByTextRegexp A regular expression, which must
+<span class='linenumber'>376</span> * match the entire <code>precededByText</code> field. If empty or null, will
+<span class='linenumber'>377</span> * only match an empty or null <code>precededByText</code>.
+<span class='linenumber'>378</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'>379</span> * @export
+<span class='linenumber'>380</span> */</span><span class="WHIT">
+<span class='linenumber'>381</span> </span><span class="NAME">bidichecker.FilterFactory.precededByTextRegexp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>382</span> </span><span class="NAME">precededByTextRegexp</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>383</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.PrecededByTextRegexpFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>384</span> </span><span class="PUNC">{</span><span class="STRN">'precededByTextRegexp'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">precededByTextRegexp</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>385</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>386</span>
+<span class='linenumber'>387</span>
+<span class='linenumber'>388</span> </span><span class="COMM">/**
+<span class='linenumber'>389</span> * Create a filter which suppresses errors based on their severity levels.
+<span class='linenumber'>390</span> * @param {number} severityThreshold the severity level from which errors should
+<span class='linenumber'>391</span> * be suppressed. At level 1, all messages will be filtered out. Note that
+<span class='linenumber'>392</span> * higher values indicate lower severities.
+<span class='linenumber'>393</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'>394</span> * @export
+<span class='linenumber'>395</span> */</span><span class="WHIT">
+<span class='linenumber'>396</span> </span><span class="NAME">bidichecker.FilterFactory.severityFrom</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">severityThreshold</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>397</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.SeverityFilter_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>398</span> </span><span class="PUNC">{</span><span class="STRN">'severityThreshold'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">severityThreshold</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>399</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>400</span>
+<span class='linenumber'>401</span>
+<span class='linenumber'>402</span> </span><span class="COMM">/**
+<span class='linenumber'>403</span> * Create a filter which suppresses errors based on their type fields.
+<span class='linenumber'>404</span> * @param {string} type The error type name to be matched exactly.
+<span class='linenumber'>405</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+<span class='linenumber'>406</span> * @export
+<span class='linenumber'>407</span> */</span><span class="WHIT">
+<span class='linenumber'>408</span> </span><span class="NAME">bidichecker.FilterFactory.type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>409</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.TypeFilter_</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">'type'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">type</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>410</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>411</span>
+<span class='linenumber'>412</span>
+<span class='linenumber'>413</span> </span><span class="COMM">/**
+<span class='linenumber'>414</span> * Checks that a required field exists in an object representing a filter, or
+<span class='linenumber'>415</span> * else throws a string exception.
+<span class='linenumber'>416</span> * @param {!Object} bareObject The object representing the filter.
+<span class='linenumber'>417</span> * @param {string} field The name of the field.
+<span class='linenumber'>418</span> * @private
+<span class='linenumber'>419</span> */</span><span class="WHIT">
+<span class='linenumber'>420</span> </span><span class="NAME">bidichecker.FilterFactory.checkParamExists_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>421</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">field</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>422</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'No \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">field</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\' parameter found for \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
+<span class='linenumber'>423</span> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="STRN">'opcode'</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\' filter'</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>424</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>425</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>426</span>
+<span class='linenumber'>427</span>
+<span class='linenumber'>428</span> </span><span class="COMM">/**
+<span class='linenumber'>429</span> * Checks that a required field of a given type exists in an object representing
+<span class='linenumber'>430</span> * a filter, or else throws a string exception.
+<span class='linenumber'>431</span> * @param {!Object} bareObject The object representing the filter.
+<span class='linenumber'>432</span> * @param {string} field The name of the field.
+<span class='linenumber'>433</span> * @param {string} type The required type of the field.
+<span class='linenumber'>434</span> * @private
+<span class='linenumber'>435</span> */</span><span class="WHIT">
+<span class='linenumber'>436</span> </span><span class="NAME">bidichecker.FilterFactory.checkParam_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>437</span> </span><span class="NAME">bidichecker.FilterFactory.checkParamExists_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>438</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="NAME">field</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>439</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Wrong type for \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">field</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\' parameter of \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
+<span class='linenumber'>440</span> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="STRN">'opcode'</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\' filter; expected '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">type</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>441</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>442</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>443</span>
+<span class='linenumber'>444</span>
+<span class='linenumber'>445</span> </span><span class="COMM">/**
+<span class='linenumber'>446</span> * Reads a string-valued field from an object representing a filter.
+<span class='linenumber'>447</span> * @param {!Object} bareObject The object representing the filter.
+<span class='linenumber'>448</span> * @param {string} field The name of the field.
+<span class='linenumber'>449</span> * @return {string} The field value.
+<span class='linenumber'>450</span> * @private
+<span class='linenumber'>451</span> */</span><span class="WHIT">
+<span class='linenumber'>452</span> </span><span class="NAME">bidichecker.FilterFactory.getStringParam_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>453</span> </span><span class="NAME">bidichecker.FilterFactory.checkParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>454</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="COMM">/** @type {string} */</span><span class="WHIT"> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="NAME">field</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>455</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>456</span>
+<span class='linenumber'>457</span>
+<span class='linenumber'>458</span> </span><span class="COMM">/**
+<span class='linenumber'>459</span> * Reads a number-valued field from an object representing a filter.
+<span class='linenumber'>460</span> * @param {!Object} bareObject The object representing the filter.
+<span class='linenumber'>461</span> * @param {string} field The name of the field.
+<span class='linenumber'>462</span> * @return {number} The field value.
+<span class='linenumber'>463</span> * @private
+<span class='linenumber'>464</span> */</span><span class="WHIT">
+<span class='linenumber'>465</span> </span><span class="NAME">bidichecker.FilterFactory.getNumberParam_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>466</span> </span><span class="NAME">bidichecker.FilterFactory.checkParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'number'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>467</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="COMM">/** @type {number} */</span><span class="WHIT"> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="NAME">field</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>468</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>469</span>
+<span class='linenumber'>470</span>
+<span class='linenumber'>471</span> </span><span class="COMM">/**
+<span class='linenumber'>472</span> * Reads a regular expression field from an object representing a filter.
+<span class='linenumber'>473</span> * The field contents must be a string or a RegExp object.
+<span class='linenumber'>474</span> * @param {!Object} bareObject The object representing the filter.
+<span class='linenumber'>475</span> * @param {string} fieldName The name of the field.
+<span class='linenumber'>476</span> * @return {!RegExp} A regular expression anchored at both ends of the string.
+<span class='linenumber'>477</span> * @private
+<span class='linenumber'>478</span> */</span><span class="WHIT">
+<span class='linenumber'>479</span> </span><span class="NAME">bidichecker.FilterFactory.getRegexpParam_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">fieldName</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>480</span> </span><span class="NAME">bidichecker.FilterFactory.checkParamExists_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">fieldName</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>481</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">field</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="NAME">fieldName</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>482</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">pattern</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>483</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">field</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>484</span> </span><span class="NAME">pattern</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="COMM">/** @type {string} */</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>485</span> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">field</span><span class="WHIT"> </span><span class="KEYW">instanceof</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>486</span> </span><span class="NAME">pattern</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">field.source</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>487</span> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>488</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Wrong type for \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">fieldName</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\' parameter of \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
+<span class='linenumber'>489</span> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="STRN">'opcode'</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\' filter; expected string or RegExp'</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>490</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>491</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="STRN">'^('</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">pattern</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">')$'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>492</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>493</span>
+<span class='linenumber'>494</span>
+<span class='linenumber'>495</span> </span><span class="COMM">/**
+<span class='linenumber'>496</span> * Reads a field representing a subfilter from an object representing a filter.
+<span class='linenumber'>497</span> * The field contents can either be a bare object representing a serialized
+<span class='linenumber'>498</span> * filter, or an object supporting an <code>isSuppressed()</code> method.
+<span class='linenumber'>499</span> * @param {!Object} bareObject The object representing the filter.
+<span class='linenumber'>500</span> * @param {string} field The name of the field.
+<span class='linenumber'>501</span> * @return {!bidichecker.FilterFactory.ComposableFilter} A filter constructed
+<span class='linenumber'>502</span> * from the field's contents.
+<span class='linenumber'>503</span> * @private
+<span class='linenumber'>504</span> */</span><span class="WHIT">
+<span class='linenumber'>505</span> </span><span class="NAME">bidichecker.FilterFactory.getFilterParam_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>506</span> </span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>507</span> </span><span class="NAME">bidichecker.FilterFactory.checkParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">field</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>508</span>
+<span class='linenumber'>509</span> </span><span class="COMM">// Recursively build any subfilters referred to by this one.</span><span class="WHIT">
+<span class='linenumber'>510</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">subfilterObject</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="NAME">field</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>511</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">subfilterObject</span><span class="WHIT"> </span><span class="KEYW">instanceof</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>512</span> </span><span class="COMM">// Found a constructed filter object.</span><span class="WHIT">
+<span class='linenumber'>513</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">subfilterObject</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>514</span> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">subfilterObject</span><span class="PUNC">[</span><span class="STRN">'opcode'</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>515</span> </span><span class="COMM">// Found a raw filter object.</span><span class="WHIT">
+<span class='linenumber'>516</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.constructFilter_</span><span class="PUNC">(</span><span class="NAME">subfilterObject</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>517</span> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>518</span> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">'Can\'t make a filter out of the \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">field</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\' parameter of \''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
+<span class='linenumber'>519</span> </span><span class="NAME">bareObject</span><span class="PUNC">[</span><span class="STRN">'opcode'</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'\' filter'</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>520</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>521</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>522</span>
+<span class='linenumber'>523</span>
+<span class='linenumber'>524</span> </span><span class="COMM">/**
+<span class='linenumber'>525</span> * A filter which suppresses errors by and-ing component filters.
+<span class='linenumber'>526</span> * @param {!Object} bareObject An object containing 'filter1' and 'filter2'
+<span class='linenumber'>527</span> * fields, each containing a bare object representing a component filter.
+<span class='linenumber'>528</span> * @constructor
+<span class='linenumber'>529</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
+<span class='linenumber'>530</span> * @private
+<span class='linenumber'>531</span> */</span><span class="WHIT">
+<span class='linenumber'>532</span> </span><span class="NAME">bidichecker.FilterFactory.AndFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>533</span> </span><span class="COMM">/**
+<span class='linenumber'>534</span> * @type {!bidichecker.Filter}
+<span class='linenumber'>535</span> * @private
+<span class='linenumber'>536</span> */</span><span class="WHIT">
+<span class='linenumber'>537</span> </span><span class="NAME">this.filter1_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>538</span> </span><span class="NAME">bidichecker.FilterFactory.getFilterParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'filter1'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>539</span>
+<span class='linenumber'>540</span> </span><span class="COMM">/**
+<span class='linenumber'>541</span> * @type {!bidichecker.Filter}
+<span class='linenumber'>542</span> * @private
+<span class='linenumber'>543</span> */</span><span class="WHIT">
+<span class='linenumber'>544</span> </span><span class="NAME">this.filter2_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>545</span> </span><span class="NAME">bidichecker.FilterFactory.getFilterParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'filter2'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>546</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>547</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.AndFilter_</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>548</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>549</span>
+<span class='linenumber'>550</span>
+<span class='linenumber'>551</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
+<span class='linenumber'>552</span> </span><span class="NAME">bidichecker.FilterFactory.AndFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>553</span> </span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>554</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.filter1_.isSuppressed</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT">
+<span class='linenumber'>555</span> </span><span class="NAME">this.filter2_.isSuppressed</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>556</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'>557</span>
<span class='linenumber'>558</span>
-<span class='linenumber'>559</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
-<span class='linenumber'>560</span> </span><span class="NAME">bidichecker.FilterFactory.AtTextFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>561</span> </span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>562</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.atText_</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">error.getAtText</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>563</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>564</span>
-<span class='linenumber'>565</span>
-<span class='linenumber'>566</span> </span><span class="COMM">/**
-<span class='linenumber'>567</span> * A filter which suppresses errors by applying a regular expression to their
-<span class='linenumber'>568</span> * <code>atText</code> fields.
-<span class='linenumber'>569</span> * @param {!Object} bareObject An object containing an 'atTextRegexp' field
-<span class='linenumber'>570</span> * containing a regular expression, which must match the entire
-<span class='linenumber'>571</span> * <code>atText</code> field value. If empty, will only match an empty or null
-<span class='linenumber'>572</span> * <code>atText</code>.
-<span class='linenumber'>573</span> * @constructor
-<span class='linenumber'>574</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
-<span class='linenumber'>575</span> * @private
-<span class='linenumber'>576</span> */</span><span class="WHIT">
-<span class='linenumber'>577</span> </span><span class="NAME">bidichecker.FilterFactory.AtTextRegexpFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>578</span> </span><span class="COMM">/**
-<span class='linenumber'>579</span> * @type {!RegExp}
-<span class='linenumber'>580</span> * @private
-<span class='linenumber'>581</span> */</span><span class="WHIT">
-<span class='linenumber'>582</span> </span><span class="NAME">this.atTextRegexp_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>583</span> </span><span class="NAME">bidichecker.FilterFactory.getRegexpParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'atTextRegexp'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>584</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>585</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.AtTextRegexpFilter_</span><span class="PUNC">,</span><span class="WHIT">
-<span class='linenumber'>586</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>559</span> </span><span class="COMM">/**
+<span class='linenumber'>560</span> * A filter which suppresses errors by a literal match of their <code>atText</code>
+<span class='linenumber'>561</span> * fields.
+<span class='linenumber'>562</span> * @param {!Object} bareObject An object containing an 'atText' field, which
+<span class='linenumber'>563</span> * must match the entire <code>atText</code> field value. If empty, will only
+<span class='linenumber'>564</span> * match an empty or null <code>atText</code>.
+<span class='linenumber'>565</span> * @constructor
+<span class='linenumber'>566</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
+<span class='linenumber'>567</span> * @private
+<span class='linenumber'>568</span> */</span><span class="WHIT">
+<span class='linenumber'>569</span> </span><span class="NAME">bidichecker.FilterFactory.AtTextFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>570</span> </span><span class="COMM">/**
+<span class='linenumber'>571</span> * @type {string}
+<span class='linenumber'>572</span> * @private
+<span class='linenumber'>573</span> */</span><span class="WHIT">
+<span class='linenumber'>574</span> </span><span class="NAME">this.atText_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>575</span> </span><span class="NAME">bidichecker.FilterFactory.getStringParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'atText'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>576</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>577</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.AtTextFilter_</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>578</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>579</span>
+<span class='linenumber'>580</span>
+<span class='linenumber'>581</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
+<span class='linenumber'>582</span> </span><span class="NAME">bidichecker.FilterFactory.AtTextFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>583</span> </span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>584</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.atText_</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">error.getAtText</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>585</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>586</span>
<span class='linenumber'>587</span>
-<span class='linenumber'>588</span>
-<span class='linenumber'>589</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
-<span class='linenumber'>590</span> </span><span class="NAME">bidichecker.FilterFactory.AtTextRegexpFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>591</span> </span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>592</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.atTextRegexp_.test</span><span class="PUNC">(</span><span class="NAME">error.getAtText</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>593</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>594</span>
-<span class='linenumber'>595</span>
-<span class='linenumber'>596</span> </span><span class="COMM">/**
-<span class='linenumber'>597</span> * A filter which suppresses errors by a literal match of their {@code
-<span class='linenumber'>598</span> * followedByText} fields.
-<span class='linenumber'>599</span> * @param {!Object} bareObject An object containing a 'followedByText' field,
-<span class='linenumber'>600</span> * which must match the entire <code>followedByText</code> field value. If empty,
-<span class='linenumber'>601</span> * will only match an empty or null <code>followedByText</code>.
-<span class='linenumber'>602</span> * @constructor
-<span class='linenumber'>603</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
-<span class='linenumber'>604</span> * @private
-<span class='linenumber'>605</span> */</span><span class="WHIT">
-<span class='linenumber'>606</span> </span><span class="NAME">bidichecker.FilterFactory.FollowedByTextFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>607</span> </span><span class="COMM">/**
-<span class='linenumber'>608</span> * @type {string}
-<span class='linenumber'>609</span> * @private
-<span class='linenumber'>610</span> */</span><span class="WHIT">
-<span class='linenumber'>611</span> </span><span class="NAME">this.followedByText_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>612</span> </span><span class="NAME">bidichecker.FilterFactory.getStringParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'followedByText'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>613</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>614</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.FollowedByTextFilter_</span><span class="PUNC">,</span><span class="WHIT">
-<span class='linenumber'>615</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>588</span> </span><span class="COMM">/**
+<span class='linenumber'>589</span> * A filter which suppresses errors by applying a regular expression to their
+<span class='linenumber'>590</span> * <code>atText</code> fields.
+<span class='linenumber'>591</span> * @param {!Object} bareObject An object containing an 'atTextRegexp' field
+<span class='linenumber'>592</span> * containing a regular expression, which must match the entire
+<span class='linenumber'>593</span> * <code>atText</code> field value. If empty, will only match an empty or null
+<span class='linenumber'>594</span> * <code>atText</code>.
+<span class='linenumber'>595</span> * @constructor
+<span class='linenumber'>596</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
+<span class='linenumber'>597</span> * @private
+<span class='linenumber'>598</span> */</span><span class="WHIT">
+<span class='linenumber'>599</span> </span><span class="NAME">bidichecker.FilterFactory.AtTextRegexpFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>600</span> </span><span class="COMM">/**
+<span class='linenumber'>601</span> * @type {!RegExp}
+<span class='linenumber'>602</span> * @private
+<span class='linenumber'>603</span> */</span><span class="WHIT">
+<span class='linenumber'>604</span> </span><span class="NAME">this.atTextRegexp_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>605</span> </span><span class="NAME">bidichecker.FilterFactory.getRegexpParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'atTextRegexp'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>606</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>607</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.AtTextRegexpFilter_</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>608</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>609</span>
+<span class='linenumber'>610</span>
+<span class='linenumber'>611</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
+<span class='linenumber'>612</span> </span><span class="NAME">bidichecker.FilterFactory.AtTextRegexpFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>613</span> </span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>614</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.atTextRegexp_.test</span><span class="PUNC">(</span><span class="NAME">error.getAtText</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>615</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'>616</span>
<span class='linenumber'>617</span>
-<span class='linenumber'>618</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
-<span class='linenumber'>619</span> </span><span class="NAME">bidichecker.FilterFactory.FollowedByTextFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>620</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>621</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.followedByText_</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">error.getFollowedByText</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>622</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>623</span>
-<span class='linenumber'>624</span>
-<span class='linenumber'>625</span> </span><span class="COMM">/**
-<span class='linenumber'>626</span> * A filter which suppresses errors by applying a regular expression to their
-<span class='linenumber'>627</span> * <code>followedByText</code> fields.
-<span class='linenumber'>628</span> * @param {!Object} bareObject An object containing a 'followedByTextRegexp'
-<span class='linenumber'>629</span> * field containing a regular expression, which must match the entire
-<span class='linenumber'>630</span> * <code>followedByText</code> field value. If empty, will only match an empty or
-<span class='linenumber'>631</span> * null <code>followedByText</code>.
-<span class='linenumber'>632</span> * @constructor
-<span class='linenumber'>633</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
-<span class='linenumber'>634</span> * @private
-<span class='linenumber'>635</span> */</span><span class="WHIT">
-<span class='linenumber'>636</span> </span><span class="NAME">bidichecker.FilterFactory.FollowedByTextRegexpFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>637</span> </span><span class="COMM">/**
-<span class='linenumber'>638</span> * @type {!RegExp}
-<span class='linenumber'>639</span> * @private
-<span class='linenumber'>640</span> */</span><span class="WHIT">
-<span class='linenumber'>641</span> </span><span class="NAME">this.followedByTextRegexp_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>642</span> </span><span class="NAME">bidichecker.FilterFactory.getRegexpParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT">
-<span class='linenumber'>643</span> </span><span class="STRN">'followedByTextRegexp'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>618</span> </span><span class="COMM">/**
+<span class='linenumber'>619</span> * A filter which suppresses errors by a literal match of their {@code
+<span class='linenumber'>620</span> * followedByText} fields.
+<span class='linenumber'>621</span> * @param {!Object} bareObject An object containing a 'followedByText' field,
+<span class='linenumber'>622</span> * which must match the entire <code>followedByText</code> field value. If empty,
+<span class='linenumber'>623</span> * will only match an empty or null <code>followedByText</code>.
+<span class='linenumber'>624</span> * @constructor
+<span class='linenumber'>625</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
+<span class='linenumber'>626</span> * @private
+<span class='linenumber'>627</span> */</span><span class="WHIT">
+<span class='linenumber'>628</span> </span><span class="NAME">bidichecker.FilterFactory.FollowedByTextFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>629</span> </span><span class="COMM">/**
+<span class='linenumber'>630</span> * @type {string}
+<span class='linenumber'>631</span> * @private
+<span class='linenumber'>632</span> */</span><span class="WHIT">
+<span class='linenumber'>633</span> </span><span class="NAME">this.followedByText_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>634</span> </span><span class="NAME">bidichecker.FilterFactory.getStringParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'followedByText'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>635</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>636</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.FollowedByTextFilter_</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>637</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>638</span>
+<span class='linenumber'>639</span>
+<span class='linenumber'>640</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
+<span class='linenumber'>641</span> </span><span class="NAME">bidichecker.FilterFactory.FollowedByTextFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>642</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>643</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.followedByText_</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">error.getFollowedByText</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'>644</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>645</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.FollowedByTextRegexpFilter_</span><span class="PUNC">,</span><span class="WHIT">
-<span class='linenumber'>646</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>647</span>
-<span class='linenumber'>648</span>
-<span class='linenumber'>649</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
-<span class='linenumber'>650</span> </span><span class="NAME">bidichecker.FilterFactory.FollowedByTextRegexpFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>651</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>652</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.followedByTextRegexp_.test</span><span class="PUNC">(</span><span class="NAME">error.getFollowedByText</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>653</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>654</span>
-<span class='linenumber'>655</span>
-<span class='linenumber'>656</span> </span><span class="COMM">/**
-<span class='linenumber'>657</span> * A filter which suppresses errors by a literal match of the error location's
-<span class='linenumber'>658</span> * (or one of its DOM ancestors') <code>class</code> name.
-<span class='linenumber'>659</span> * @param {!Object} bareObject An object containing a 'className' field, which
-<span class='linenumber'>660</span> * must match one of the class names in the <code>class</code> attribute of the
-<span class='linenumber'>661</span> * location or one of its ancestors.
-<span class='linenumber'>662</span> * @constructor
-<span class='linenumber'>663</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
-<span class='linenumber'>664</span> * @private
-<span class='linenumber'>665</span> */</span><span class="WHIT">
-<span class='linenumber'>666</span> </span><span class="NAME">bidichecker.FilterFactory.LocationClassFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>667</span> </span><span class="COMM">/**
-<span class='linenumber'>668</span> * @type {string}
-<span class='linenumber'>669</span> * @private
-<span class='linenumber'>670</span> */</span><span class="WHIT">
-<span class='linenumber'>671</span> </span><span class="NAME">this.className_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>672</span> </span><span class="NAME">bidichecker.FilterFactory.getStringParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'className'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>673</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>674</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.LocationClassFilter_</span><span class="PUNC">,</span><span class="WHIT">
-<span class='linenumber'>675</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>645</span>
+<span class='linenumber'>646</span>
+<span class='linenumber'>647</span> </span><span class="COMM">/**
+<span class='linenumber'>648</span> * A filter which suppresses errors by applying a regular expression to their
+<span class='linenumber'>649</span> * <code>followedByText</code> fields.
+<span class='linenumber'>650</span> * @param {!Object} bareObject An object containing a 'followedByTextRegexp'
+<span class='linenumber'>651</span> * field containing a regular expression, which must match the entire
+<span class='linenumber'>652</span> * <code>followedByText</code> field value. If empty, will only match an empty or
+<span class='linenumber'>653</span> * null <code>followedByText</code>.
+<span class='linenumber'>654</span> * @constructor
+<span class='linenumber'>655</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
+<span class='linenumber'>656</span> * @private
+<span class='linenumber'>657</span> */</span><span class="WHIT">
+<span class='linenumber'>658</span> </span><span class="NAME">bidichecker.FilterFactory.FollowedByTextRegexpFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>659</span> </span><span class="COMM">/**
+<span class='linenumber'>660</span> * @type {!RegExp}
+<span class='linenumber'>661</span> * @private
+<span class='linenumber'>662</span> */</span><span class="WHIT">
+<span class='linenumber'>663</span> </span><span class="NAME">this.followedByTextRegexp_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>664</span> </span><span class="NAME">bidichecker.FilterFactory.getRegexpParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>665</span> </span><span class="STRN">'followedByTextRegexp'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>666</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>667</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.FollowedByTextRegexpFilter_</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>668</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>669</span>
+<span class='linenumber'>670</span>
+<span class='linenumber'>671</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
+<span class='linenumber'>672</span> </span><span class="NAME">bidichecker.FilterFactory.FollowedByTextRegexpFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>673</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>674</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.followedByTextRegexp_.test</span><span class="PUNC">(</span><span class="NAME">error.getFollowedByText</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>675</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'>676</span>
<span class='linenumber'>677</span>
-<span class='linenumber'>678</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
-<span class='linenumber'>679</span> </span><span class="NAME">bidichecker.FilterFactory.LocationClassFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>680</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>681</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC"><</span><span class="WHIT"> </span><span class="NAME">locationElements.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">++</span><span class="NAME">i</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>682</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">current</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">current</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>683</span> </span><span class="NAME">current</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">current.parentNode</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>684</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">current.className</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>685</span> </span><span class="COMM">// Match each whitespace-separated class name separately.</span><span class="WHIT">
-<span class='linenumber'>686</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">classNames</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">current.className.split</span><span class="PUNC">(</span><span class="REGX">/\s/</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>687</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC"><</span><span class="WHIT"> </span><span class="NAME">classNames.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">++</span><span class="NAME">j</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>688</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.className_</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">classNames</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>689</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>690</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>691</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>692</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>693</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>694</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>695</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>696</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>697</span>
+<span class='linenumber'>678</span> </span><span class="COMM">/**
+<span class='linenumber'>679</span> * A filter which suppresses errors by a literal match of the error location's
+<span class='linenumber'>680</span> * (or one of its DOM ancestors') <code>class</code> name.
+<span class='linenumber'>681</span> * @param {!Object} bareObject An object containing a 'className' field, which
+<span class='linenumber'>682</span> * must match one of the class names in the <code>class</code> attribute of the
+<span class='linenumber'>683</span> * location or one of its ancestors.
+<span class='linenumber'>684</span> * @constructor
+<span class='linenumber'>685</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
+<span class='linenumber'>686</span> * @private
+<span class='linenumber'>687</span> */</span><span class="WHIT">
+<span class='linenumber'>688</span> </span><span class="NAME">bidichecker.FilterFactory.LocationClassFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>689</span> </span><span class="COMM">/**
+<span class='linenumber'>690</span> * @type {string}
+<span class='linenumber'>691</span> * @private
+<span class='linenumber'>692</span> */</span><span class="WHIT">
+<span class='linenumber'>693</span> </span><span class="NAME">this.className_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>694</span> </span><span class="NAME">bidichecker.FilterFactory.getStringParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'className'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>695</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>696</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.LocationClassFilter_</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>697</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'>698</span>
-<span class='linenumber'>699</span> </span><span class="COMM">/**
-<span class='linenumber'>700</span> * A filter which suppresses errors by applying a regular expression to the
-<span class='linenumber'>701</span> * error location's (or one of its DOM ancestors') <code>class</code> name.
-<span class='linenumber'>702</span> * @param {!Object} bareObject An object containing a 'classRegexp' field,
-<span class='linenumber'>703</span> * containing a regular expression which must match one of the class names
-<span class='linenumber'>704</span> * in the <code>class</code> attribute of the location or one of its ancestors.
-<span class='linenumber'>705</span> * @constructor
-<span class='linenumber'>706</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
-<span class='linenumber'>707</span> * @private
-<span class='linenumber'>708</span> */</span><span class="WHIT">
-<span class='linenumber'>709</span> </span><span class="NAME">bidichecker.FilterFactory.LocationClassRegexpFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>710</span> </span><span class="COMM">/**
-<span class='linenumber'>711</span> * @type {!RegExp}
-<span class='linenumber'>712</span> * @private
-<span class='linenumber'>713</span> */</span><span class="WHIT">
-<span class='linenumber'>714</span> </span><span class="NAME">this.classRegexp_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>715</span> </span><span class="NAME">bidichecker.FilterFactory.getRegexpParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'classRegexp'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>716</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>717</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.LocationClassRegexpFilter_</span><span class="PUNC">,</span><span class="WHIT">
-<span class='linenumber'>718</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>699</span>
+<span class='linenumber'>700</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
+<span class='linenumber'>701</span> </span><span class="NAME">bidichecker.FilterFactory.LocationClassFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>702</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>703</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC"><</span><span class="WHIT"> </span><span class="NAME">locationElements.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">++</span><span class="NAME">i</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>704</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">current</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">current</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>705</span> </span><span class="NAME">current</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">current.parentNode</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>706</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">current.className</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>707</span> </span><span class="COMM">// Match each whitespace-separated class name separately.</span><span class="WHIT">
+<span class='linenumber'>708</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">classNames</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">current.className.split</span><span class="PUNC">(</span><span class="REGX">/\s/</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>709</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC"><</span><span class="WHIT"> </span><span class="NAME">classNames.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">++</span><span class="NAME">j</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>710</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.className_</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">classNames</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>711</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>712</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>713</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>714</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>715</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>716</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>717</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>718</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'>719</span>
<span class='linenumber'>720</span>
-<span class='linenumber'>721</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
-<span class='linenumber'>722</span> </span><span class="NAME">bidichecker.FilterFactory.LocationClassRegexpFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>723</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>724</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC"><</span><span class="WHIT"> </span><span class="NAME">locationElements.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">++</span><span class="NAME">i</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>725</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">current</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">current</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>726</span> </span><span class="NAME">current</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">current.parentNode</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>727</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">current.className</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>728</span> </span><span class="COMM">// Match each whitespace-separated class name separately.</span><span class="WHIT">
-<span class='linenumber'>729</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">classNames</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">current.className.split</span><span class="PUNC">(</span><span class="REGX">/\s/</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>730</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC"><</span><span class="WHIT"> </span><span class="NAME">classNames.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">++</span><span class="NAME">j</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>731</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.classRegexp_.test</span><span class="PUNC">(</span><span class="NAME">classNames</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>732</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>733</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>734</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>735</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>736</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>737</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>738</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>739</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>740</span>
+<span class='linenumber'>721</span> </span><span class="COMM">/**
+<span class='linenumber'>722</span> * A filter which suppresses errors by applying a regular expression to the
+<span class='linenumber'>723</span> * error location's (or one of its DOM ancestors') <code>class</code> name.
+<span class='linenumber'>724</span> * @param {!Object} bareObject An object containing a 'classRegexp' field,
+<span class='linenumber'>725</span> * containing a regular expression which must match one of the class names
+<span class='linenumber'>726</span> * in the <code>class</code> attribute of the location or one of its ancestors.
+<span class='linenumber'>727</span> * @constructor
+<span class='linenumber'>728</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
+<span class='linenumber'>729</span> * @private
+<span class='linenumber'>730</span> */</span><span class="WHIT">
+<span class='linenumber'>731</span> </span><span class="NAME">bidichecker.FilterFactory.LocationClassRegexpFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>732</span> </span><span class="COMM">/**
+<span class='linenumber'>733</span> * @type {!RegExp}
+<span class='linenumber'>734</span> * @private
+<span class='linenumber'>735</span> */</span><span class="WHIT">
+<span class='linenumber'>736</span> </span><span class="NAME">this.classRegexp_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>737</span> </span><span class="NAME">bidichecker.FilterFactory.getRegexpParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'classRegexp'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>738</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>739</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.LocationClassRegexpFilter_</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>740</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'>741</span>
-<span class='linenumber'>742</span> </span><span class="COMM">/**
-<span class='linenumber'>743</span> * A filter which suppresses errors by a literal match of the error location's
-<span class='linenumber'>744</span> * (or one of its DOM ancestors') <code>id</code> attribute.
-<span class='linenumber'>745</span> * @param {!Object} bareObject An object containing an 'id' field, which must
-<span class='linenumber'>746</span> * match the <code>id</code> attribute of the location or one of its ancestors.
-<span class='linenumber'>747</span> * @constructor
-<span class='linenumber'>748</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
-<span class='linenumber'>749</span> * @private
-<span class='linenumber'>750</span> */</span><span class="WHIT">
-<span class='linenumber'>751</span> </span><span class="NAME">bidichecker.FilterFactory.LocationIdFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>752</span> </span><span class="COMM">/**
-<span class='linenumber'>753</span> * @type {string}
-<span class='linenumber'>754</span> * @private
-<span class='linenumber'>755</span> */</span><span class="WHIT">
-<span class='linenumber'>756</span> </span><span class="NAME">this.id_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.getStringParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'id'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>757</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>758</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.LocationIdFilter_</span><span class="PUNC">,</span><span class="WHIT">
-<span class='linenumber'>759</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>760</span>
-<span class='linenumber'>761</span>
-<span class='linenumber'>762</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
-<span class='linenumber'>763</span> </span><span class="NAME">bidichecker.FilterFactory.LocationIdFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>764</span> </span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>765</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC"><</span><span class="WHIT"> </span><span class="NAME">locationElements.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">++</span><span class="NAME">i</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>766</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">current</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">current</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>767</span> </span><span class="NAME">current</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">current.parentNode</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>768</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">current.id</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">this.id_</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">current.id</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>769</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>770</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>771</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>772</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>773</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>774</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>775</span>
-<span class='linenumber'>776</span>
-<span class='linenumber'>777</span> </span><span class="COMM">/**
-<span class='linenumber'>778</span> * A filter which suppresses errors by applying a regular expression to the
-<span class='linenumber'>779</span> * error location's (or one of its DOM ancestors') <code>id</code> attribute.
-<span class='linenumber'>780</span> * @param {!Object} bareObject An object containing an 'idRegexp' field
-<span class='linenumber'>781</span> * containing a regular expression, which must match the <code>id</code>
-<span class='linenumber'>782</span> * attribute of the location or one of its ancestors.
-<span class='linenumber'>783</span> * @constructor
-<span class='linenumber'>784</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
-<span class='linenumber'>785</span> * @private
-<span class='linenumber'>786</span> */</span><span class="WHIT">
-<span class='linenumber'>787</span> </span><span class="NAME">bidichecker.FilterFactory.LocationIdRegexpFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>788</span> </span><span class="COMM">/**
-<span class='linenumber'>789</span> * @type {!RegExp}
-<span class='linenumber'>790</span> * @private
-<span class='linenumber'>791</span> */</span><span class="WHIT">
-<span class='linenumber'>792</span> </span><span class="NAME">this.idRegexp_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>793</span> </span><span class="NAME">bidichecker.FilterFactory.getRegexpParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'idRegexp'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>794</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>795</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.LocationIdRegexpFilter_</span><span class="PUNC">,</span><span class="WHIT">
-<span class='linenumber'>796</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>742</span>
+<span class='linenumber'>743</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
+<span class='linenumber'>744</span> </span><span class="NAME">bidichecker.FilterFactory.LocationClassRegexpFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>745</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>746</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC"><</span><span class="WHIT"> </span><span class="NAME">locationElements.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">++</span><span class="NAME">i</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>747</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">current</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">current</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>748</span> </span><span class="NAME">current</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">current.parentNode</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>749</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">current.className</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>750</span> </span><span class="COMM">// Match each whitespace-separated class name separately.</span><span class="WHIT">
+<span class='linenumber'>751</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">classNames</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">current.className.split</span><span class="PUNC">(</span><span class="REGX">/\s/</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>752</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC"><</span><span class="WHIT"> </span><span class="NAME">classNames.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">++</span><span class="NAME">j</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>753</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.classRegexp_.test</span><span class="PUNC">(</span><span class="NAME">classNames</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>754</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>755</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>756</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>757</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>758</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>759</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>760</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>761</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>762</span>
+<span class='linenumber'>763</span>
+<span class='linenumber'>764</span> </span><span class="COMM">/**
+<span class='linenumber'>765</span> * A filter which suppresses errors by a literal match of the error location's
+<span class='linenumber'>766</span> * (or one of its DOM ancestors') <code>id</code> attribute.
+<span class='linenumber'>767</span> * @param {!Object} bareObject An object containing an 'id' field, which must
+<span class='linenumber'>768</span> * match the <code>id</code> attribute of the location or one of its ancestors.
+<span class='linenumber'>769</span> * @constructor
+<span class='linenumber'>770</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
+<span class='linenumber'>771</span> * @private
+<span class='linenumber'>772</span> */</span><span class="WHIT">
+<span class='linenumber'>773</span> </span><span class="NAME">bidichecker.FilterFactory.LocationIdFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>774</span> </span><span class="COMM">/**
+<span class='linenumber'>775</span> * @type {string}
+<span class='linenumber'>776</span> * @private
+<span class='linenumber'>777</span> */</span><span class="WHIT">
+<span class='linenumber'>778</span> </span><span class="NAME">this.id_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.getStringParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'id'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>779</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>780</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.LocationIdFilter_</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>781</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>782</span>
+<span class='linenumber'>783</span>
+<span class='linenumber'>784</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
+<span class='linenumber'>785</span> </span><span class="NAME">bidichecker.FilterFactory.LocationIdFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>786</span> </span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>787</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC"><</span><span class="WHIT"> </span><span class="NAME">locationElements.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">++</span><span class="NAME">i</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>788</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">current</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">current</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>789</span> </span><span class="NAME">current</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">current.parentNode</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>790</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">current.id</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">this.id_</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">current.id</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>791</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>792</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>793</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>794</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>795</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>796</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'>797</span>
<span class='linenumber'>798</span>
-<span class='linenumber'>799</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
-<span class='linenumber'>800</span> </span><span class="NAME">bidichecker.FilterFactory.LocationIdRegexpFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>801</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>802</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC"><</span><span class="WHIT"> </span><span class="NAME">locationElements.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">++</span><span class="NAME">i</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>803</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">current</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">current</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>804</span> </span><span class="NAME">current</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">current.parentNode</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>805</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">current.id</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">this.idRegexp_.test</span><span class="PUNC">(</span><span class="NAME">current.id</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>806</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>807</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>808</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>809</span> </span><span class="PUNC">}</span><span class="WHIT">
-<span class='linenumber'>810</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>811</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>812</span>
-<span class='linenumber'>813</span>
-<span class='linenumber'>814</span> </span><span class="COMM">/**
-<span class='linenumber'>815</span> * A filter which suppresses errors by inverting another filter.
-<span class='linenumber'>816</span> * @param {!Object} bareObject An object containing a 'filter' field, containing
-<span class='linenumber'>817</span> * a bare object representing a component filter.
-<span class='linenumber'>818</span> * @constructor
-<span class='linenumber'>819</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
-<span class='linenumber'>820</span> * @private
-<span class='linenumber'>821</span> */</span><span class="WHIT">
-<span class='linenumber'>822</span> </span><span class="NAME">bidichecker.FilterFactory.NotFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>823</span> </span><span class="COMM">/**
-<span class='linenumber'>824</span> * @type {!bidichecker.Filter}
-<span class='linenumber'>825</span> * @private
-<span class='linenumber'>826</span> */</span><span class="WHIT">
-<span class='linenumber'>827</span> </span><span class="NAME">this.filter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>828</span> </span><span class="NAME">bidichecker.FilterFactory.getFilterParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'filter'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>829</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>830</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.NotFilter_</span><span class="PUNC">,</span><span class="WHIT">
-<span class='linenumber'>831</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>832</span>
-<span class='linenumber'>833</span>
-<span class='linenumber'>834</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
-<span class='linenumber'>835</span> </span><span class="NAME">bidichecker.FilterFactory.NotFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>836</span> </span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>837</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">this.filter_.isSuppressed</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>838</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>839</span>
-<span class='linenumber'>840</span>
-<span class='linenumber'>841</span> </span><span class="COMM">/**
-<span class='linenumber'>842</span> * A filter which suppresses errors by or-ing component filters.
-<span class='linenumber'>843</span> * @param {!Object} bareObject An object containing 'filter1' and 'filter2'
-<span class='linenumber'>844</span> * fields, each containing a bare object representing a component filter.
-<span class='linenumber'>845</span> * @constructor
-<span class='linenumber'>846</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
-<span class='linenumber'>847</span> * @private
-<span class='linenumber'>848</span> */</span><span class="WHIT">
-<span class='linenumber'>849</span> </span><span class="NAME">bidichecker.FilterFactory.OrFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>850</span> </span><span class="COMM">/**
-<span class='linenumber'>851</span> * @type {!bidichecker.Filter}
-<span class='linenumber'>852</span> * @private
-<span class='linenumber'>853</span> */</span><span class="WHIT">
-<span class='linenumber'>854</span> </span><span class="NAME">this.filter1_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>855</span> </span><span class="NAME">bidichecker.FilterFactory.getFilterParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'filter1'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>856</span>
-<span class='linenumber'>857</span> </span><span class="COMM">/**
-<span class='linenumber'>858</span> * @type {!bidichecker.Filter}
-<span class='linenumber'>859</span> * @private
-<span class='linenumber'>860</span> */</span><span class="WHIT">
-<span class='linenumber'>861</span> </span><span class="NAME">this.filter2_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>862</span> </span><span class="NAME">bidichecker.FilterFactory.getFilterParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'filter2'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>863</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>864</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.OrFilter_</span><span class="PUNC">,</span><span class="WHIT">
-<span class='linenumber'>865</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>866</span>
-<span class='linenumber'>867</span>
-<span class='linenumber'>868</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
-<span class='linenumber'>869</span> </span><span class="NAME">bidichecker.FilterFactory.OrFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>870</span> </span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>871</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.filter1_.isSuppressed</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT">
-<span class='linenumber'>872</span> </span><span class="NAME">this.filter2_.isSuppressed</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>873</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>874</span>
-<span class='linenumber'>875</span>
-<span class='linenumber'>876</span> </span><span class="COMM">/**
-<span class='linenumber'>877</span> * A filter which suppresses errors by a literal match of their
-<span class='linenumber'>878</span> * <code>precededByText</code> fields.
-<span class='linenumber'>879</span> * @param {!Object} bareObject An object containing a 'precededByText' field,
-<span class='linenumber'>880</span> * which must match the entire <code>precededByText</code> field value. If empty,
-<span class='linenumber'>881</span> * will only match an empty or null <code>precededByText</code>.
+<span class='linenumber'>799</span> </span><span class="COMM">/**
+<span class='linenumber'>800</span> * A filter which suppresses errors by applying a regular expression to the
+<span class='linenumber'>801</span> * error location's (or one of its DOM ancestors') <code>id</code> attribute.
+<span class='linenumber'>802</span> * @param {!Object} bareObject An object containing an 'idRegexp' field
+<span class='linenumber'>803</span> * containing a regular expression, which must match the <code>id</code>
+<span class='linenumber'>804</span> * attribute of the location or one of its ancestors.
+<span class='linenumber'>805</span> * @constructor
+<span class='linenumber'>806</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
+<span class='linenumber'>807</span> * @private
+<span class='linenumber'>808</span> */</span><span class="WHIT">
+<span class='linenumber'>809</span> </span><span class="NAME">bidichecker.FilterFactory.LocationIdRegexpFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>810</span> </span><span class="COMM">/**
+<span class='linenumber'>811</span> * @type {!RegExp}
+<span class='linenumber'>812</span> * @private
+<span class='linenumber'>813</span> */</span><span class="WHIT">
+<span class='linenumber'>814</span> </span><span class="NAME">this.idRegexp_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>815</span> </span><span class="NAME">bidichecker.FilterFactory.getRegexpParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'idRegexp'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>816</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>817</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.LocationIdRegexpFilter_</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>818</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>819</span>
+<span class='linenumber'>820</span>
+<span class='linenumber'>821</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
+<span class='linenumber'>822</span> </span><span class="NAME">bidichecker.FilterFactory.LocationIdRegexpFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>823</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>824</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC"><</span><span class="WHIT"> </span><span class="NAME">locationElements.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">++</span><span class="NAME">i</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>825</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">current</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">current</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>826</span> </span><span class="NAME">current</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">current.parentNode</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>827</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">current.id</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">this.idRegexp_.test</span><span class="PUNC">(</span><span class="NAME">current.id</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>828</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>829</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>830</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>831</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>832</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>833</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>834</span>
+<span class='linenumber'>835</span>
+<span class='linenumber'>836</span> </span><span class="COMM">/**
+<span class='linenumber'>837</span> * A filter which suppresses errors by matching an XPath expression to the
+<span class='linenumber'>838</span> * error's location. The XPath is matched against the element location in the
+<span class='linenumber'>839</span> * innermost frame, as well as the elements corresponding to any containing
+<span class='linenumber'>840</span> * frames. There is currently no way to restrict the match to apply within
+<span class='linenumber'>841</span> * specific frames only.
+<span class='linenumber'>842</span> * @param {!Object} bareObject An object with an 'xpath' field containing an
+<span class='linenumber'>843</span> * XPath expression.
+<span class='linenumber'>844</span> * @constructor
+<span class='linenumber'>845</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
+<span class='linenumber'>846</span> * @private
+<span class='linenumber'>847</span> */</span><span class="WHIT">
+<span class='linenumber'>848</span> </span><span class="NAME">bidichecker.FilterFactory.LocationXpathFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>849</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">xpath</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.getStringParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'xpath'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>850</span>
+<span class='linenumber'>851</span> </span><span class="COMM">/**
+<span class='linenumber'>852</span> * @type {bidichecker.XpathMatcher}
+<span class='linenumber'>853</span> * @private
+<span class='linenumber'>854</span> */</span><span class="WHIT">
+<span class='linenumber'>855</span> </span><span class="NAME">this.xpathMatcher_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">bidichecker.XpathMatcher</span><span class="PUNC">(</span><span class="NAME">xpath</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>856</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>857</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.LocationXpathFilter_</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>858</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>859</span>
+<span class='linenumber'>860</span>
+<span class='linenumber'>861</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
+<span class='linenumber'>862</span> </span><span class="NAME">bidichecker.FilterFactory.LocationXpathFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>863</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>864</span> </span><span class="COMM">// TODO(user): This currently matches the path to the element in the</span><span class="WHIT">
+<span class='linenumber'>865</span> </span><span class="COMM">// innermost frame, as well as the element(s) of any frame(s) that contain it.</span><span class="WHIT">
+<span class='linenumber'>866</span> </span><span class="COMM">// Should we implement Puppet's '/content:' syntax extension to specify</span><span class="WHIT">
+<span class='linenumber'>867</span> </span><span class="COMM">// matching in a specific frame(s)? Or some other mechanism to specify the</span><span class="WHIT">
+<span class='linenumber'>868</span> </span><span class="COMM">// parent frames?</span><span class="WHIT">
+<span class='linenumber'>869</span> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC"><</span><span class="WHIT"> </span><span class="NAME">locationElements.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">++</span><span class="NAME">i</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>870</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.xpathMatcher_.matches</span><span class="PUNC">(</span><span class="NAME">locationElements</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>871</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>872</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>873</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='linenumber'>874</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>875</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>876</span>
+<span class='linenumber'>877</span>
+<span class='linenumber'>878</span> </span><span class="COMM">/**
+<span class='linenumber'>879</span> * A filter which suppresses errors by inverting another filter.
+<span class='linenumber'>880</span> * @param {!Object} bareObject An object containing a 'filter' field, containing
+<span class='linenumber'>881</span> * a bare object representing a component filter.
<span class='linenumber'>882</span> * @constructor
<span class='linenumber'>883</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
<span class='linenumber'>884</span> * @private
<span class='linenumber'>885</span> */</span><span class="WHIT">
-<span class='linenumber'>886</span> </span><span class="NAME">bidichecker.FilterFactory.PrecededByTextFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>886</span> </span><span class="NAME">bidichecker.FilterFactory.NotFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='linenumber'>887</span> </span><span class="COMM">/**
-<span class='linenumber'>888</span> * @type {string}
+<span class='linenumber'>888</span> * @type {!bidichecker.Filter}
<span class='linenumber'>889</span> * @private
<span class='linenumber'>890</span> */</span><span class="WHIT">
-<span class='linenumber'>891</span> </span><span class="NAME">this.precededByText_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>892</span> </span><span class="NAME">bidichecker.FilterFactory.getStringParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'precededByText'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>891</span> </span><span class="NAME">this.filter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>892</span> </span><span class="NAME">bidichecker.FilterFactory.getFilterParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'filter'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'>893</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>894</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.PrecededByTextFilter_</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>894</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.NotFilter_</span><span class="PUNC">,</span><span class="WHIT">
<span class='linenumber'>895</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'>896</span>
<span class='linenumber'>897</span>
<span class='linenumber'>898</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
-<span class='linenumber'>899</span> </span><span class="NAME">bidichecker.FilterFactory.PrecededByTextFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>900</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>901</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.precededByText_</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">error.getPrecededByText</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>899</span> </span><span class="NAME">bidichecker.FilterFactory.NotFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>900</span> </span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>901</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">this.filter_.isSuppressed</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'>902</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='linenumber'>903</span>
<span class='linenumber'>904</span>
<span class='linenumber'>905</span> </span><span class="COMM">/**
-<span class='linenumber'>906</span> * A filter which suppresses errors by applying a regular expression to their
-<span class='linenumber'>907</span> * <code>precededByText</code> fields.
-<span class='linenumber'>908</span> * @param {!Object} bareObject An object containing a 'precededByTextRegexp'
-<span class='linenumber'>909</span> * field containing a regular expression, which must match the entire
-<span class='linenumber'>910</span> * precededByText field value. If empty, will only match an empty or null
-<span class='linenumber'>911</span> * <code>precededByText</code>.
-<span class='linenumber'>912</span> * @constructor
-<span class='linenumber'>913</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
-<span class='linenumber'>914</span> * @private
-<span class='linenumber'>915</span> */</span><span class="WHIT">
-<span class='linenumber'>916</span> </span><span class="NAME">bidichecker.FilterFactory.PrecededByTextRegexpFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>917</span> </span><span class="COMM">/**
-<span class='linenumber'>918</span> * @type {!RegExp}
-<span class='linenumber'>919</span> * @private
-<span class='linenumber'>920</span> */</span><span class="WHIT">
-<span class='linenumber'>921</span> </span><span class="NAME">this.precededByTextRegexp_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>922</span> </span><span class="NAME">bidichecker.FilterFactory.getRegexpParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT">
-<span class='linenumber'>923</span> </span><span class="STRN">'precededByTextRegexp'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>924</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>925</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.PrecededByTextRegexpFilter_</span><span class="PUNC">,</span><span class="WHIT">
-<span class='linenumber'>926</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>927</span>
-<span class='linenumber'>928</span>
-<span class='linenumber'>929</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
-<span class='linenumber'>930</span> </span><span class="NAME">bidichecker.FilterFactory.PrecededByTextRegexpFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
-<span class='linenumber'>931</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>932</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.precededByTextRegexp_.test</span><span class="PUNC">(</span><span class="NAME">error.getPrecededByText</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>933</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>934</span>
-<span class='linenumber'>935</span>
-<span class='linenumber'>936</span> </span><span class="COMM">/**
-<span class='linenumber'>937</span> * A filter which suppresses errors based on their severity fields.
-<span class='linenumber'>938</span> * @param {!Object} bareObject An object containing an integer-valued
-<span class='linenumber'>939</span> * 'severityThreshold' field representing the threshold severity value for
-<span class='linenumber'>940</span> * suppression.
-<span class='linenumber'>941</span> * @constructor
-<span class='linenumber'>942</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
-<span class='linenumber'>943</span> * @private
-<span class='linenumber'>944</span> */</span><span class="WHIT">
-<span class='linenumber'>945</span> </span><span class="NAME">bidichecker.FilterFactory.SeverityFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>946</span> </span><span class="COMM">/**
-<span class='linenumber'>947</span> * @type {number}
-<span class='linenumber'>948</span> * @private
-<span class='linenumber'>949</span> */</span><span class="WHIT">
-<span class='linenumber'>950</span> </span><span class="NAME">this.severityThreshold_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.getNumberParam_</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>951</span> </span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'severityThreshold'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>952</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>953</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.SeverityFilter_</span><span class="PUNC">,</span><span class="WHIT">
-<span class='linenumber'>954</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>955</span>
-<span class='linenumber'>956</span>
-<span class='linenumber'>957</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
-<span class='linenumber'>958</span> </span><span class="NAME">bidichecker.FilterFactory.SeverityFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>959</span> </span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>960</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.severityThreshold_</span><span class="WHIT"> </span><span class="PUNC"><=</span><span class="WHIT"> </span><span class="NAME">error.getSeverity</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>961</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>962</span>
-<span class='linenumber'>963</span>
-<span class='linenumber'>964</span> </span><span class="COMM">/**
-<span class='linenumber'>965</span> * A filter which suppresses errors based on their type fields.
-<span class='linenumber'>966</span> * @param {!Object} bareObject An object containing a string-valued 'type' field
-<span class='linenumber'>967</span> * which must exactly match the error type value.
-<span class='linenumber'>968</span> * @constructor
-<span class='linenumber'>969</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
-<span class='linenumber'>970</span> * @private
-<span class='linenumber'>971</span> */</span><span class="WHIT">
-<span class='linenumber'>972</span> </span><span class="NAME">bidichecker.FilterFactory.TypeFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>973</span> </span><span class="COMM">/**
-<span class='linenumber'>974</span> * @type {string}
-<span class='linenumber'>975</span> * @private
-<span class='linenumber'>976</span> */</span><span class="WHIT">
-<span class='linenumber'>977</span> </span><span class="NAME">this.type_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.getStringParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'type'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>978</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>979</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.TypeFilter_</span><span class="PUNC">,</span><span class="WHIT">
-<span class='linenumber'>980</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>981</span>
-<span class='linenumber'>982</span>
-<span class='linenumber'>983</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
-<span class='linenumber'>984</span> </span><span class="NAME">bidichecker.FilterFactory.TypeFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
-<span class='linenumber'>985</span> </span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
-<span class='linenumber'>986</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.type_</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">error.getType</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>987</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
-<span class='linenumber'>988</span> </span></pre></body></html>
\ No newline at end of file
+<span class='linenumber'>906</span> * A filter which suppresses errors by or-ing component filters.
+<span class='linenumber'>907</span> * @param {!Object} bareObject An object containing 'filter1' and 'filter2'
+<span class='linenumber'>908</span> * fields, each containing a bare object representing a component filter.
+<span class='linenumber'>909</span> * @constructor
+<span class='linenumber'>910</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
+<span class='linenumber'>911</span> * @private
+<span class='linenumber'>912</span> */</span><span class="WHIT">
+<span class='linenumber'>913</span> </span><span class="NAME">bidichecker.FilterFactory.OrFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>914</span> </span><span class="COMM">/**
+<span class='linenumber'>915</span> * @type {!bidichecker.Filter}
+<span class='linenumber'>916</span> * @private
+<span class='linenumber'>917</span> */</span><span class="WHIT">
+<span class='linenumber'>918</span> </span><span class="NAME">this.filter1_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>919</span> </span><span class="NAME">bidichecker.FilterFactory.getFilterParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'filter1'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>920</span>
+<span class='linenumber'>921</span> </span><span class="COMM">/**
+<span class='linenumber'>922</span> * @type {!bidichecker.Filter}
+<span class='linenumber'>923</span> * @private
+<span class='linenumber'>924</span> */</span><span class="WHIT">
+<span class='linenumber'>925</span> </span><span class="NAME">this.filter2_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>926</span> </span><span class="NAME">bidichecker.FilterFactory.getFilterParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'filter2'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>927</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>928</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.OrFilter_</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>929</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>930</span>
+<span class='linenumber'>931</span>
+<span class='linenumber'>932</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
+<span class='linenumber'>933</span> </span><span class="NAME">bidichecker.FilterFactory.OrFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>934</span> </span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>935</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.filter1_.isSuppressed</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT">
+<span class='linenumber'>936</span> </span><span class="NAME">this.filter2_.isSuppressed</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>937</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>938</span>
+<span class='linenumber'>939</span>
+<span class='linenumber'>940</span> </span><span class="COMM">/**
+<span class='linenumber'>941</span> * A filter which suppresses errors by a literal match of their
+<span class='linenumber'>942</span> * <code>precededByText</code> fields.
+<span class='linenumber'>943</span> * @param {!Object} bareObject An object containing a 'precededByText' field,
+<span class='linenumber'>944</span> * which must match the entire <code>precededByText</code> field value. If empty,
+<span class='linenumber'>945</span> * will only match an empty or null <code>precededByText</code>.
+<span class='linenumber'>946</span> * @constructor
+<span class='linenumber'>947</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
+<span class='linenumber'>948</span> * @private
+<span class='linenumber'>949</span> */</span><span class="WHIT">
+<span class='linenumber'>950</span> </span><span class="NAME">bidichecker.FilterFactory.PrecededByTextFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>951</span> </span><span class="COMM">/**
+<span class='linenumber'>952</span> * @type {string}
+<span class='linenumber'>953</span> * @private
+<span class='linenumber'>954</span> */</span><span class="WHIT">
+<span class='linenumber'>955</span> </span><span class="NAME">this.precededByText_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>956</span> </span><span class="NAME">bidichecker.FilterFactory.getStringParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'precededByText'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>957</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>958</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.PrecededByTextFilter_</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>959</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>960</span>
+<span class='linenumber'>961</span>
+<span class='linenumber'>962</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
+<span class='linenumber'>963</span> </span><span class="NAME">bidichecker.FilterFactory.PrecededByTextFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>964</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>965</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.precededByText_</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">error.getPrecededByText</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>966</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>967</span>
+<span class='linenumber'>968</span>
+<span class='linenumber'>969</span> </span><span class="COMM">/**
+<span class='linenumber'>970</span> * A filter which suppresses errors by applying a regular expression to their
+<span class='linenumber'>971</span> * <code>precededByText</code> fields.
+<span class='linenumber'>972</span> * @param {!Object} bareObject An object containing a 'precededByTextRegexp'
+<span class='linenumber'>973</span> * field containing a regular expression, which must match the entire
+<span class='linenumber'>974</span> * precededByText field value. If empty, will only match an empty or null
+<span class='linenumber'>975</span> * <code>precededByText</code>.
+<span class='linenumber'>976</span> * @constructor
+<span class='linenumber'>977</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
+<span class='linenumber'>978</span> * @private
+<span class='linenumber'>979</span> */</span><span class="WHIT">
+<span class='linenumber'>980</span> </span><span class="NAME">bidichecker.FilterFactory.PrecededByTextRegexpFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>981</span> </span><span class="COMM">/**
+<span class='linenumber'>982</span> * @type {!RegExp}
+<span class='linenumber'>983</span> * @private
+<span class='linenumber'>984</span> */</span><span class="WHIT">
+<span class='linenumber'>985</span> </span><span class="NAME">this.precededByTextRegexp_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>986</span> </span><span class="NAME">bidichecker.FilterFactory.getRegexpParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>987</span> </span><span class="STRN">'precededByTextRegexp'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>988</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>989</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.PrecededByTextRegexpFilter_</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>990</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>991</span>
+<span class='linenumber'>992</span>
+<span class='linenumber'>993</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
+<span class='linenumber'>994</span> </span><span class="NAME">bidichecker.FilterFactory.PrecededByTextRegexpFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">
+<span class='linenumber'>995</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>996</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.precededByTextRegexp_.test</span><span class="PUNC">(</span><span class="NAME">error.getPrecededByText</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>997</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>998</span>
+<span class='linenumber'>999</span>
+<span class='linenumber'>1000</span> </span><span class="COMM">/**
+<span class='linenumber'>1001</span> * A filter which suppresses errors based on their severity fields.
+<span class='linenumber'>1002</span> * @param {!Object} bareObject An object containing an integer-valued
+<span class='linenumber'>1003</span> * 'severityThreshold' field representing the threshold severity value for
+<span class='linenumber'>1004</span> * suppression.
+<span class='linenumber'>1005</span> * @constructor
+<span class='linenumber'>1006</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
+<span class='linenumber'>1007</span> * @private
+<span class='linenumber'>1008</span> */</span><span class="WHIT">
+<span class='linenumber'>1009</span> </span><span class="NAME">bidichecker.FilterFactory.SeverityFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>1010</span> </span><span class="COMM">/**
+<span class='linenumber'>1011</span> * @type {number}
+<span class='linenumber'>1012</span> * @private
+<span class='linenumber'>1013</span> */</span><span class="WHIT">
+<span class='linenumber'>1014</span> </span><span class="NAME">this.severityThreshold_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.getNumberParam_</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>1015</span> </span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'severityThreshold'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>1016</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>1017</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.SeverityFilter_</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>1018</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>1019</span>
+<span class='linenumber'>1020</span>
+<span class='linenumber'>1021</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
+<span class='linenumber'>1022</span> </span><span class="NAME">bidichecker.FilterFactory.SeverityFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>1023</span> </span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>1024</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.severityThreshold_</span><span class="WHIT"> </span><span class="PUNC"><=</span><span class="WHIT"> </span><span class="NAME">error.getSeverity</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>1025</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>1026</span>
+<span class='linenumber'>1027</span>
+<span class='linenumber'>1028</span> </span><span class="COMM">/**
+<span class='linenumber'>1029</span> * A filter which suppresses errors based on their type fields.
+<span class='linenumber'>1030</span> * @param {!Object} bareObject An object containing a string-valued 'type' field
+<span class='linenumber'>1031</span> * which must exactly match the error type value.
+<span class='linenumber'>1032</span> * @constructor
+<span class='linenumber'>1033</span> * @extends {bidichecker.FilterFactory.ComposableFilter}
+<span class='linenumber'>1034</span> * @private
+<span class='linenumber'>1035</span> */</span><span class="WHIT">
+<span class='linenumber'>1036</span> </span><span class="NAME">bidichecker.FilterFactory.TypeFilter_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>1037</span> </span><span class="COMM">/**
+<span class='linenumber'>1038</span> * @type {string}
+<span class='linenumber'>1039</span> * @private
+<span class='linenumber'>1040</span> */</span><span class="WHIT">
+<span class='linenumber'>1041</span> </span><span class="NAME">this.type_</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">bidichecker.FilterFactory.getStringParam_</span><span class="PUNC">(</span><span class="NAME">bareObject</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'type'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>1042</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>1043</span> </span><span class="NAME">goog.inherits</span><span class="PUNC">(</span><span class="NAME">bidichecker.FilterFactory.TypeFilter_</span><span class="PUNC">,</span><span class="WHIT">
+<span class='linenumber'>1044</span> </span><span class="NAME">bidichecker.FilterFactory.ComposableFilter</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>1045</span>
+<span class='linenumber'>1046</span>
+<span class='linenumber'>1047</span> </span><span class="COMM">/** @inheritDoc */</span><span class="WHIT">
+<span class='linenumber'>1048</span> </span><span class="NAME">bidichecker.FilterFactory.TypeFilter_.prototype.isSuppressed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT">
+<span class='linenumber'>1049</span> </span><span class="NAME">error</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">locationElements</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='linenumber'>1050</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.type_</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">error.getType</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>1051</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='linenumber'>1052</span> </span></pre></body></html>
\ No newline at end of file
diff --git a/docs/users_guide.html b/docs/users_guide.html
index 3182d68..df8b33d 100644
--- a/docs/users_guide.html
+++ b/docs/users_guide.html
@@ -252,6 +252,11 @@
<td> Matches against an entire <b>id</b> attribute on any ancestor element containing the error location (including any containing frames)</td>
</tr>
<tr>
+<td> locationXpath</td>
+<td> bidichecker.FilterFactory.locationXpath(string)</td>
+<td> Matches an XPath expression against the element of the error location (including the elements representing any containing frames). This does not match against ancestor elements; to match against everything within a given location, you can add "/*" to the XPath expression. There is currently no mechanism for restricting the XPath match to specific frames. <b>NOTE: XPaths are not currently supported on Internet Explorer.</b></td>
+</tr>
+<tr>
<td> not</td>
<td> bidichecker.FilterFactory.not(filter)</td>
<td> Inverts the meaning of a filter</td>
@@ -399,17 +404,14 @@
<br>
<h2><a name="TOC-Issues-with"></a>Issues with HTML support</h2>
How BidiChecker handles various features of HTML:<br>
-<ol><li><b>Undisplayed text.</b> Content designated as "display:none" is ignored by BidiChecker. If a page has elements which are conditionally displayed when something is clicked, for example, they will not be checked while invisible.<br>
-</li>
+<ol><li><b>Undisplayed text.</b> Content designated as "display:none" is ignored by BidiChecker. If a page has elements which are conditionally displayed when something is clicked, for example, they will not be checked while invisible.</li>
<li><b>Frames.</b> When traversing the DOM of the page, BidiChecker also enters the contents of frames (either FRAME or IFRAME elements). The frame's location is appended to the element's location description, such as: "<b style="font-family: courier new,monospace;">in <div id='abc'><p> in <iframe id='frame1'></b>". In the case of FRAMEs making up the top-level page passed to
BidiChecker, their overall directionality is checked to match the
-specified value; in the case of IFRAMEs and FRAMEs below IFRAMEs, their
-overall
-directionality is not checked. If a frame's contents are hosted on a different domain, they are not checked; the Javascript security model makes them inaccessible, and you probably don't intend to check them anyway.<br>
-</li>
+specified value; in the case of IFRAMEs and FRAMEs below IFRAMEs, their overall
+directionality is not checked. If a frame's contents are hosted on a different domain, they are not checked; the Javascript security model makes them inaccessible, and you probably don't intend to check them anyway.</li>
<li><b>Unicode BiDi characters.</b> BidiChecker does not yet handle <a href="http://www.w3.org/TR/unicode-xml/#Bidi" target="_blank">Unicode BiDi embedding control characters</a>. This means that in the rare situation where embedding control characters are used to fix a BiDi bug, such as in <b style="font-family: courier new,monospace;"><option></b> elements, BidiChecker will report the bug anyway. In the rarer circumstance where incorrectly used embedding control characters may introduce a bug, the bug will not be identified.</li>
-<li><b>Layout garbling of non-text inline elements.</b> Certain page elements, such as inputs and images, are affected by BiDi layout garbling bugs as if they were neutral characters. This is not yet identified.<br>
-</li></ol>
+<li><b>Layout garbling of non-text inline elements.</b> Certain page elements, such as inputs and images, are affected by BiDi layout garbling bugs as if they were neutral characters. This is not yet identified.</li>
+<li><b><noscript> elements.</b> The contents of <b>noscript</b> tags (which are meant to be rendered when scripting is disabled) are not checked by BidiChecker; anything inside them is skipped.</li></ol>
<h2><a name="TOC-Known-problems"></a>Known problems</h2>
<ol><li>The GUI does not work correctly if more than one test is run from a given test file; otherwise, subsequent tests may corrupt the DOM of the test for which the GUI is run, making it unusable.</li>
<li>The dialog box of the GUI mode does not work correctly when run on some pages.</li>
diff --git a/lib/bidichecker_packaged.js b/lib/bidichecker_packaged.js
index b6dca88..7535ac1 100755
--- a/lib/bidichecker_packaged.js
+++ b/lib/bidichecker_packaged.js
@@ -1,100 +1,105 @@
(function (){ function h(a){throw a;}
-var i=true,j=null,k=false,m,o=this,q=function(a,b,c){a=a.split(".");c=c||o;!(a[0]in c)&&c.execScript&&c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)if(!a.length&&b!==undefined)c[d]=b;else c=c[d]?c[d]:c[d]={}},aa=function(){},ba=function(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array||!(a instanceof Object)&&Object.prototype.toString.call(a)=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";
-if(!(a instanceof Object)&&(Object.prototype.toString.call(a)=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call")))return"function"}else return"null";else if(b=="function"&&typeof a.call=="undefined")return"object";return b},s=function(a){return ba(a)=="array"},ca=function(a){var b=ba(a);return b=="array"||b=="object"&&typeof a.length=="number"},t=function(a){return typeof a=="string"},da=function(a){return ba(a)=="function"},
-ea=function(a){a=ba(a);return a=="object"||a=="array"||a=="function"},ha=function(a){return a[fa]||(a[fa]=++ga)},fa="closure_uid_"+Math.floor(Math.random()*2147483648).toString(36),ga=0,ia=function(a,b){var c=b||o;if(arguments.length>2){var d=Array.prototype.slice.call(arguments,2);return function(){var e=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(e,d);return a.apply(c,e)}}else return function(){return a.apply(c,arguments)}},ja=function(a){var b=Array.prototype.slice.call(arguments,
-1);return function(){var c=Array.prototype.slice.call(arguments);c.unshift.apply(c,b);return a.apply(this,c)}},ka=Date.now||function(){return+new Date},v=function(a,b){function c(){}c.prototype=b.prototype;a.l=b.prototype;a.prototype=new c};var la=function(a){this.stack=Error().stack||"";if(a)this.message=String(a)};v(la,Error);la.prototype.name="CustomError";var ma=function(a){for(var b=1;b<arguments.length;b++){var c=String(arguments[b]).replace(/\$/g,"$$$$");a=a.replace(/\%s/,c)}return a},sa=function(a,b){if(b)return a.replace(na,"&").replace(oa,"<").replace(pa,">").replace(qa,""");else{if(!ra.test(a))return a;if(a.indexOf("&")!=-1)a=a.replace(na,"&");if(a.indexOf("<")!=-1)a=a.replace(oa,"<");if(a.indexOf(">")!=-1)a=a.replace(pa,">");if(a.indexOf('"')!=-1)a=a.replace(qa,""");return a}},na=/&/g,oa=/</g,pa=/>/g,qa=/\"/g,
-ra=/[&<>\"]/,ua=function(a,b){for(var c=0,d=String(a).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),e=String(b).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),f=Math.max(d.length,e.length),g=0;c==0&&g<f;g++){var l=d[g]||"",n=e[g]||"",p=RegExp("(\\d*)(\\D*)","g"),G=RegExp("(\\d*)(\\D*)","g");do{var u=p.exec(l)||["","",""],r=G.exec(n)||["","",""];if(u[0].length==0&&r[0].length==0)break;c=ta(u[1].length==0?0:parseInt(u[1],10),r[1].length==0?0:parseInt(r[1],10))||ta(u[2].length==0,r[2].length==0)||
-ta(u[2],r[2])}while(c==0)}return c},ta=function(a,b){if(a<b)return-1;else if(a>b)return 1;return 0};var va=function(a,b){b.unshift(a);la.call(this,ma.apply(j,b));b.shift();this.Nc=a};v(va,la);va.prototype.name="AssertionError";var wa=function(a,b){if(!a){var c=Array.prototype.slice.call(arguments,2),d="Assertion failed";if(b){d+=": "+b;var e=c}h(new va(""+d,e||[]))}return a};var w=function(a){return a[a.length-1]},x=Array.prototype,xa=x.indexOf?function(a,b,c){wa(a.length!=j);return x.indexOf.call(a,b,c)}:function(a,b,c){c=c==j?0:c<0?Math.max(0,a.length+c):c;if(t(a)){if(!t(b)||b.length!=1)return-1;return a.indexOf(b,c)}for(c=c;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},ya=x.forEach?function(a,b,c){wa(a.length!=j);x.forEach.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=t(a)?a.split(""):a,f=0;f<d;f++)f in e&&b.call(c,e[f],f,a)},za=function(a,b,c){for(var d=
-t(a)?a.split(""):a,e=a.length-1;e>=0;--e)e in d&&b.call(c,d[e],e,a)},Aa=x.map?function(a,b,c){wa(a.length!=j);return x.map.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=Array(d),f=t(a)?a.split(""):a,g=0;g<d;g++)if(g in f)e[g]=b.call(c,f[g],g,a);return e},Ba=x.every?function(a,b,c){wa(a.length!=j);return x.every.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=t(a)?a.split(""):a,f=0;f<d;f++)if(f in e&&!b.call(c,e[f],f,a))return k;return i},Ca=function(a,b){var c=xa(a,b),d;if(d=c>=0){wa(a.length!=
-j);x.splice.call(a,c,1)}return d},Da=function(){return x.concat.apply(x,arguments)},Ea=function(a){if(s(a))return Da(a);else{for(var b=[],c=0,d=a.length;c<d;c++)b[c]=a[c];return b}},Fa=function(a,b,c){wa(a.length!=j);return arguments.length<=2?x.slice.call(a,b):x.slice.call(a,b,c)},Ga=function(a,b,c,d,e){for(var f=0,g=a.length,l;f<g;){var n=f+g>>1,p;p=c?b.call(e,a[n],n,a):b(d,a[n]);if(p>0)f=n+1;else{g=n;l=!p}}return l?f:~f},Ha=function(a,b){return a>b?1:a<b?-1:0};var y="StopIteration"in o?o.StopIteration:Error("StopIteration"),Ia=function(){};Ia.prototype.next=function(){h(y)};Ia.prototype.Ma=function(){return this};
-var Ja=function(a){if(a instanceof Ia)return a;if(typeof a.Ma=="function")return a.Ma(k);if(ca(a)){var b=0,c=new Ia;c.next=function(){for(;;){if(b>=a.length)h(y);if(b in a)return a[b++];else b++}};return c}h(Error("Not implemented"))},Ka=function(a,b,c){if(ca(a))try{ya(a,b,c)}catch(d){if(d!==y)h(d)}else{a=Ja(a);try{for(;;)b.call(c,a.next(),undefined,a)}catch(e){if(e!==y)h(e)}}};var La=function(a,b){this.x=a!==undefined?a:0;this.y=b!==undefined?b:0};La.prototype.toString=function(){return"("+this.x+", "+this.y+")"};var z=function(a,b){this.width=a;this.height=b};z.prototype.toString=function(){return"("+this.width+" x "+this.height+")"};z.prototype.Ea=function(){return!(this.width*this.height)};z.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};z.prototype.round=function(){this.width=Math.round(this.width);this.height=Math.round(this.height);return this};var Ma=function(a,b,c){for(var d in a)b.call(c,a[d],d,a)},Na=function(a){var b=[],c=0,d;for(d in a)b[c++]=a[d];return b},Oa=function(a){var b=[],c=0,d;for(d in a)b[c++]=d;return b},Pa=function(a,b){var c;if(c=b in a)delete a[b];return c},Qa=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Ra=function(a){for(var b,c,d=1;d<arguments.length;d++){c=arguments[d];for(b in c)a[b]=c[b];for(var e=0;e<Qa.length;e++){b=Qa[e];if(Object.prototype.hasOwnProperty.call(c,
-b))a[b]=c[b]}}},Sa=function(){var a=arguments.length;if(a==1&&s(arguments[0]))return Sa.apply(j,arguments[0]);for(var b={},c=0;c<a;c++)b[arguments[c]]=i;return b};var Ta,Ua,Va,Wa,Xa,Ya,Za=function(){return o.navigator?o.navigator.userAgent:j},$a=function(){return o.navigator};Xa=Wa=Va=Ua=Ta=k;var ab;if(ab=Za()){var bb=$a();Ta=ab.indexOf("Opera")==0;Ua=!Ta&&ab.indexOf("MSIE")!=-1;Wa=(Va=!Ta&&ab.indexOf("WebKit")!=-1)&&ab.indexOf("Mobile")!=-1;Xa=!Ta&&!Va&&bb.product=="Gecko"}var cb=Ta,A=Ua,B=Xa,C=Va,db=Wa,eb=$a();Ya=(eb&&eb.platform||"").indexOf("Mac")!=-1;var fb=!!$a()&&($a().appVersion||"").indexOf("X11")!=-1,gb;
-a:{var hb="",ib;if(cb&&o.opera){var jb=o.opera.version;hb=typeof jb=="function"?jb():jb}else{if(B)ib=/rv\:([^\);]+)(\)|;)/;else if(A)ib=/MSIE\s+([^\);]+)(\)|;)/;else if(C)ib=/WebKit\/(\S+)/;if(ib){var kb=ib.exec(Za());hb=kb?kb[1]:""}}if(A){var lb,mb=o.document;lb=mb?mb.documentMode:undefined;if(lb>parseFloat(hb)){gb=String(lb);break a}}gb=hb}var nb=gb,ob={},E=function(a){return ob[a]||(ob[a]=ua(nb,a)>=0)};var pb,qb=!A||E("9");A&&E("9");var rb=function(a){var b;b=(b=a.className)&&typeof b.split=="function"?b.split(/\s+/):[];var c;c=Fa(arguments,1);for(var d=0,e=0;e<c.length;e++)if(!(xa(b,c[e])>=0)){b.push(c[e]);d++}c=d==c.length;a.className=b.join(" ");return c};var I=function(a){return a?new F(H(a)):pb||(pb=new F)},tb=function(a,b,c,d){a=d||a;b=b&&b!="*"?b.toUpperCase():"";if(a.querySelectorAll&&a.querySelector&&(!C||sb(document)||E("528"))&&(b||c))return a.querySelectorAll(b+(c?"."+c:""));if(c&&a.getElementsByClassName){a=a.getElementsByClassName(c);if(b){d={};for(var e=0,f=0,g;g=a[f];f++)if(b==g.nodeName)d[e++]=g;d.length=e;return d}else return a}a=a.getElementsByTagName(b||"*");if(c){d={};for(f=e=0;g=a[f];f++){b=g.className;if(typeof b.split=="function"&&
-xa(b.split(/\s+/),c)>=0)d[e++]=g}d.length=e;return d}else return a},vb=function(a,b){Ma(b,function(c,d){if(d=="style")a.style.cssText=c;else if(d=="class")a.className=c;else if(d=="for")a.htmlFor=c;else if(d in ub)a.setAttribute(ub[d],c);else a[d]=c})},ub={cellpadding:"cellPadding",cellspacing:"cellSpacing",colspan:"colSpan",rowspan:"rowSpan",valign:"vAlign",height:"height",width:"width",usemap:"useMap",frameborder:"frameBorder",type:"type"},wb=function(a){var b=a.document;if(C&&!E("500")&&!db){if(typeof a.innerHeight==
-"undefined")a=window;b=a.innerHeight;var c=a.document.documentElement.scrollHeight;if(a==a.top)if(c<b)b-=15;return new z(a.innerWidth,b)}a=sb(b);if(cb&&!E("9.50"))a=k;a=a?b.documentElement:b.body;return new z(a.clientWidth,a.clientHeight)},xb=function(a){return a?a.parentWindow||a.defaultView:window},zb=function(){return yb(document,arguments)},yb=function(a,b){var c=b[0],d=b[1];if(!qb&&d&&(d.name||d.type)){c=["<",c];d.name&&c.push(' name="',sa(d.name),'"');if(d.type){c.push(' type="',sa(d.type),
-'"');var e={};Ra(e,d);d=e;delete d.type}c.push(">");c=c.join("")}c=a.createElement(c);if(d)if(t(d))c.className=d;else s(d)?rb.apply(j,[c].concat(d)):vb(c,d);b.length>2&&Ab(a,c,b,2);return c},Ab=function(a,b,c,d){function e(g){if(g)b.appendChild(t(g)?a.createTextNode(g):g)}for(d=d;d<c.length;d++){var f=c[d];ca(f)&&!(ea(f)&&f.nodeType>0)?ya(Bb(f)?Ea(f):f,e):e(f)}},sb=function(a){return a.compatMode=="CSS1Compat"},Cb=function(a){return a&&a.parentNode?a.parentNode.removeChild(a):j},Db=function(a,b){var c=
-b.parentNode;c&&c.replaceChild(a,b)},H=function(a){return a.nodeType==9?a:a.ownerDocument||a.document},Eb=function(a,b){if("textContent"in a)a.textContent=b;else if(a.firstChild&&a.firstChild.nodeType==3){for(;a.lastChild!=a.firstChild;)a.removeChild(a.lastChild);a.firstChild.data=b}else{for(var c;c=a.firstChild;)a.removeChild(c);a.appendChild(H(a).createTextNode(b))}},Bb=function(a){if(a&&typeof a.length=="number")if(ea(a))return typeof a.item=="function"||typeof a.item=="string";else if(da(a))return typeof a.item==
-"function";return k},F=function(a){this.h=a||o.document||document};F.prototype.n=I;var Fb=function(a){return a.h};F.prototype.c=function(a){return t(a)?this.h.getElementById(a):a};F.prototype.k=function(){return yb(this.h,arguments)};F.prototype.createElement=function(a){return this.h.createElement(a)};F.prototype.createTextNode=function(a){return this.h.createTextNode(a)};var Gb=function(a){a=!C&&sb(a.h)?a.h.documentElement:a.h.body;return new La(a.scrollLeft,a.scrollTop)};
-F.prototype.appendChild=function(a,b){a.appendChild(b)};F.prototype.append=function(a){Ab(H(a),a,arguments,1)};var J=function(a,b,c,d,e){this.o=!!b;a&&Hb(this,a,d);this.V=e!=undefined?e:this.p||0;if(this.o)this.V*=-1;this.Vb=!c};v(J,Ia);J.prototype.r=j;J.prototype.p=0;J.prototype.Ib=k;var Hb=function(a,b,c,d){if(a.r=b)a.p=typeof c=="number"?c:a.r.nodeType!=1?0:a.o?-1:1;if(typeof d=="number")a.V=d};
-J.prototype.next=function(){var a;if(this.Ib){if(!this.r||this.Vb&&this.V==0)h(y);a=this.r;var b=this.o?-1:1;if(this.p==b){var c=this.o?a.lastChild:a.firstChild;c?Hb(this,c):Hb(this,a,b*-1)}else(c=this.o?a.previousSibling:a.nextSibling)?Hb(this,c):Hb(this,a.parentNode,b*-1);this.V+=this.p*(this.o?-1:1)}else this.Ib=i;a=this.r;if(!this.r)h(y);return a};
-J.prototype.splice=function(){var a=this.r,b=this.o?1:-1;if(this.p==b){this.p=b*-1;this.V+=this.p*(this.o?-1:1)}this.o=!this.o;J.prototype.next.call(this);this.o=!this.o;b=ca(arguments[0])?arguments[0]:arguments;for(var c=b.length-1;c>=0;c--)a.parentNode&&a.parentNode.insertBefore(b[c],a.nextSibling);Cb(a)};var Ib,Jb=!A||E("9"),Kb=A&&!E("8");var Lb=function(){};Lb.prototype.kb=k;Lb.prototype.u=function(){if(!this.kb){this.kb=i;this.g()}};Lb.prototype.g=function(){};var K=function(a,b){this.type=a;this.currentTarget=this.target=b};v(K,Lb);m=K.prototype;m.g=function(){delete this.type;delete this.target;delete this.currentTarget};m.U=k;m.qa=i;m.stopPropagation=function(){this.U=i};m.preventDefault=function(){this.qa=k};var Mb=function(a){a.preventDefault()};var L=function(a,b){a&&this.Da(a,b)};v(L,K);var Nb=[1,4,2];m=L.prototype;m.target=j;m.relatedTarget=j;m.offsetX=0;m.offsetY=0;m.clientX=0;m.clientY=0;m.screenX=0;m.screenY=0;m.button=0;m.keyCode=0;m.charCode=0;m.ctrlKey=k;m.altKey=k;m.shiftKey=k;m.metaKey=k;m.yc=k;m.G=j;
-m.Da=function(a,b){var c=this.type=a.type;this.target=a.target||a.srcElement;this.currentTarget=b;var d=a.relatedTarget;if(d){if(B)try{d=d.nodeName&&d}catch(e){d=j}}else if(c=="mouseover")d=a.fromElement;else if(c=="mouseout")d=a.toElement;this.relatedTarget=d;this.offsetX=a.offsetX!==undefined?a.offsetX:a.layerX;this.offsetY=a.offsetY!==undefined?a.offsetY:a.layerY;this.clientX=a.clientX!==undefined?a.clientX:a.pageX;this.clientY=a.clientY!==undefined?a.clientY:a.pageY;this.screenX=a.screenX||0;
-this.screenY=a.screenY||0;this.button=a.button;this.keyCode=a.keyCode||0;this.charCode=a.charCode||(c=="keypress"?a.keyCode:0);this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=a.shiftKey;this.metaKey=a.metaKey;this.yc=Ya?a.metaKey:a.ctrlKey;this.state=a.state;this.G=a;delete this.qa;delete this.U};m.stopPropagation=function(){L.l.stopPropagation.call(this);if(this.G.stopPropagation)this.G.stopPropagation();else this.G.cancelBubble=i};
-m.preventDefault=function(){L.l.preventDefault.call(this);var a=this.G;if(a.preventDefault)a.preventDefault();else{a.returnValue=k;if(Kb)try{if(a.ctrlKey||a.keyCode>=112&&a.keyCode<=123)a.keyCode=-1}catch(b){}}};m.g=function(){L.l.g.call(this);this.relatedTarget=this.currentTarget=this.target=this.G=j};var M=function(a,b){this.yb=b;this.R=[];if(a>this.yb)h(Error("[goog.structs.SimplePool] Initial cannot be greater than max"));for(var c=0;c<a;c++)this.R.push(this.C?this.C():{})};v(M,Lb);M.prototype.C=j;M.prototype.jb=j;var Ob=function(a){if(a.R.length)return a.R.pop();return a.C?a.C():{}},Qb=function(a,b){a.R.length<a.yb?a.R.push(b):Pb(a,b)},Pb=function(a,b){if(a.jb)a.jb(b);else if(ea(b))if(da(b.u))b.u();else for(var c in b)delete b[c]};
-M.prototype.g=function(){M.l.g.call(this);for(var a=this.R;a.length;)Pb(this,a.pop());delete this.R};var Rb;var Sb=(Rb="ScriptEngine"in o&&o.ScriptEngine()=="JScript")?o.ScriptEngineMajorVersion()+"."+o.ScriptEngineMinorVersion()+"."+o.ScriptEngineBuildVersion():"0";var Tb=function(){},Ub=0;m=Tb.prototype;m.key=0;m.ha=k;m.Oa=k;m.Da=function(a,b,c,d,e,f){if(da(a))this.vb=i;else if(a&&a.handleEvent&&da(a.handleEvent))this.vb=k;else h(Error("Invalid listener argument"));this.ca=a;this.Db=b;this.src=c;this.type=d;this.capture=!!e;this.Ca=f;this.Oa=k;this.key=++Ub;this.ha=k};m.handleEvent=function(a){if(this.vb)return this.ca.call(this.Ca||this.src,a);return this.ca.handleEvent.call(this.ca,a)};var Vb,Wb,Xb,Yb,Zb,$b,ac,bc,cc,dc,ec;
-(function(){function a(){return{j:0,v:0}}function b(){return[]}function c(){var r=function(D){return g.call(r.src,r.key,D)};return r}function d(){return new Tb}function e(){return new L}var f=Rb&&!(ua(Sb,"5.7")>=0),g;$b=function(r){g=r};if(f){Vb=function(){return Ob(l)};Wb=function(r){Qb(l,r)};Xb=function(){return Ob(n)};Yb=function(r){Qb(n,r)};Zb=function(){return Ob(p)};ac=function(){Qb(p,c())};bc=function(){return Ob(G)};cc=function(r){Qb(G,r)};dc=function(){return Ob(u)};ec=function(r){Qb(u,r)};
-var l=new M(0,600);l.C=a;var n=new M(0,600);n.C=b;var p=new M(0,600);p.C=c;var G=new M(0,600);G.C=d;var u=new M(0,600);u.C=e}else{Vb=a;Wb=aa;Xb=b;Yb=aa;Zb=c;ac=aa;bc=d;cc=aa;dc=e;ec=aa}})();var fc={},N={},O={},gc={},P=function(a,b,c,d,e){if(b)if(s(b)){for(var f=0;f<b.length;f++)P(a,b[f],c,d,e);return j}else{d=!!d;var g=N;b in g||(g[b]=Vb());g=g[b];if(!(d in g)){g[d]=Vb();g.j++}g=g[d];var l=ha(a),n;g.v++;if(g[l]){n=g[l];for(f=0;f<n.length;f++){g=n[f];if(g.ca==c&&g.Ca==e){if(g.ha)break;return n[f].key}}}else{n=g[l]=Xb();g.j++}f=Zb();f.src=a;g=bc();g.Da(c,f,a,b,d,e);c=g.key;f.key=c;n.push(g);fc[c]=g;O[l]||(O[l]=Xb());O[l].push(g);if(a.addEventListener){if(a==o||!a.ib)a.addEventListener(b,
-f,d)}else a.attachEvent(hc(b),f);return c}else h(Error("Invalid event type"))},ic=function(a,b,c,d,e){if(s(b)){for(var f=0;f<b.length;f++)ic(a,b[f],c,d,e);return j}a=P(a,b,c,d,e);fc[a].Oa=i;return a},jc=function(a,b,c,d,e){if(s(b)){for(var f=0;f<b.length;f++)jc(a,b[f],c,d,e);return j}d=!!d;a=kc(a,b,d);if(!a)return k;for(f=0;f<a.length;f++)if(a[f].ca==c&&a[f].capture==d&&a[f].Ca==e)return Q(a[f].key);return k},Q=function(a){if(!fc[a])return k;var b=fc[a];if(b.ha)return k;var c=b.src,d=b.type,e=b.Db,
-f=b.capture;if(c.removeEventListener){if(c==o||!c.ib)c.removeEventListener(d,e,f)}else c.detachEvent&&c.detachEvent(hc(d),e);c=ha(c);e=N[d][f][c];if(O[c]){var g=O[c];Ca(g,b);g.length==0&&delete O[c]}b.ha=i;e.zb=i;lc(d,f,c,e);delete fc[a];return i},lc=function(a,b,c,d){if(!d.Fa)if(d.zb){for(var e=0,f=0;e<d.length;e++)if(d[e].ha){var g=d[e].Db;g.src=j;ac(g);cc(d[e])}else{if(e!=f)d[f]=d[e];f++}d.length=f;d.zb=k;if(f==0){Yb(d);delete N[a][b][c];N[a][b].j--;if(N[a][b].j==0){Wb(N[a][b]);delete N[a][b];
-N[a].j--}if(N[a].j==0){Wb(N[a]);delete N[a]}}}},mc=function(a,b,c){var d=0,e=a==j,f=b==j,g=c==j;c=!!c;if(e)Ma(O,function(n){for(var p=n.length-1;p>=0;p--){var G=n[p];if((f||b==G.type)&&(g||c==G.capture)){Q(G.key);d++}}});else{a=ha(a);if(O[a]){a=O[a];for(e=a.length-1;e>=0;e--){var l=a[e];if((f||b==l.type)&&(g||c==l.capture)){Q(l.key);d++}}}}return d},kc=function(a,b,c){var d=N;if(b in d){d=d[b];if(c in d){d=d[c];a=ha(a);if(d[a])return d[a]}}return j},hc=function(a){if(a in gc)return gc[a];return gc[a]=
-"on"+a},oc=function(a,b,c,d,e){var f=1;b=ha(b);if(a[b]){a.v--;a=a[b];if(a.Fa)a.Fa++;else a.Fa=1;try{for(var g=a.length,l=0;l<g;l++){var n=a[l];if(n&&!n.ha)f&=nc(n,e)!==k}}finally{a.Fa--;lc(c,d,b,a)}}return Boolean(f)},nc=function(a,b){var c=a.handleEvent(b);a.Oa&&Q(a.key);return c};
-$b(function(a,b){if(!fc[a])return i;var c=fc[a],d=c.type,e=N;if(!(d in e))return i;e=e[d];var f,g;if(Ib===undefined)Ib=A&&!o.addEventListener;if(Ib){var l;if(!(l=b))a:{l="window.event".split(".");for(var n=o;f=l.shift();)if(n[f])n=n[f];else{l=j;break a}l=n}f=l;l=i in e;n=k in e;if(l){if(f.keyCode<0||f.returnValue!=undefined)return i;a:{var p=k;if(f.keyCode==0)try{f.keyCode=-1;break a}catch(G){p=i}if(p||f.returnValue==undefined)f.returnValue=i}}p=dc();p.Da(f,this);f=i;try{if(l){for(var u=Xb(),r=p.currentTarget;r;r=
-r.parentNode)u.push(r);g=e[i];g.v=g.j;for(var D=u.length-1;!p.U&&D>=0&&g.v;D--){p.currentTarget=u[D];f&=oc(g,u[D],d,i,p)}if(n){g=e[k];g.v=g.j;for(D=0;!p.U&&D<u.length&&g.v;D++){p.currentTarget=u[D];f&=oc(g,u[D],d,k,p)}}}else f=nc(c,p)}finally{if(u){u.length=0;Yb(u)}p.u();ec(p)}return f}d=new L(b,this);try{f=nc(c,d)}finally{d.u()}return f});var R=function(a){this.$a=a};v(R,Lb);
-var pc=new M(0,100),S=function(a,b,c,d,e,f){if(s(c))for(var g=0;g<c.length;g++)S(a,b,c[g],d,e,f);else qc(a,P(b,c,d||a,e||k,f||a.$a||a));return a},rc=function(a,b,c,d,e,f){if(s(c))for(var g=0;g<c.length;g++)rc(a,b,c[g],d,e,f);else qc(a,ic(b,c,d||a,e||k,f||a.$a||a));return a},qc=function(a,b){if(a.a)a.a[b]=i;else if(a.M){a.a=Ob(pc);a.a[a.M]=i;a.M=j;a.a[b]=i}else a.M=b},sc=function(a,b,c,d,e,f){if(a.M||a.a)if(s(c))for(var g=0;g<c.length;g++)sc(a,b,c[g],d,e,f);else{a:{d=d||a;f=f||a.$a||a;e=!!(e||k);if(b=
-kc(b,c,e))for(c=0;c<b.length;c++)if(b[c].ca==d&&b[c].capture==e&&b[c].Ca==f){b=b[c];break a}b=j}if(b){b=b.key;Q(b);if(a.a)Pa(a.a,b);else if(a.M==b)a.M=j}}return a};R.prototype.ga=function(){if(this.a){for(var a in this.a){Q(a);delete this.a[a]}Qb(pc,this.a);this.a=j}else this.M&&Q(this.M)};R.prototype.g=function(){R.l.g.call(this);this.ga()};R.prototype.handleEvent=function(){h(Error("EventHandler.handleEvent not implemented"))};var T=function(){};v(T,Lb);m=T.prototype;m.ib=i;m.Ha=j;m.db=function(a){this.Ha=a};m.addEventListener=function(a,b,c,d){P(this,a,b,c,d)};m.removeEventListener=function(a,b,c,d){jc(this,a,b,c,d)};
-m.dispatchEvent=function(a){a=a;if(t(a))a=new K(a,this);else if(a instanceof K)a.target=a.target||this;else{var b=a;a=new K(a.type,this);Ra(a,b)}b=1;var c,d=a.type,e=N;if(d in e){e=e[d];d=i in e;var f;if(d){c=[];for(f=this;f;f=f.Ha)c.push(f);f=e[i];f.v=f.j;for(var g=c.length-1;!a.U&&g>=0&&f.v;g--){a.currentTarget=c[g];b&=oc(f,c[g],a.type,i,a)&&a.qa!=k}}if(k in e){f=e[k];f.v=f.j;if(d)for(g=0;!a.U&&g<c.length&&f.v;g++){a.currentTarget=c[g];b&=oc(f,c[g],a.type,k,a)&&a.qa!=k}else for(c=this;!a.U&&c&&
-f.v;c=c.Ha){a.currentTarget=c;b&=oc(f,c,a.type,k,a)&&a.qa!=k}}a=Boolean(b)}else a=i;return a};m.g=function(){T.l.g.call(this);mc(this);this.Ha=j};var tc=function(a){a=String(a);var b;b=/^\s*$/.test(a)?k:/^[\],:{}\s\u2028\u2029]*$/.test(a.replace(/\\["\\\/bfnrtu]/g,"@").replace(/"[^"\\\n\r\u2028\u2029\x00-\x08\x10-\x1f\x80-\x9f]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:[\s\u2028\u2029]*\[)+/g,""));if(b)try{return eval("("+a+")")}catch(c){}h(Error("Invalid JSON string: "+a))},uc=function(){},wc=function(a,b,c){switch(typeof b){case "string":vc(a,b,c);break;case "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");
-break;case "boolean":c.push(b);break;case "undefined":c.push("null");break;case "object":if(b==j){c.push("null");break}if(s(b)){var d=b.length;c.push("[");for(var e="",f=0;f<d;f++){c.push(e);wc(a,b[f],c);e=","}c.push("]");break}c.push("{");d="";for(e in b)if(b.hasOwnProperty(e)){f=b[e];if(typeof f!="function"){c.push(d);vc(a,e,c);c.push(":");wc(a,f,c);d=","}}c.push("}");break;case "function":break;default:h(Error("Unknown type: "+typeof b))}},xc={'"':'\\"',"\\":"\\\\","/":"\\/","\u0008":"\\b","\u000c":"\\f",
-"\n":"\\n","\r":"\\r","\t":"\\t","\u000b":"\\u000b"},yc=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g,vc=function(a,b,c){c.push('"',b.replace(yc,function(d){if(d in xc)return xc[d];var e=d.charCodeAt(0),f="\\u";if(e<16)f+="000";else if(e<256)f+="00";else if(e<4096)f+="0";return xc[d]=f+e.toString(16)}),'"')};var zc=function(a){this.w=Rb?[]:"";a!=j&&this.append.apply(this,arguments)};zc.prototype.i=function(a){this.clear();this.append(a)};if(Rb){zc.prototype.Na=0;zc.prototype.append=function(a,b){if(b==j)this.w[this.Na++]=a;else{this.w.push.apply(this.w,arguments);this.Na=this.w.length}return this}}else zc.prototype.append=function(a,b){this.w+=a;if(b!=j)for(var c=1;c<arguments.length;c++)this.w+=arguments[c];return this};zc.prototype.clear=function(){if(Rb)this.Na=this.w.length=0;else this.w=""};
-zc.prototype.toString=function(){if(Rb){var a=this.w.join("");this.clear();a&&this.append(a);return a}else return this.w};var Ac=function(a,b,c,d){this.left=a;this.top=b;this.width=c;this.height=d};Ac.prototype.toString=function(){return"("+this.left+", "+this.top+" - "+this.width+"w x "+this.height+"h)"};var Cc=function(a,b,c){a.style[Bc(c)]=b},Dc=function(a,b){var c=H(a);if(c.defaultView&&c.defaultView.getComputedStyle)if(c=c.defaultView.getComputedStyle(a,j))return c[b]||c.getPropertyValue(b);return""},U=function(a,b){return Dc(a,b)||(a.currentStyle?a.currentStyle[b]:j)||a.style[b]},Fc=function(a,b,c){var d,e=B&&(Ya||fb)&&E("1.9");if(b instanceof La){d=b.x;b=b.y}else{d=b;b=c}a.style.left=Ec(d,e);a.style.top=Ec(b,e)},Gc=function(a){if(A)return a.offsetParent;var b=H(a),c=U(a,"position"),d=c=="fixed"||
-c=="absolute";for(a=a.parentNode;a&&a!=b;a=a.parentNode){c=U(a,"position");d=d&&c=="static"&&a!=b.documentElement&&a!=b.body;if(!d&&(a.scrollWidth>a.clientWidth||a.scrollHeight>a.clientHeight||c=="fixed"||c=="absolute"))return a}return j},Hc=function(a){var b,c=H(a),d=U(a,"position"),e=B&&c.getBoxObjectFor&&!a.getBoundingClientRect&&d=="absolute"&&(b=c.getBoxObjectFor(a))&&(b.screenX<0||b.screenY<0),f=new La(0,0),g;b=c?c.nodeType==9?c:H(c):document;if(g=A){g=I(b);g=!sb(g.h)}g=g?b.body:b.documentElement;
-if(a==g)return f;if(a.getBoundingClientRect){d=a.getBoundingClientRect();if(A){a=a.ownerDocument;d.left-=a.documentElement.clientLeft+a.body.clientLeft;d.top-=a.documentElement.clientTop+a.body.clientTop}b=d;c=Gb(I(c));f.x=b.left+c.x;f.y=b.top+c.y}else if(c.getBoxObjectFor&&!e){b=c.getBoxObjectFor(a);c=c.getBoxObjectFor(g);f.x=b.screenX-c.screenX;f.y=b.screenY-c.screenY}else{e=a;do{f.x+=e.offsetLeft;f.y+=e.offsetTop;if(e!=a){f.x+=e.clientLeft||0;f.y+=e.clientTop||0}if(C&&U(e,"position")=="fixed"){f.x+=
-c.body.scrollLeft;f.y+=c.body.scrollTop;break}e=e.offsetParent}while(e&&e!=a);if(cb||C&&d=="absolute")f.y-=c.body.offsetTop;for(e=a;(e=Gc(e))&&e!=c.body&&e!=g;){f.x-=e.scrollLeft;if(!cb||e.tagName!="TR")f.y-=e.scrollTop}}return f},Ic=function(a,b,c){if(b instanceof z){c=b.height;b=b.width}else{if(c==undefined)h(Error("missing height argument"));c=c}a.style.width=Ec(b,i);a.style.height=Ec(c,i)},Ec=function(a,b){if(typeof a=="number")a=(b?Math.round(a):a)+"px";return a},Jc=function(a){var b=cb&&!E("10");
-if(U(a,"display")!="none")return b?new z(a.offsetWidth||a.clientWidth,a.offsetHeight||a.clientHeight):new z(a.offsetWidth,a.offsetHeight);var c=a.style,d=c.display,e=c.visibility,f=c.position;c.visibility="hidden";c.position="absolute";c.display="inline";if(b){b=a.offsetWidth||a.clientWidth;a=a.offsetHeight||a.clientHeight}else{b=a.offsetWidth;a=a.offsetHeight}c.display=d;c.position=f;c.visibility=e;return new z(b,a)},Kc={},Bc=function(a){return Kc[a]||(Kc[a]=String(a).replace(/\-([a-z])/g,function(b,
-c){return c.toUpperCase()}))},Lc=function(a,b){var c=a.style;if("opacity"in c)c.opacity=b;else if("MozOpacity"in c)c.MozOpacity=b;else if("filter"in c)c.filter=b===""?"":"alpha(opacity="+b*100+")"},V=function(a,b){a.style.display=b?"":"none"},Mc=function(a,b){if(A)a.cssText=b;else a[C?"innerText":"innerHTML"]=b};var Nc=function(a){this.b=a;a=A?"focusout":"blur";this.nc=P(this.b,A?"focusin":"focus",this,!A);this.oc=P(this.b,a,this,!A)};v(Nc,T);Nc.prototype.handleEvent=function(a){var b=new L(a.G);b.type=a.type=="focusin"||a.type=="focus"?"focusin":"focusout";try{this.dispatchEvent(b)}finally{b.u()}};Nc.prototype.g=function(){Nc.l.g.call(this);Q(this.nc);Q(this.oc);delete this.b};var Oc=function(a,b,c){this.target=a;this.handle=b||a;this.ab=c||new Ac(NaN,NaN,NaN,NaN);this.h=H(a);this.m=new R(this);P(this.handle,"mousedown",this.Fb,k,this)};v(Oc,T);var Pc=A||B&&E("1.9.3");m=Oc.prototype;m.screenX=0;m.screenY=0;m.Gb=0;m.Hb=0;m.ja=0;m.ka=0;m.mb=i;m.L=k;m.sb=0;m.qc=0;m.lc=k;m.Y=function(){return this.m};m.g=function(){Oc.l.g.call(this);jc(this.handle,"mousedown",this.Fb,k,this);this.m.u();delete this.target;delete this.handle;delete this.m};
-m.Fb=function(a){if(this.mb&&!this.L&&(a.type!="mousedown"||(Jb?a.G.button==0:a.type=="click"?i:!!(a.G.button&Nb[0])))){if(this.sb==0){Qc(this,a);if(this.L)a.preventDefault();else return}else a.preventDefault();var b=this.h,c=b.documentElement,d=!Pc;S(this.m,b,"mousemove",this.rc,d);S(this.m,b,"mouseup",this.ya,d);if(Pc){c.setCapture(k);S(this.m,c,"losecapture",this.ya)}else S(this.m,xb(b),"blur",this.ya);A&&this.lc&&S(this.m,b,"dragstart",Mb);this.Ec&&S(this.m,this.Ec,"scroll",this.vc,d);this.screenX=
-this.Gb=a.screenX;this.screenY=this.Hb=a.screenY;this.ja=this.target.offsetLeft;this.ka=this.target.offsetTop;this.pa=Gb(I(this.h));this.qc=ka()}};var Qc=function(a,b){if(a.dispatchEvent(new Rc("start",a,b.clientX,b.clientY,b))!==k)a.L=i};Oc.prototype.ya=function(a,b){this.m.ga();Pc&&this.h.releaseCapture();if(this.L){this.L=k;this.dispatchEvent(new Rc("end",this,a.clientX,a.clientY,a,Sc(this,this.ja),Tc(this,this.ka),b))}};
-Oc.prototype.rc=function(a){if(this.mb){var b=a.screenX-this.screenX,c=a.screenY-this.screenY;this.screenX=a.screenX;this.screenY=a.screenY;if(!this.L){var d=this.Gb-this.screenX,e=this.Hb-this.screenY;if(d*d+e*e>this.sb){Qc(this,a);if(!this.L){this.ya(a);return}}}c=Uc(this,b,c);b=c.x;c=c.y;if(this.L)if(this.dispatchEvent(new Rc("beforedrag",this,a.clientX,a.clientY,a,b,c))!==k){Vc(this,a,b,c,k);a.preventDefault()}}};
-var Uc=function(a,b,c){var d=Gb(I(a.h));b+=d.x-a.pa.x;c+=d.y-a.pa.y;a.pa=d;a.ja+=b;a.ka+=c;return new La(Sc(a,a.ja),Tc(a,a.ka))};Oc.prototype.vc=function(a){var b=Uc(this,0,0);a.clientX=this.pa.x-this.screenX;a.clientY=this.pa.x-this.screenY;Vc(this,a,b.x,b.y,i)};
-var Vc=function(a,b,c,d){a.target.style.left=c+"px";a.target.style.top=d+"px";a.dispatchEvent(new Rc("drag",a,b.clientX,b.clientY,b,c,d))},Sc=function(a,b){var c=a.ab,d=!isNaN(c.left)?c.left:j;c=!isNaN(c.width)?c.width:0;return Math.min(d!=j?d+c:Infinity,Math.max(d!=j?d:-Infinity,b))},Tc=function(a,b){var c=a.ab,d=!isNaN(c.top)?c.top:j;c=!isNaN(c.height)?c.height:0;return Math.min(d!=j?d+c:Infinity,Math.max(d!=j?d:-Infinity,b))},Rc=function(a,b,c,d,e,f,g,l){K.call(this,a);this.clientX=c;this.clientY=
-d;this.Kc=e;this.left=f!==undefined?f:b.ja;this.top=g!==undefined?g:b.ka;this.Mc=b;this.Lc=!!l};v(Rc,K);var Wc=function(a){if(typeof a.Ba=="function")return a.Ba();if(t(a))return a.split("");if(ca(a)){for(var b=[],c=a.length,d=0;d<c;d++)b.push(a[d]);return b}return Na(a)},Xc=function(a,b,c){if(typeof a.forEach=="function")a.forEach(b,c);else if(ca(a)||t(a))ya(a,b,c);else{var d;if(typeof a.Ya=="function")d=a.Ya();else if(typeof a.Ba!="function")if(ca(a)||t(a)){d=[];for(var e=a.length,f=0;f<e;f++)d.push(f);d=d}else d=Oa(a);else d=void 0;e=Wc(a);f=e.length;for(var g=0;g<f;g++)b.call(c,e[g],d&&d[g],a)}};var Yc=function(a){this.N={};this.a=[];var b=arguments.length;if(b>1){if(b%2)h(Error("Uneven number of arguments"));for(var c=0;c<b;c+=2)this.i(arguments[c],arguments[c+1])}else if(a){if(a instanceof Yc){b=a.Ya();c=a.Ba()}else{b=Oa(a);c=Na(a)}for(var d=0;d<b.length;d++)this.i(b[d],c[d])}};m=Yc.prototype;m.j=0;m.La=0;m.Ba=function(){Zc(this);for(var a=[],b=0;b<this.a.length;b++)a.push(this.N[this.a[b]]);return a};m.Ya=function(){Zc(this);return this.a.concat()};m.Ea=function(){return this.j==0};
-m.clear=function(){this.N={};this.La=this.j=this.a.length=0};var Zc=function(a){if(a.j!=a.a.length){for(var b=0,c=0;b<a.a.length;){var d=a.a[b];if(Object.prototype.hasOwnProperty.call(a.N,d))a.a[c++]=d;b++}a.a.length=c}if(a.j!=a.a.length){var e={};for(c=b=0;b<a.a.length;){d=a.a[b];if(!Object.prototype.hasOwnProperty.call(e,d)){a.a[c++]=d;e[d]=1}b++}a.a.length=c}},$c=function(a,b,c){if(Object.prototype.hasOwnProperty.call(a.N,b))return a.N[b];return c};
-Yc.prototype.i=function(a,b){if(!Object.prototype.hasOwnProperty.call(this.N,a)){this.j++;this.a.push(a);this.La++}this.N[a]=b};Yc.prototype.Ma=function(a){Zc(this);var b=0,c=this.a,d=this.N,e=this.La,f=this,g=new Ia;g.next=function(){for(;;){if(e!=f.La)h(Error("The map has changed since the iterator was created"));if(b>=c.length)h(y);var l=c[b++];return a?l:d[l]}};return g};var ad=o.window;var bd=function(){};(function(a){a.pb=function(){return a.mc||(a.mc=new a)}})(bd);bd.prototype.Ab=0;bd.pb();var W=function(a){this.xa=a||I();this.Bc=cd};v(W,T);W.prototype.tb=bd.pb();var cd=j;m=W.prototype;m.aa=j;m.H=k;m.b=j;m.Bc=j;m.pc=j;m.fa=j;m.ua=j;m.ta=j;m.Jc=k;m.c=function(){return this.b};m.Y=function(){return this.$||(this.$=new R(this))};m.db=function(a){if(this.fa&&this.fa!=a)h(Error("Method not supported"));W.l.db.call(this,a)};m.n=function(){return this.xa};m.k=function(){this.b=this.xa.createElement("div")};
-m.ia=function(a){if(this.H)h(Error("Component already rendered"));this.b||this.k();a?a.insertBefore(this.b,j):this.xa.h.body.appendChild(this.b);if(!this.fa||this.fa.H)this.za()};m.za=function(){this.H=i;dd(this,function(a){!a.H&&a.c()&&a.za()})};m.ma=function(){dd(this,function(a){a.H&&a.ma()});this.$&&this.$.ga();this.H=k};
-m.g=function(){W.l.g.call(this);this.H&&this.ma();if(this.$){this.$.u();delete this.$}dd(this,function(a){a.u()});!this.Jc&&this.b&&Cb(this.b);this.fa=this.pc=this.b=this.ta=this.ua=j};var dd=function(a,b,c){a.ua&&ya(a.ua,b,c)};
-W.prototype.removeChild=function(a,b){if(a){var c=t(a)?a:a.aa||(a.aa=":"+(a.tb.Ab++).toString(36)),d;if(this.ta&&c){d=this.ta;d=c in d?d[c]:void 0;d=d||j}else d=j;a=d;if(c&&a){Pa(this.ta,c);Ca(this.ua,a);if(b){a.ma();a.b&&Cb(a.b)}c=a;if(c==j)h(Error("Unable to set parent component"));c.fa=j;W.l.db.call(c,j)}}if(!a)h(Error("Child is not in parent component"));return a};var X=function(a,b,c){W.call(this,c);this.t=a||"modal-dialog";this.gb=!!b;this.s=ed};v(X,W);m=X.prototype;m.Aa=j;m.Yb=i;m.qb=i;m.gb=k;m.oa=i;m.lb=i;m.Rb=0.5;m.Mb="";m.Ra="";m.s=j;m.W=j;m.hb=k;m.Wb=k;m.f=j;m.d=j;m.Ka=j;m.sa=j;m.Lb=j;m.Ja=j;m.va=j;m.z=j;
-m.k=function(){fd(this);var a=this.n();this.b=a.k("div",{className:this.t,tabIndex:0},this.Ka=a.k("div",{className:this.t+"-title",id:this.aa||(this.aa=":"+(this.tb.Ab++).toString(36))},this.sa=a.k("span",this.t+"-title-text",this.Mb),this.Ja=a.k("span",this.t+"-title-close")),this.va=a.k("div",this.t+"-content"),this.z=a.k("div",this.t+"-buttons"),this.Jb=a.k("span",{tabIndex:0}));this.Lb=this.Ka.id;a=this.c();if(B){a.setAttribute("role","dialog");a.Cc="dialog"}B&&this.c().setAttribute("aria-labelledby",
-this.Lb||"");if(this.Ra)this.va.innerHTML=this.Ra;V(this.Ja,this.qb);V(this.c(),k);if(this.s){a=this.s;a.b=this.z;a.ia()}};var fd=function(a){if(a.gb&&a.oa&&!a.d){var b;b=a.n().k("iframe",{frameborder:0,style:"border:0;vertical-align:bottom;",src:'javascript:""'});a.d=b;a.d.className=a.t+"-bg";V(a.d,k);Lc(a.d,0)}else if((!a.gb||!a.oa)&&a.d){Cb(a.d);a.d=j}if(a.oa&&!a.f){a.f=a.n().k("div",a.t+"-bg");Lc(a.f,a.Rb);V(a.f,k)}else if(!a.oa&&a.f){Cb(a.f);a.f=j}};
-X.prototype.ia=function(a){if(this.H)h(Error("Component already rendered"));this.c()||this.k();a=a||Fb(this.n()).body;this.d&&a.appendChild(this.d);this.f&&a.appendChild(this.f);X.l.ia.call(this,a)};
-X.prototype.za=function(){X.l.za.call(this);this.Aa=new Nc(Fb(this.n()));if(this.lb&&!this.W){var a=new Oc(this.c(),this.Ka);rb(this.Ka,this.t+"-title-draggable");this.W=a}S(S(this.Y(),this.Ja,"click",this.wc),this.Aa,"focusin",this.uc);a=this.c();if(B){a.setAttribute("role","dialog");a.Cc="dialog"}this.sa.id!==""&&B&&this.c().setAttribute("aria-labelledby",this.sa.id)};X.prototype.ma=function(){this.hb&&gd(this,k);this.Aa.u();this.Aa=j;if(this.W){this.W.u();this.W=j}X.l.ma.call(this)};
-var gd=function(a,b){if(b!=a.hb){var c=Fb(a.n()),d=xb(c)||window;a.H||a.ia(c.body);if(b){hd(a);id(a);S(S(S(a.Y(),a.c(),"keydown",a.Ga,i),a.c(),"keypress",a.Ga,i),d,"resize",a.Cb,i)}else sc(sc(sc(a.Y(),a.c(),"keydown",a.Ga,i),a.c(),"keypress",a.Ga,i),d,"resize",a.Cb,i);a.d&&V(a.d,b);a.f&&V(a.f,b);V(a.c(),b);b&&a.focus();if(a.hb=b)S(a.Y(),a.z,"click",a.Bb);else{sc(a.Y(),a.z,"click",a.Bb);a.dispatchEvent("afterhide");a.Wb&&a.u()}}};
-X.prototype.focus=function(){try{this.c().focus()}catch(a){}if(this.s){var b=this.s.wa;if(b)for(var c=Fb(this.n()),d=this.z.getElementsByTagName("button"),e=0,f;f=d[e];e++)if(f.name==b){try{if(C||cb){var g=c.createElement("input");g.style.cssText="position:fixed;width:0;height:0;left:0;top:0;";this.c().appendChild(g);g.focus();this.c().removeChild(g)}f.focus()}catch(l){}break}}};
-var hd=function(a){a.d&&V(a.d,k);a.f&&V(a.f,k);var b=Fb(a.n()),c=wb(xb(b)||window||window),d=Math.max(b.body.scrollWidth,c.width);b=Math.max(b.body.scrollHeight,c.height);if(a.d){V(a.d,i);Ic(a.d,d,b)}if(a.f){V(a.f,i);Ic(a.f,d,b)}if(a.lb){c=Jc(a.c());a.W.ab=new Ac(0,0,d-c.width,b-c.height)}},id=function(a){var b=Fb(a.n()),c=xb(b)||window;if(U(a.c(),"position")=="fixed")var d=b=0;else{d=Gb(a.n());b=d.x;d=d.y}var e=Jc(a.c());c=wb(c||window);Fc(a.c(),Math.max(b+c.width/2-e.width/2,0),Math.max(d+c.height/
-2-e.height/2,0))};m=X.prototype;m.wc=function(){if(this.qb){var a=this.s,b=a&&a.Pa;if(b)this.dispatchEvent(new jd(b,$c(a,b)))&&gd(this,k);else gd(this,k)}};m.g=function(){X.l.g.call(this);if(this.f){Cb(this.f);this.f=j}if(this.d){Cb(this.d);this.d=j}this.Jb=this.z=this.Ja=j};m.Bb=function(a){a:{for(a=a.target;a!=j&&a!=this.z;){if(a.tagName=="BUTTON"){a=a;break a}a=a.parentNode}a=j}if(a&&!a.disabled){a=a.name;this.dispatchEvent(new jd(a,$c(this.s,a)))&&gd(this,k)}};
-m.Ga=function(a){var b=k,c=k,d=this.s,e=a.target;if(a.type=="keydown")if(this.Yb&&a.keyCode==27){var f=d&&d.Pa;e=e.tagName=="SELECT"&&!e.disabled;if(f&&!e){c=i;b=this.dispatchEvent(new jd(f,$c(d,f)))}else e||(b=i)}else{if(a.keyCode==9&&a.shiftKey&&e==this.c())c=i}else if(a.keyCode==13){if(e.tagName=="BUTTON")f=e.name;else if(d){var g=d.wa,l;if(l=g)a:{l=d.b.getElementsByTagName("BUTTON");for(var n=0,p;p=l[n];n++)if(p.name==g||p.id==g){l=p;break a}l=j}l=l;e=(e.tagName=="TEXTAREA"||e.tagName=="SELECT")&&
-!e.disabled;if(l&&!l.disabled&&!e)f=g}if(f){c=i;b=this.dispatchEvent(new jd(f,String($c(d,f))))}}if(b||c){a.stopPropagation();a.preventDefault()}b&&gd(this,k)};m.Cb=function(){hd(this)};m.uc=function(a){if(this.Jb==a.target){a=this.ac;if(da(a)){if(this)a=ia(a,this)}else if(a&&typeof a.handleEvent=="function")a=ia(a.handleEvent,a);else h(Error("Invalid listener argument"));ad.setTimeout(a,0)}};m.ac=function(){A&&Fb(this.n()).body.focus();this.c().focus()};
-var jd=function(a,b){this.type="dialogselect";this.key=a;this.caption=b};v(jd,K);var Y=function(a){this.xa=a||I();Yc.call(this)},ed;v(Y,Yc);m=Y.prototype;m.t="goog-buttonset";m.wa=j;m.b=j;m.Pa=j;m.i=function(a,b,c,d){Yc.prototype.i.call(this,a,b);if(c)this.wa=a;if(d)this.Pa=a;return this};m.ia=function(){if(this.b){this.b.innerHTML="";var a=I(this.b);Xc(this,function(b,c){var d=a.k("button",{name:c},b);if(c==this.wa)d.className=this.t+"-default";this.b.appendChild(d)},this)}};
-(new Y).i("ok","OK",i,i);ed=(new Y).i("ok","OK",i).i("cancel","Cancel",k,i);(new Y).i("yes","Yes",i).i("no","No",k,i);(new Y).i("yes","Yes").i("no","No",i).i("cancel","Cancel",k,i);(new Y).i("continue","Continue").i("save","Save").i("cancel","Cancel",i,i);var kd=RegExp("[\u0591-\u07ff\u200f\ufb1d-\ufdff\ufe70-\ufefc](?:[^A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff]*[\u0591-\u07ff\u200f\ufb1d-\ufdff\ufe70-\ufefc])?","g"),ld=RegExp("[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff](?:[^\u0591-\u07ff\u200f\ufb1d-\ufdff\ufe70-\ufefc]*[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff])?",
-"g"),md=RegExp("^[\u0000-\u0008\u000e-\u001f!-@[-`{-\u0084\u0086-\u009f\u00a1-\u00bf\u00d7\u00f7\u02b9-\u02ff\u200b-\u200d\u2010-\u2027\u2030-\u205e\u2060-\u2bff\t-\r \u0085\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000]*[\u0000-\u0008\u000e-\u001f!-@[-`{-\u0084\u0086-\u009f\u00a1-\u00bf\u00d7\u00f7\u02b9-\u02ff\u200b-\u200d\u2010-\u2027\u2030-\u205e\u2060-\u2bff]"),nd=RegExp("[\u0000-\u0008\u000e-\u001f!-@[-`{-\u0084\u0086-\u009f\u00a1-\u00bf\u00d7\u00f7\u02b9-\u02ff\u200b-\u200d\u2010-\u2027\u2030-\u205e\u2060-\u2bff][\u0000-\u0008\u000e-\u001f!-@[-`{-\u0084\u0086-\u009f\u00a1-\u00bf\u00d7\u00f7\u02b9-\u02ff\u200b-\u200d\u2010-\u2027\u2030-\u205e\u2060-\u2bff\t-\r \u0085\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000]*$"),
-od=RegExp("[\u0000-\u001f\u0085\u00a0\u1680\u180e\u2000-\u200f\u2028\u2029\u202f\u205f\u3000]"),pd=RegExp("^[\u0000-\u0008\u000e-\u001f!-@[-`{-\u0084\u0086-\u009f\u00a1-\u00bf\u00d7\u00f7\u02b9-\u02ff\u200b-\u200d\u2010-\u2027\u2030-\u205e\u2060-\u2bff\t-\r \u0085\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\u200e]+$"),qd=RegExp("^[\u0000-\u0008\u000e-\u001f!-@[-`{-\u0084\u0086-\u009f\u00a1-\u00bf\u00d7\u00f7\u02b9-\u02ff\u200b-\u200d\u2010-\u2027\u2030-\u205e\u2060-\u2bff\t-\r \u0085\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\u200f]+$"),
-rd=RegExp("^[\u0000-\u0008\u000e-\u001f!-@[-`{-\u0084\u0086-\u009f\u00a1-\u00bf\u00d7\u00f7\u02b9-\u02ff\u200b-\u200d\u2010-\u2027\u2030-\u205e\u2060-\u2bff\t-\r \u0085\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000]*\\d"),sd=RegExp("[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff\u0591-\u07ff\u200f\ufb1d-\ufdff\ufe70-\ufefc]"),td=function(a,b){this.text=a;this.index=b},ud=function(a){for(var b=[],c;c=kd.exec(a);)b.push(new td(c[0],
-c.index));return b},vd=function(a){for(var b=[],c;c=ld.exec(a);)b.push(new td(c[0],c.index));return b},wd=function(a){if(a=rd.exec(a))return new td(a[0],0);return j},xd={"\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t",'"':'\\"',"'":"\\'","\\":"\\\\"},yd=function(a){for(var b=[],c=0;c<a.length;c++){var d=b,e=c,f;f=a.charAt(c);if(f in xd)f=xd[f];else{var g=f;if(od.test(f)){var l=f.charCodeAt(0);g="\\u";if(l<4096){g+="0";if(l<256){g+="0";if(l<16)g+="0"}}g+=l.toString(16)}f=xd[f]=g}d[e]=
-f}return b.join("")},zd=function(a){return a.nodeName+"="+("'"+yd(a.nodeValue)+"'")},Ad=function(a){var b=[];if(a.attributes)for(var c=0;c<a.attributes.length;++c){var d=a.attributes[c];if(d.specified===undefined||d.specified)b.push(d)}a=[a.nodeName.toLowerCase()];b=Aa(b,zd);b.sort();a=a.concat(b);return"<"+a.join(" ")+">"},Bd=function(a){var b=[];for(a=a;a;a=a.parentNode){b.push(Ad(a));if(a.id||a.nodeName=="BODY")break}b.reverse();return b.join("")},Cd=function(a){var b=[],c=new J(a);Ka(c,function(){c.r.nodeType==
-3&&b.push(c.r.data)});return b.join("")},Dd=Sa("ADDRESS","BLOCKQUOTE","BODY","CAPTION","CENTER","COL","COLGROUP","DIR","DIV","DL","DD","DT","FIELDSET","FORM","H1","H2","H3","H4","H5","H6","HR","ISINDEX","OL","LI","MAP","MENU","OPTGROUP","OPTION","P","PRE","TABLE","TBODY","TD","TFOOT","TH","THEAD","TR","TL","UL"),Ed=Sa("inline","inline-block","inline-table"),Fd={element:j,style:j},Gd=function(a){if(Fd.element==a)return Fd.style;var b=(a.currentStyle?a.currentStyle.display:j)||Dc(a,"display");Fd={element:a,
-style:b};return b},Hd=function(a){var b=Gd(a);return b?!Ed[b]:!!Dd[a.tagName]},Id=function(a){if(a.nodeType==1){if(a.nodeName=="SCRIPT"||a.nodeName=="STYLE")return k;return Gd(a)!="none"}return i};var Jd=function(a,b,c){this.T=a;this.Gc=b;this.Xb=c;this.S=[]};Jd.prototype.rb=function(){if(this.S.length==0)for(var a=0;a<this.T.length;++a)this.S.push(Kd(this.T[a],a==0?this.Gc:0,a==this.T.length-1?this.Xb:this.T[a].length));else for(a=0;a<this.S.length;++a)Db(this.S[a],this.T[a]);return Hc(this.S[0])};Jd.prototype.Nb=function(){if(this.S.length!=0)for(var a=0;a<this.T.length;++a)Db(this.T[a],this.S[a])};
-var Kd=function(a,b,c){b=b||0;c=c||a.data.length;var d=[];b>0&&d.push(a.data.substring(0,b));d.push(zb("span",{style:"color:red; background-color:yellow"},a.data.substring(b,c)));c<a.data.length&&d.push(a.data.substring(c));b=zb("span",j,d);Db(b,a);return b};var Ld=function(a){this.b=a};Ld.prototype.cb=j;Ld.prototype.rb=function(){this.cb=U(this.b,"backgroundColor");var a=this.b;t("background-color")?Cc(a,"yellow","background-color"):Ma("background-color",ja(Cc,a));return Hc(this.b)};Ld.prototype.Nb=function(){if(this.cb!=j){var a=this.b;t("background-color")?Cc(a,this.cb,"background-color"):Ma("background-color",ja(Cc,a))}};var Z=function(a,b,c,d){if(typeof a=="object"){b=["id","type","severity","atText","locationDescription","precededByText","followedByText"];c=["id","type","severity"];for(d=0;d<b.length;++d){var e=b[d];this[e]=e in a?a[e]:j;if(this[e]==j&&xa(c,e)>=0)h("Required field '"+e+"' not found in bidichecker.Error.")}}else{if(b==undefined)h("Required parameter 'opt_severity' not found in bidichecker.Error.");this.id=Md++;this.type=a;this.severity=b;Nd[this.id]=c||j;this.atText=d||j}};
-Z.prototype.precededByText=j;Z.prototype.followedByText=j;Z.prototype.locationDescription=j;Z.prototype.asString=j;var Md=0,Nd=[];Z.prototype.Z=function(){return Nd[this.id]||j};Z.prototype.toString=function(){var a=new zc("[",this.severity.toString(),"] ",this.type),b;if(b=this.atText)a.append(": ","'"+yd(b)+"'");if(b=this.precededByText)a.append(" preceded by ","'"+yd(b)+"'");if(b=this.followedByText)a.append(" followed by ","'"+yd(b)+"'");if(b=this.locationDescription)a.append(" in ",b);return a.toString()};var Od=function(a){this.A=a;this.q=0;this.ob=this.Q=this.P=j};Od.prototype.ic=function(){var a;if(/[^0-9]/.test(this.Q.value))a=-1;else{a=this.Q.value;var b=Number(a);a=b==0&&/^[\s\xa0]*$/.test(a)?NaN:b;a=a-1}a=a;if(a>=0&&a<this.A.length&&a!=this.q){Pd(this);this.q=a;this.Q.value=this.q+1;Qd(this)}else this.Q.value=this.q+1};Od.prototype.ec=function(a){a=a.key=="next"?this.q==this.A.length-1?0:this.q+1:this.q==0?this.A.length-1:this.q-1;Pd(this);this.q=a;this.Q.value=this.q+1;Qd(this);return k};
-var Qd=function(a){var b=a.A[a.q],c=b.Z();if(c){var d=c.rb();c=window.scrollY;window.scrollTo(0,d.y-100);d=new La(a.P.offsetLeft,a.P.offsetTop);Fc(a.P,d.x,d.y+(window.scrollY-c))}Eb(a.ob,b.toString())},Pd=function(a){(a=a.A[a.q].Z())&&a.Nb()};var Rd=function(a,b){this.Qa=a;this.r=b},Sd=function(a){this.ea=[new Rd(0,a)];this.xb=a};Sd.prototype.append=function(a,b){if(this.xb!=b){this.ea.push(new Rd(a,b));this.xb=b}};var Td=function(a,b){var c=Ga(a.ea,function(d,e){return d-e.Qa}||Ha,k,b);return c>=0?c:-c-2};Sd.prototype.Va=function(a){return this.ea[Td(this,a)].r};Sd.prototype.Z=function(a,b){for(var c=Td(this,a),d=Td(this,a+b-1),e=[],f=c;f<=d;++f)e.push(this.ea[f].r);return new Jd(e,a-this.ea[c].Qa,a+b-this.ea[d].Qa)};
-var Ud=function(a,b,c,d,e){this.wb=b;this.ub=e;this.Sb=d;this.fb=[a];this.Kb=a.length;this.bb=new Sd(c)};Ud.prototype.Ia=j;Ud.prototype.Ea=function(){return Ba(this.fb,function(a){return a.length==0})};Ud.prototype.append=function(a,b){this.bb.append(this.Kb,b);this.Kb+=a.length;this.fb.push(a);this.Ia=j};var Vd=function(a){if(a.Ia===j)a.Ia=a.fb.join("");return a.Ia};Ud.prototype.Va=function(a){return this.bb.Va(a)};Ud.prototype.Z=function(a,b){return this.bb.Z(a,b)};var Wd=new Ud("",k,j,j,k);var Xd=function(a){this.da=new J(a);this.Dc=a;this.B=["rtl"==U(a,"direction")];this.ba=[];this.O=[a];this.X=[]};v(Xd,T);Xd.prototype.I=j;Xd.prototype.go=function(){try{for(;;Yd(this));}catch(a){if(a!==y)h(a);else this.dispatchEvent("EndOfDom")}};
-var Yd=function(a){for(var b=a.da.next();a.da.p==1&&!Id(b);){b=a.da;var c=b.o?-1:1;if(b.p==c){b.p=c*-1;b.V+=b.p*(b.o?-1:1)}b=a.da.next()}a.I=b;if(a.da.p==1){b=a.I;c="rtl"==U(b,"direction");a.ba.push(w(a.ba)||c!=w(a.B)||Zd(a,b));a.B.push(c);if(b.nodeName=="IFRAME"||b.nodeName=="FRAME")a.X.push(b);else Hd(b)&&a.O.push(b);a.dispatchEvent("StartTag")}else if(a.da.p==-1){a.dispatchEvent("EndTag");a.B.pop();a.ba.pop();a.I==w(a.O)&&a.O.pop()}else a.I.nodeType==3&&a.dispatchEvent("TextNode")};
-Xd.prototype.Xa=function(){return this.X};var Zd=function(a,b){if(!b.dir||b==a.Dc)return k;for(var c=b.firstChild;c;c=c.nextSibling)if(c.nodeType==1&&Hd(c))return k;return i};var $d=function(a){this.K=Wd;this.m=new R(this);S(this.m,a,"TextNode",this.Za);rc(this.m,a,"EndOfDom",this.gc)};v($d,T);$d.prototype.Za=function(a){a=a.target;var b=a.I;if(w(a.B)==this.K.wb&&w(a.O)==this.K.Sb&&w(a.ba)==this.K.ub)this.K.append(b.data,b);else{this.K.Ea()||this.dispatchEvent("DirChunk");this.K=new Ud(b.data,w(a.B),b,w(a.O),w(a.ba))}};$d.prototype.gc=function(){this.K.Ea()||this.dispatchEvent("DirChunk");this.dispatchEvent("EndOfChunks");this.m.ga()};var $=function(){};q("bidichecker.FilterFactory.ComposableFilter",$,void 0);$.prototype.Ob=function(a){return ae(this,a)};$.prototype.and=$.prototype.Ob;$.prototype.tc=function(){return be(this)};$.prototype.not=$.prototype.tc;$.prototype.xc=function(a){return ce(this,a)};$.prototype.or=$.prototype.xc;
-var se=function(a){var b=a.opcode;switch(b){case "AND":return new de(a);case "AT_TEXT":return new ee(a);case "AT_TEXT_REGEXP":return new fe(a);case "FOLLOWED_BY_TEXT":return new ge(a);case "FOLLOWED_BY_TEXT_REGEXP":return new he(a);case "LOCATION_CLASS":return new ie(a);case "LOCATION_CLASS_REGEXP":return new je(a);case "LOCATION_ID":return new ke(a);case "LOCATION_ID_REGEXP":return new le(a);case "NOT":return new me(a);case "OR":return new ne(a);case "PRECEDED_BY_TEXT":return new oe(a);case "PRECEDED_BY_TEXT_REGEXP":return new pe(a);
-case "SEVERITY":return new qe(a);case "TYPE":return new re(a);default:h("Unknown filter opcode: '"+b+"'")}},te=function(a){if(!a)return j;a=tc(a);return Aa(a,function(b){return se(b)})},ae=function(a,b){return new de({filter1:a,filter2:b})};q("bidichecker.FilterFactory.and",ae,void 0);q("bidichecker.FilterFactory.atText",function(a){return new ee({atText:a||""})},void 0);q("bidichecker.FilterFactory.atTextRegexp",function(a){return new fe({atTextRegexp:a||""})},void 0);
-q("bidichecker.FilterFactory.followedByText",function(a){return new ge({followedByText:a||""})},void 0);q("bidichecker.FilterFactory.followedByTextRegexp",function(a){return new he({followedByTextRegexp:a||""})},void 0);q("bidichecker.FilterFactory.locationClass",function(a){if(!a||a=="")h("Empty or null argument to bidichecker.FilterFactory.locationClass");return new ie({className:a})},void 0);
-q("bidichecker.FilterFactory.locationClassRegexp",function(a){if(!a||a=="")h("Empty or null argument to bidichecker.FilterFactory.locationClassRegexp");return new je({classRegexp:a})},void 0);q("bidichecker.FilterFactory.locationId",function(a){if(!a||a=="")h("Empty or null argument to bidichecker.FilterFactory.locationId");return new ke({id:a})},void 0);
-q("bidichecker.FilterFactory.locationIdRegexp",function(a){if(!a||a=="")h("Empty or null argument to bidichecker.FilterFactory.locationIdRegexp");return new le({idRegexp:a})},void 0);var be=function(a){return new me({filter:a})};q("bidichecker.FilterFactory.not",be,void 0);var ce=function(a,b){return new ne({filter1:a,filter2:b})};q("bidichecker.FilterFactory.or",ce,void 0);q("bidichecker.FilterFactory.precededByText",function(a){return new oe({precededByText:a||""})},void 0);
-q("bidichecker.FilterFactory.precededByTextRegexp",function(a){return new pe({precededByTextRegexp:a||""})},void 0);q("bidichecker.FilterFactory.severityFrom",function(a){return new qe({severityThreshold:a})},void 0);q("bidichecker.FilterFactory.type",function(a){return new re({type:a})},void 0);
-var ue=function(a,b){if(!(b in a))h("No '"+b+"' parameter found for '"+a.opcode+"' filter")},ve=function(a,b,c){ue(a,b);if(typeof a[b]!=c)h("Wrong type for '"+b+"' parameter of '"+a.opcode+"' filter; expected "+c)},we=function(a,b){ve(a,b,"string");return a[b]},xe=function(a,b){ue(a,b);var c=a[b],d;if(typeof c=="string")d=c;else if(c instanceof RegExp)d=c.source;else h("Wrong type for '"+b+"' parameter of '"+a.opcode+"' filter; expected string or RegExp");return RegExp("^("+d+")$")},ye=function(a,
-b){ve(a,b,"object");var c=a[b];if(c instanceof $)return c;else if(typeof c.opcode=="string")return se(c);else h("Can't make a filter out of the '"+b+"' parameter of '"+a.opcode+"' filter")},de=function(a){this.Ta=ye(a,"filter1");this.Ua=ye(a,"filter2")};v(de,$);de.prototype.e=function(a,b){return this.Ta.e(a,b)&&this.Ua.e(a,b)};var ee=function(a){this.Qb=we(a,"atText")};v(ee,$);ee.prototype.e=function(a){return this.Qb==(a.atText||"")};var fe=function(a){this.Pb=xe(a,"atTextRegexp")};v(fe,$);
-fe.prototype.e=function(a){return this.Pb.test(a.atText||"")};var ge=function(a){this.cc=we(a,"followedByText")};v(ge,$);ge.prototype.e=function(a){return this.cc==(a.followedByText||"")};var he=function(a){this.bc=xe(a,"followedByTextRegexp")};v(he,$);he.prototype.e=function(a){return this.bc.test(a.followedByText||"")};var ie=function(a){this.Tb=we(a,"className")};v(ie,$);
-ie.prototype.e=function(a,b){for(var c=0;c<b.length;++c)for(var d=b[c];d;d=d.parentNode)if(d.className)for(var e=d.className.split(/\s/),f=0;f<e.length;++f)if(this.Tb==e[f])return i;return k};var je=function(a){this.Ub=xe(a,"classRegexp")};v(je,$);je.prototype.e=function(a,b){for(var c=0;c<b.length;++c)for(var d=b[c];d;d=d.parentNode)if(d.className)for(var e=d.className.split(/\s/),f=0;f<e.length;++f)if(this.Ub.test(e[f]))return i;return k};var ke=function(a){this.aa=we(a,"id")};v(ke,$);
-ke.prototype.e=function(a,b){for(var c=0;c<b.length;++c)for(var d=b[c];d;d=d.parentNode)if(d.id&&this.aa==d.id)return i;return k};var le=function(a){this.kc=xe(a,"idRegexp")};v(le,$);le.prototype.e=function(a,b){for(var c=0;c<b.length;++c)for(var d=b[c];d;d=d.parentNode)if(d.id&&this.kc.test(d.id))return i;return k};var me=function(a){this.Zb=ye(a,"filter")};v(me,$);me.prototype.e=function(a,b){return!this.Zb.e(a,b)};var ne=function(a){this.Ta=ye(a,"filter1");this.Ua=ye(a,"filter2")};v(ne,$);
-ne.prototype.e=function(a,b){return this.Ta.e(a,b)||this.Ua.e(a,b)};var oe=function(a){this.Ac=we(a,"precededByText")};v(oe,$);oe.prototype.e=function(a){return this.Ac==(a.precededByText||"")};var pe=function(a){this.zc=xe(a,"precededByTextRegexp")};v(pe,$);pe.prototype.e=function(a){return this.zc.test(a.precededByText||"")};var qe=function(a){ve(a,"severityThreshold","number");this.Fc=a.severityThreshold};v(qe,$);qe.prototype.e=function(a){return this.Fc<=a.severity};
-var re=function(a){this.Ic=we(a,"type")};v(re,$);re.prototype.e=function(a){return this.Ic==a.type};var ze=function(){this.X=[]};v(ze,T);m=ze.prototype;m.start=function(){this.dispatchEvent("StartFrames")};m.end=function(){this.dispatchEvent("EndFrames")};m.push=function(a){this.X.push(a);this.dispatchEvent("EnterFrame")};m.pop=function(){this.dispatchEvent("ExitFrame");this.X.pop()};m.Xa=function(){return this.X};var Ae=function(a,b){this.dc=a;this.$b=b||[];this.A=[]};Ae.prototype.Hc=k;Ae.prototype.Wa=function(){return this.A};var Ce=function(a,b,c){var d=a.dc.Xa().slice(0);c&&d.push(c);if(Ba(a.$b,function(e){return!e.e(b,d)})){c=Be(a,d);if(c!="")b.locationDescription=c;a.A.push(b);if(a.Hc)h(b.toString()+"\n")}},Be=function(a,b){var c=[];za(b,function(d){c.push(Bd(d))});return c.join(" in ")};var De=function(a,b){this.sc=!!b;this.na=new ze;this.nb=new Ae(this.na,a)};De.prototype.F=j;De.prototype.Sa=j;De.prototype.Wa=function(){return this.nb.Wa()};
-var He=function(a,b,c){var d,e=a.nb;d=[new Ee(e),new Fe(e)];c!=0&&d.unshift(new Ge(c==-1,e));a.F=new Xd(b);a.Sa=a.sc?new $d(a.F):j;for(b=0;b<d.length;++b)d[b].eb(a);a.F.go();d=a.F.Xa();for(b=0;b<d.length;++b){e=d[b];a.na.push(e);try{var f=(C?e.document||e.contentWindow.document:e.contentDocument||e.contentWindow.document).body;if(e.tagName=="IFRAME")c=0;He(a,f,c)}catch(g){}a.na.pop()}};var Ge=function(a,b){this.Eb=a;this.la=b};Ge.prototype.eb=function(a){ic(a.F,"StartTag",this)};Ge.prototype.handleEvent=function(a){a=a.target;if(this.Eb!=w(a.B))Ce(this.la,new Z("Overall directionality not "+(this.Eb?"RTL":"LTR"),1,new Ld(a.I)))};var Fe=function(a){this.la=a;this.ra=[]};m=Fe.prototype;m.J=j;m.eb=function(a){var b=new R(this);S(b,a.F,"StartTag",this.jc);S(b,a.F,"EndTag",this.hc);S(b,a.F,"TextNode",this.Za);rc(b,a.F,"EndOfDom",b.ga,k,b)};m.jc=function(a){a=a.target;var b=a.I;if(b.dir||b==w(a.O))this.J=j};m.hc=function(a){a=a.target;var b=a.I;if(b==w(a.O))this.J=j;else if(b.dir)if(w(a.B)==a.B[a.B.length-2])this.J=j;else{this.J=b;this.ra=[]}};
-m.Za=function(a){a=a.target;var b=a.I;if(this.J){this.ra.push(b);var c=wd(b.data);if(c){var d=Aa(this.ra,function(f){return f.data}).join(""),e=w(this.ra).parentNode;Ce(this.la,Ie(this,d.substr(0,d.length-(b.data.length-c.text.length)),c.text.length,w(a.B),w(a.ba)),e);this.J=j}else if(sd.test(b.data))this.J=j}};var Ie=function(a,b,c,d,e){b=new Z("Declared "+(d?"LTR":"RTL")+" spillover to number",e?4:2,new Jd(a.ra,0,c),b);a=Cd(a.J);b.precededByText=a;return b};var Ee=function(a){this.la=a};Ee.prototype.eb=function(a){var b=new R(this);S(b,a.Sa,"DirChunk",this.fc);rc(b,a.Sa,"EndOfChunks",b.ga,k,b)};Ee.prototype.fc=function(a){var b=this,c=a.target.K;if(c.wb){a=vd(Vd(c));ya(a,function(d){(pd.exec(d.text)?i:k)||Je(b,c,d,"Undeclared LTR text")})}else{a=ud(Vd(c));ya(a,function(d){(qd.exec(d.text)?i:k)||Je(b,c,d,"Undeclared RTL text")})}};
-var Je=function(a,b,c,d){var e=b.ub?4:3,f=b.Z(c.index,c.text.length);d=new Z(d,e,f,c.text);e=Vd(b);f=c.index;var g=nd.exec(e.substr(0,f));f=g?new td(g[0],f-g[0].length):j;if(f){if(d.severity==3)d.severity=2;d.precededByText=f.text}f=c.index+c.text.length;e=(e=md.exec(e.substr(f)))?new td(e[0],f):j;if(e){if(d.severity==3)d.severity=2;d.followedByText=e.text}b=b.Va(c.index).parentNode;Ce(a.la,d,b)};var Ke=function(a){De.call(this,a,i)};v(Ke,De);var Le=function(a,b,c){Nd=[];Md=0;c=new Ke(c);b=b||top.document.body;a=a?-1:1;c.na.start();He(c,b,a);c.na.end();return c.Wa()};q("bidichecker.checkPage",Le,void 0);q("bidichecker.checkPageToJson",function(a,b,c){c=te(c);a=Le(a,b,c);for(b=0;b<a.length;++b){c=a[b];c.asString=c.toString()}b=[];wc(new uc,a,b);return b.join("")},void 0);
-var Me=function(a){a=new Od(a);if(!(a.P||a.A.length==0)){a.D=new X("bidichecker-dialog");var b=a.D;b.Mb="BidiChecker error browser";b.sa&&Eb(b.sa,"BidiChecker error browser");b=a.D;b.oa=k;fd(b);b.n();var c=new Y;c.i("prev","< Prev");c.i("next","Next >");b=a.D;b.s=c;if(b.z)if(b.s){c=b.s;c.b=b.z;c.ia()}else b.z.innerHTML="";b=a.D;b.Ra='<div id="bidichecker-dialog-error-text" class="bidichecker-dialog-error-text"> </div><p>Error <input name="current" id="bidichecker-dialog-error-num" type="text" size="3" value="1" /> of <span id="bidichecker-dialog-error-count"></span></p><p style="font-size:75%">Drag this box if it conceals a part of the page you need.</p>';
-if(b.va)b.va.innerHTML='<div id="bidichecker-dialog-error-text" class="bidichecker-dialog-error-text"> </div><p>Error <input name="current" id="bidichecker-dialog-error-num" type="text" size="3" value="1" /> of <span id="bidichecker-dialog-error-count"></span></p><p style="font-size:75%">Drag this box if it conceals a part of the page you need.</p>';gd(a.D,i);a.P=a.D.c();b=I(a.P);var d=j;if(A){d=b.h.createStyleSheet();Mc(d,".bidichecker-dialog-bg { position: absolute; top: 0; left: 0; }.bidichecker-dialog { position: absolute; padding: 5px; background-color: #fcb; border: 1px solid #000; font-family: arial, sans-serif; width: 475px; color: #000; outline: none; direction: ltr }.bidichecker-dialog a, .bidichecker-dialog a:link,.bidichecker-dialog a:visited { color: #0066cc; cursor: pointer; }.bidichecker-dialog-title { position: relative; background-color: #f9efeb; color: #000000; padding: 10px 15px; font-size: 16px; font-weight: bold; vertical-align: middle; cursor: pointer; cursor: hand }.bidichecker-dialog-content { padding: 15px; font-size: 90%; background-color: #fff }.bidichecker-dialog-buttons { padding: 0 15px 15px; background-color: #fff }.bidichecker-dialog-error-text { font-weight: bold; font-size: 125%; color: #f00; height: 80px; overflow: auto; border: 1px dotted #f00 }")}else{c=
-tb(b.h,"head",void 0,void 0)[0];if(!c){d=tb(b.h,"body",void 0,void 0)[0];c=b.k("head");d.parentNode.insertBefore(c,d)}d=b.k("style");Mc(d,".bidichecker-dialog-bg { position: absolute; top: 0; left: 0; }.bidichecker-dialog { position: absolute; padding: 5px; background-color: #fcb; border: 1px solid #000; font-family: arial, sans-serif; width: 475px; color: #000; outline: none; direction: ltr }.bidichecker-dialog a, .bidichecker-dialog a:link,.bidichecker-dialog a:visited { color: #0066cc; cursor: pointer; }.bidichecker-dialog-title { position: relative; background-color: #f9efeb; color: #000000; padding: 10px 15px; font-size: 16px; font-weight: bold; vertical-align: middle; cursor: pointer; cursor: hand }.bidichecker-dialog-content { padding: 15px; font-size: 90%; background-color: #fff }.bidichecker-dialog-buttons { padding: 0 15px 15px; background-color: #fff }.bidichecker-dialog-error-text { font-weight: bold; font-size: 125%; color: #f00; height: 80px; overflow: auto; border: 1px dotted #f00 }");
-b.appendChild(c,d)}a.P.style.zIndex=1E4;b=a.D.n();Eb(b.c("bidichecker-dialog-error-count"),a.A.length+"");a.Q=b.c("bidichecker-dialog-error-num");a.ob=b.c("bidichecker-dialog-error-text");id(a.D);Qd(a);P(a.D,"dialogselect",a.ec,k,a);a.Q.onchange=ia(a.ic,a)}};q("bidichecker.runGui",Me,void 0);q("bidichecker.runGuiFromJson",function(a){a=tc(a);a=Aa(a,function(b){return new Z(b)});Me(a)},void 0); })()
+var i=true,j=null,k=false,m,n=this,aa=function(){},ba=function(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(c=="[object Window]")return"object";if(c=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(c=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!=
+"undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null";else if(b=="function"&&typeof a.call=="undefined")return"object";return b},p=function(a){return ba(a)=="array"},ca=function(a){var b=ba(a);return b=="array"||b=="object"&&typeof a.length=="number"},s=function(a){return typeof a=="string"},da=function(a){return ba(a)=="function"},ea=function(a){a=ba(a);return a=="object"||a=="array"||a=="function"},ha=function(a){return a[fa]||(a[fa]=++ga)},fa="closure_uid_"+Math.floor(Math.random()*
+2147483648).toString(36),ga=0,ia=function(a){return a.call.apply(a.bind,arguments)},ja=function(a,b){var c=b||n;if(arguments.length>2){var d=Array.prototype.slice.call(arguments,2);return function(){var e=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(e,d);return a.apply(c,e)}}else return function(){return a.apply(c,arguments)}},ka=function(){ka=Function.prototype.bind&&Function.prototype.bind.toString().indexOf("native code")!=-1?ia:ja;return ka.apply(j,arguments)},ma=function(a){var b=
+Array.prototype.slice.call(arguments,1);return function(){var c=Array.prototype.slice.call(arguments);c.unshift.apply(c,b);return a.apply(this,c)}},na=Date.now||function(){return+new Date},t=function(a,b){var c=a.split("."),d=n;!(c[0]in d)&&d.execScript&&d.execScript("var "+c[0]);for(var e;c.length&&(e=c.shift());)if(!c.length&&b!==undefined)d[e]=b;else d=d[e]?d[e]:d[e]={}},v=function(a,b){function c(){}c.prototype=b.prototype;a.k=b.prototype;a.prototype=new c};
+Function.prototype.bind=Function.prototype.bind||function(a){if(arguments.length>1){var b=Array.prototype.slice.call(arguments,1);b.unshift(this,a);return ka.apply(j,b)}else return ka(this,a)};var oa=function(a){this.stack=Error().stack||"";if(a)this.message=String(a)};v(oa,Error);oa.prototype.name="CustomError";var pa=function(a){for(var b=1;b<arguments.length;b++){var c=String(arguments[b]).replace(/\$/g,"$$$$");a=a.replace(/\%s/,c)}return a},va=function(a){if(!qa.test(a))return a;if(a.indexOf("&")!=-1)a=a.replace(ra,"&");if(a.indexOf("<")!=-1)a=a.replace(sa,"<");if(a.indexOf(">")!=-1)a=a.replace(ta,">");if(a.indexOf('"')!=-1)a=a.replace(ua,""");return a},ra=/&/g,sa=/</g,ta=/>/g,ua=/\"/g,qa=/[&<>\"]/,xa=function(a,b){for(var c=0,d=String(a).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),
+e=String(b).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),f=Math.max(d.length,e.length),g=0;c==0&&g<f;g++){var l=d[g]||"",o=e[g]||"",q=RegExp("(\\d*)(\\D*)","g"),la=RegExp("(\\d*)(\\D*)","g");do{var u=q.exec(l)||["","",""],r=la.exec(o)||["","",""];if(u[0].length==0&&r[0].length==0)break;c=wa(u[1].length==0?0:parseInt(u[1],10),r[1].length==0?0:parseInt(r[1],10))||wa(u[2].length==0,r[2].length==0)||wa(u[2],r[2])}while(c==0)}return c},wa=function(a,b){if(a<b)return-1;else if(a>b)return 1;return 0},
+ya={},za=function(a){return ya[a]||(ya[a]=String(a).replace(/\-([a-z])/g,function(b,c){return c.toUpperCase()}))};var Aa=function(a,b){b.unshift(a);oa.call(this,pa.apply(j,b));b.shift();this.Pc=a};v(Aa,oa);Aa.prototype.name="AssertionError";var Ba=function(a,b){if(!a){var c=Array.prototype.slice.call(arguments,2),d="Assertion failed";if(b){d+=": "+b;var e=c}h(new Aa(""+d,e||[]))}};var w=function(a){return a[a.length-1]},x=Array.prototype,Ca=x.indexOf?function(a,b,c){Ba(a.length!=j);return x.indexOf.call(a,b,c)}:function(a,b,c){c=c==j?0:c<0?Math.max(0,a.length+c):c;if(s(a)){if(!s(b)||b.length!=1)return-1;return a.indexOf(b,c)}for(;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},Da=x.forEach?function(a,b,c){Ba(a.length!=j);x.forEach.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=s(a)?a.split(""):a,f=0;f<d;f++)f in e&&b.call(c,e[f],f,a)},Ea=function(a,b){for(var c=s(a)?
+a.split(""):a,d=a.length-1;d>=0;--d)d in c&&b.call(void 0,c[d],d,a)},Fa=x.map?function(a,b,c){Ba(a.length!=j);return x.map.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=Array(d),f=s(a)?a.split(""):a,g=0;g<d;g++)if(g in f)e[g]=b.call(c,f[g],g,a);return e},Ga=x.every?function(a,b,c){Ba(a.length!=j);return x.every.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=s(a)?a.split(""):a,f=0;f<d;f++)if(f in e&&!b.call(c,e[f],f,a))return k;return i},Ha=function(){return x.concat.apply(x,arguments)},Ia=
+function(a){if(p(a))return Ha(a);else{for(var b=[],c=0,d=a.length;c<d;c++)b[c]=a[c];return b}},Ja=function(a,b,c){Ba(a.length!=j);return arguments.length<=2?x.slice.call(a,b):x.slice.call(a,b,c)},Ka=function(a,b,c){for(var d=0,e=a.length,f;d<e;){var g=d+e>>1,l;l=b(c,a[g]);if(l>0)d=g+1;else{e=g;f=!l}}return f?d:~d},La=function(a,b){return a>b?1:a<b?-1:0};var y="StopIteration"in n?n.StopIteration:Error("StopIteration"),Ma=function(){};Ma.prototype.next=function(){h(y)};Ma.prototype.Na=function(){return this};
+var Na=function(a){if(a instanceof Ma)return a;if(typeof a.Na=="function")return a.Na(k);if(ca(a)){var b=0,c=new Ma;c.next=function(){for(;;){b>=a.length&&h(y);if(b in a)return a[b++];else b++}};return c}h(Error("Not implemented"))},Oa=function(a,b){if(ca(a))try{Da(a,b,void 0)}catch(c){c!==y&&h(c)}else{a=Na(a);try{for(;;)b.call(void 0,a.next(),undefined,a)}catch(d){d!==y&&h(d)}}};var Pa=function(a,b){this.x=a!==undefined?a:0;this.y=b!==undefined?b:0};Pa.prototype.toString=function(){return"("+this.x+", "+this.y+")"};var z=function(a,b){this.width=a;this.height=b};z.prototype.toString=function(){return"("+this.width+" x "+this.height+")"};z.prototype.Ea=function(){return!(this.width*this.height)};z.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};z.prototype.round=function(){this.width=Math.round(this.width);this.height=Math.round(this.height);return this};var Qa=function(a,b){for(var c in a)b.call(void 0,a[c],c,a)},Ra=function(a){var b=[],c=0,d;for(d in a)b[c++]=a[d];return b},Sa=function(a){var b=[],c=0,d;for(d in a)b[c++]=d;return b},Ta=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Ua=function(a){for(var b,c,d=1;d<arguments.length;d++){c=arguments[d];for(b in c)a[b]=c[b];for(var e=0;e<Ta.length;e++){b=Ta[e];if(Object.prototype.hasOwnProperty.call(c,b))a[b]=c[b]}}},Va=function(){var a=
+arguments.length;if(a==1&&p(arguments[0]))return Va.apply(j,arguments[0]);for(var b={},c=0;c<a;c++)b[arguments[c]]=i;return b};var Wa,Xa,Ya,Za,$a,ab,bb=function(){return n.navigator?n.navigator.userAgent:j},cb=function(){return n.navigator};$a=Za=Ya=Xa=Wa=k;var db;if(db=bb()){var eb=cb();Wa=db.indexOf("Opera")==0;Xa=!Wa&&db.indexOf("MSIE")!=-1;Za=(Ya=!Wa&&db.indexOf("WebKit")!=-1)&&db.indexOf("Mobile")!=-1;$a=!Wa&&!Ya&&eb.product=="Gecko"}var fb=Wa,A=Xa,gb=$a,B=Ya,hb=Za,ib=cb();ab=(ib&&ib.platform||"").indexOf("Mac")!=-1;var jb=!!cb()&&(cb().appVersion||"").indexOf("X11")!=-1,kb;
+a:{var lb="",mb;if(fb&&n.opera){var nb=n.opera.version;lb=typeof nb=="function"?nb():nb}else{if(gb)mb=/rv\:([^\);]+)(\)|;)/;else if(A)mb=/MSIE\s+([^\);]+)(\)|;)/;else if(B)mb=/WebKit\/(\S+)/;if(mb){var ob=mb.exec(bb());lb=ob?ob[1]:""}}if(A){var pb,qb=n.document;pb=qb?qb.documentMode:undefined;if(pb>parseFloat(lb)){kb=String(pb);break a}}kb=lb}var rb=kb,sb={},C=function(a){return sb[a]||(sb[a]=xa(rb,a)>=0)};var tb,ub=!A||C("9");A&&C("9");var vb=function(a){var b;b=(b=a.className)&&typeof b.split=="function"?b.split(/\s+/):[];var c;c=Ja(arguments,1);for(var d=0,e=0;e<c.length;e++)if(!(Ca(b,c[e])>=0)){b.push(c[e]);d++}c=d==c.length;a.className=b.join(" ");return c};var G=function(a){return a?new E(F(a)):tb||(tb=new E)},xb=function(a,b,c,d){a=d||a;b=b&&b!="*"?b.toUpperCase():"";if(a.querySelectorAll&&a.querySelector&&(!B||wb(document)||C("528"))&&(b||c))return a.querySelectorAll(b+(c?"."+c:""));if(c&&a.getElementsByClassName){a=a.getElementsByClassName(c);if(b){d={};for(var e=0,f=0,g;g=a[f];f++)if(b==g.nodeName)d[e++]=g;d.length=e;return d}else return a}a=a.getElementsByTagName(b||"*");if(c){d={};for(f=e=0;g=a[f];f++){b=g.className;if(typeof b.split=="function"&&
+Ca(b.split(/\s+/),c)>=0)d[e++]=g}d.length=e;return d}else return a},zb=function(a,b){Qa(b,function(c,d){if(d=="style")a.style.cssText=c;else if(d=="class")a.className=c;else if(d=="for")a.htmlFor=c;else if(d in yb)a.setAttribute(yb[d],c);else a[d]=c})},yb={cellpadding:"cellPadding",cellspacing:"cellSpacing",colspan:"colSpan",rowspan:"rowSpan",valign:"vAlign",height:"height",width:"width",usemap:"useMap",frameborder:"frameBorder",maxlength:"maxLength",type:"type"},Ab=function(a){var b=a.document;if(B&&
+!C("500")&&!hb){if(typeof a.innerHeight=="undefined")a=window;b=a.innerHeight;var c=a.document.documentElement.scrollHeight;if(a==a.top)if(c<b)b-=15;return new z(a.innerWidth,b)}a=wb(b);if(fb&&!C("9.50"))a=k;a=a?b.documentElement:b.body;return new z(a.clientWidth,a.clientHeight)},Bb=function(a){return a?a.parentWindow||a.defaultView:window},Db=function(){return Cb(document,arguments)},Cb=function(a,b){var c=b[0],d=b[1];if(!ub&&d&&(d.name||d.type)){c=["<",c];d.name&&c.push(' name="',va(d.name),'"');
+if(d.type){c.push(' type="',va(d.type),'"');var e={};Ua(e,d);d=e;delete d.type}c.push(">");c=c.join("")}c=a.createElement(c);if(d)if(s(d))c.className=d;else p(d)?vb.apply(j,[c].concat(d)):zb(c,d);b.length>2&&Eb(a,c,b,2);return c},Eb=function(a,b,c,d){function e(g){if(g)b.appendChild(s(g)?a.createTextNode(g):g)}for(;d<c.length;d++){var f=c[d];ca(f)&&!(ea(f)&&f.nodeType>0)?Da(Fb(f)?Ia(f):f,e):e(f)}},wb=function(a){return a.compatMode=="CSS1Compat"},Gb=function(a){a&&a.parentNode&&a.parentNode.removeChild(a)},
+Hb=function(a,b){var c=b.parentNode;c&&c.replaceChild(a,b)},F=function(a){return a.nodeType==9?a:a.ownerDocument||a.document},Ib=function(a,b){if("textContent"in a)a.textContent=b;else if(a.firstChild&&a.firstChild.nodeType==3){for(;a.lastChild!=a.firstChild;)a.removeChild(a.lastChild);a.firstChild.data=b}else{for(var c;c=a.firstChild;)a.removeChild(c);a.appendChild(F(a).createTextNode(b))}},Fb=function(a){if(a&&typeof a.length=="number")if(ea(a))return typeof a.item=="function"||typeof a.item=="string";
+else if(da(a))return typeof a.item=="function";return k},E=function(a){this.h=a||n.document||document};E.prototype.m=G;var Jb=function(a){return a.h};E.prototype.c=function(a){return s(a)?this.h.getElementById(a):a};E.prototype.j=function(){return Cb(this.h,arguments)};E.prototype.createElement=function(a){return this.h.createElement(a)};E.prototype.createTextNode=function(a){return this.h.createTextNode(a)};
+var Kb=function(a){a=!B&&wb(a.h)?a.h.documentElement:a.h.body;return new Pa(a.scrollLeft,a.scrollTop)};E.prototype.appendChild=function(a,b){a.appendChild(b)};E.prototype.append=function(a){Eb(F(a),a,arguments,1)};var H=function(a,b,c,d,e){this.n=!!b;a&&Lb(this,a,d);this.la=e!=undefined?e:this.o||0;if(this.n)this.la*=-1;this.Xb=!c};v(H,Ma);H.prototype.q=j;H.prototype.o=0;H.prototype.Kb=k;var Lb=function(a,b,c){if(a.q=b)a.o=typeof c=="number"?c:a.q.nodeType!=1?0:a.n?-1:1};
+H.prototype.next=function(){var a;if(this.Kb){if(!this.q||this.Xb&&this.la==0)h(y);a=this.q;var b=this.n?-1:1;if(this.o==b){var c=this.n?a.lastChild:a.firstChild;c?Lb(this,c):Lb(this,a,b*-1)}else(c=this.n?a.previousSibling:a.nextSibling)?Lb(this,c):Lb(this,a.parentNode,b*-1);this.la+=this.o*(this.n?-1:1)}else this.Kb=i;(a=this.q)||h(y);return a};
+H.prototype.splice=function(){var a=this.q,b=this.n?1:-1;if(this.o==b){this.o=b*-1;this.la+=this.o*(this.n?-1:1)}this.n=!this.n;H.prototype.next.call(this);this.n=!this.n;b=ca(arguments[0])?arguments[0]:arguments;for(var c=b.length-1;c>=0;c--)a.parentNode&&a.parentNode.insertBefore(b[c],a.nextSibling);Gb(a)};var Mb=new Function("a","return a");var Nb,Ob=!A||C("9"),Pb=A&&!C("8");var Qb=function(){};Qb.prototype.mb=k;Qb.prototype.t=function(){if(!this.mb){this.mb=i;this.g()}};Qb.prototype.g=function(){};var I=function(a,b){this.type=a;this.currentTarget=this.target=b};v(I,Qb);m=I.prototype;m.g=function(){delete this.type;delete this.target;delete this.currentTarget};m.U=k;m.ra=i;m.stopPropagation=function(){this.U=i};m.preventDefault=function(){this.ra=k};var Rb=function(a){a.preventDefault()};var J=function(a,b){a&&this.aa(a,b)};v(J,I);var Sb=[1,4,2];m=J.prototype;m.target=j;m.relatedTarget=j;m.offsetX=0;m.offsetY=0;m.clientX=0;m.clientY=0;m.screenX=0;m.screenY=0;m.button=0;m.keyCode=0;m.charCode=0;m.ctrlKey=k;m.altKey=k;m.shiftKey=k;m.metaKey=k;m.Ac=k;m.u=j;
+m.aa=function(a,b){var c=this.type=a.type;I.call(this,c);this.target=a.target||a.srcElement;this.currentTarget=b;var d=a.relatedTarget;if(d){if(gb)try{Mb(d.nodeName)}catch(e){d=j}}else if(c=="mouseover")d=a.fromElement;else if(c=="mouseout")d=a.toElement;this.relatedTarget=d;this.offsetX=a.offsetX!==undefined?a.offsetX:a.layerX;this.offsetY=a.offsetY!==undefined?a.offsetY:a.layerY;this.clientX=a.clientX!==undefined?a.clientX:a.pageX;this.clientY=a.clientY!==undefined?a.clientY:a.pageY;this.screenX=
+a.screenX||0;this.screenY=a.screenY||0;this.button=a.button;this.keyCode=a.keyCode||0;this.charCode=a.charCode||(c=="keypress"?a.keyCode:0);this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=a.shiftKey;this.metaKey=a.metaKey;this.Ac=ab?a.metaKey:a.ctrlKey;this.state=a.state;this.u=a;delete this.ra;delete this.U};m.stopPropagation=function(){J.k.stopPropagation.call(this);if(this.u.stopPropagation)this.u.stopPropagation();else this.u.cancelBubble=i};
+m.preventDefault=function(){J.k.preventDefault.call(this);var a=this.u;if(a.preventDefault)a.preventDefault();else{a.returnValue=k;if(Pb)try{if(a.ctrlKey||a.keyCode>=112&&a.keyCode<=123)a.keyCode=-1}catch(b){}}};m.g=function(){J.k.g.call(this);this.relatedTarget=this.currentTarget=this.target=this.u=j};var K=function(a,b){this.Ab=b;this.R=[];a>this.Ab&&h(Error("[goog.structs.SimplePool] Initial cannot be greater than max"));for(var c=0;c<a;c++)this.R.push(this.C?this.C():{})};v(K,Qb);K.prototype.C=j;K.prototype.lb=j;K.prototype.getObject=function(){if(this.R.length)return this.R.pop();return this.C?this.C():{}};var Ub=function(a,b){a.R.length<a.Ab?a.R.push(b):Tb(a,b)},Tb=function(a,b){if(a.lb)a.lb(b);else if(ea(b))if(da(b.t))b.t();else for(var c in b)delete b[c]};
+K.prototype.g=function(){K.k.g.call(this);for(var a=this.R;a.length;)Tb(this,a.pop());delete this.R};var Vb;var Wb=(Vb="ScriptEngine"in n&&n.ScriptEngine()=="JScript")?n.ScriptEngineMajorVersion()+"."+n.ScriptEngineMinorVersion()+"."+n.ScriptEngineBuildVersion():"0";var Xb=function(){},Yb=0;m=Xb.prototype;m.key=0;m.ha=k;m.Pa=k;m.aa=function(a,b,c,d,e,f){if(da(a))this.xb=i;else if(a&&a.handleEvent&&da(a.handleEvent))this.xb=k;else h(Error("Invalid listener argument"));this.ca=a;this.Fb=b;this.src=c;this.type=d;this.capture=!!e;this.Da=f;this.Pa=k;this.key=++Yb;this.ha=k};m.handleEvent=function(a){if(this.xb)return this.ca.call(this.Da||this.src,a);return this.ca.handleEvent.call(this.ca,a)};var Zb,$b,ac,bc,cc,dc,ec,fc,gc,hc,ic;
+(function(){function a(){return{i:0,v:0}}function b(){return[]}function c(){var r=function(D){return g.call(r.src,r.key,D)};return r}function d(){return new Xb}function e(){return new J}var f=Vb&&!(xa(Wb,"5.7")>=0),g;dc=function(r){g=r};if(f){Zb=function(){return l.getObject()};$b=function(r){Ub(l,r)};ac=function(){return o.getObject()};bc=function(r){Ub(o,r)};cc=function(){return q.getObject()};ec=function(){Ub(q,c())};fc=function(){return la.getObject()};gc=function(r){Ub(la,r)};hc=function(){return u.getObject()};
+ic=function(r){Ub(u,r)};var l=new K(0,600);l.C=a;var o=new K(0,600);o.C=b;var q=new K(0,600);q.C=c;var la=new K(0,600);la.C=d;var u=new K(0,600);u.C=e}else{Zb=a;$b=aa;ac=b;bc=aa;cc=c;ec=aa;fc=d;gc=aa;hc=e;ic=aa}})();var jc={},L={},M={},kc={},N=function(a,b,c,d,e){if(b)if(p(b)){for(var f=0;f<b.length;f++)N(a,b[f],c,d,e);return j}else{d=!!d;var g=L;b in g||(g[b]=Zb());g=g[b];if(!(d in g)){g[d]=Zb();g.i++}g=g[d];var l=ha(a),o;g.v++;if(g[l]){o=g[l];for(f=0;f<o.length;f++){g=o[f];if(g.ca==c&&g.Da==e){if(g.ha)break;return o[f].key}}}else{o=g[l]=ac();g.i++}f=cc();f.src=a;g=fc();g.aa(c,f,a,b,d,e);c=g.key;f.key=c;o.push(g);jc[c]=g;M[l]||(M[l]=ac());M[l].push(g);if(a.addEventListener){if(a==n||!a.kb)a.addEventListener(b,
+f,d)}else a.attachEvent(lc(b),f);return c}else h(Error("Invalid event type"))},mc=function(a,b,c,d,e){if(p(b)){for(var f=0;f<b.length;f++)mc(a,b[f],c,d,e);return j}a=N(a,b,c,d,e);jc[a].Pa=i;return a},nc=function(a,b,c,d,e){if(p(b))for(var f=0;f<b.length;f++)nc(a,b[f],c,d,e);else{d=!!d;if(a=oc(a,b,d))for(f=0;f<a.length;f++)if(a[f].ca==c&&a[f].capture==d&&a[f].Da==e){O(a[f].key);break}}},O=function(a){if(jc[a]){var b=jc[a];if(!b.ha){var c=b.src,d=b.type,e=b.Fb,f=b.capture;if(c.removeEventListener){if(c==
+n||!c.kb)c.removeEventListener(d,e,f)}else c.detachEvent&&c.detachEvent(lc(d),e);c=ha(c);e=L[d][f][c];if(M[c]){var g=M[c],l=Ca(g,b);if(l>=0){Ba(g.length!=j);x.splice.call(g,l,1)}g.length==0&&delete M[c]}b.ha=i;e.Bb=i;pc(d,f,c,e);delete jc[a]}}},pc=function(a,b,c,d){if(!d.Fa)if(d.Bb){for(var e=0,f=0;e<d.length;e++)if(d[e].ha){var g=d[e].Fb;g.src=j;ec(g);gc(d[e])}else{if(e!=f)d[f]=d[e];f++}d.length=f;d.Bb=k;if(f==0){bc(d);delete L[a][b][c];L[a][b].i--;if(L[a][b].i==0){$b(L[a][b]);delete L[a][b];L[a].i--}if(L[a].i==
+0){$b(L[a]);delete L[a]}}}},qc=function(a){var b,c=0,d=b==j;b=!!b;if(a==j)Qa(M,function(g){for(var l=g.length-1;l>=0;l--){var o=g[l];if(d||b==o.capture){O(o.key);c++}}});else{a=ha(a);if(M[a]){a=M[a];for(var e=a.length-1;e>=0;e--){var f=a[e];if(d||b==f.capture){O(f.key);c++}}}}},oc=function(a,b,c){var d=L;if(b in d){d=d[b];if(c in d){d=d[c];a=ha(a);if(d[a])return d[a]}}return j},lc=function(a){if(a in kc)return kc[a];return kc[a]="on"+a},sc=function(a,b,c,d,e){var f=1;b=ha(b);if(a[b]){a.v--;a=a[b];
+if(a.Fa)a.Fa++;else a.Fa=1;try{for(var g=a.length,l=0;l<g;l++){var o=a[l];if(o&&!o.ha)f&=rc(o,e)!==k}}finally{a.Fa--;pc(c,d,b,a)}}return Boolean(f)},rc=function(a,b){var c=a.handleEvent(b);a.Pa&&O(a.key);return c};
+dc(function(a,b){if(!jc[a])return i;var c=jc[a],d=c.type,e=L;if(!(d in e))return i;e=e[d];var f,g;if(Nb===undefined)Nb=A&&!n.addEventListener;if(Nb){var l;if(!(l=b))a:{l="window.event".split(".");for(var o=n;f=l.shift();)if(o[f]!=j)o=o[f];else{l=j;break a}l=o}f=l;l=i in e;o=k in e;if(l){if(f.keyCode<0||f.returnValue!=undefined)return i;a:{var q=k;if(f.keyCode==0)try{f.keyCode=-1;break a}catch(la){q=i}if(q||f.returnValue==undefined)f.returnValue=i}}q=hc();q.aa(f,this);f=i;try{if(l){for(var u=ac(),
+r=q.currentTarget;r;r=r.parentNode)u.push(r);g=e[i];g.v=g.i;for(var D=u.length-1;!q.U&&D>=0&&g.v;D--){q.currentTarget=u[D];f&=sc(g,u[D],d,i,q)}if(o){g=e[k];g.v=g.i;for(D=0;!q.U&&D<u.length&&g.v;D++){q.currentTarget=u[D];f&=sc(g,u[D],d,k,q)}}}else f=rc(c,q)}finally{if(u){u.length=0;bc(u)}q.t();ic(q)}return f}d=new J(b,this);try{f=rc(c,d)}finally{d.t()}return f});var P=function(a){this.ab=a};v(P,Qb);
+var tc=new K(0,100),uc=[],Q=function(a,b,c,d,e){if(!p(c)){uc[0]=c;c=uc}for(var f=0;f<c.length;f++)vc(a,N(b,c[f],d||a,e||k,a.ab||a));return a},wc=function(a,b,c,d,e,f){if(p(c))for(var g=0;g<c.length;g++)wc(a,b,c[g],d,e,f);else vc(a,mc(b,c,d||a,e||k,f||a.ab||a))},vc=function(a,b){if(a.a)a.a[b]=i;else if(a.L){a.a=tc.getObject();a.a[a.L]=i;a.L=j;a.a[b]=i}else a.L=b},xc=function(a,b,c,d,e,f){if(a.L||a.a)if(p(c))for(var g=0;g<c.length;g++)xc(a,b,c[g],d,e,f);else{a:{d=d||a;f=f||a.ab||a;e=!!e;if(b=oc(b,c,
+e))for(c=0;c<b.length;c++)if(b[c].ca==d&&b[c].capture==e&&b[c].Da==f){b=b[c];break a}b=j}if(b){b=b.key;O(b);if(a.a){c=a.a;b in c&&delete c[b]}else if(a.L==b)a.L=j}}return a};P.prototype.ga=function(){if(this.a){for(var a in this.a){O(a);delete this.a[a]}Ub(tc,this.a);this.a=j}else this.L&&O(this.L)};P.prototype.g=function(){P.k.g.call(this);this.ga()};P.prototype.handleEvent=function(){h(Error("EventHandler.handleEvent not implemented"))};var R=function(){};v(R,Qb);m=R.prototype;m.kb=i;m.Ha=j;m.fb=function(a){this.Ha=a};m.addEventListener=function(a,b,c,d){N(this,a,b,c,d)};m.removeEventListener=function(a,b,c,d){nc(this,a,b,c,d)};
+m.dispatchEvent=function(a){var b=a.type||a,c=L;if(b in c){if(s(a))a=new I(a,this);else if(a instanceof I)a.target=a.target||this;else{var d=a;a=new I(b,this);Ua(a,d)}d=1;var e;c=c[b];b=i in c;var f;if(b){e=[];for(f=this;f;f=f.Ha)e.push(f);f=c[i];f.v=f.i;for(var g=e.length-1;!a.U&&g>=0&&f.v;g--){a.currentTarget=e[g];d&=sc(f,e[g],a.type,i,a)&&a.ra!=k}}if(k in c){f=c[k];f.v=f.i;if(b)for(g=0;!a.U&&g<e.length&&f.v;g++){a.currentTarget=e[g];d&=sc(f,e[g],a.type,k,a)&&a.ra!=k}else for(e=this;!a.U&&e&&f.v;e=
+e.Ha){a.currentTarget=e;d&=sc(f,e,a.type,k,a)&&a.ra!=k}}a=Boolean(d)}else a=i;return a};m.g=function(){R.k.g.call(this);qc(this);this.Ha=j};var yc=function(a){a=String(a);var b;b=/^\s*$/.test(a)?k:/^[\],:{}\s\u2028\u2029]*$/.test(a.replace(/\\["\\\/bfnrtu]/g,"@").replace(/"[^"\\\n\r\u2028\u2029\x00-\x08\x10-\x1f\x80-\x9f]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:[\s\u2028\u2029]*\[)+/g,""));if(b)try{return eval("("+a+")")}catch(c){}h(Error("Invalid JSON string: "+a))},zc=function(){},Bc=function(a,b,c){switch(typeof b){case "string":Ac(a,b,c);break;case "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");
+break;case "boolean":c.push(b);break;case "undefined":c.push("null");break;case "object":if(b==j){c.push("null");break}if(p(b)){var d=b.length;c.push("[");for(var e="",f=0;f<d;f++){c.push(e);Bc(a,b[f],c);e=","}c.push("]");break}c.push("{");d="";for(e in b)if(Object.prototype.hasOwnProperty.call(b,e)){f=b[e];if(typeof f!="function"){c.push(d);Ac(a,e,c);c.push(":");Bc(a,f,c);d=","}}c.push("}");break;case "function":break;default:h(Error("Unknown type: "+typeof b))}},Cc={'"':'\\"',"\\":"\\\\","/":"\\/",
+"\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\u000b":"\\u000b"},Dc=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g,Ac=function(a,b,c){c.push('"',b.replace(Dc,function(d){if(d in Cc)return Cc[d];var e=d.charCodeAt(0),f="\\u";if(e<16)f+="000";else if(e<256)f+="00";else if(e<4096)f+="0";return Cc[d]=f+e.toString(16)}),'"')};var Ec=function(a){this.w=Vb?[]:"";a!=j&&this.append.apply(this,arguments)};Ec.prototype.N=function(a){this.clear();this.append(a)};if(Vb){Ec.prototype.Oa=0;Ec.prototype.append=function(a,b){if(b==j)this.w[this.Oa++]=a;else{this.w.push.apply(this.w,arguments);this.Oa=this.w.length}return this}}else Ec.prototype.append=function(a,b){this.w+=a;if(b!=j)for(var c=1;c<arguments.length;c++)this.w+=arguments[c];return this};Ec.prototype.clear=function(){if(Vb)this.Oa=this.w.length=0;else this.w=""};
+Ec.prototype.toString=function(){if(Vb){var a=this.w.join("");this.clear();a&&this.append(a);return a}else return this.w};var Fc=function(a,b,c,d){this.left=a;this.top=b;this.width=c;this.height=d};Fc.prototype.toString=function(){return"("+this.left+", "+this.top+" - "+this.width+"w x "+this.height+"h)"};var Hc=function(a,b){s("background-color")?Gc(a,b,"background-color"):Qa("background-color",ma(Gc,a))},Gc=function(a,b,c){a.style[za(c)]=b},Ic=function(a,b){var c=F(a);if(c.defaultView&&c.defaultView.getComputedStyle)if(c=c.defaultView.getComputedStyle(a,j))return c[b]||c.getPropertyValue(b);return""},S=function(a,b){return Ic(a,b)||(a.currentStyle?a.currentStyle[b]:j)||a.style[b]},Kc=function(a,b,c){var d,e=gb&&(ab||jb)&&C("1.9");if(b instanceof Pa){d=b.x;b=b.y}else{d=b;b=c}a.style.left=Jc(d,e);
+a.style.top=Jc(b,e)},Lc=function(a){if(A)return a.offsetParent;var b=F(a),c=S(a,"position"),d=c=="fixed"||c=="absolute";for(a=a.parentNode;a&&a!=b;a=a.parentNode){c=S(a,"position");d=d&&c=="static"&&a!=b.documentElement&&a!=b.body;if(!d&&(a.scrollWidth>a.clientWidth||a.scrollHeight>a.clientHeight||c=="fixed"||c=="absolute"))return a}return j},Mc=function(a){var b,c=F(a),d=S(a,"position"),e=gb&&c.getBoxObjectFor&&!a.getBoundingClientRect&&d=="absolute"&&(b=c.getBoxObjectFor(a))&&(b.screenX<0||b.screenY<
+0),f=new Pa(0,0),g;b=c?c.nodeType==9?c:F(c):document;if(g=A){g=G(b);g=!wb(g.h)}g=g?b.body:b.documentElement;if(a==g)return f;if(a.getBoundingClientRect){d=a.getBoundingClientRect();if(A){a=a.ownerDocument;d.left-=a.documentElement.clientLeft+a.body.clientLeft;d.top-=a.documentElement.clientTop+a.body.clientTop}b=d;c=Kb(G(c));f.x=b.left+c.x;f.y=b.top+c.y}else if(c.getBoxObjectFor&&!e){b=c.getBoxObjectFor(a);c=c.getBoxObjectFor(g);f.x=b.screenX-c.screenX;f.y=b.screenY-c.screenY}else{e=a;do{f.x+=e.offsetLeft;
+f.y+=e.offsetTop;if(e!=a){f.x+=e.clientLeft||0;f.y+=e.clientTop||0}if(B&&S(e,"position")=="fixed"){f.x+=c.body.scrollLeft;f.y+=c.body.scrollTop;break}e=e.offsetParent}while(e&&e!=a);if(fb||B&&d=="absolute")f.y-=c.body.offsetTop;for(e=a;(e=Lc(e))&&e!=c.body&&e!=g;){f.x-=e.scrollLeft;if(!fb||e.tagName!="TR")f.y-=e.scrollTop}}return f},Nc=function(a,b,c){if(b instanceof z){c=b.height;b=b.width}else c==undefined&&h(Error("missing height argument"));a.style.width=Jc(b,i);a.style.height=Jc(c,i)},Jc=function(a,
+b){if(typeof a=="number")a=(b?Math.round(a):a)+"px";return a},Oc=function(a){var b=fb&&!C("10");if(S(a,"display")!="none")return b?new z(a.offsetWidth||a.clientWidth,a.offsetHeight||a.clientHeight):new z(a.offsetWidth,a.offsetHeight);var c=a.style,d=c.display,e=c.visibility,f=c.position;c.visibility="hidden";c.position="absolute";c.display="inline";if(b){b=a.offsetWidth||a.clientWidth;a=a.offsetHeight||a.clientHeight}else{b=a.offsetWidth;a=a.offsetHeight}c.display=d;c.position=f;c.visibility=e;return new z(b,
+a)},Pc=function(a,b){var c=a.style;if("opacity"in c)c.opacity=b;else if("MozOpacity"in c)c.MozOpacity=b;else if("filter"in c)c.filter=b===""?"":"alpha(opacity="+b*100+")"},T=function(a,b){a.style.display=b?"":"none"},Qc=function(a,b){if(A)a.cssText=b;else a[B?"innerText":"innerHTML"]=b};var Rc=function(a){a.setAttribute("role","dialog");a.Qc="dialog"};var Sc=function(a){this.b=a;a=A?"focusout":"blur";this.qc=N(this.b,A?"focusin":"focus",this,!A);this.rc=N(this.b,a,this,!A)};v(Sc,R);Sc.prototype.handleEvent=function(a){var b=new J(a.u);b.type=a.type=="focusin"||a.type=="focus"?"focusin":"focusout";try{this.dispatchEvent(b)}finally{b.t()}};Sc.prototype.g=function(){Sc.k.g.call(this);O(this.qc);O(this.rc);delete this.b};var Tc=function(a,b,c){this.target=a;this.handle=b||a;this.bb=c||new Fc(NaN,NaN,NaN,NaN);this.h=F(a);this.l=new P(this);N(this.handle,["touchstart","mousedown"],this.Hb,k,this)};v(Tc,R);var Uc=A||gb&&C("1.9.3");m=Tc.prototype;m.clientX=0;m.clientY=0;m.screenX=0;m.screenY=0;m.Ib=0;m.Jb=0;m.ja=0;m.ka=0;m.ob=i;m.K=k;m.ub=0;m.tc=0;m.oc=k;m.X=function(){return this.l};
+m.g=function(){Tc.k.g.call(this);nc(this.handle,["touchstart","mousedown"],this.Hb,k,this);this.l.t();delete this.target;delete this.handle;delete this.l};
+m.Hb=function(a){var b=a.type=="mousedown";if(this.ob&&!this.K&&(!b||(Ob?a.u.button==0:a.type=="click"||a.u.button&Sb[0])&&!(B&&ab&&a.ctrlKey))){Vc(this,a);if(this.ub==0){Wc(this,a);if(this.K)a.preventDefault();else return}else a.preventDefault();b=this.h;var c=b.documentElement,d=!Uc;Q(this.l,b,["touchmove","mousemove"],this.lc,d);Q(this.l,b,["touchend","mouseup"],this.za,d);if(Uc){c.setCapture(k);Q(this.l,c,"losecapture",this.za)}else Q(this.l,Bb(b),"blur",this.za);A&&this.oc&&Q(this.l,b,"dragstart",
+Rb);this.Fc&&Q(this.l,this.Fc,"scroll",this.xc,d);this.clientX=this.Ib=a.clientX;this.clientY=this.Jb=a.clientY;this.screenX=a.screenX;this.screenY=a.screenY;this.ja=this.target.offsetLeft;this.ka=this.target.offsetTop;this.qa=Kb(G(this.h));this.tc=na()}};var Wc=function(a,b){if(a.dispatchEvent(new Xc("start",a,b.clientX,b.clientY,b))!==k)a.K=i};
+Tc.prototype.za=function(a,b){this.l.ga();Uc&&this.h.releaseCapture();if(this.K){Vc(this,a);this.K=k;this.dispatchEvent(new Xc("end",this,a.clientX,a.clientY,a,Yc(this,this.ja),Zc(this,this.ka),b||a.type=="touchcancel"))}if(a.type=="touchend"||a.type=="touchcancel")a.preventDefault()};var Vc=function(a,b){var c=b.type;if(c=="touchstart"||c=="touchmove")b.aa(b.u.targetTouches[0],b.currentTarget);else if(c=="touchend"||c=="touchcancel")b.aa(b.u.changedTouches[0],b.currentTarget)};
+Tc.prototype.lc=function(a){if(this.ob){Vc(this,a);var b=a.clientX-this.clientX,c=a.clientY-this.clientY;this.clientX=a.clientX;this.clientY=a.clientY;this.screenX=a.screenX;this.screenY=a.screenY;if(!this.K){var d=this.Ib-this.clientX,e=this.Jb-this.clientY;if(d*d+e*e>this.ub){Wc(this,a);if(!this.K){this.za(a);return}}}c=$c(this,b,c);b=c.x;c=c.y;if(this.K)if(this.dispatchEvent(new Xc("beforedrag",this,a.clientX,a.clientY,a,b,c))!==k){ad(this,a,b,c,k);a.preventDefault()}}};
+var $c=function(a,b,c){var d=Kb(G(a.h));b+=d.x-a.qa.x;c+=d.y-a.qa.y;a.qa=d;a.ja+=b;a.ka+=c;return new Pa(Yc(a,a.ja),Zc(a,a.ka))};Tc.prototype.xc=function(a){var b=$c(this,0,0);a.clientX=this.qa.x-this.clientX;a.clientY=this.qa.y-this.clientY;ad(this,a,b.x,b.y,i)};
+var ad=function(a,b,c,d){a.target.style.left=c+"px";a.target.style.top=d+"px";a.dispatchEvent(new Xc("drag",a,b.clientX,b.clientY,b,c,d))},Yc=function(a,b){var c=a.bb,d=!isNaN(c.left)?c.left:j;c=!isNaN(c.width)?c.width:0;return Math.min(d!=j?d+c:Infinity,Math.max(d!=j?d:-Infinity,b))},Zc=function(a,b){var c=a.bb,d=!isNaN(c.top)?c.top:j;c=!isNaN(c.height)?c.height:0;return Math.min(d!=j?d+c:Infinity,Math.max(d!=j?d:-Infinity,b))},Xc=function(a,b,c,d,e,f,g,l){I.call(this,a);this.clientX=c;this.clientY=
+d;this.Mc=e;this.left=f!==undefined?f:b.ja;this.top=g!==undefined?g:b.ka;this.Oc=b;this.Nc=!!l};v(Xc,I);var bd=function(a){if(typeof a.Ca=="function")return a.Ca();if(s(a))return a.split("");if(ca(a)){for(var b=[],c=a.length,d=0;d<c;d++)b.push(a[d]);return b}return Ra(a)},cd=function(a,b,c){if(typeof a.forEach=="function")a.forEach(b,c);else if(ca(a)||s(a))Da(a,b,c);else{var d;if(typeof a.Za=="function")d=a.Za();else if(typeof a.Ca!="function")if(ca(a)||s(a)){d=[];for(var e=a.length,f=0;f<e;f++)d.push(f)}else d=Sa(a);else d=void 0;e=bd(a);f=e.length;for(var g=0;g<f;g++)b.call(c,e[g],d&&d[g],a)}};var U=function(a){this.M={};this.a=[];var b=arguments.length;if(b>1){b%2&&h(Error("Uneven number of arguments"));for(var c=0;c<b;c+=2)this.N(arguments[c],arguments[c+1])}else if(a){if(a instanceof U){b=a.Za();c=a.Ca()}else{b=Sa(a);c=Ra(a)}for(var d=0;d<b.length;d++)this.N(b[d],c[d])}};m=U.prototype;m.i=0;m.La=0;m.Ca=function(){dd(this);for(var a=[],b=0;b<this.a.length;b++)a.push(this.M[this.a[b]]);return a};m.Za=function(){dd(this);return this.a.concat()};m.Ea=function(){return this.i==0};
+m.clear=function(){this.M={};this.La=this.i=this.a.length=0};var dd=function(a){if(a.i!=a.a.length){for(var b=0,c=0;b<a.a.length;){var d=a.a[b];if(Object.prototype.hasOwnProperty.call(a.M,d))a.a[c++]=d;b++}a.a.length=c}if(a.i!=a.a.length){var e={};for(c=b=0;b<a.a.length;){d=a.a[b];if(!Object.prototype.hasOwnProperty.call(e,d)){a.a[c++]=d;e[d]=1}b++}a.a.length=c}};U.prototype.get=function(a,b){if(Object.prototype.hasOwnProperty.call(this.M,a))return this.M[a];return b};
+U.prototype.N=function(a,b){if(!Object.prototype.hasOwnProperty.call(this.M,a)){this.i++;this.a.push(a);this.La++}this.M[a]=b};U.prototype.Na=function(a){dd(this);var b=0,c=this.a,d=this.M,e=this.La,f=this,g=new Ma;g.next=function(){for(;;){e!=f.La&&h(Error("The map has changed since the iterator was created"));b>=c.length&&h(y);var l=c[b++];return a?l:d[l]}};return g};var ed=n.window;var fd=function(){};(function(a){a.rb=function(){return a.pc||(a.pc=new a)}})(fd);fd.prototype.Cb=0;fd.rb();var V=function(a){this.ya=a||G();this.Dc=gd};v(V,R);V.prototype.vb=fd.rb();var gd=j;m=V.prototype;m.$=j;m.G=k;m.b=j;m.Dc=j;m.sc=j;m.fa=j;m.va=j;m.ua=j;m.Kc=k;m.c=function(){return this.b};m.X=function(){return this.Z||(this.Z=new P(this))};m.fb=function(a){this.fa&&this.fa!=a&&h(Error("Method not supported"));V.k.fb.call(this,a)};m.m=function(){return this.ya};m.j=function(){this.b=this.ya.createElement("div")};
+m.ia=function(a){this.G&&h(Error("Component already rendered"));this.b||this.j();a?a.insertBefore(this.b,j):this.ya.h.body.appendChild(this.b);if(!this.fa||this.fa.G)this.Aa()};m.Aa=function(){this.G=i;hd(this,function(a){!a.G&&a.c()&&a.Aa()})};m.na=function(){hd(this,function(a){a.G&&a.na()});this.Z&&this.Z.ga();this.G=k};
+m.g=function(){V.k.g.call(this);this.G&&this.na();if(this.Z){this.Z.t();delete this.Z}hd(this,function(a){a.t()});!this.Kc&&this.b&&Gb(this.b);this.fa=this.sc=this.b=this.ua=this.va=j};var hd=function(a,b){a.va&&Da(a.va,b,void 0)};
+V.prototype.removeChild=function(a,b){if(a){var c=s(a)?a:a.$||(a.$=":"+(a.vb.Cb++).toString(36)),d;if(this.ua&&c){d=this.ua;d=c in d?d[c]:void 0;d=d||j}else d=j;a=d;if(c&&a){d=this.ua;c in d&&delete d[c];c=this.va;d=Ca(c,a);if(d>=0){Ba(c.length!=j);x.splice.call(c,d,1)}if(b){a.na();a.b&&Gb(a.b)}c=a;c==j&&h(Error("Unable to set parent component"));c.fa=j;V.k.fb.call(c,j)}}a||h(Error("Child is not in parent component"));return a};var W=function(a,b,c){V.call(this,c);this.s=a||"modal-dialog";this.ib=!!b;this.r=id()};v(W,V);m=W.prototype;m.Ba=j;m.$b=i;m.sb=i;m.ib=k;m.pa=i;m.nb=i;m.Tb=0.5;m.Ob="";m.Sa="";m.r=j;m.V=j;m.jb=k;m.Yb=k;m.f=j;m.e=j;m.Ka=j;m.ta=j;m.Nb=j;m.Ja=j;m.wa=j;m.z=j;
+m.j=function(){jd(this);var a=this.m();this.b=a.j("div",{className:this.s,tabIndex:0},this.Ka=a.j("div",{className:this.s+"-title",id:this.$||(this.$=":"+(this.vb.Cb++).toString(36))},this.ta=a.j("span",this.s+"-title-text",this.Ob),this.Ja=a.j("span",this.s+"-title-close")),this.wa=a.j("div",this.s+"-content"),this.z=a.j("div",this.s+"-buttons"),this.Lb=a.j("span",{tabIndex:0}));this.Nb=this.Ka.id;Rc(this.c());this.c().setAttribute("aria-labelledby",this.Nb||"");if(this.Sa)this.wa.innerHTML=this.Sa;
+T(this.Ja,this.sb);T(this.c(),k);if(this.r){a=this.r;a.b=this.z;a.ia()}};var jd=function(a){if(a.ib&&a.pa&&!a.e){var b;b=a.m().j("iframe",{frameborder:0,style:"border:0;vertical-align:bottom;",src:'javascript:""'});a.e=b;a.e.className=a.s+"-bg";T(a.e,k);Pc(a.e,0)}else if((!a.ib||!a.pa)&&a.e){Gb(a.e);a.e=j}if(a.pa&&!a.f){a.f=a.m().j("div",a.s+"-bg");Pc(a.f,a.Tb);T(a.f,k)}else if(!a.pa&&a.f){Gb(a.f);a.f=j}};
+W.prototype.ia=function(a){this.G&&h(Error("Component already rendered"));this.c()||this.j();a=a||Jb(this.m()).body;this.e&&a.appendChild(this.e);this.f&&a.appendChild(this.f);W.k.ia.call(this,a)};
+W.prototype.Aa=function(){W.k.Aa.call(this);this.Ba=new Sc(Jb(this.m()));if(this.nb&&!this.V){var a=new Tc(this.c(),this.Ka);vb(this.Ka,this.s+"-title-draggable");this.V=a}Q(Q(this.X(),this.Ja,"click",this.yc),this.Ba,"focusin",this.wc);Rc(this.c());this.ta.id!==""&&this.c().setAttribute("aria-labelledby",this.ta.id)};W.prototype.na=function(){this.jb&&kd(this,k);this.Ba.t();this.Ba=j;if(this.V){this.V.t();this.V=j}W.k.na.call(this)};
+var kd=function(a,b){if(b!=a.jb){var c=Jb(a.m()),d=Bb(c)||window;a.G||a.ia(c.body);if(b){ld(a);md(a);Q(Q(Q(a.X(),a.c(),"keydown",a.Ga),a.c(),"keypress",a.Ga),d,"resize",a.Eb)}else xc(xc(xc(a.X(),a.c(),"keydown",a.Ga),a.c(),"keypress",a.Ga),d,"resize",a.Eb);a.e&&T(a.e,b);a.f&&T(a.f,b);T(a.c(),b);b&&a.focus();if(a.jb=b)Q(a.X(),a.z,"click",a.Db);else{xc(a.X(),a.z,"click",a.Db);a.dispatchEvent("afterhide");a.Yb&&a.t()}}};
+W.prototype.focus=function(){try{this.c().focus()}catch(a){}if(this.r){var b=this.r.xa;if(b)for(var c=Jb(this.m()),d=this.z.getElementsByTagName("button"),e=0,f;f=d[e];e++)if(f.name==b){try{if(B||fb){var g=c.createElement("input");g.style.cssText="position:fixed;width:0;height:0;left:0;top:0;";this.c().appendChild(g);g.focus();this.c().removeChild(g)}f.focus()}catch(l){}break}}};
+var ld=function(a){a.e&&T(a.e,k);a.f&&T(a.f,k);var b=Jb(a.m()),c=Ab(Bb(b)||window||window),d=Math.max(b.body.scrollWidth,c.width);b=Math.max(b.body.scrollHeight,c.height);if(a.e){T(a.e,i);Nc(a.e,d,b)}if(a.f){T(a.f,i);Nc(a.f,d,b)}if(a.nb){c=Oc(a.c());a.V.bb=new Fc(0,0,d-c.width,b-c.height)}},md=function(a){var b=Jb(a.m()),c=Bb(b)||window;if(S(a.c(),"position")=="fixed")var d=b=0;else{d=Kb(a.m());b=d.x;d=d.y}var e=Oc(a.c());c=Ab(c||window);Kc(a.c(),Math.max(b+c.width/2-e.width/2,0),Math.max(d+c.height/
+2-e.height/2,0))};m=W.prototype;m.yc=function(){if(this.sb){var a=this.r,b=a&&a.Qa;if(b){a=a.get(b);this.dispatchEvent(new nd(b,a))&&kd(this,k)}else kd(this,k)}};m.g=function(){W.k.g.call(this);if(this.f){Gb(this.f);this.f=j}if(this.e){Gb(this.e);this.e=j}this.Lb=this.z=this.Ja=j};m.Db=function(a){a:{for(a=a.target;a!=j&&a!=this.z;){if(a.tagName=="BUTTON")break a;a=a.parentNode}a=j}if(a&&!a.disabled){a=a.name;var b=this.r.get(a);this.dispatchEvent(new nd(a,b))&&kd(this,k)}};
+m.Ga=function(a){var b=k,c=k,d=this.r,e=a.target;if(a.type=="keydown")if(this.$b&&a.keyCode==27){var f=d&&d.Qa;e=e.tagName=="SELECT"&&!e.disabled;if(f&&!e){c=i;b=d.get(f);b=this.dispatchEvent(new nd(f,b))}else e||(b=i)}else{if(a.keyCode==9&&a.shiftKey&&e==this.c())c=i}else if(a.keyCode==13){if(e.tagName=="BUTTON")f=e.name;else if(d){var g=d.xa,l;if(l=g)a:{l=d.b.getElementsByTagName("BUTTON");for(var o=0,q;q=l[o];o++)if(q.name==g||q.id==g){l=q;break a}l=j}e=(e.tagName=="TEXTAREA"||e.tagName=="SELECT")&&
+!e.disabled;if(l&&!l.disabled&&!e)f=g}if(f){c=i;b=this.dispatchEvent(new nd(f,String(d.get(f))))}}if(b||c){a.stopPropagation();a.preventDefault()}b&&kd(this,k)};m.Eb=function(){ld(this)};m.wc=function(a){if(this.Lb==a.target){a=this.cc;if(da(a)){if(this)a=ka(a,this)}else if(a&&typeof a.handleEvent=="function")a=ka(a.handleEvent,a);else h(Error("Invalid listener argument"));ed.setTimeout(a,0)}};m.cc=function(){A&&Jb(this.m()).body.focus();this.c().focus()};
+var nd=function(a,b){this.type="dialogselect";this.key=a;this.caption=b};v(nd,I);var X=function(a){this.ya=a||G();U.call(this)};v(X,U);m=X.prototype;m.s="goog-buttonset";m.xa=j;m.b=j;m.Qa=j;m.N=function(a,b,c,d){U.prototype.N.call(this,a,b);if(c)this.xa=a;if(d)this.Qa=a;return this};var Y=function(a,b,c,d){return a.N(b.key,b.caption,c,d)};
+X.prototype.ia=function(){if(this.b){this.b.innerHTML="";var a=G(this.b);cd(this,function(b,c){var d=a.j("button",{name:c},b);if(c==this.xa)d.className=this.s+"-default";this.b.appendChild(d)},this)}};var od={key:"ok",caption:"OK"},pd={key:"cancel",caption:"Cancel"},qd={key:"yes",caption:"Yes"},rd={key:"no",caption:"No"},id=function(){return Y(Y(new X,od,i),pd,k,i)};Y(new X,od,i,i);id();Y(Y(new X,qd,i),rd,k,i);Y(Y(Y(new X,qd),rd,i),pd,k,i);
+Y(Y(Y(new X,{key:"continue",caption:"Continue"}),{key:"save",caption:"Save"}),pd,i,i);var sd=RegExp("[\u0591-\u07ff\u200f\ufb1d-\ufdff\ufe70-\ufefc](?:[^A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff\u202a-\u202e]*[\u0591-\u07ff\u200f\ufb1d-\ufdff\ufe70-\ufefc])?","g"),td=RegExp("[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff](?:[^\u0591-\u07ff\u200f\ufb1d-\ufdff\ufe70-\ufefc\u202a-\u202e]*[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff])?",
+"g"),ud=RegExp("^[\u0000-\u0008\u000e-\u001f!-@[-`{-\u0084\u0086-\u009f\u00a1-\u00bf\u00d7\u00f7\u02b9-\u02ff\u200b-\u200d\u2010-\u2027\u2030-\u205e\u2060-\u2bff\t-\r \u0085\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000]*[\u0000-\u0008\u000e-\u001f!-@[-`{-\u0084\u0086-\u009f\u00a1-\u00bf\u00d7\u00f7\u02b9-\u02ff\u200b-\u200d\u2010-\u2027\u2030-\u205e\u2060-\u2bff]"),vd=RegExp("[\u0000-\u0008\u000e-\u001f!-@[-`{-\u0084\u0086-\u009f\u00a1-\u00bf\u00d7\u00f7\u02b9-\u02ff\u200b-\u200d\u2010-\u2027\u2030-\u205e\u2060-\u2bff][\u0000-\u0008\u000e-\u001f!-@[-`{-\u0084\u0086-\u009f\u00a1-\u00bf\u00d7\u00f7\u02b9-\u02ff\u200b-\u200d\u2010-\u2027\u2030-\u205e\u2060-\u2bff\t-\r \u0085\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000]*$"),
+wd=RegExp("[\u0000-\u001f\u0085\u00a0\u1680\u180e\u2000-\u200f\u2028\u2029\u202f\u205f\u3000]"),xd=RegExp("^[\u0000-\u0008\u000e-\u001f!-@[-`{-\u0084\u0086-\u009f\u00a1-\u00bf\u00d7\u00f7\u02b9-\u02ff\u200b-\u200d\u2010-\u2027\u2030-\u205e\u2060-\u2bff\t-\r \u0085\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\u200e]+$"),yd=RegExp("^[\u0000-\u0008\u000e-\u001f!-@[-`{-\u0084\u0086-\u009f\u00a1-\u00bf\u00d7\u00f7\u02b9-\u02ff\u200b-\u200d\u2010-\u2027\u2030-\u205e\u2060-\u2bff\t-\r \u0085\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\u200f]+$"),
+zd=RegExp("^[\u0000-\u0008\u000e-\u001f!-@[-`{-\u0084\u0086-\u009f\u00a1-\u00bf\u00d7\u00f7\u02b9-\u02ff\u200b-\u200d\u2010-\u2027\u2030-\u205e\u2060-\u2bff\t-\r \u0085\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000]*\\d"),Ad=RegExp("[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff\u0591-\u07ff\u200f\ufb1d-\ufdff\ufe70-\ufefc]"),Bd=function(a,b){this.text=a;this.index=b},Cd=function(a){for(var b=[],c;c=sd.exec(a);)b.push(new Bd(c[0],
+c.index));return b},Dd=function(a){for(var b=[],c;c=td.exec(a);)a.charAt(c.index-1)=="\u202e"&&a.charAt(c.index+c[0].length)=="\u202c"||b.push(new Bd(c[0],c.index));return b},Ed=function(a){if(a=zd.exec(a))return new Bd(a[0],0);return j},Fd={"\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t",'"':'\\"',"'":"\\'","\\":"\\\\"},Gd=function(a){for(var b=[],c=0;c<a.length;c++){var d=b,e=c,f;f=a.charAt(c);if(f in Fd)f=Fd[f];else{var g=f;if(wd.test(f)){var l=f.charCodeAt(0);g="\\u";if(l<4096){g+=
+"0";if(l<256){g+="0";if(l<16)g+="0"}}g+=l.toString(16)}f=Fd[f]=g}d[e]=f}return b.join("")},Hd=function(a){return a.nodeName+"="+("'"+Gd(a.nodeValue)+"'")},Id=function(a){var b=[];if(a.attributes)for(var c=0;c<a.attributes.length;++c){var d=a.attributes[c];if(d.specified===undefined||d.specified)b.push(d)}a=[a.nodeName.toLowerCase()];b=Fa(b,Hd);b.sort();a=a.concat(b);return"<"+a.join(" ")+">"},Jd=function(a){for(var b=[];a;a=a.parentNode){b.push(Id(a));if(a.id||a.nodeName=="BODY")break}b.reverse();
+return b.join("")},Kd=function(a){var b=[],c=new H(a);Oa(c,function(){c.q.nodeType==3&&b.push(c.q.data)});return b.join("")},Ld=Va("ADDRESS","BLOCKQUOTE","BODY","CAPTION","CENTER","COL","COLGROUP","DIR","DIV","DL","DD","DT","FIELDSET","FORM","H1","H2","H3","H4","H5","H6","HR","ISINDEX","OL","LI","MAP","MENU","OPTGROUP","OPTION","P","PRE","TABLE","TBODY","TD","TFOOT","TH","THEAD","TR","TL","UL"),Md=Va("inline","inline-block","inline-table"),Nd={element:j,style:j},Od=function(a){if(Nd.element==a)return Nd.style;
+var b=(a.currentStyle?a.currentStyle.display:j)||Ic(a,"display");Nd={element:a,style:b};return b},Pd=function(a){var b=Od(a);return b?!Md[b]:!!Ld[a.tagName]},Qd=function(a){if(a.nodeType==1){if(a.nodeName=="SCRIPT"||a.nodeName=="STYLE"||a.nodeName=="NOSCRIPT")return k;return Od(a)!="none"}return i};var Rd=function(a,b,c){this.T=a;this.Hc=b;this.Zb=c;this.S=[]};Rd.prototype.tb=function(){if(this.S.length==0)for(var a=0;a<this.T.length;++a)this.S.push(Sd(this.T[a],a==0?this.Hc:0,a==this.T.length-1?this.Zb:this.T[a].length));else for(a=0;a<this.S.length;++a)Hb(this.S[a],this.T[a]);return Mc(this.S[0])};Rd.prototype.Pb=function(){if(this.S.length!=0)for(var a=0;a<this.T.length;++a)Hb(this.T[a],this.S[a])};
+var Sd=function(a,b,c){b=b||0;c=c||a.data.length;var d=[];b>0&&d.push(a.data.substring(0,b));d.push(Db("span",{style:"color:red; background-color:yellow"},a.data.substring(b,c)));c<a.data.length&&d.push(a.data.substring(c));b=Db("span",j,d);Hb(b,a);return b};var Td=function(a){this.b=a};Td.prototype.eb=j;Td.prototype.tb=function(){this.eb=S(this.b,"backgroundColor");Hc(this.b,"yellow");return Mc(this.b)};Td.prototype.Pb=function(){this.eb!=j&&Hc(this.b,this.eb)};var Z=function(a,b,c,d){if(typeof a=="object"){b=["id","type","severity","atText","locationDescription","precededByText","followedByText"];c=["id","type","severity"];for(d=0;d<b.length;++d){var e=b[d];this[e]=e in a?a[e]:j;this[e]==j&&Ca(c,e)>=0&&h("Required field '"+e+"' not found in bidichecker.Error.")}}else{b==undefined&&h("Required parameter 'opt_severity' not found in bidichecker.Error.");this.id=Ud++;this.type=a;this.severity=b;Vd[this.id]=c||j;this.atText=d||j}};
+Z.prototype.precededByText=j;Z.prototype.followedByText=j;Z.prototype.locationDescription=j;Z.prototype.asString=j;var Ud=0,Vd=[];Z.prototype.Y=function(){return Vd[this.id]||j};Z.prototype.toString=function(){var a=new Ec("[",this.severity.toString(),"] ",this.type),b;if(b=this.atText)a.append(": ","'"+Gd(b)+"'");if(b=this.precededByText)a.append(" preceded by ","'"+Gd(b)+"'");if(b=this.followedByText)a.append(" followed by ","'"+Gd(b)+"'");if(b=this.locationDescription)a.append(" in ",b);return a.toString()};var Wd=function(a){this.A=a;this.p=0;this.qb=this.Q=this.P=j};Wd.prototype.kc=function(){var a;if(/[^0-9]/.test(this.Q.value))a=-1;else{a=this.Q.value;var b=Number(a);a=b==0&&/^[\s\xa0]*$/.test(a)?NaN:b;a-=1}if(a>=0&&a<this.A.length&&a!=this.p){Xd(this);this.p=a;this.Q.value=this.p+1;Yd(this)}else this.Q.value=this.p+1};Wd.prototype.gc=function(a){a=a.key=="next"?this.p==this.A.length-1?0:this.p+1:this.p==0?this.A.length-1:this.p-1;Xd(this);this.p=a;this.Q.value=this.p+1;Yd(this);return k};
+var Yd=function(a){var b=a.A[a.p],c=b.Y();if(c){var d=c.tb();c=window.scrollY;window.scrollTo(0,d.y-100);d=new Pa(a.P.offsetLeft,a.P.offsetTop);Kc(a.P,d.x,d.y+(window.scrollY-c))}Ib(a.qb,b.toString())},Xd=function(a){(a=a.A[a.p].Y())&&a.Pb()};var Zd=function(a,b){this.Ra=a;this.q=b},$d=function(a){this.ea=[new Zd(0,a)];this.zb=a};$d.prototype.append=function(a,b){if(this.zb!=b){this.ea.push(new Zd(a,b));this.zb=b}};var ae=function(a,b){var c=Ka(a.ea,function(d,e){return d-e.Ra}||La,b);return c>=0?c:-c-2};$d.prototype.Wa=function(a){return this.ea[ae(this,a)].q};$d.prototype.Y=function(a,b){for(var c=ae(this,a),d=ae(this,a+b-1),e=[],f=c;f<=d;++f)e.push(this.ea[f].q);return new Rd(e,a-this.ea[c].Ra,a+b-this.ea[d].Ra)};
+var be=function(a,b,c,d,e){this.yb=b;this.wb=e;this.Ub=d;this.hb=[a];this.Mb=a.length;this.cb=new $d(c)};be.prototype.Ia=j;be.prototype.Ea=function(){return Ga(this.hb,function(a){return a.length==0})};be.prototype.append=function(a,b){this.cb.append(this.Mb,b);this.Mb+=a.length;this.hb.push(a);this.Ia=j};var ce=function(a){if(a.Ia===j)a.Ia=a.hb.join("");return a.Ia};be.prototype.Wa=function(a){return this.cb.Wa(a)};be.prototype.Y=function(a,b){return this.cb.Y(a,b)};var de=new be("",k,j,j,k);var ee=function(a){this.da=new H(a);this.Ec=a;this.B=["rtl"==S(a,"direction")];this.ba=[];this.O=[a];this.W=[]};v(ee,R);ee.prototype.H=j;ee.prototype.go=function(){try{for(;;fe(this));}catch(a){a!==y?h(a):this.dispatchEvent("EndOfDom")}};
+var fe=function(a){for(var b=a.da.next();a.da.o==1&&!Qd(b);){b=a.da;var c=b.n?-1:1;if(b.o==c){b.o=c*-1;b.la+=b.o*(b.n?-1:1)}b=a.da.next()}a.H=b;if(a.da.o==1){b=a.H;c="rtl"==S(b,"direction");a.ba.push(w(a.ba)||c!=w(a.B)||ge(a,b));a.B.push(c);if(b.nodeName=="IFRAME"||b.nodeName=="FRAME")a.W.push(b);else Pd(b)&&a.O.push(b);a.dispatchEvent("StartTag")}else if(a.da.o==-1){a.dispatchEvent("EndTag");a.B.pop();a.ba.pop();a.H==w(a.O)&&a.O.pop()}else a.H.nodeType==3&&a.dispatchEvent("TextNode")};
+ee.prototype.Ya=function(){return this.W};var ge=function(a,b){if(!b.dir||b==a.Ec)return k;for(var c=b.firstChild;c;c=c.nextSibling)if(c.nodeType==1&&Pd(c))return k;return i};var he=function(a){this.J=de;this.l=new P(this);Q(this.l,a,"TextNode",this.$a);wc(this.l,a,"EndOfDom",this.ic)};v(he,R);he.prototype.$a=function(a){a=a.target;var b=a.H;if(w(a.B)==this.J.yb&&w(a.O)==this.J.Ub&&w(a.ba)==this.J.wb)this.J.append(b.data,b);else{this.J.Ea()||this.dispatchEvent("DirChunk");this.J=new be(b.data,w(a.B),b,w(a.O),w(a.ba))}};he.prototype.ic=function(){this.J.Ea()||this.dispatchEvent("DirChunk");this.dispatchEvent("EndOfChunks");this.l.ga()};var ie=function(a){this.Ma=a};var $=function(){};t("bidichecker.FilterFactory.ComposableFilter",$);$.prototype.Qb=function(a){return je(this,a)};$.prototype.and=$.prototype.Qb;$.prototype.vc=function(){return ke(this)};$.prototype.not=$.prototype.vc;$.prototype.zc=function(a){return le(this,a)};$.prototype.or=$.prototype.zc;
+var Ce=function(a){var b=a.opcode;switch(b){case "AND":return new me(a);case "AT_TEXT":return new ne(a);case "AT_TEXT_REGEXP":return new oe(a);case "FOLLOWED_BY_TEXT":return new pe(a);case "FOLLOWED_BY_TEXT_REGEXP":return new qe(a);case "LOCATION_CLASS":return new re(a);case "LOCATION_CLASS_REGEXP":return new se(a);case "LOCATION_ID":return new te(a);case "LOCATION_ID_REGEXP":return new ue(a);case "LOCATION_XPATH":return new ve(a);case "NOT":return new we(a);case "OR":return new xe(a);case "PRECEDED_BY_TEXT":return new ye(a);
+case "PRECEDED_BY_TEXT_REGEXP":return new ze(a);case "SEVERITY":return new Ae(a);case "TYPE":return new Be(a);default:h("Unknown filter opcode: '"+b+"'")}},De=function(a){if(!a)return j;a=yc(a);return Fa(a,function(b){return Ce(b)})},je=function(a,b){return new me({filter1:a,filter2:b})};t("bidichecker.FilterFactory.and",je);t("bidichecker.FilterFactory.atText",function(a){return new ne({atText:a||""})});t("bidichecker.FilterFactory.atTextRegexp",function(a){return new oe({atTextRegexp:a||""})});
+t("bidichecker.FilterFactory.followedByText",function(a){return new pe({followedByText:a||""})});t("bidichecker.FilterFactory.followedByTextRegexp",function(a){return new qe({followedByTextRegexp:a||""})});t("bidichecker.FilterFactory.locationClass",function(a){a||h("Empty or null argument to bidichecker.FilterFactory.locationClass");return new re({className:a})});
+t("bidichecker.FilterFactory.locationClassRegexp",function(a){a||h("Empty or null argument to bidichecker.FilterFactory.locationClassRegexp");return new se({classRegexp:a})});t("bidichecker.FilterFactory.locationId",function(a){a||h("Empty or null argument to bidichecker.FilterFactory.locationId");return new te({id:a})});t("bidichecker.FilterFactory.locationIdRegexp",function(a){a||h("Empty or null argument to bidichecker.FilterFactory.locationIdRegexp");return new ue({idRegexp:a})});
+t("bidichecker.FilterFactory.locationXpath",function(a){a||h("Empty or null argument to bidichecker.FilterFactory.locationXpath");return new ve({xpath:a})});var ke=function(a){return new we({filter:a})};t("bidichecker.FilterFactory.not",ke);var le=function(a,b){return new xe({filter1:a,filter2:b})};t("bidichecker.FilterFactory.or",le);t("bidichecker.FilterFactory.precededByText",function(a){return new ye({precededByText:a||""})});
+t("bidichecker.FilterFactory.precededByTextRegexp",function(a){return new ze({precededByTextRegexp:a||""})});t("bidichecker.FilterFactory.severityFrom",function(a){return new Ae({severityThreshold:a})});t("bidichecker.FilterFactory.type",function(a){return new Be({type:a})});
+var Ee=function(a,b){b in a||h("No '"+b+"' parameter found for '"+a.opcode+"' filter")},Fe=function(a,b,c){Ee(a,b);typeof a[b]!=c&&h("Wrong type for '"+b+"' parameter of '"+a.opcode+"' filter; expected "+c)},Ge=function(a,b){Fe(a,b,"string");return a[b]},He=function(a,b){Ee(a,b);var c=a[b],d;if(typeof c=="string")d=c;else if(c instanceof RegExp)d=c.source;else h("Wrong type for '"+b+"' parameter of '"+a.opcode+"' filter; expected string or RegExp");return RegExp("^("+d+")$")},Ie=function(a,b){Fe(a,
+b,"object");var c=a[b];if(c instanceof $)return c;else if(typeof c.opcode=="string")return Ce(c);else h("Can't make a filter out of the '"+b+"' parameter of '"+a.opcode+"' filter")},me=function(a){this.Ua=Ie(a,"filter1");this.Va=Ie(a,"filter2")};v(me,$);me.prototype.d=function(a,b){return this.Ua.d(a,b)&&this.Va.d(a,b)};var ne=function(a){this.Sb=Ge(a,"atText")};v(ne,$);ne.prototype.d=function(a){return this.Sb==(a.atText||"")};var oe=function(a){this.Rb=He(a,"atTextRegexp")};v(oe,$);
+oe.prototype.d=function(a){return this.Rb.test(a.atText||"")};var pe=function(a){this.ec=Ge(a,"followedByText")};v(pe,$);pe.prototype.d=function(a){return this.ec==(a.followedByText||"")};var qe=function(a){this.dc=He(a,"followedByTextRegexp")};v(qe,$);qe.prototype.d=function(a){return this.dc.test(a.followedByText||"")};var re=function(a){this.Vb=Ge(a,"className")};v(re,$);
+re.prototype.d=function(a,b){for(var c=0;c<b.length;++c)for(var d=b[c];d;d=d.parentNode)if(d.className)for(var e=d.className.split(/\s/),f=0;f<e.length;++f)if(this.Vb==e[f])return i;return k};var se=function(a){this.Wb=He(a,"classRegexp")};v(se,$);se.prototype.d=function(a,b){for(var c=0;c<b.length;++c)for(var d=b[c];d;d=d.parentNode)if(d.className)for(var e=d.className.split(/\s/),f=0;f<e.length;++f)if(this.Wb.test(e[f]))return i;return k};var te=function(a){this.$=Ge(a,"id")};v(te,$);
+te.prototype.d=function(a,b){for(var c=0;c<b.length;++c)for(var d=b[c];d;d=d.parentNode)if(d.id&&this.$==d.id)return i;return k};var ue=function(a){this.nc=He(a,"idRegexp")};v(ue,$);ue.prototype.d=function(a,b){for(var c=0;c<b.length;++c)for(var d=b[c];d;d=d.parentNode)if(d.id&&this.nc.test(d.id))return i;return k};var ve=function(a){a=Ge(a,"xpath");this.Lc=new ie(a)};v(ve,$);
+ve.prototype.d=function(a,b){for(var c=0;c<b.length;++c){var d;a:{d=b[c];var e;e=this.Lc;var f=d.ownerDocument,g=f._bidicheckerXpathMatcherCache_[e.Ma];if(!g)try{f.evaluate||h("XPath not supported by this browser");g=f.evaluate(e.Ma,f,j,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,j);f._bidicheckerXpathMatcherCache_[e.Ma]=g}catch(l){h("Error evaluating XPath expression "+e.Ma+": "+l)}e=g;for(f=0;f<e.snapshotLength;++f)if(e.snapshotItem(f)==d){d=i;break a}d=k}if(d)return i}return k};
+var we=function(a){this.ac=Ie(a,"filter")};v(we,$);we.prototype.d=function(a,b){return!this.ac.d(a,b)};var xe=function(a){this.Ua=Ie(a,"filter1");this.Va=Ie(a,"filter2")};v(xe,$);xe.prototype.d=function(a,b){return this.Ua.d(a,b)||this.Va.d(a,b)};var ye=function(a){this.Cc=Ge(a,"precededByText")};v(ye,$);ye.prototype.d=function(a){return this.Cc==(a.precededByText||"")};var ze=function(a){this.Bc=He(a,"precededByTextRegexp")};v(ze,$);
+ze.prototype.d=function(a){return this.Bc.test(a.precededByText||"")};var Ae=function(a){Fe(a,"severityThreshold","number");this.Gc=a.severityThreshold};v(Ae,$);Ae.prototype.d=function(a){return this.Gc<=a.severity};var Be=function(a){this.Jc=Ge(a,"type")};v(Be,$);Be.prototype.d=function(a){return this.Jc==a.type};var Je=function(){this.W=[]};v(Je,R);m=Je.prototype;m.start=function(){this.dispatchEvent("StartFrames")};m.end=function(){this.dispatchEvent("EndFrames")};m.push=function(a){this.W.push(a);this.dispatchEvent("EnterFrame")};m.pop=function(){this.dispatchEvent("ExitFrame");this.W.pop()};m.Ya=function(){return this.W};var Ke=function(a,b){this.fc=a;this.bc=b||[];this.A=[]};Ke.prototype.Ic=k;Ke.prototype.Xa=function(){return this.A};var Me=function(a,b,c){var d=a.fc.Ya().slice(0);c&&d.push(c);if(Ga(a.bc,function(e){return!e.d(b,d)})){c=Le(a,d);if(c!="")b.locationDescription=c;a.A.push(b);a.Ic&&h(b.toString()+"\n")}},Le=function(a,b){var c=[];Ea(b,function(d){c.push(Jd(d))});return c.join(" in ")};var Ne=function(a,b){this.uc=!!b;this.oa=new Je;this.pb=new Ke(this.oa,a)};Ne.prototype.F=j;Ne.prototype.Ta=j;Ne.prototype.Xa=function(){return this.pb.Xa()};
+var Re=function(a,b,c){b.ownerDocument._bidicheckerXpathMatcherCache_={};var d,e=a.pb;d=[new Oe(e),new Pe(e)];c!=0&&d.unshift(new Qe(c==-1,e));a.F=new ee(b);a.Ta=a.uc?new he(a.F):j;for(b=0;b<d.length;++b)d[b].gb(a);a.F.go();d=a.F.Ya();for(b=0;b<d.length;++b){e=d[b];a.oa.push(e);try{var f=(B?e.document||e.contentWindow.document:e.contentDocument||e.contentWindow.document).body;if(e.tagName=="IFRAME")c=0;Re(a,f,c)}catch(g){}a.oa.pop()}};var Qe=function(a,b){this.Gb=a;this.ma=b};Qe.prototype.gb=function(a){mc(a.F,"StartTag",this)};Qe.prototype.handleEvent=function(a){a=a.target;if(this.Gb!=w(a.B))Me(this.ma,new Z("Overall directionality not "+(this.Gb?"RTL":"LTR"),1,new Td(a.H)))};var Pe=function(a){this.ma=a;this.sa=[]};m=Pe.prototype;m.I=j;m.gb=function(a){var b=new P(this);Q(b,a.F,"StartTag",this.mc);Q(b,a.F,"EndTag",this.jc);Q(b,a.F,"TextNode",this.$a);wc(b,a.F,"EndOfDom",b.ga,k,b)};m.mc=function(a){a=a.target;var b=a.H;if(b.dir||b==w(a.O))this.I=j};m.jc=function(a){a=a.target;var b=a.H;if(b==w(a.O))this.I=j;else if(b.dir)if(w(a.B)==a.B[a.B.length-2])this.I=j;else{this.I=b;this.sa=[]}};
+m.$a=function(a){a=a.target;var b=a.H;if(this.I){this.sa.push(b);var c=Ed(b.data);if(c){var d=Fa(this.sa,function(f){return f.data}).join(""),e=w(this.sa).parentNode;Me(this.ma,Se(this,d.substr(0,d.length-(b.data.length-c.text.length)),c.text.length,w(a.B),w(a.ba)),e);this.I=j}else if(Ad.test(b.data))this.I=j}};var Se=function(a,b,c,d,e){b=new Z("Declared "+(d?"LTR":"RTL")+" spillover to number",e?4:2,new Rd(a.sa,0,c),b);a=Kd(a.I);b.precededByText=a;return b};var Oe=function(a){this.ma=a};Oe.prototype.gb=function(a){var b=new P(this);Q(b,a.Ta,"DirChunk",this.hc);wc(b,a.Ta,"EndOfChunks",b.ga,k,b)};Oe.prototype.hc=function(a){var b=this,c=a.target.J;if(c.yb){a=Dd(ce(c));Da(a,function(d){xd.exec(d.text)||Te(b,c,d,"Undeclared LTR text")})}else{a=Cd(ce(c));Da(a,function(d){yd.exec(d.text)||Te(b,c,d,"Undeclared RTL text")})}};
+var Te=function(a,b,c,d){var e=b.wb?4:3,f=b.Y(c.index,c.text.length);d=new Z(d,e,f,c.text);e=ce(b);f=c.index;var g=vd.exec(e.substr(0,f));f=g?new Bd(g[0],f-g[0].length):j;if(f){if(d.severity==3)d.severity=2;d.precededByText=f.text}f=c.index+c.text.length;e=(e=ud.exec(e.substr(f)))?new Bd(e[0],f):j;if(e){if(d.severity==3)d.severity=2;d.followedByText=e.text}b=b.Wa(c.index).parentNode;Me(a.ma,d,b)};var Ue=function(a){Ne.call(this,a,i)};v(Ue,Ne);var Ve=function(a,b,c){Vd=[];Ud=0;b=b||top.document.body;a=a?-1:1;c=new Ue(c);c.oa.start();Re(c,b,a);c.oa.end();return c.Xa()};t("bidichecker.checkPage",Ve);t("bidichecker.checkPageToJson",function(a,b,c){c=De(c);a=Ve(a,b,c);for(b=0;b<a.length;++b){c=a[b];c.asString=c.toString()}b=[];Bc(new zc,a,b);return b.join("")});
+var We=function(a){a=new Wd(a);if(!(a.P||a.A.length==0)){a.D=new W("bidichecker-dialog");var b=a.D;b.Ob="BidiChecker error browser";b.ta&&Ib(b.ta,"BidiChecker error browser");b=a.D;b.pa=k;jd(b);b.m();var c=new X;c.N("prev","< Prev");c.N("next","Next >");b=a.D;b.r=c;if(b.z)if(b.r){c=b.r;c.b=b.z;c.ia()}else b.z.innerHTML="";b=a.D;b.Sa='<div id="bidichecker-dialog-error-text" class="bidichecker-dialog-error-text"> </div><p>Error <input name="current" id="bidichecker-dialog-error-num" type="text" size="3" value="1" /> of <span id="bidichecker-dialog-error-count"></span></p><p style="font-size:75%">Drag this box if it conceals a part of the page you need.</p>';
+if(b.wa)b.wa.innerHTML='<div id="bidichecker-dialog-error-text" class="bidichecker-dialog-error-text"> </div><p>Error <input name="current" id="bidichecker-dialog-error-num" type="text" size="3" value="1" /> of <span id="bidichecker-dialog-error-count"></span></p><p style="font-size:75%">Drag this box if it conceals a part of the page you need.</p>';kd(a.D,i);a.P=a.D.c();b=G(a.P);var d=j;if(A){d=b.h.createStyleSheet();Qc(d,".bidichecker-dialog-bg { position: absolute; top: 0; left: 0; }.bidichecker-dialog { position: absolute; padding: 5px; background-color: #fcb; border: 1px solid #000; font-family: arial, sans-serif; width: 475px; color: #000; outline: none; direction: ltr }.bidichecker-dialog a, .bidichecker-dialog a:link,.bidichecker-dialog a:visited { color: #0066cc; cursor: pointer; }.bidichecker-dialog-title { position: relative; background-color: #f9efeb; color: #000000; padding: 10px 15px; font-size: 16px; font-weight: bold; vertical-align: middle; cursor: pointer; cursor: hand }.bidichecker-dialog-content { padding: 15px; font-size: 90%; background-color: #fff }.bidichecker-dialog-buttons { padding: 0 15px 15px; background-color: #fff }.bidichecker-dialog-error-text { font-weight: bold; font-size: 125%; color: #f00; height: 80px; overflow: auto; border: 1px dotted #f00 }")}else{c=
+xb(b.h,"head",void 0,void 0)[0];if(!c){d=xb(b.h,"body",void 0,void 0)[0];c=b.j("head");d.parentNode.insertBefore(c,d)}d=b.j("style");Qc(d,".bidichecker-dialog-bg { position: absolute; top: 0; left: 0; }.bidichecker-dialog { position: absolute; padding: 5px; background-color: #fcb; border: 1px solid #000; font-family: arial, sans-serif; width: 475px; color: #000; outline: none; direction: ltr }.bidichecker-dialog a, .bidichecker-dialog a:link,.bidichecker-dialog a:visited { color: #0066cc; cursor: pointer; }.bidichecker-dialog-title { position: relative; background-color: #f9efeb; color: #000000; padding: 10px 15px; font-size: 16px; font-weight: bold; vertical-align: middle; cursor: pointer; cursor: hand }.bidichecker-dialog-content { padding: 15px; font-size: 90%; background-color: #fff }.bidichecker-dialog-buttons { padding: 0 15px 15px; background-color: #fff }.bidichecker-dialog-error-text { font-weight: bold; font-size: 125%; color: #f00; height: 80px; overflow: auto; border: 1px dotted #f00 }");
+b.appendChild(c,d)}a.P.style.zIndex=1E4;b=a.D.m();Ib(b.c("bidichecker-dialog-error-count"),a.A.length+"");a.Q=b.c("bidichecker-dialog-error-num");a.qb=b.c("bidichecker-dialog-error-text");md(a.D);Yd(a);N(a.D,"dialogselect",a.gc,k,a);a.Q.onchange=ka(a.kc,a)}};t("bidichecker.runGui",We);t("bidichecker.runGuiFromJson",function(a){a=yc(a);a=Fa(a,function(b){return new Z(b)});We(a)}); })()
diff --git a/samples/reviews/reviews_closure_test.html b/samples/reviews/reviews_closure_test.html
index a1a6298..c6e063d 100644
--- a/samples/reviews/reviews_closure_test.html
+++ b/samples/reviews/reviews_closure_test.html
@@ -147,9 +147,10 @@
// Run BidiChecker on the application's element.
// As before, we'll filter out the known BiDi errors; specifically,
- // "undeclared RTL text" errors in the reviews panel.
+ // "undeclared RTL text" errors in the reviews panel. This time, we'll try
+ // the XPath-based filter.
var filters = [ bidichecker.FilterFactory.type('Undeclared RTL text').and(
- bidichecker.FilterFactory.locationId('reviews')) ];
+ bidichecker.FilterFactory.locationXpath('id("reviews")/*')) ];
var errors =
bidichecker.checkPage(/* shouldBeRtl= */ false, testDiv, filters);
diff --git a/samples/reviews/reviews_packaged_test.html b/samples/reviews/reviews_packaged_test.html
index 6d66a15..fe323d2 100644
--- a/samples/reviews/reviews_packaged_test.html
+++ b/samples/reviews/reviews_packaged_test.html
@@ -142,9 +142,10 @@
// Run BidiChecker on the application's element.
// As before, we'll filter out the known BiDi errors; specifically,
- // "undeclared RTL text" errors in the reviews panel.
+ // "undeclared RTL text" errors in the reviews panel. This time, we'll try
+ // the XPath-based filter.
var filters = [ bidichecker.FilterFactory.type('Undeclared RTL text').and(
- bidichecker.FilterFactory.locationId('reviews')) ];
+ bidichecker.FilterFactory.locationXpath('id("reviews")/*')) ];
var errors =
bidichecker.checkPage(/* shouldBeRtl= */ false, testDiv, filters);
diff --git a/src/bidichecker_test.html b/src/bidichecker_test.html
index 17783d8..8bce0a1 100644
--- a/src/bidichecker_test.html
+++ b/src/bidichecker_test.html
@@ -50,8 +50,7 @@
'atText': '5,012.7',
'precededByText': 'friends',
'severity': 2,
- 'locationDescription':
- '<div id=\'test\'><p>'}];
+ 'locationDescription': '<div id=\'test\'><p>'}];
assertErrorFields(expected, errors);
}
@@ -166,8 +165,7 @@
'atText': '5,012.7',
'precededByText': 'friends',
'severity': 2,
- 'locationDescription':
- '<div id=\'test\'><p>'}];
+ 'locationDescription': '<div id=\'test\'><p>'}];
assertErrorFields(expected, errors);
}
@@ -187,12 +185,57 @@
'atText': '5,012.7',
'precededByText': 'friends',
'severity': 2,
- 'locationDescription':
- '<div id=\'test\'><p>'}];
+ 'locationDescription': '<div id=\'test\'><p>'}];
assertErrorFields(expected, errors);
}
+function testBidiChecker_XpathFilterNotCachedAcrossCalls() {
+ // Onlyl run this test if the browser supports XPaths.
+ // TODO(elbaum): Remove the condition block when XPath is fully supported.
+ if (document.evaluate) {
+ var testDiv = goog.dom.createDom('div', {'id': 'test'});
+ goog.dom.appendChild(document.body, testDiv);
+ testDiv.innerHTML =
+ '<p><span dir=\'rtl\' id=\'my_id\' >friends<\/span>5,012.7 meters<\/p>';
+
+ var filters = [bidichecker.FilterFactory.locationXpath('id("my_id")')];
+ var errors = bidichecker.checkPage(true, testDiv, filters);
+
+ var expected = [{'type': 'Overall directionality not RTL',
+ 'severity': 1},
+
+ {'type': 'Declared RTL spillover to number',
+ 'atText': '5,012.7',
+ 'precededByText': 'friends',
+ 'severity': 2,
+ 'locationDescription': '<div id=\'test\'><p>'}];
+ assertErrorFields(expected, errors);
+
+ // Create a new test div containing an element with the same id. If XPath
+ // results are cached across calls to checkPage(), this will fail, since the
+ // cache will still contain the obsolete element.
+ goog.dom.removeNode(testDiv);
+ var testDiv = goog.dom.createDom('div', {'id': 'test'});
+ goog.dom.appendChild(document.body, testDiv);
+ testDiv.innerHTML =
+ '<p><span dir=\'rtl\' id=\'my_id\' align=\'right\'>ends<\/span>5.7<\/p>';
+
+ errors = bidichecker.checkPage(true, testDiv, filters);
+
+ expected = [{'type': 'Overall directionality not RTL',
+ 'severity': 1},
+
+ {'type': 'Declared RTL spillover to number',
+ 'atText': '5.7',
+ 'precededByText': 'ends',
+ 'severity': 2,
+ 'locationDescription': '<div id=\'test\'><p>'}];
+ assertErrorFields(expected, errors);
+ }
+}
+
+
function testBidiChecker_LocationBasedFilterWorksInIframe() {
// Test that filtering by id works across an iframe boundary.
diff --git a/src/deps.js b/src/deps.js
index 57cef5c..5541d23 100644
--- a/src/deps.js
+++ b/src/deps.js
@@ -12,7 +12,7 @@
goog.addDependency('../../../../src/errorcollector.js', ['bidichecker.ErrorCollector'], ['bidichecker.Error', 'bidichecker.Filter', 'bidichecker.FrameStack', 'bidichecker.utils', 'goog.array']);
goog.addDependency('../../../../src/errorgui.js', ['bidichecker.ErrorGui'], ['bidichecker.Error', 'goog.dom', 'goog.events.Event', 'goog.string', 'goog.style', 'goog.ui.Dialog', 'goog.ui.Dialog.ButtonSet']);
goog.addDependency('../../../../src/filter.js', ['bidichecker.Filter'], ['bidichecker.Error']);
-goog.addDependency('../../../../src/filterfactory.js', ['bidichecker.FilterFactory'], ['bidichecker.Filter', 'goog.json']);
+goog.addDependency('../../../../src/filterfactory.js', ['bidichecker.FilterFactory', 'bidichecker.FilterFactory.ComposableFilter'], ['bidichecker.Filter', 'bidichecker.XpathMatcher', 'goog.json']);
goog.addDependency('../../../../src/framestack.js', ['bidichecker.FrameStack', 'bidichecker.FrameStack.EventTypes'], ['goog.events.EventTarget']);
goog.addDependency('../../../../src/highlightablearea.js', ['bidichecker.HighlightableArea'], []);
goog.addDependency('../../../../src/highlightableelement.js', ['bidichecker.HighlightableElement'], ['bidichecker.HighlightableArea', 'goog.style']);
@@ -20,8 +20,9 @@
goog.addDependency('../../../../src/overalldirectionalitydetector.js', ['bidichecker.OverallDirectionalityDetector'], ['bidichecker.Detector', 'bidichecker.DomWalker', 'bidichecker.Error', 'bidichecker.HighlightableElement', 'bidichecker.Scanner', 'goog.events', 'goog.events.Event']);
goog.addDependency('../../../../src/samples/reviews/i18n.js', ['I18n'], []);
goog.addDependency('../../../../src/samples/reviews/reviews.js', ['ReviewsApp'], ['I18n']);
-goog.addDependency('../../../../src/scanner.js', ['bidichecker.Scanner'], ['bidichecker.Detector', 'bidichecker.DirChunkWalker', 'bidichecker.DomWalker', 'bidichecker.ErrorCollector', 'goog.i18n.bidi']);
+goog.addDependency('../../../../src/scanner.js', ['bidichecker.Scanner'], ['bidichecker.Detector', 'bidichecker.DirChunkWalker', 'bidichecker.DomWalker', 'bidichecker.ErrorCollector', 'bidichecker.XpathMatcher', 'goog.i18n.bidi']);
goog.addDependency('../../../../src/spilloverdetector.js', ['bidichecker.SpilloverDetector'], ['bidichecker.Detector', 'bidichecker.DomWalker', 'bidichecker.Error', 'bidichecker.HighlightableText', 'bidichecker.Scanner', 'goog.array', 'goog.events', 'goog.events.EventHandler']);
goog.addDependency('../../../../src/texterrorscanner.js', ['bidichecker.TextErrorScanner'], ['bidichecker.Detector', 'bidichecker.ErrorCollector', 'bidichecker.OverallDirectionalityDetector', 'bidichecker.Scanner', 'bidichecker.SpilloverDetector', 'bidichecker.UndeclaredTextDetector', 'goog.i18n.bidi']);
goog.addDependency('../../../../src/undeclaredtextdetector.js', ['bidichecker.UndeclaredTextDetector'], ['bidichecker.Detector', 'bidichecker.DirChunk', 'bidichecker.DirChunkWalker', 'bidichecker.Error', 'bidichecker.Scanner', 'bidichecker.utils', 'goog.array', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler']);
goog.addDependency('../../../../src/utils.js', ['bidichecker.utils', 'bidichecker.utils.Substring'], ['goog.array', 'goog.dom', 'goog.dom.TagIterator', 'goog.style']);
+goog.addDependency('../../../../src/xpathmatcher.js', ['bidichecker.XpathMatcher'], []);
diff --git a/src/domwalker.js b/src/domwalker.js
index ae5910c..e1b0688 100644
--- a/src/domwalker.js
+++ b/src/domwalker.js
@@ -282,9 +282,8 @@
/**
- * Advances the node iterator while skipping scripts or elements with style
- * display:none.
- * @return {Node} Returns the next node in a displayable element.
+ * Advances the node iterator while skipping non-displayable elements.
+ * @return {Node} The next node in a displayable element.
* @throws goog.iter.StopIteration when the whole DOM has been read.
* @private
*/
diff --git a/src/domwalker_test.html b/src/domwalker_test.html
index 2b9fa2d..4cd45fc 100644
--- a/src/domwalker_test.html
+++ b/src/domwalker_test.html
@@ -405,6 +405,25 @@
}
+function testDomWalker_NoscriptIsIgnored() {
+ var testDiv = goog.dom.createDom('div', {'id': 'test'});
+ goog.dom.appendChild(document.body, testDiv);
+ testDiv.innerHTML = '<noscript><p>In a noscript tag.</p></noscript>';
+
+ var domWalker = new bidichecker.DomWalker(testDiv);
+ var states = walkTheDom(domWalker);
+ var expected = [{type: START_TAG, element: testDiv,
+ inRtl: false, inDeclaredDir: false, block: testDiv},
+
+ {type: END_TAG, element: testDiv,
+ inRtl: false, inDeclaredDir: false, block: testDiv},
+
+ {type: END_OF_DOM, inRtl: false, block: testDiv}
+ ];
+ assertStatesEqual(expected, states);
+}
+
+
function testDomWalker_CanWalkAnIframe() {
// Create an iframe in the document.
var testDiv = goog.dom.createDom('div', {'id': 'test'});
diff --git a/src/filterfactory.js b/src/filterfactory.js
index fd3fbd9..07e22d6 100644
--- a/src/filterfactory.js
+++ b/src/filterfactory.js
@@ -26,6 +26,7 @@
goog.provide('bidichecker.FilterFactory.ComposableFilter');
goog.require('bidichecker.Filter');
+goog.require('bidichecker.XpathMatcher');
goog.require('goog.json');
@@ -119,6 +120,10 @@
return new bidichecker.FilterFactory.LocationIdRegexpFilter_(
bareFilter);
+ case 'LOCATION_XPATH':
+ return new bidichecker.FilterFactory.LocationXpathFilter_(
+ bareFilter);
+
case 'NOT':
return new bidichecker.FilterFactory.NotFilter_(bareFilter);
@@ -245,7 +250,7 @@
* @export
*/
bidichecker.FilterFactory.locationClass = function(className) {
- if (!className || className == '') {
+ if (!className) {
throw 'Empty or null argument to bidichecker.FilterFactory.locationClass';
}
return new bidichecker.FilterFactory.LocationClassFilter_(
@@ -264,7 +269,7 @@
* @export
*/
bidichecker.FilterFactory.locationClassRegexp = function(classRegexp) {
- if (!classRegexp || classRegexp == '') {
+ if (!classRegexp) {
throw 'Empty or null argument to ' +
'bidichecker.FilterFactory.locationClassRegexp';
}
@@ -282,7 +287,7 @@
* @export
*/
bidichecker.FilterFactory.locationId = function(id) {
- if (!id || id == '') {
+ if (!id) {
throw 'Empty or null argument to bidichecker.FilterFactory.locationId';
}
return new bidichecker.FilterFactory.LocationIdFilter_({'id': id});
@@ -299,7 +304,7 @@
* @export
*/
bidichecker.FilterFactory.locationIdRegexp = function(idRegexp) {
- if (!idRegexp || idRegexp == '') {
+ if (!idRegexp) {
throw 'Empty or null argument to ' +
'bidichecker.FilterFactory.locationIdRegexp';
}
@@ -309,6 +314,23 @@
/**
+ * Create a filter which suppresses errors by matching an XPath expression to
+ * the error's location.
+ * @param {string} xpath An XPath expression. Must not be empty or null.
+ * @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
+ * @export
+ */
+bidichecker.FilterFactory.locationXpath = function(xpath) {
+ if (!xpath) {
+ throw 'Empty or null argument to ' +
+ 'bidichecker.FilterFactory.locationXpath';
+ }
+ return new bidichecker.FilterFactory.LocationXpathFilter_(
+ {'xpath': xpath});
+};
+
+
+/**
* Create a filter which suppresses errors by inverting another filter.
* @param {!bidichecker.Filter} filter The subfilter.
* @return {!bidichecker.FilterFactory.ComposableFilter} A filter object.
@@ -812,6 +834,48 @@
/**
+ * A filter which suppresses errors by matching an XPath expression to the
+ * error's location. The XPath is matched against the element location in the
+ * innermost frame, as well as the elements corresponding to any containing
+ * frames. There is currently no way to restrict the match to apply within
+ * specific frames only.
+ * @param {!Object} bareObject An object with an 'xpath' field containing an
+ * XPath expression.
+ * @constructor
+ * @extends {bidichecker.FilterFactory.ComposableFilter}
+ * @private
+ */
+bidichecker.FilterFactory.LocationXpathFilter_ = function(bareObject) {
+ var xpath = bidichecker.FilterFactory.getStringParam_(bareObject, 'xpath');
+
+ /**
+ * @type {bidichecker.XpathMatcher}
+ * @private
+ */
+ this.xpathMatcher_ = new bidichecker.XpathMatcher(xpath);
+};
+goog.inherits(bidichecker.FilterFactory.LocationXpathFilter_,
+ bidichecker.FilterFactory.ComposableFilter);
+
+
+/** @inheritDoc */
+bidichecker.FilterFactory.LocationXpathFilter_.prototype.isSuppressed =
+ function(error, locationElements) {
+ // TODO(user): This currently matches the path to the element in the
+ // innermost frame, as well as the element(s) of any frame(s) that contain it.
+ // Should we implement Puppet's '/content:' syntax extension to specify
+ // matching in a specific frame(s)? Or some other mechanism to specify the
+ // parent frames?
+ for (var i = 0; i < locationElements.length; ++i) {
+ if (this.xpathMatcher_.matches(locationElements[i])) {
+ return true;
+ }
+ }
+ return false;
+};
+
+
+/**
* A filter which suppresses errors by inverting another filter.
* @param {!Object} bareObject An object containing a 'filter' field, containing
* a bare object representing a component filter.
diff --git a/src/filterfactory_test.html b/src/filterfactory_test.html
index 76f98dc..61ea442 100644
--- a/src/filterfactory_test.html
+++ b/src/filterfactory_test.html
@@ -626,6 +626,181 @@
}
+function testFilterFactory_LocationXpathFilterConstruct() {
+ var actual = bidichecker.FilterFactory.constructFilter_(
+ {'xpath': 'mypath', 'opcode': 'LOCATION_XPATH'});
+ var expected = bidichecker.FilterFactory.locationXpath('mypath');
+ assertObjectEquals(expected, actual);
+}
+
+
+function testFilterFactory_LocationXpathFilterConstructThrows() {
+ assertThrows(function() {
+ bidichecker.FilterFactory.locationXpath(null);
+ });
+}
+
+
+function testFilterFactory_LocationXpathFilterNoLocationElement() {
+ var filter = bidichecker.FilterFactory.locationXpath('abc');
+ var error = new bidichecker.Error('my_type', 2);
+ assertFalse(filter.isSuppressed(error, []));
+}
+
+
+function testFilterFactory_LocationXpathFilterNoMatch() {
+ bidichecker.XpathMatcher.initCache(document);
+
+ var testDiv = goog.dom.createDom('div', {'id': 'test'});
+ testDiv.innerHTML = '<div><p>Okay?<\/p><\/div>';
+ document.body.appendChild(testDiv); // Required for XPaths to work.
+
+ try {
+ var filter = bidichecker.FilterFactory.locationXpath('abc');
+ var error = new bidichecker.Error('my_type', 2);
+ assertFalse(filter.isSuppressed(error, [testDiv.firstChild]));
+ } catch (except) {
+ // The filter should only throw if the browser doesn't support XPaths.
+ // TODO(elbaum): Remove the try-catch block when XPath is fully supported.
+ assert(!document.evaluate);
+ }
+}
+
+
+function testFilterFactory_LocationXpathFilterMatch() {
+ bidichecker.XpathMatcher.initCache(document);
+
+ var testDiv = goog.dom.createDom('div', {'id': 'test'});
+ testDiv.innerHTML = '<div id=\'abc\'><p>Okay?<\/p><\/div>';
+ document.body.appendChild(testDiv);
+
+ try {
+ var filter = bidichecker.FilterFactory.locationXpath('//div/div');
+ var error = new bidichecker.Error('my_type', 2);
+ assertTrue(filter.isSuppressed(error, [testDiv.firstChild]));
+ } catch (except) {
+ // The filter should only throw if the browser doesn't support XPaths.
+ // TODO(elbaum): Remove the try-catch block when XPath is fully supported.
+ assert(!document.evaluate);
+ }
+}
+
+
+function testFilterFactory_LocationXpathFilterTwoMatches() {
+ bidichecker.XpathMatcher.initCache(document);
+
+ var testDiv = goog.dom.createDom('div', {'id': 'test'});
+ testDiv.innerHTML = '<div id=\'abc\'><p>Okay?<\/p><\/div>' +
+ '<div id=\'def\'><p>Okay?<\/p><\/div>';
+ document.body.appendChild(testDiv);
+
+ try {
+ var filter = bidichecker.FilterFactory.locationXpath('//div/div');
+ var error = new bidichecker.Error('my_type', 2);
+ assertTrue(filter.isSuppressed(error, [testDiv.firstChild]));
+ assertTrue(filter.isSuppressed(error, [testDiv.childNodes[1]]));
+ } catch (except) {
+ // The filter should only throw if the browser doesn't support XPaths.
+ // TODO(elbaum): Remove the try-catch block when XPath is fully supported.
+ assert(!document.evaluate);
+ }
+}
+
+
+function testFilterFactory_LocationXpathMatchesInIframes() {
+ // Create an iframe in the document.
+ var testDiv = goog.dom.createDom('div', {'id': 'test'});
+ goog.dom.appendChild(document.body, testDiv);
+ testDiv.innerHTML = '<iframe id=\'iframe\'><\/iframe>';
+ goog.dom.appendChild(document.body, testDiv);
+
+ // Fill the iframe with two "hello world" div's.
+ var iframe = testDiv.firstChild;
+ var iframeDoc =
+ goog.dom.getFrameContentDocument(/** @type {Element} */ (iframe));
+ iframeDoc.open();
+ iframeDoc.write('<div id=\'line1\'>hello world<\/div>' +
+ '<div id=\'line2\'>hello world<\/div>');
+ iframeDoc.close();
+ var iframeRoot = iframeDoc.body;
+ var firstDiv = iframeRoot.firstChild;
+ var secondDiv = iframeRoot.childNodes[1];
+
+ bidichecker.XpathMatcher.initCache(document);
+ bidichecker.XpathMatcher.initCache(iframeDoc);
+
+ try {
+ // Expect this to match both "hello world" div's.
+ var filter = bidichecker.FilterFactory.locationXpath('//div');
+ var error = new bidichecker.Error('my_type', 2);
+ assertTrue(filter.isSuppressed(error, [iframe, firstDiv]));
+ assertTrue(filter.isSuppressed(error, [iframe, secondDiv]));
+
+ // This time, expect it to match only the second "hello world" div.
+ filter = bidichecker.FilterFactory.locationXpath('id("line2")');
+ var error = new bidichecker.Error('my_type', 2);
+ assertFalse(filter.isSuppressed(error, [iframe, firstDiv]));
+ assertTrue(filter.isSuppressed(error, [iframe, secondDiv]));
+ } catch (except) {
+ // The filter should only throw if the browser doesn't support XPaths.
+ // TODO(elbaum): Remove the try-catch block when XPath is fully supported.
+ assert(!document.evaluate);
+ }
+}
+
+
+function testFilterFactory_LocationXpathMatchesIframeElement() {
+ bidichecker.XpathMatcher.initCache(document);
+
+ // Create an iframe in the document.
+ var testDiv = goog.dom.createDom('div', {'id': 'test'});
+ goog.dom.appendChild(document.body, testDiv);
+ testDiv.innerHTML = '<iframe id=\'iframe\'><\/iframe>';
+ goog.dom.appendChild(document.body, testDiv);
+
+ // Fill the iframe with two "hello world" div's.
+ var iframe = testDiv.firstChild;
+ var iframeDoc =
+ goog.dom.getFrameContentDocument(/** @type {Element} */ (iframe));
+ iframeDoc.open();
+ iframeDoc.write('<div id=\'line1\'>hello world<\/div>' +
+ '<div id=\'line2\'>hello world<\/div>');
+ iframeDoc.close();
+ var iframeRoot = iframeDoc.body;
+ var firstDiv = iframeRoot.firstChild;
+ var secondDiv = iframeRoot.childNodes[1];
+
+ try {
+ // Expect this to match due to the iframe element, regardless of the rest of
+ // the error location within the frame.
+ var filter = bidichecker.FilterFactory.locationXpath('id("iframe")');
+ var error = new bidichecker.Error('my_type', 2);
+ assertTrue(filter.isSuppressed(error, [iframe, firstDiv]));
+ assertTrue(filter.isSuppressed(error, [iframe, secondDiv]));
+ } catch (except) {
+ // The filter should only throw if the browser doesn't support XPaths.
+ // TODO(elbaum): Remove the try-catch block when XPath is fully supported.
+ assert(!document.evaluate);
+ }
+}
+
+
+function testFilterFactory_LocationXpathFilterInvalidXpathThrows() {
+ bidichecker.XpathMatcher.initCache(document);
+
+ var testDiv = goog.dom.createDom('div', {'id': 'test'});
+ testDiv.innerHTML = '<div><p>Okay?<\/p><\/div>';
+ document.body.appendChild(testDiv);
+
+ var filter = bidichecker.FilterFactory.locationXpath('%&#[]!');
+ var error = new bidichecker.Error('my_type', 2);
+
+ assertThrows(function() {
+ assertFalse(filter.isSuppressed(error, [testDiv.firstChild]));
+ });
+}
+
+
function testFilterFactory_NotFilterConstruct() {
var actual = bidichecker.FilterFactory.constructFilter_(
{'filter': new bidichecker.FilterFactory.atText('friends'),
diff --git a/src/scanner.js b/src/scanner.js
index f4cdc33..702fee5 100644
--- a/src/scanner.js
+++ b/src/scanner.js
@@ -23,6 +23,7 @@
goog.require('bidichecker.DirChunkWalker');
goog.require('bidichecker.DomWalker');
goog.require('bidichecker.ErrorCollector');
+goog.require('bidichecker.XpathMatcher');
goog.require('goog.i18n.bidi');
@@ -115,6 +116,8 @@
*/
bidichecker.Scanner.prototype.scanDomRecursively_ = function(
element, expectedDir) {
+ bidichecker.XpathMatcher.initCache(element.ownerDocument);
+
var newFrames = this.runDetectors_(element, expectedDir);
// Recurse for any contained frames.
diff --git a/src/utils.js b/src/utils.js
index 18d94dc..08521b1 100644
--- a/src/utils.js
+++ b/src/utils.js
@@ -89,7 +89,7 @@
/**
* Regular expression to check for a substring of RTL characters with neutral
- * characters among them.
+ * characters among them (excluding Unicode bidi control characters).
* @type {RegExp}
* @private
*/
@@ -99,13 +99,13 @@
// first character is optional to allow for a match against a single RTL
// character.
new RegExp('[' + bidichecker.utils.rtlChars_ + '](?:[^' +
- bidichecker.utils.ltrChars_ + ']*[' +
+ bidichecker.utils.ltrChars_ + '\u202A-\u202E]*[' +
bidichecker.utils.rtlChars_ + '])?', 'g');
/**
* Regular expression to check for a substring of LTR characters with neutral
- * characters among them.
+ * characters among them (excluding Unicode bidi control characters).
* @type {RegExp}
* @private
*/
@@ -115,7 +115,7 @@
// first character is optional to allow for a match against a single LTR
// character.
new RegExp('[' + bidichecker.utils.ltrChars_ + '](?:[^' +
- bidichecker.utils.rtlChars_ + ']*[' +
+ bidichecker.utils.rtlChars_ + '\u202A-\u202E]*[' +
bidichecker.utils.ltrChars_ + '])?', 'g');
@@ -233,7 +233,8 @@
/**
* Finds substrings in a given string of LTR characters with neutral characters
- * among them.
+ * among them. Ignores "fake RTL" strings, when the LTR characters are
+ * sandwiched between Unicode RLO and PDF characters.
* @param {string} str The string to be searched.
* @return {Array.<bidichecker.utils.Substring>} Array of matching substrings.
* Returns empty array if no match.
@@ -242,6 +243,11 @@
var results = [];
var match;
while ((match = bidichecker.utils.ltrSubstringReg_.exec(str))) {
+ // Skip fake RTl strings.
+ if (str.charAt(match.index - 1) == '\u202E' &&
+ str.charAt(match.index + match[0].length) == '\u202C') {
+ continue;
+ }
results.push(new bidichecker.utils.Substring(match[0], match.index));
}
return results;
@@ -565,14 +571,20 @@
/**
- * Checks if a node is displayable; that is, it has style "display:none" or
- * is a script or style element.
+ * Checks if a node is displayable; that is, it does not have style
+ * "display:none" and is not a script, noscript or style element.
+ * <p>In some browsers (such as IE), contents of noscript tags are not
+ * accessible anyway with scripting activated. In others (such as Chrome) the
+ * DOM contains a noscript element whose contents are the entity-encoded HTML
+ * source code of the contents of the noscript tag; if the context is RTL, that
+ * produces undeclared-directionality errors.
* @param {Node} node The node to test.
* @return {boolean} Whether the node is displayable.
*/
bidichecker.utils.isDisplayable = function(node) {
if (node.nodeType == goog.dom.NodeType.ELEMENT) {
- if (node.nodeName == 'SCRIPT' || node.nodeName == 'STYLE') {
+ if (node.nodeName == 'SCRIPT' || node.nodeName == 'STYLE' ||
+ node.nodeName == 'NOSCRIPT') {
return false;
}
return bidichecker.utils.getDisplayStyle(
diff --git a/src/utils_test.html b/src/utils_test.html
index 128f8e2..a7bb15c 100644
--- a/src/utils_test.html
+++ b/src/utils_test.html
@@ -85,6 +85,13 @@
goog.i18n.bidi.Format.RLM);
assertArrayEquals([{text: goog.i18n.bidi.Format.LRM + ' Some Text',
index: 3}], matches);
+
+ // A series of LTR letters surrounded by RLO (right-to-left override) and PDF
+ // should not be identified as LTR.
+ matches = bidichecker.utils.findLtrSubstrings(
+ 'Some Text \u202Ebidi\u202C \u202Eoverride\u202C and some other text');
+ assertArrayEquals([{text: 'Some Text', index: 0},
+ {text: 'and some other text', index: 28}], matches);
}
diff --git a/src/xpathmatcher.js b/src/xpathmatcher.js
new file mode 100644
index 0000000..eaae1f3
--- /dev/null
+++ b/src/xpathmatcher.js
@@ -0,0 +1,125 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Matches XPath expressions in a document, caching the results.
+ */
+
+
+goog.provide('bidichecker.XpathMatcher');
+
+
+/**
+ * Matches XPath expressions, caching the results.
+ * @param {string} xpath An XPath expression.
+ * @constructor
+ */
+bidichecker.XpathMatcher = function(xpath) {
+ /**
+ * @type {string}
+ * @private
+ */
+ this.xpath_ = xpath;
+};
+
+
+/**
+ * Key used for storing XPath caches on document objects. Hopefully this will
+ * not clash with keys used by other code.
+ * @type {string}
+ * @const
+ * @private
+ */
+bidichecker.XpathMatcher.DOCUMENT_CACHE_KEY_ = '_bidicheckerXpathMatcherCache_';
+
+
+/**
+ * Initializes the XPath results cache for a given document. Must be called
+ * before {@code matches()} for each document to be used.
+ * @param {Document} doc The document in which XPaths are to be evaluated.
+ */
+bidichecker.XpathMatcher.initCache = function(doc) {
+ doc[bidichecker.XpathMatcher.DOCUMENT_CACHE_KEY_] = {};
+};
+
+
+/**
+ * Checks whether a given element matches the XPath expression.
+ * @param {Element} element The element to be matched.
+ * @return {boolean} Whether or not it matches the XPath expression.
+ */
+bidichecker.XpathMatcher.prototype.matches = function(element) {
+ var xpathResult = this.evaluate_(element.ownerDocument);
+ for (var i = 0; i < xpathResult.snapshotLength; ++i) {
+ if (xpathResult.snapshotItem(i) == element) {
+ return true;
+ }
+ }
+ return false;
+};
+
+
+/**
+ * Evaluates the XPath expression in a given document.
+ * @param {Document} doc The document in which XPaths are to be evaluated.
+ * @return {XPathResult} An unordered snapshot containing all the nodes in the
+ * document which match the XPath expression.
+ * @private
+ */
+bidichecker.XpathMatcher.prototype.evaluate_ = function(doc) {
+ var xpathResult = this.getCachedResults_(doc);
+ if (!xpathResult) {
+ try {
+ // IE does not support document.evaluate (which evaluates XPaths).
+ // TODO(user): Add support for IE by using an external XPath library.
+ if (!doc.evaluate) {
+ throw 'XPath not supported by this browser';
+ }
+ xpathResult = doc.evaluate(this.xpath_, doc, null,
+ XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
+ this.setCachedResults_(doc, xpathResult);
+ } catch (except) {
+ throw 'Error evaluating XPath expression ' + this.xpath_ + ': ' + except;
+ }
+ }
+ return xpathResult;
+};
+
+
+/**
+ * Retrieves cached results of evaluating the XPath expression in a given
+ * document, if available. Assumes {@code initCache} has already been called.
+ * @param {Document} doc The document in which XPaths are to be evaluated and
+ * their results cached.
+ * @return {XPathResult} An unordered snapshot containing all the nodes in the
+ * document which match the XPath expression. If no cached results are
+ * available, returns null.
+ * @private
+ */
+bidichecker.XpathMatcher.prototype.getCachedResults_ = function(doc) {
+ return doc[bidichecker.XpathMatcher.DOCUMENT_CACHE_KEY_][this.xpath_];
+};
+
+
+/**
+ * Caches results of evaluating the XPath expression in a given document.
+ * @param {Document} doc The document in which XPath results are to be cached.
+ * @param {XPathResult} xpathResult An unordered snapshot containing all the
+ * nodes in the document which match the XPath expression.
+ * @private
+ */
+bidichecker.XpathMatcher.prototype.setCachedResults_ = function(
+ doc, xpathResult) {
+ doc[bidichecker.XpathMatcher.DOCUMENT_CACHE_KEY_][this.xpath_] = xpathResult;
+};