babelacc

compare different implementations of the text alternative computation  https://p.ce9e.org/babelacc/
git clone https://git.ce9e.org/babelacc.git

commit
4c6c30b19a072c9147fb3405a22da80c62b307d6
parent
befaef0a9b31e5a85613568713690ca42a99cac6
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2018-07-07 06:52
build

Diffstat

M babel.js 3974 ++++++++++++++++++++++++++++++++++++++++++++++---------------

1 files changed, 3017 insertions, 957 deletions


diff --git a/babel.js b/babel.js

@@ -4762,15 +4762,19 @@ exports.attributes = {
 4762  4762 	'sort': 'token',
 4763  4763 };
 4764  4764 
 4765    -1 exports.attributeMapping = {
 4766    -1 	'checked': 'checked',
 4767    -1 	'colspan': 'colSpan',
   -1  4765 exports.attributeStrongMapping = {
 4768  4766 	'disabled': 'disabled',
 4769    -1 	'expanded': 'open',
 4770    -1 	'multiselectable': 'multiple',
   -1  4767 	'hidden': 'hidden',
 4771  4768 	'placeholder': 'placeholder',
 4772  4769 	'readonly': 'readOnly',
 4773  4770 	'required': 'required',
   -1  4771 };
   -1  4772 
   -1  4773 exports.attributeWeakMapping = {
   -1  4774 	'checked': 'checked',
   -1  4775 	'colspan': 'colSpan',
   -1  4776 	'expanded': 'open',
   -1  4777 	'multiselectable': 'multiple',
 4774  4778 	'rowspan': 'rowSpan',
 4775  4779 	'selected': 'selected',
 4776  4780 };
@@ -4834,6 +4838,7 @@ exports.extraSelectors = {
 4834  4838 	spinbutton: ['input[type="number"]'],
 4835  4839 	status: ['output'],
 4836  4840 	table: ['table'],
   -1  4841 	term: ['dfn', 'dt'],
 4837  4842 	textbox: [
 4838  4843 		'input:not([type]):not([list])',
 4839  4844 		'input[type="email"]:not([list])',
@@ -5051,7 +5056,7 @@ var getPseudoContent = function(node, selector) {
 5051  5056 	var ret = styles.getPropertyValue('content');
 5052  5057 	var inline = styles.display.substr(0, 6) === 'inline';
 5053  5058 	if (!ret) {
 5054    -1 		return ''
   -1  5059 		return '';
 5055  5060 	}
 5056  5061 	if (ret.substr(0, 1) !== '"') {
 5057  5062 		return '';
@@ -5208,6 +5213,10 @@ var getName = function(el, recursive, referenced) {
 5208  5213 	return before + ret + after;
 5209  5214 };
 5210  5215 
   -1  5216 var getNameTrimmed = function(el) {
   -1  5217 	return getName(el).replace(/\s+/g, ' ').trim();
   -1  5218 };
   -1  5219 
 5211  5220 var getDescription = function(el) {
 5212  5221 	var ret = '';
 5213  5222 
@@ -5224,13 +5233,17 @@ var getDescription = function(el) {
 5224  5233 		ret = el.placeholder;
 5225  5234 	}
 5226  5235 
 5227    -1 	return (ret || '').trim().replace(/\s+/g, ' ');
   -1  5236 	ret = (ret || '').trim().replace(/\s+/g, ' ');
   -1  5237 
   -1  5238 	if (ret === getNameTrimmed(el)) {
   -1  5239 		ret = '';
   -1  5240 	}
   -1  5241 
   -1  5242 	return ret;
 5228  5243 };
 5229  5244 
 5230  5245 module.exports = {
 5231    -1 	getName: function(el) {
 5232    -1 		return getName(el).replace(/\s+/g, ' ').trim();
 5233    -1 	},
   -1  5246 	getName: getNameTrimmed,
 5234  5247 	getDescription: getDescription,
 5235  5248 };
 5236  5249 
@@ -5275,6 +5288,23 @@ var getAttribute = function(el, key, _hiddenRoot) {
 5275  5288 		return false;
 5276  5289 	}
 5277  5290 
   -1  5291 	if (constants.attributeStrongMapping.hasOwnProperty(key)) {
   -1  5292 		var value = el[constants.attributeStrongMapping[key]];
   -1  5293 		if (value) {
   -1  5294 			return value;
   -1  5295 		}
   -1  5296 	}
   -1  5297 	if (key === 'readonly' && el.contentEditable) {
   -1  5298 		return false;
   -1  5299 	} else if (key === 'invalid' && el.checkValidity) {
   -1  5300 		return !el.checkValidity();
   -1  5301 	} else if (key === 'hidden') {
   -1  5302 		var style = window.getComputedStyle(el);
   -1  5303 		if (style.display === 'none' || style.visibility === 'hidden') {
   -1  5304 			return true;
   -1  5305 		}
   -1  5306 	}
   -1  5307 
 5278  5308 	var type = constants.attributes[key];
 5279  5309 	var raw = el.getAttribute('aria-' + key);
 5280  5310 
@@ -5311,16 +5341,11 @@ var getAttribute = function(el, key, _hiddenRoot) {
 5311  5341 			}
 5312  5342 		}
 5313  5343 	} else if (key === 'hidden') {
 5314    -1 		var style = window.getComputedStyle(el);
 5315    -1 		if (el.hidden || style.display === 'none' || style.visibility === 'hidden') {
 5316    -1 			return true;
 5317    -1 		} else if (el.clientHeight === 0) {  // rough check for performance
   -1  5344 		if (el.clientHeight === 0) {  // rough check for performance
 5318  5345 			return el.parentNode && getAttribute(el.parentNode, 'hidden', _hiddenRoot);
 5319  5346 		}
 5320    -1 	} else if (key === 'invalid' && el.checkValidity) {
 5321    -1 		return el.checkValidity();
 5322    -1 	} else if (constants.attributeMapping.hasOwnProperty(key)) {
 5323    -1 		return el[constants.attributeMapping[key]];
   -1  5347 	} else if (constants.attributeWeakMapping.hasOwnProperty(key)) {
   -1  5348 		return el[constants.attributeWeakMapping[key]];
 5324  5349 	}
 5325  5350 
 5326  5351 	if (type === 'bool' || type === 'tristate') {
@@ -5412,17 +5437,6 @@ module.exports = {
 5412  5437 };
 5413  5438 
 5414  5439 },{}],12:[function(require,module,exports){
 5415    -1 /*! aXe v2.6.1
 5416    -1  * Copyright (c) 2017 Deque Systems, Inc.
 5417    -1  *
 5418    -1  * Your use of this Source Code Form is subject to the terms of the Mozilla Public
 5419    -1  * License, v. 2.0. If a copy of the MPL was not distributed with this
 5420    -1  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 5421    -1  *
 5422    -1  * This entire copyright notice must appear in every copy of this file you
 5423    -1  * distribute or in any file that contains substantial portions of this source
 5424    -1  * code.
 5425    -1  */
 5426  5440 (function axeFunction(window) {
 5427  5441   var global = window;
 5428  5442   var document = window.document;
@@ -5433,9 +5447,9 @@ module.exports = {
 5433  5447     return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;
 5434  5448   };
 5435  5449   var axe = axe || {};
 5436    -1   axe.version = '2.6.1';
   -1  5450   axe.version = '3.0.3';
 5437  5451   if (typeof define === 'function' && define.amd) {
 5438    -1     define([], function() {
   -1  5452     define('axe-core', [], function() {
 5439  5453       'use strict';
 5440  5454       return axe;
 5441  5455     });
@@ -5557,7 +5571,8 @@ module.exports = {
 5557  5571   };
 5558  5572   Audit.prototype.run = function(context, options, resolve, reject) {
 5559  5573     'use strict';
 5560    -1     this.validateOptions(options);
   -1  5574     this.normalizeOptions(options);
   -1  5575     axe._selectCache = [];
 5561  5576     var q = axe.utils.queue();
 5562  5577     this.rules.forEach(function(rule) {
 5563  5578       if (axe.utils.ruleShouldRun(rule, context, options)) {
@@ -5591,6 +5606,7 @@ module.exports = {
 5591  5606       }
 5592  5607     });
 5593  5608     q.then(function(results) {
   -1  5609       axe._selectCache = undefined;
 5594  5610       resolve(results.filter(function(result) {
 5595  5611         return !!result;
 5596  5612       }));
@@ -5601,6 +5617,9 @@ module.exports = {
 5601  5617     var rules = this.rules;
 5602  5618     return results.map(function(ruleResult) {
 5603  5619       var rule = axe.utils.findBy(rules, 'id', ruleResult.id);
   -1  5620       if (!rule) {
   -1  5621         throw new Error('Result for unknown rule. You may be running mismatch aXe-core versions');
   -1  5622       }
 5604  5623       return rule.after(ruleResult, options);
 5605  5624     });
 5606  5625   };
@@ -5609,34 +5628,43 @@ module.exports = {
 5609  5628       return rule.id === ruleId;
 5610  5629     });
 5611  5630   };
 5612    -1   Audit.prototype.validateOptions = function(options) {
   -1  5631   Audit.prototype.normalizeOptions = function(options) {
 5613  5632     'use strict';
 5614  5633     var audit = this;
 5615  5634     if (_typeof(options.runOnly) === 'object') {
   -1  5635       if (Array.isArray(options.runOnly)) {
   -1  5636         options.runOnly = {
   -1  5637           type: 'tag',
   -1  5638           values: options.runOnly
   -1  5639         };
   -1  5640       }
 5616  5641       var only = options.runOnly;
 5617    -1       if (only.type === 'rule' && Array.isArray(only.value)) {
 5618    -1         only.value.forEach(function(ruleId) {
   -1  5642       if (only.value && !only.values) {
   -1  5643         only.values = only.value;
   -1  5644         delete only.value;
   -1  5645       }
   -1  5646       if (!Array.isArray(only.values) || only.values.length === 0) {
   -1  5647         throw new Error('runOnly.values must be a non-empty array');
   -1  5648       }
   -1  5649       if ([ 'rule', 'rules' ].includes(only.type)) {
   -1  5650         only.type = 'rule';
   -1  5651         only.values.forEach(function(ruleId) {
 5619  5652           if (!audit.getRule(ruleId)) {
 5620  5653             throw new Error('unknown rule `' + ruleId + '` in options.runOnly');
 5621  5654           }
 5622  5655         });
 5623    -1       } else if (Array.isArray(only.value) && only.value.length > 0) {
 5624    -1         var tags = [].concat(only.value);
 5625    -1         audit.rules.forEach(function(rule) {
 5626    -1           var tagPos, i, l;
 5627    -1           if (!tags) {
 5628    -1             return;
 5629    -1           }
 5630    -1           for (i = 0, l = rule.tags.length; i < l; i++) {
 5631    -1             tagPos = tags.indexOf(rule.tags[i]);
 5632    -1             if (tagPos !== -1) {
 5633    -1               tags.splice(tagPos, 1);
 5634    -1             }
 5635    -1           }
 5636    -1         });
 5637    -1         if (tags.length !== 0) {
 5638    -1           throw new Error('could not find tags `' + tags.join('`, `') + '`');
   -1  5656       } else if ([ 'tag', 'tags', undefined ].includes(only.type)) {
   -1  5657         only.type = 'tag';
   -1  5658         var unmatchedTags = audit.rules.reduce(function(unmatchedTags, rule) {
   -1  5659           return unmatchedTags.length ? unmatchedTags.filter(function(tag) {
   -1  5660             return !rule.tags.includes(tag);
   -1  5661           }) : unmatchedTags;
   -1  5662         }, only.values);
   -1  5663         if (unmatchedTags.length !== 0) {
   -1  5664           throw new Error('Could not find tags `' + unmatchedTags.join('`, `') + '`');
 5639  5665         }
   -1  5666       } else {
   -1  5667         throw new Error('Unknown runOnly type \'' + only.type + '\'');
 5640  5668       }
 5641  5669     }
 5642  5670     if (_typeof(options.rules) === 'object') {
@@ -5716,7 +5744,7 @@ module.exports = {
 5716  5744       var checkHelper = axe.utils.checkHelper(checkResult, options, resolve, reject);
 5717  5745       var result;
 5718  5746       try {
 5719    -1         result = this.evaluate.call(checkHelper, node, checkOptions);
   -1  5747         result = this.evaluate.call(checkHelper, node.actualNode, checkOptions, node);
 5720  5748       } catch (e) {
 5721  5749         reject(e);
 5722  5750         return;
@@ -5823,20 +5851,30 @@ module.exports = {
 5823  5851   }
 5824  5852   function parseSelectorArray(context, type) {
 5825  5853     'use strict';
 5826    -1     var item, result = [];
   -1  5854     var item, result = [], nodeList;
 5827  5855     for (var i = 0, l = context[type].length; i < l; i++) {
 5828  5856       item = context[type][i];
 5829  5857       if (typeof item === 'string') {
 5830    -1         result = result.concat(axe.utils.toArray(document.querySelectorAll(item)));
   -1  5858         nodeList = Array.from(document.querySelectorAll(item));
   -1  5859         result = result.concat(nodeList.map(function(node) {
   -1  5860           return axe.utils.getNodeFromTree(context.flatTree[0], node);
   -1  5861         }));
 5831  5862         break;
 5832  5863       } else if (item && item.length && !(item instanceof Node)) {
 5833  5864         if (item.length > 1) {
 5834  5865           pushUniqueFrameSelector(context, type, item);
 5835  5866         } else {
 5836    -1           result = result.concat(axe.utils.toArray(document.querySelectorAll(item[0])));
   -1  5867           nodeList = Array.from(document.querySelectorAll(item[0]));
   -1  5868           result = result.concat(nodeList.map(function(node) {
   -1  5869             return axe.utils.getNodeFromTree(context.flatTree[0], node);
   -1  5870           }));
   -1  5871         }
   -1  5872       } else if (item instanceof Node) {
   -1  5873         if (item.documentElement instanceof Node) {
   -1  5874           result.push(context.flatTree[0]);
   -1  5875         } else {
   -1  5876           result.push(axe.utils.getNodeFromTree(context.flatTree[0], item));
 5837  5877         }
 5838    -1       } else {
 5839    -1         result.push(item);
 5840  5878       }
 5841  5879     }
 5842  5880     return result.filter(function(r) {
@@ -5857,29 +5895,48 @@ module.exports = {
 5857  5895       });
 5858  5896     }
 5859  5897   }
   -1  5898   function getRootNode(_ref) {
   -1  5899     var include = _ref.include, exclude = _ref.exclude;
   -1  5900     var selectors = Array.from(include).concat(Array.from(exclude));
   -1  5901     var localDocument = selectors.reduce(function(result, item) {
   -1  5902       if (result) {
   -1  5903         return result;
   -1  5904       } else if (item instanceof Element) {
   -1  5905         return item.ownerDocument;
   -1  5906       } else if (item instanceof Document) {
   -1  5907         return item;
   -1  5908       }
   -1  5909     }, null);
   -1  5910     return (localDocument || document).documentElement;
   -1  5911   }
 5860  5912   function Context(spec) {
 5861  5913     'use strict';
 5862    -1     var self = this;
   -1  5914     var _this = this;
 5863  5915     this.frames = [];
 5864  5916     this.initiator = spec && typeof spec.initiator === 'boolean' ? spec.initiator : true;
 5865  5917     this.page = false;
 5866  5918     spec = normalizeContext(spec);
   -1  5919     this.flatTree = axe.utils.getFlattenedTree(getRootNode(spec));
 5867  5920     this.exclude = spec.exclude;
 5868  5921     this.include = spec.include;
 5869  5922     this.include = parseSelectorArray(this, 'include');
 5870  5923     this.exclude = parseSelectorArray(this, 'exclude');
 5871  5924     axe.utils.select('frame, iframe', this).forEach(function(frame) {
 5872    -1       if (isNodeInContext(frame, self)) {
 5873    -1         pushUniqueFrame(self.frames, frame);
   -1  5925       if (isNodeInContext(frame, _this)) {
   -1  5926         pushUniqueFrame(_this.frames, frame.actualNode);
 5874  5927       }
 5875  5928     });
 5876    -1     if (this.include.length === 1 && this.include[0] === document) {
   -1  5929     if (this.include.length === 1 && this.include[0].actualNode === document.documentElement) {
 5877  5930       this.page = true;
 5878  5931     }
 5879  5932     var err = validateContext(this);
 5880  5933     if (err instanceof Error) {
 5881  5934       throw err;
 5882  5935     }
   -1  5936     if (!Array.isArray(this.include)) {
   -1  5937       this.include = Array.from(this.include);
   -1  5938     }
   -1  5939     this.include.sort(axe.utils.nodeSorter);
 5883  5940   }
 5884  5941   'use strict';
 5885  5942   function RuleResult(rule) {
@@ -5916,7 +5973,7 @@ module.exports = {
 5916  5973     var elements = axe.utils.select(this.selector, context);
 5917  5974     if (this.excludeHidden) {
 5918  5975       return elements.filter(function(element) {
 5919    -1         return !axe.utils.isHidden(element);
   -1  5976         return !axe.utils.isHidden(element.actualNode);
 5920  5977       });
 5921  5978     }
 5922  5979     return elements;
@@ -5946,10 +6003,12 @@ module.exports = {
 5946  6003     var _this = this;
 5947  6004     var q = axe.utils.queue();
 5948  6005     var ruleResult = new RuleResult(this);
   -1  6006     var markStart = 'mark_runchecks_start_' + this.id;
   -1  6007     var markEnd = 'mark_runchecks_end_' + this.id;
 5949  6008     var nodes = void 0;
 5950  6009     try {
 5951  6010       nodes = this.gather(context).filter(function(node) {
 5952    -1         return _this.matches(node);
   -1  6011         return _this.matches(node.actualNode, node);
 5953  6012       });
 5954  6013     } catch (error) {
 5955  6014       reject(new SupportError({
@@ -5960,6 +6019,7 @@ module.exports = {
 5960  6019     }
 5961  6020     if (options.performanceTimer) {
 5962  6021       axe.log('gather (', nodes.length, '):', axe.utils.performanceTimer.timeElapsed() + 'ms');
   -1  6022       axe.utils.performanceTimer.mark(markStart);
 5963  6023     }
 5964  6024     nodes.forEach(function(node) {
 5965  6025       q.defer(function(resolveNode, rejectNode) {
@@ -5986,7 +6046,7 @@ module.exports = {
 5986  6046               }
 5987  6047             });
 5988  6048             if (hasResults) {
 5989    -1               result.node = new axe.utils.DqElement(node, options);
   -1  6049               result.node = new axe.utils.DqElement(node.actualNode, options);
 5990  6050               ruleResult.nodes.push(result);
 5991  6051             }
 5992  6052           }
@@ -5996,6 +6056,10 @@ module.exports = {
 5996  6056         });
 5997  6057       });
 5998  6058     });
   -1  6059     if (options.performanceTimer) {
   -1  6060       axe.utils.performanceTimer.mark(markEnd);
   -1  6061       axe.utils.performanceTimer.measure('runchecks_' + this.id, markStart, markEnd);
   -1  6062     }
 5999  6063     q.then(function() {
 6000  6064       return resolve(ruleResult);
 6001  6065     }).catch(function(error) {
@@ -6168,42 +6232,10 @@ module.exports = {
 6168  6232     }
 6169  6233   };
 6170  6234   'use strict';
 6171    -1   var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) {
 6172    -1     return typeof obj;
 6173    -1   } : function(obj) {
 6174    -1     return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;
 6175    -1   };
 6176    -1   axe.a11yCheck = function(context, options, callback) {
 6177    -1     'use strict';
 6178    -1     if (typeof options === 'function') {
 6179    -1       callback = options;
 6180    -1       options = {};
 6181    -1     }
 6182    -1     if (!options || (typeof options === 'undefined' ? 'undefined' : _typeof(options)) !== 'object') {
 6183    -1       options = {};
 6184    -1     }
 6185    -1     var audit = axe._audit;
 6186    -1     if (!audit) {
 6187    -1       throw new Error('No audit configured');
 6188    -1     }
 6189    -1     options.reporter = options.reporter || audit.reporter || 'v2';
 6190    -1     if (options.performanceTimer) {
 6191    -1       axe.utils.performanceTimer.start();
 6192    -1     }
 6193    -1     var reporter = axe.getReporter(options.reporter);
 6194    -1     axe._runRules(context, options, function(results) {
 6195    -1       var res = reporter(results, options, callback);
 6196    -1       if (res !== undefined) {
 6197    -1         if (options.performanceTimer) {
 6198    -1           axe.utils.performanceTimer.end();
 6199    -1         }
 6200    -1         callback(res);
 6201    -1       }
 6202    -1     }, axe.log);
 6203    -1   };
 6204    -1   'use strict';
 6205  6235   function cleanupPlugins(resolve, reject) {
 6206  6236     'use strict';
   -1  6237     resolve = resolve || function() {};
   -1  6238     reject = reject || axe.log;
 6207  6239     if (!axe._audit) {
 6208  6240       throw new Error('No audit configured');
 6209  6241     }
@@ -6222,9 +6254,10 @@ module.exports = {
 6222  6254         }
 6223  6255       });
 6224  6256     });
 6225    -1     axe.utils.toArray(document.querySelectorAll('frame, iframe')).forEach(function(frame) {
   -1  6257     var flattenedTree = axe.utils.getFlattenedTree(document.body);
   -1  6258     axe.utils.querySelectorAll(flattenedTree, 'iframe, frame').forEach(function(node) {
 6226  6259       q.defer(function(res, rej) {
 6227    -1         return axe.utils.sendCommandToFrame(frame, {
   -1  6260         return axe.utils.sendCommandToFrame(node.actualNode, {
 6228  6261           command: 'cleanup-plugin'
 6229  6262         }, res, rej);
 6230  6263       });
@@ -6254,11 +6287,20 @@ module.exports = {
 6254  6287         audit.addCheck(check);
 6255  6288       });
 6256  6289     }
   -1  6290     var modifiedRules = [];
 6257  6291     if (spec.rules) {
 6258  6292       spec.rules.forEach(function(rule) {
   -1  6293         modifiedRules.push(rule.id);
 6259  6294         audit.addRule(rule);
 6260  6295       });
 6261  6296     }
   -1  6297     if (spec.disableOtherRules) {
   -1  6298       audit.rules.forEach(function(rule) {
   -1  6299         if (modifiedRules.includes(rule.id) === false) {
   -1  6300           rule.enabled = false;
   -1  6301         }
   -1  6302       });
   -1  6303     }
 6262  6304     if (typeof spec.branding !== 'undefined') {
 6263  6305       audit.setBranding(spec.branding);
 6264  6306     } else {
@@ -6307,7 +6349,10 @@ module.exports = {
 6307  6349     var options = data && data.options || {};
 6308  6350     switch (data.command) {
 6309  6351      case 'rules':
 6310    -1       return runRules(context, options, resolve, reject);
   -1  6352       return runRules(context, options, function(results, cleanup) {
   -1  6353         resolve(results);
   -1  6354         cleanup();
   -1  6355       }, reject);
 6311  6356 
 6312  6357      case 'cleanup-plugin':
 6313  6358       return cleanupPlugins(resolve, reject);
@@ -6400,11 +6445,18 @@ module.exports = {
 6400  6445   }
 6401  6446   axe.reset = resetConfiguration;
 6402  6447   'use strict';
   -1  6448   function cleanup() {
   -1  6449     axe._tree = undefined;
   -1  6450     axe._selectorData = undefined;
   -1  6451   }
 6403  6452   function runRules(context, options, resolve, reject) {
 6404  6453     'use strict';
 6405  6454     try {
 6406  6455       context = new Context(context);
   -1  6456       axe._tree = context.flatTree;
   -1  6457       axe._selectorData = axe.utils.getSelectorData(context.flatTree);
 6407  6458     } catch (e) {
   -1  6459       cleanup();
 6408  6460       return reject(e);
 6409  6461     }
 6410  6462     var q = axe.utils.queue();
@@ -6432,9 +6484,9 @@ module.exports = {
 6432  6484         if (options.performanceTimer) {
 6433  6485           axe.utils.performanceTimer.auditEnd();
 6434  6486         }
 6435    -1         var results = axe.utils.mergeResults(data.map(function(d) {
   -1  6487         var results = axe.utils.mergeResults(data.map(function(results) {
 6436  6488           return {
 6437    -1             results: d
   -1  6489             results: results
 6438  6490           };
 6439  6491         }));
 6440  6492         if (context.initiator) {
@@ -6443,14 +6495,19 @@ module.exports = {
 6443  6495           results = results.map(axe.utils.finalizeRuleResult);
 6444  6496         }
 6445  6497         try {
 6446    -1           resolve(results);
   -1  6498           resolve(results, cleanup);
 6447  6499         } catch (e) {
   -1  6500           cleanup();
 6448  6501           axe.log(e);
 6449  6502         }
 6450  6503       } catch (e) {
   -1  6504         cleanup();
 6451  6505         reject(e);
 6452  6506       }
 6453    -1     }).catch(reject);
   -1  6507     }).catch(function(e) {
   -1  6508       cleanup();
   -1  6509       reject(e);
   -1  6510     });
 6454  6511   }
 6455  6512   axe._runRules = runRules;
 6456  6513   'use strict';
@@ -6530,8 +6587,9 @@ module.exports = {
 6530  6587         resolve = _resolve;
 6531  6588       });
 6532  6589     }
 6533    -1     axe._runRules(context, options, function(rawResults) {
   -1  6590     axe._runRules(context, options, function(rawResults, cleanup) {
 6534  6591       var respond = function respond(results) {
   -1  6592         cleanup();
 6535  6593         try {
 6536  6594           callback(null, results);
 6537  6595         } catch (e) {
@@ -6549,6 +6607,7 @@ module.exports = {
 6549  6607           respond(results);
 6550  6608         }
 6551  6609       } catch (err) {
   -1  6610         cleanup();
 6552  6611         callback(err);
 6553  6612         reject(err);
 6554  6613       }
@@ -6958,7 +7017,11 @@ module.exports = {
 6958  7017   'use strict';
 6959  7018   function err(message, node) {
 6960  7019     'use strict';
 6961    -1     return new Error(message + ': ' + axe.utils.getSelector(node));
   -1  7020     var selector;
   -1  7021     if (axe._tree) {
   -1  7022       selector = axe.utils.getSelector(node);
   -1  7023     }
   -1  7024     return new Error(message + ': ' + (selector || node));
 6962  7025   }
 6963  7026   axe.utils.sendCommandToFrame = function(node, parameters, resolve, reject) {
 6964  7027     'use strict';
@@ -6970,20 +7033,19 @@ module.exports = {
 6970  7033     }
 6971  7034     var timeout = setTimeout(function() {
 6972  7035       timeout = setTimeout(function() {
 6973    -1         var errMsg = err('No response from frame', node);
 6974  7036         if (!parameters.debug) {
 6975    -1           axe.log(errMsg);
 6976  7037           resolve(null);
 6977  7038         } else {
 6978    -1           reject(errMsg);
   -1  7039           reject(err('No response from frame', node));
 6979  7040         }
 6980  7041       }, 0);
 6981  7042     }, 500);
 6982  7043     axe.utils.respondable(win, 'axe.ping', null, undefined, function() {
 6983  7044       clearTimeout(timeout);
   -1  7045       var frameWaitTime = parameters.options && parameters.options.frameWaitTime || 6e4;
 6984  7046       timeout = setTimeout(function() {
 6985  7047         reject(err('Axe in frame timed out', node));
 6986    -1       }, 3e4);
   -1  7048       }, frameWaitTime);
 6987  7049       axe.utils.respondable(win, 'axe.start', parameters, undefined, function(data) {
 6988  7050         clearTimeout(timeout);
 6989  7051         if (data instanceof Error === false) {
@@ -7032,12 +7094,585 @@ module.exports = {
 7032  7094   'use strict';
 7033  7095   axe.utils.contains = function(node, otherNode) {
 7034  7096     'use strict';
 7035    -1     if (typeof node.contains === 'function') {
 7036    -1       return node.contains(otherNode);
   -1  7097     function containsShadowChild(node, otherNode) {
   -1  7098       if (node.shadowId === otherNode.shadowId) {
   -1  7099         return true;
   -1  7100       }
   -1  7101       return !!node.children.find(function(child) {
   -1  7102         return containsShadowChild(child, otherNode);
   -1  7103       });
   -1  7104     }
   -1  7105     if (node.shadowId || otherNode.shadowId) {
   -1  7106       return containsShadowChild(node, otherNode);
 7037  7107     }
 7038    -1     return !!(node.compareDocumentPosition(otherNode) & 16);
   -1  7108     if (typeof node.actualNode.contains === 'function') {
   -1  7109       return node.actualNode.contains(otherNode.actualNode);
   -1  7110     }
   -1  7111     return !!(node.actualNode.compareDocumentPosition(otherNode.actualNode) & 16);
 7039  7112   };
 7040  7113   'use strict';
   -1  7114   (function(axe) {
   -1  7115     function CssSelectorParser() {
   -1  7116       this.pseudos = {};
   -1  7117       this.attrEqualityMods = {};
   -1  7118       this.ruleNestingOperators = {};
   -1  7119       this.substitutesEnabled = false;
   -1  7120     }
   -1  7121     CssSelectorParser.prototype.registerSelectorPseudos = function(name) {
   -1  7122       for (var j = 0, len = arguments.length; j < len; j++) {
   -1  7123         name = arguments[j];
   -1  7124         this.pseudos[name] = 'selector';
   -1  7125       }
   -1  7126       return this;
   -1  7127     };
   -1  7128     CssSelectorParser.prototype.unregisterSelectorPseudos = function(name) {
   -1  7129       for (var j = 0, len = arguments.length; j < len; j++) {
   -1  7130         name = arguments[j];
   -1  7131         delete this.pseudos[name];
   -1  7132       }
   -1  7133       return this;
   -1  7134     };
   -1  7135     CssSelectorParser.prototype.registerNumericPseudos = function(name) {
   -1  7136       for (var j = 0, len = arguments.length; j < len; j++) {
   -1  7137         name = arguments[j];
   -1  7138         this.pseudos[name] = 'numeric';
   -1  7139       }
   -1  7140       return this;
   -1  7141     };
   -1  7142     CssSelectorParser.prototype.unregisterNumericPseudos = function(name) {
   -1  7143       for (var j = 0, len = arguments.length; j < len; j++) {
   -1  7144         name = arguments[j];
   -1  7145         delete this.pseudos[name];
   -1  7146       }
   -1  7147       return this;
   -1  7148     };
   -1  7149     CssSelectorParser.prototype.registerNestingOperators = function(operator) {
   -1  7150       for (var j = 0, len = arguments.length; j < len; j++) {
   -1  7151         operator = arguments[j];
   -1  7152         this.ruleNestingOperators[operator] = true;
   -1  7153       }
   -1  7154       return this;
   -1  7155     };
   -1  7156     CssSelectorParser.prototype.unregisterNestingOperators = function(operator) {
   -1  7157       for (var j = 0, len = arguments.length; j < len; j++) {
   -1  7158         operator = arguments[j];
   -1  7159         delete this.ruleNestingOperators[operator];
   -1  7160       }
   -1  7161       return this;
   -1  7162     };
   -1  7163     CssSelectorParser.prototype.registerAttrEqualityMods = function(mod) {
   -1  7164       for (var j = 0, len = arguments.length; j < len; j++) {
   -1  7165         mod = arguments[j];
   -1  7166         this.attrEqualityMods[mod] = true;
   -1  7167       }
   -1  7168       return this;
   -1  7169     };
   -1  7170     CssSelectorParser.prototype.unregisterAttrEqualityMods = function(mod) {
   -1  7171       for (var j = 0, len = arguments.length; j < len; j++) {
   -1  7172         mod = arguments[j];
   -1  7173         delete this.attrEqualityMods[mod];
   -1  7174       }
   -1  7175       return this;
   -1  7176     };
   -1  7177     CssSelectorParser.prototype.enableSubstitutes = function() {
   -1  7178       this.substitutesEnabled = true;
   -1  7179       return this;
   -1  7180     };
   -1  7181     CssSelectorParser.prototype.disableSubstitutes = function() {
   -1  7182       this.substitutesEnabled = false;
   -1  7183       return this;
   -1  7184     };
   -1  7185     function isIdentStart(c) {
   -1  7186       return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c === '-' || c === '_';
   -1  7187     }
   -1  7188     function isIdent(c) {
   -1  7189       return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9' || c === '-' || c === '_';
   -1  7190     }
   -1  7191     function isHex(c) {
   -1  7192       return c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F' || c >= '0' && c <= '9';
   -1  7193     }
   -1  7194     function isDecimal(c) {
   -1  7195       return c >= '0' && c <= '9';
   -1  7196     }
   -1  7197     function isAttrMatchOperator(chr) {
   -1  7198       return chr === '=' || chr === '^' || chr === '$' || chr === '*' || chr === '~';
   -1  7199     }
   -1  7200     var identSpecialChars = {
   -1  7201       '!': true,
   -1  7202       '"': true,
   -1  7203       '#': true,
   -1  7204       $: true,
   -1  7205       '%': true,
   -1  7206       '&': true,
   -1  7207       '\'': true,
   -1  7208       '(': true,
   -1  7209       ')': true,
   -1  7210       '*': true,
   -1  7211       '+': true,
   -1  7212       ',': true,
   -1  7213       '.': true,
   -1  7214       '/': true,
   -1  7215       ';': true,
   -1  7216       '<': true,
   -1  7217       '=': true,
   -1  7218       '>': true,
   -1  7219       '?': true,
   -1  7220       '@': true,
   -1  7221       '[': true,
   -1  7222       '\\': true,
   -1  7223       ']': true,
   -1  7224       '^': true,
   -1  7225       '`': true,
   -1  7226       '{': true,
   -1  7227       '|': true,
   -1  7228       '}': true,
   -1  7229       '~': true
   -1  7230     };
   -1  7231     var strReplacementsRev = {
   -1  7232       '\n': '\\n',
   -1  7233       '\r': '\\r',
   -1  7234       '\t': '\\t',
   -1  7235       '\f': '\\f',
   -1  7236       '\v': '\\v'
   -1  7237     };
   -1  7238     var singleQuoteEscapeChars = {
   -1  7239       n: '\n',
   -1  7240       r: '\r',
   -1  7241       t: '\t',
   -1  7242       f: '\f',
   -1  7243       '\\': '\\',
   -1  7244       '\'': '\''
   -1  7245     };
   -1  7246     var doubleQuotesEscapeChars = {
   -1  7247       n: '\n',
   -1  7248       r: '\r',
   -1  7249       t: '\t',
   -1  7250       f: '\f',
   -1  7251       '\\': '\\',
   -1  7252       '"': '"'
   -1  7253     };
   -1  7254     function ParseContext(str, pos, pseudos, attrEqualityMods, ruleNestingOperators, substitutesEnabled) {
   -1  7255       var chr, getIdent, getStr, l, skipWhitespace;
   -1  7256       l = str.length;
   -1  7257       chr = null;
   -1  7258       getStr = function getStr(quote, escapeTable) {
   -1  7259         var esc, hex, result;
   -1  7260         result = '';
   -1  7261         pos++;
   -1  7262         chr = str.charAt(pos);
   -1  7263         while (pos < l) {
   -1  7264           if (chr === quote) {
   -1  7265             pos++;
   -1  7266             return result;
   -1  7267           } else if (chr === '\\') {
   -1  7268             pos++;
   -1  7269             chr = str.charAt(pos);
   -1  7270             if (chr === quote) {
   -1  7271               result += quote;
   -1  7272             } else if (esc = escapeTable[chr]) {
   -1  7273               result += esc;
   -1  7274             } else if (isHex(chr)) {
   -1  7275               hex = chr;
   -1  7276               pos++;
   -1  7277               chr = str.charAt(pos);
   -1  7278               while (isHex(chr)) {
   -1  7279                 hex += chr;
   -1  7280                 pos++;
   -1  7281                 chr = str.charAt(pos);
   -1  7282               }
   -1  7283               if (chr === ' ') {
   -1  7284                 pos++;
   -1  7285                 chr = str.charAt(pos);
   -1  7286               }
   -1  7287               result += String.fromCharCode(parseInt(hex, 16));
   -1  7288               continue;
   -1  7289             } else {
   -1  7290               result += chr;
   -1  7291             }
   -1  7292           } else {
   -1  7293             result += chr;
   -1  7294           }
   -1  7295           pos++;
   -1  7296           chr = str.charAt(pos);
   -1  7297         }
   -1  7298         return result;
   -1  7299       };
   -1  7300       getIdent = function getIdent() {
   -1  7301         var result = '';
   -1  7302         chr = str.charAt(pos);
   -1  7303         while (pos < l) {
   -1  7304           if (isIdent(chr)) {
   -1  7305             result += chr;
   -1  7306           } else if (chr === '\\') {
   -1  7307             pos++;
   -1  7308             if (pos >= l) {
   -1  7309               throw Error('Expected symbol but end of file reached.');
   -1  7310             }
   -1  7311             chr = str.charAt(pos);
   -1  7312             if (identSpecialChars[chr]) {
   -1  7313               result += chr;
   -1  7314             } else if (isHex(chr)) {
   -1  7315               var hex = chr;
   -1  7316               pos++;
   -1  7317               chr = str.charAt(pos);
   -1  7318               while (isHex(chr)) {
   -1  7319                 hex += chr;
   -1  7320                 pos++;
   -1  7321                 chr = str.charAt(pos);
   -1  7322               }
   -1  7323               if (chr === ' ') {
   -1  7324                 pos++;
   -1  7325                 chr = str.charAt(pos);
   -1  7326               }
   -1  7327               result += String.fromCharCode(parseInt(hex, 16));
   -1  7328               continue;
   -1  7329             } else {
   -1  7330               result += chr;
   -1  7331             }
   -1  7332           } else {
   -1  7333             return result;
   -1  7334           }
   -1  7335           pos++;
   -1  7336           chr = str.charAt(pos);
   -1  7337         }
   -1  7338         return result;
   -1  7339       };
   -1  7340       skipWhitespace = function skipWhitespace() {
   -1  7341         chr = str.charAt(pos);
   -1  7342         var result = false;
   -1  7343         while (chr === ' ' || chr === '\t' || chr === '\n' || chr === '\r' || chr === '\f') {
   -1  7344           result = true;
   -1  7345           pos++;
   -1  7346           chr = str.charAt(pos);
   -1  7347         }
   -1  7348         return result;
   -1  7349       };
   -1  7350       this.parse = function() {
   -1  7351         var res = this.parseSelector();
   -1  7352         if (pos < l) {
   -1  7353           throw Error('Rule expected but "' + str.charAt(pos) + '" found.');
   -1  7354         }
   -1  7355         return res;
   -1  7356       };
   -1  7357       this.parseSelector = function() {
   -1  7358         var res;
   -1  7359         var selector = res = this.parseSingleSelector();
   -1  7360         chr = str.charAt(pos);
   -1  7361         while (chr === ',') {
   -1  7362           pos++;
   -1  7363           skipWhitespace();
   -1  7364           if (res.type !== 'selectors') {
   -1  7365             res = {
   -1  7366               type: 'selectors',
   -1  7367               selectors: [ selector ]
   -1  7368             };
   -1  7369           }
   -1  7370           selector = this.parseSingleSelector();
   -1  7371           if (!selector) {
   -1  7372             throw Error('Rule expected after ",".');
   -1  7373           }
   -1  7374           res.selectors.push(selector);
   -1  7375         }
   -1  7376         return res;
   -1  7377       };
   -1  7378       this.parseSingleSelector = function() {
   -1  7379         skipWhitespace();
   -1  7380         var selector = {
   -1  7381           type: 'ruleSet'
   -1  7382         };
   -1  7383         var rule = this.parseRule();
   -1  7384         if (!rule) {
   -1  7385           return null;
   -1  7386         }
   -1  7387         var currentRule = selector;
   -1  7388         while (rule) {
   -1  7389           rule.type = 'rule';
   -1  7390           currentRule.rule = rule;
   -1  7391           currentRule = rule;
   -1  7392           skipWhitespace();
   -1  7393           chr = str.charAt(pos);
   -1  7394           if (pos >= l || chr === ',' || chr === ')') {
   -1  7395             break;
   -1  7396           }
   -1  7397           if (ruleNestingOperators[chr]) {
   -1  7398             var op = chr;
   -1  7399             pos++;
   -1  7400             skipWhitespace();
   -1  7401             rule = this.parseRule();
   -1  7402             if (!rule) {
   -1  7403               throw Error('Rule expected after "' + op + '".');
   -1  7404             }
   -1  7405             rule.nestingOperator = op;
   -1  7406           } else {
   -1  7407             rule = this.parseRule();
   -1  7408             if (rule) {
   -1  7409               rule.nestingOperator = null;
   -1  7410             }
   -1  7411           }
   -1  7412         }
   -1  7413         return selector;
   -1  7414       };
   -1  7415       this.parseRule = function() {
   -1  7416         var rule = null;
   -1  7417         while (pos < l) {
   -1  7418           chr = str.charAt(pos);
   -1  7419           if (chr === '*') {
   -1  7420             pos++;
   -1  7421             (rule = rule || {}).tagName = '*';
   -1  7422           } else if (isIdentStart(chr) || chr === '\\') {
   -1  7423             (rule = rule || {}).tagName = getIdent();
   -1  7424           } else if (chr === '.') {
   -1  7425             pos++;
   -1  7426             rule = rule || {};
   -1  7427             (rule.classNames = rule.classNames || []).push(getIdent());
   -1  7428           } else if (chr === '#') {
   -1  7429             pos++;
   -1  7430             (rule = rule || {}).id = getIdent();
   -1  7431           } else if (chr === '[') {
   -1  7432             pos++;
   -1  7433             skipWhitespace();
   -1  7434             var attr = {
   -1  7435               name: getIdent()
   -1  7436             };
   -1  7437             skipWhitespace();
   -1  7438             if (chr === ']') {
   -1  7439               pos++;
   -1  7440             } else {
   -1  7441               var operator = '';
   -1  7442               if (attrEqualityMods[chr]) {
   -1  7443                 operator = chr;
   -1  7444                 pos++;
   -1  7445                 chr = str.charAt(pos);
   -1  7446               }
   -1  7447               if (pos >= l) {
   -1  7448                 throw Error('Expected "=" but end of file reached.');
   -1  7449               }
   -1  7450               if (chr !== '=') {
   -1  7451                 throw Error('Expected "=" but "' + chr + '" found.');
   -1  7452               }
   -1  7453               attr.operator = operator + '=';
   -1  7454               pos++;
   -1  7455               skipWhitespace();
   -1  7456               var attrValue = '';
   -1  7457               attr.valueType = 'string';
   -1  7458               if (chr === '"') {
   -1  7459                 attrValue = getStr('"', doubleQuotesEscapeChars);
   -1  7460               } else if (chr === '\'') {
   -1  7461                 attrValue = getStr('\'', singleQuoteEscapeChars);
   -1  7462               } else if (substitutesEnabled && chr === '$') {
   -1  7463                 pos++;
   -1  7464                 attrValue = getIdent();
   -1  7465                 attr.valueType = 'substitute';
   -1  7466               } else {
   -1  7467                 while (pos < l) {
   -1  7468                   if (chr === ']') {
   -1  7469                     break;
   -1  7470                   }
   -1  7471                   attrValue += chr;
   -1  7472                   pos++;
   -1  7473                   chr = str.charAt(pos);
   -1  7474                 }
   -1  7475                 attrValue = attrValue.trim();
   -1  7476               }
   -1  7477               skipWhitespace();
   -1  7478               if (pos >= l) {
   -1  7479                 throw Error('Expected "]" but end of file reached.');
   -1  7480               }
   -1  7481               if (chr !== ']') {
   -1  7482                 throw Error('Expected "]" but "' + chr + '" found.');
   -1  7483               }
   -1  7484               pos++;
   -1  7485               attr.value = attrValue;
   -1  7486             }
   -1  7487             rule = rule || {};
   -1  7488             (rule.attrs = rule.attrs || []).push(attr);
   -1  7489           } else if (chr === ':') {
   -1  7490             pos++;
   -1  7491             var pseudoName = getIdent();
   -1  7492             var pseudo = {
   -1  7493               name: pseudoName
   -1  7494             };
   -1  7495             if (chr === '(') {
   -1  7496               pos++;
   -1  7497               var value = '';
   -1  7498               skipWhitespace();
   -1  7499               if (pseudos[pseudoName] === 'selector') {
   -1  7500                 pseudo.valueType = 'selector';
   -1  7501                 value = this.parseSelector();
   -1  7502               } else {
   -1  7503                 pseudo.valueType = pseudos[pseudoName] || 'string';
   -1  7504                 if (chr === '"') {
   -1  7505                   value = getStr('"', doubleQuotesEscapeChars);
   -1  7506                 } else if (chr === '\'') {
   -1  7507                   value = getStr('\'', singleQuoteEscapeChars);
   -1  7508                 } else if (substitutesEnabled && chr === '$') {
   -1  7509                   pos++;
   -1  7510                   value = getIdent();
   -1  7511                   pseudo.valueType = 'substitute';
   -1  7512                 } else {
   -1  7513                   while (pos < l) {
   -1  7514                     if (chr === ')') {
   -1  7515                       break;
   -1  7516                     }
   -1  7517                     value += chr;
   -1  7518                     pos++;
   -1  7519                     chr = str.charAt(pos);
   -1  7520                   }
   -1  7521                   value = value.trim();
   -1  7522                 }
   -1  7523                 skipWhitespace();
   -1  7524               }
   -1  7525               if (pos >= l) {
   -1  7526                 throw Error('Expected ")" but end of file reached.');
   -1  7527               }
   -1  7528               if (chr !== ')') {
   -1  7529                 throw Error('Expected ")" but "' + chr + '" found.');
   -1  7530               }
   -1  7531               pos++;
   -1  7532               pseudo.value = value;
   -1  7533             }
   -1  7534             rule = rule || {};
   -1  7535             (rule.pseudos = rule.pseudos || []).push(pseudo);
   -1  7536           } else {
   -1  7537             break;
   -1  7538           }
   -1  7539         }
   -1  7540         return rule;
   -1  7541       };
   -1  7542       return this;
   -1  7543     }
   -1  7544     CssSelectorParser.prototype.parse = function(str) {
   -1  7545       var context = new ParseContext(str, 0, this.pseudos, this.attrEqualityMods, this.ruleNestingOperators, this.substitutesEnabled);
   -1  7546       return context.parse();
   -1  7547     };
   -1  7548     CssSelectorParser.prototype.escapeIdentifier = function(s) {
   -1  7549       var result = '';
   -1  7550       var i = 0;
   -1  7551       var len = s.length;
   -1  7552       while (i < len) {
   -1  7553         var chr = s.charAt(i);
   -1  7554         if (identSpecialChars[chr]) {
   -1  7555           result += '\\' + chr;
   -1  7556         } else {
   -1  7557           if (!(chr === '_' || chr === '-' || chr >= 'A' && chr <= 'Z' || chr >= 'a' && chr <= 'z' || i !== 0 && chr >= '0' && chr <= '9')) {
   -1  7558             var charCode = chr.charCodeAt(0);
   -1  7559             if ((charCode & 63488) === 55296) {
   -1  7560               var extraCharCode = s.charCodeAt(i++);
   -1  7561               if ((charCode & 64512) !== 55296 || (extraCharCode & 64512) !== 56320) {
   -1  7562                 throw Error('UCS-2(decode): illegal sequence');
   -1  7563               }
   -1  7564               charCode = ((charCode & 1023) << 10) + (extraCharCode & 1023) + 65536;
   -1  7565             }
   -1  7566             result += '\\' + charCode.toString(16) + ' ';
   -1  7567           } else {
   -1  7568             result += chr;
   -1  7569           }
   -1  7570         }
   -1  7571         i++;
   -1  7572       }
   -1  7573       return result;
   -1  7574     };
   -1  7575     CssSelectorParser.prototype.escapeStr = function(s) {
   -1  7576       var result = '';
   -1  7577       var i = 0;
   -1  7578       var len = s.length;
   -1  7579       var chr, replacement;
   -1  7580       while (i < len) {
   -1  7581         chr = s.charAt(i);
   -1  7582         if (chr === '"') {
   -1  7583           chr = '\\"';
   -1  7584         } else if (chr === '\\') {
   -1  7585           chr = '\\\\';
   -1  7586         } else if (replacement = strReplacementsRev[chr]) {
   -1  7587           chr = replacement;
   -1  7588         }
   -1  7589         result += chr;
   -1  7590         i++;
   -1  7591       }
   -1  7592       return '"' + result + '"';
   -1  7593     };
   -1  7594     CssSelectorParser.prototype.render = function(path) {
   -1  7595       return this._renderEntity(path).trim();
   -1  7596     };
   -1  7597     CssSelectorParser.prototype._renderEntity = function(entity) {
   -1  7598       var currentEntity, parts, res;
   -1  7599       res = '';
   -1  7600       switch (entity.type) {
   -1  7601        case 'ruleSet':
   -1  7602         currentEntity = entity.rule;
   -1  7603         parts = [];
   -1  7604         while (currentEntity) {
   -1  7605           if (currentEntity.nestingOperator) {
   -1  7606             parts.push(currentEntity.nestingOperator);
   -1  7607           }
   -1  7608           parts.push(this._renderEntity(currentEntity));
   -1  7609           currentEntity = currentEntity.rule;
   -1  7610         }
   -1  7611         res = parts.join(' ');
   -1  7612         break;
   -1  7613 
   -1  7614        case 'selectors':
   -1  7615         res = entity.selectors.map(this._renderEntity, this).join(', ');
   -1  7616         break;
   -1  7617 
   -1  7618        case 'rule':
   -1  7619         if (entity.tagName) {
   -1  7620           if (entity.tagName === '*') {
   -1  7621             res = '*';
   -1  7622           } else {
   -1  7623             res = this.escapeIdentifier(entity.tagName);
   -1  7624           }
   -1  7625         }
   -1  7626         if (entity.id) {
   -1  7627           res += '#' + this.escapeIdentifier(entity.id);
   -1  7628         }
   -1  7629         if (entity.classNames) {
   -1  7630           res += entity.classNames.map(function(cn) {
   -1  7631             return '.' + this.escapeIdentifier(cn);
   -1  7632           }, this).join('');
   -1  7633         }
   -1  7634         if (entity.attrs) {
   -1  7635           res += entity.attrs.map(function(attr) {
   -1  7636             if (attr.operator) {
   -1  7637               if (attr.valueType === 'substitute') {
   -1  7638                 return '[' + this.escapeIdentifier(attr.name) + attr.operator + '$' + attr.value + ']';
   -1  7639               } else {
   -1  7640                 return '[' + this.escapeIdentifier(attr.name) + attr.operator + this.escapeStr(attr.value) + ']';
   -1  7641               }
   -1  7642             } else {
   -1  7643               return '[' + this.escapeIdentifier(attr.name) + ']';
   -1  7644             }
   -1  7645           }, this).join('');
   -1  7646         }
   -1  7647         if (entity.pseudos) {
   -1  7648           res += entity.pseudos.map(function(pseudo) {
   -1  7649             if (pseudo.valueType) {
   -1  7650               if (pseudo.valueType === 'selector') {
   -1  7651                 return ':' + this.escapeIdentifier(pseudo.name) + '(' + this._renderEntity(pseudo.value) + ')';
   -1  7652               } else if (pseudo.valueType === 'substitute') {
   -1  7653                 return ':' + this.escapeIdentifier(pseudo.name) + '($' + pseudo.value + ')';
   -1  7654               } else if (pseudo.valueType === 'numeric') {
   -1  7655                 return ':' + this.escapeIdentifier(pseudo.name) + '(' + pseudo.value + ')';
   -1  7656               } else {
   -1  7657                 return ':' + this.escapeIdentifier(pseudo.name) + '(' + this.escapeIdentifier(pseudo.value) + ')';
   -1  7658               }
   -1  7659             } else {
   -1  7660               return ':' + this.escapeIdentifier(pseudo.name);
   -1  7661             }
   -1  7662           }, this).join('');
   -1  7663         }
   -1  7664         break;
   -1  7665 
   -1  7666        default:
   -1  7667         throw Error('Unknown entity type: "' + entity.type(+'".'));
   -1  7668       }
   -1  7669       return res;
   -1  7670     };
   -1  7671     var parser = new CssSelectorParser();
   -1  7672     parser.registerNestingOperators('>');
   -1  7673     axe.utils.cssParser = parser;
   -1  7674   })(axe);
   -1  7675   'use strict';
 7041  7676   function truncate(str, maxLength) {
 7042  7677     maxLength = maxLength || 300;
 7043  7678     if (str.length > maxLength) {
@@ -7124,13 +7759,14 @@ module.exports = {
 7124  7759     while (++index < length) {
 7125  7760       codeUnit = string.charCodeAt(index);
 7126  7761       if (codeUnit == 0) {
 7127    -1         throw new Error('INVALID_CHARACTER_ERR');
   -1  7762         result += '�';
   -1  7763         continue;
 7128  7764       }
 7129    -1       if (codeUnit >= 1 && codeUnit <= 31 || codeUnit >= 127 && codeUnit <= 159 || index == 0 && codeUnit >= 48 && codeUnit <= 57 || index == 1 && codeUnit >= 48 && codeUnit <= 57 && firstCodeUnit == 45) {
   -1  7765       if (codeUnit >= 1 && codeUnit <= 31 || codeUnit == 127 || index == 0 && codeUnit >= 48 && codeUnit <= 57 || index == 1 && codeUnit >= 48 && codeUnit <= 57 && firstCodeUnit == 45) {
 7130  7766         result += '\\' + codeUnit.toString(16) + ' ';
 7131  7767         continue;
 7132  7768       }
 7133    -1       if (index == 1 && codeUnit == 45 && firstCodeUnit == 45) {
   -1  7769       if (index == 0 && length == 1 && codeUnit == 45) {
 7134  7770         result += '\\' + string.charAt(index);
 7135  7771         continue;
 7136  7772       }
@@ -7174,22 +7810,109 @@ module.exports = {
 7174  7810     }
 7175  7811   };
 7176  7812   'use strict';
 7177    -1   axe.utils.getAllChecks = function getAllChecks(object) {
 7178    -1     'use strict';
 7179    -1     var result = [];
 7180    -1     return result.concat(object.any || []).concat(object.all || []).concat(object.none || []);
   -1  7813   var axe = axe || {
   -1  7814     utils: {}
 7181  7815   };
 7182    -1   'use strict';
 7183    -1   axe.utils.getCheckOption = function(check, ruleID, options) {
 7184    -1     var ruleCheckOption = ((options.rules && options.rules[ruleID] || {}).checks || {})[check.id];
 7185    -1     var checkOption = (options.checks || {})[check.id];
 7186    -1     var enabled = check.enabled;
 7187    -1     var opts = check.options;
 7188    -1     if (checkOption) {
 7189    -1       if (checkOption.hasOwnProperty('enabled')) {
 7190    -1         enabled = checkOption.enabled;
   -1  7816   function virtualDOMfromNode(node, shadowId) {
   -1  7817     return {
   -1  7818       shadowId: shadowId,
   -1  7819       children: [],
   -1  7820       actualNode: node
   -1  7821     };
   -1  7822   }
   -1  7823   function getSlotChildren(node) {
   -1  7824     var retVal = [];
   -1  7825     node = node.firstChild;
   -1  7826     while (node) {
   -1  7827       retVal.push(node);
   -1  7828       node = node.nextSibling;
   -1  7829     }
   -1  7830     return retVal;
   -1  7831   }
   -1  7832   axe.utils.getFlattenedTree = function(node, shadowId) {
   -1  7833     var retVal, realArray, nodeName;
   -1  7834     function reduceShadowDOM(res, child) {
   -1  7835       var replacements = axe.utils.getFlattenedTree(child, shadowId);
   -1  7836       if (replacements) {
   -1  7837         res = res.concat(replacements);
 7191  7838       }
 7192    -1       if (checkOption.hasOwnProperty('options')) {
   -1  7839       return res;
   -1  7840     }
   -1  7841     if (node.documentElement) {
   -1  7842       node = node.documentElement;
   -1  7843     }
   -1  7844     nodeName = node.nodeName.toLowerCase();
   -1  7845     if (axe.utils.isShadowRoot(node)) {
   -1  7846       retVal = virtualDOMfromNode(node, shadowId);
   -1  7847       shadowId = 'a' + Math.random().toString().substring(2);
   -1  7848       realArray = Array.from(node.shadowRoot.childNodes);
   -1  7849       retVal.children = realArray.reduce(reduceShadowDOM, []);
   -1  7850       return [ retVal ];
   -1  7851     } else {
   -1  7852       if (nodeName === 'content') {
   -1  7853         realArray = Array.from(node.getDistributedNodes());
   -1  7854         return realArray.reduce(reduceShadowDOM, []);
   -1  7855       } else if (nodeName === 'slot') {
   -1  7856         realArray = Array.from(node.assignedNodes());
   -1  7857         if (!realArray.length) {
   -1  7858           realArray = getSlotChildren(node);
   -1  7859         }
   -1  7860         var styl = window.getComputedStyle(node);
   -1  7861         if (false && styl.display !== 'contents') {
   -1  7862           retVal = virtualDOMfromNode(node, shadowId);
   -1  7863           retVal.children = realArray.reduce(reduceShadowDOM, []);
   -1  7864           return [ retVal ];
   -1  7865         } else {
   -1  7866           return realArray.reduce(reduceShadowDOM, []);
   -1  7867         }
   -1  7868       } else {
   -1  7869         if (node.nodeType === 1) {
   -1  7870           retVal = virtualDOMfromNode(node, shadowId);
   -1  7871           realArray = Array.from(node.childNodes);
   -1  7872           retVal.children = realArray.reduce(reduceShadowDOM, []);
   -1  7873           return [ retVal ];
   -1  7874         } else if (node.nodeType === 3) {
   -1  7875           return [ virtualDOMfromNode(node) ];
   -1  7876         }
   -1  7877         return undefined;
   -1  7878       }
   -1  7879     }
   -1  7880   };
   -1  7881   axe.utils.getNodeFromTree = function(vNode, node) {
   -1  7882     var found;
   -1  7883     if (vNode.actualNode === node) {
   -1  7884       return vNode;
   -1  7885     }
   -1  7886     vNode.children.forEach(function(candidate) {
   -1  7887       var retVal;
   -1  7888       if (candidate.actualNode === node) {
   -1  7889         found = candidate;
   -1  7890       } else {
   -1  7891         retVal = axe.utils.getNodeFromTree(candidate, node);
   -1  7892         if (retVal) {
   -1  7893           found = retVal;
   -1  7894         }
   -1  7895       }
   -1  7896     });
   -1  7897     return found;
   -1  7898   };
   -1  7899   'use strict';
   -1  7900   axe.utils.getAllChecks = function getAllChecks(object) {
   -1  7901     'use strict';
   -1  7902     var result = [];
   -1  7903     return result.concat(object.any || []).concat(object.all || []).concat(object.none || []);
   -1  7904   };
   -1  7905   'use strict';
   -1  7906   axe.utils.getCheckOption = function(check, ruleID, options) {
   -1  7907     var ruleCheckOption = ((options.rules && options.rules[ruleID] || {}).checks || {})[check.id];
   -1  7908     var checkOption = (options.checks || {})[check.id];
   -1  7909     var enabled = check.enabled;
   -1  7910     var opts = check.options;
   -1  7911     if (checkOption) {
   -1  7912       if (checkOption.hasOwnProperty('enabled')) {
   -1  7913         enabled = checkOption.enabled;
   -1  7914       }
   -1  7915       if (checkOption.hasOwnProperty('options')) {
 7193  7916         opts = checkOption.options;
 7194  7917       }
 7195  7918     }
@@ -7254,6 +7977,9 @@ module.exports = {
 7254  7977   function splitString(str, splitIndex) {
 7255  7978     return [ str.substring(0, splitIndex), str.substring(splitIndex) ];
 7256  7979   }
   -1  7980   function trimRight(str) {
   -1  7981     return str.replace(/\s+$/, '');
   -1  7982   }
 7257  7983   function uriParser(url) {
 7258  7984     var original = url;
 7259  7985     var protocol = '', domain = '', port = '', path = '', query = '', hash = '';
@@ -7316,57 +8042,127 @@ module.exports = {
 7316  8042     var pathEnd = path.substr(path.substr(0, path.length - 2).lastIndexOf('/') + 1);
 7317  8043     if (hash) {
 7318  8044       if (pathEnd && (pathEnd + hash).length <= maxLength) {
 7319    -1         return pathEnd + hash;
   -1  8045         return trimRight(pathEnd + hash);
 7320  8046       } else if (pathEnd.length < 2 && hash.length > 2 && hash.length <= maxLength) {
 7321    -1         return hash;
   -1  8047         return trimRight(hash);
 7322  8048       } else {
 7323  8049         return;
 7324  8050       }
 7325  8051     } else if (domain && domain.length < maxLength && path.length <= 1) {
 7326    -1       return domain + path;
   -1  8052       return trimRight(domain + path);
 7327  8053     }
 7328  8054     if (path === '/' + pathEnd && domain && currentDomain && domain !== currentDomain && (domain + path).length <= maxLength) {
 7329    -1       return domain + path;
   -1  8055       return trimRight(domain + path);
 7330  8056     }
 7331  8057     var lastDotIndex = pathEnd.lastIndexOf('.');
 7332  8058     if ((lastDotIndex === -1 || lastDotIndex > 1) && (lastDotIndex !== -1 || pathEnd.length > 2) && pathEnd.length <= maxLength && !pathEnd.match(/index(\.[a-zA-Z]{2-4})?/) && !isMostlyNumbers(pathEnd)) {
 7333    -1       return pathEnd;
   -1  8059       return trimRight(pathEnd);
 7334  8060     }
 7335  8061   };
 7336  8062   'use strict';
 7337    -1   function _toConsumableArray(arr) {
 7338    -1     if (Array.isArray(arr)) {
 7339    -1       for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
 7340    -1         arr2[i] = arr[i];
   -1  8063   var escapeSelector = axe.utils.escapeSelector;
   -1  8064   var isXHTML = void 0;
   -1  8065   var ignoredAttributes = [ 'class', 'style', 'id', 'selected', 'checked', 'disabled', 'tabindex', 'aria-checked', 'aria-selected', 'aria-invalid', 'aria-activedescendant', 'aria-busy', 'aria-disabled', 'aria-expanded', 'aria-grabbed', 'aria-pressed', 'aria-valuenow' ];
   -1  8066   var MAXATTRIBUTELENGTH = 31;
   -1  8067   function getAttributeNameValue(node, at) {
   -1  8068     var name = at.name;
   -1  8069     var atnv = void 0;
   -1  8070     if (name.indexOf('href') !== -1 || name.indexOf('src') !== -1) {
   -1  8071       var friendly = axe.utils.getFriendlyUriEnd(node.getAttribute(name));
   -1  8072       if (friendly) {
   -1  8073         var value = encodeURI(friendly);
   -1  8074         if (value) {
   -1  8075           atnv = escapeSelector(at.name) + '$="' + value + '"';
   -1  8076         } else {
   -1  8077           return;
   -1  8078         }
   -1  8079       } else {
   -1  8080         atnv = escapeSelector(at.name) + '="' + node.getAttribute(name) + '"';
 7341  8081       }
 7342    -1       return arr2;
 7343  8082     } else {
 7344    -1       return Array.from(arr);
   -1  8083       atnv = escapeSelector(name) + '="' + escapeSelector(at.value) + '"';
 7345  8084     }
   -1  8085     return atnv;
 7346  8086   }
 7347    -1   var escapeSelector = axe.utils.escapeSelector;
 7348    -1   var isXHTML = void 0;
 7349    -1   function isUncommonClassName(className) {
 7350    -1     return ![ 'focus', 'hover', 'hidden', 'visible', 'dirty', 'touched', 'valid', 'disable', 'enable', 'active', 'col-' ].find(function(str) {
 7351    -1       return className.includes(str);
 7352    -1     });
   -1  8087   function countSort(a, b) {
   -1  8088     return a.count < b.count ? -1 : a.count === b.count ? 0 : 1;
 7353  8089   }
 7354    -1   function getDistinctClassList(elm) {
 7355    -1     if (!elm.classList || elm.classList.length === 0) {
 7356    -1       return [];
 7357    -1     }
 7358    -1     var siblings = elm.parentNode && Array.from(elm.parentNode.children || '') || [];
 7359    -1     return siblings.reduce(function(classList, childElm) {
 7360    -1       if (elm === childElm) {
 7361    -1         return classList;
 7362    -1       } else {
 7363    -1         return classList.filter(function(classItem) {
 7364    -1           return !childElm.classList.contains(classItem);
 7365    -1         });
   -1  8090   function filterAttributes(at) {
   -1  8091     return !ignoredAttributes.includes(at.name) && at.name.indexOf(':') === -1 && (!at.value || at.value.length < MAXATTRIBUTELENGTH);
   -1  8092   }
   -1  8093   axe.utils.getSelectorData = function(domTree) {
   -1  8094     var data = {
   -1  8095       classes: {},
   -1  8096       tags: {},
   -1  8097       attributes: {}
   -1  8098     };
   -1  8099     domTree = Array.isArray(domTree) ? domTree : [ domTree ];
   -1  8100     var currentLevel = domTree.slice();
   -1  8101     var stack = [];
   -1  8102     var _loop = function _loop() {
   -1  8103       var current = currentLevel.pop();
   -1  8104       var node = current.actualNode;
   -1  8105       if (!!node.querySelectorAll) {
   -1  8106         var tag = node.nodeName;
   -1  8107         if (data.tags[tag]) {
   -1  8108           data.tags[tag]++;
   -1  8109         } else {
   -1  8110           data.tags[tag] = 1;
   -1  8111         }
   -1  8112         if (node.classList) {
   -1  8113           Array.from(node.classList).forEach(function(cl) {
   -1  8114             var ind = escapeSelector(cl);
   -1  8115             if (data.classes[ind]) {
   -1  8116               data.classes[ind]++;
   -1  8117             } else {
   -1  8118               data.classes[ind] = 1;
   -1  8119             }
   -1  8120           });
   -1  8121         }
   -1  8122         if (node.attributes) {
   -1  8123           Array.from(node.attributes).filter(filterAttributes).forEach(function(at) {
   -1  8124             var atnv = getAttributeNameValue(node, at);
   -1  8125             if (atnv) {
   -1  8126               if (data.attributes[atnv]) {
   -1  8127                 data.attributes[atnv]++;
   -1  8128               } else {
   -1  8129                 data.attributes[atnv] = 1;
   -1  8130               }
   -1  8131             }
   -1  8132           });
   -1  8133         }
   -1  8134       }
   -1  8135       if (current.children.length) {
   -1  8136         stack.push(currentLevel);
   -1  8137         currentLevel = current.children.slice();
 7366  8138       }
 7367    -1     }, Array.from(elm.classList).filter(isUncommonClassName));
   -1  8139       while (!currentLevel.length && stack.length) {
   -1  8140         currentLevel = stack.pop();
   -1  8141       }
   -1  8142     };
   -1  8143     while (currentLevel.length) {
   -1  8144       _loop();
   -1  8145     }
   -1  8146     return data;
   -1  8147   };
   -1  8148   function uncommonClasses(node, selectorData) {
   -1  8149     var retVal = [];
   -1  8150     var classData = selectorData.classes;
   -1  8151     var tagData = selectorData.tags;
   -1  8152     if (node.classList) {
   -1  8153       Array.from(node.classList).forEach(function(cl) {
   -1  8154         var ind = escapeSelector(cl);
   -1  8155         if (classData[ind] < tagData[node.nodeName]) {
   -1  8156           retVal.push({
   -1  8157             name: ind,
   -1  8158             count: classData[ind],
   -1  8159             species: 'class'
   -1  8160           });
   -1  8161         }
   -1  8162       });
   -1  8163     }
   -1  8164     return retVal.sort(countSort);
 7368  8165   }
 7369    -1   var commonNodes = [ 'div', 'span', 'p', 'b', 'i', 'u', 'strong', 'em', 'h2', 'h3' ];
 7370  8166   function getNthChildString(elm, selector) {
 7371  8167     var siblings = elm.parentNode && Array.from(elm.parentNode.children || '') || [];
 7372  8168     var hasMatchingSiblings = siblings.find(function(sibling) {
@@ -7379,128 +8175,134 @@ module.exports = {
 7379  8175       return '';
 7380  8176     }
 7381  8177   }
 7382    -1   var createSelector = {
 7383    -1     getElmId: function getElmId(elm) {
 7384    -1       if (!elm.getAttribute('id')) {
 7385    -1         return;
 7386    -1       }
 7387    -1       var id = '#' + escapeSelector(elm.getAttribute('id') || '');
 7388    -1       if (!id.match(/player_uid_/) && document.querySelectorAll(id).length === 1) {
 7389    -1         return id;
 7390    -1       }
 7391    -1     },
 7392    -1     getCustomElm: function getCustomElm(elm, _ref) {
 7393    -1       var isCustomElm = _ref.isCustomElm, nodeName = _ref.nodeName;
 7394    -1       if (isCustomElm) {
 7395    -1         return nodeName;
 7396    -1       }
 7397    -1     },
 7398    -1     getElmRoleProp: function getElmRoleProp(elm) {
 7399    -1       if (elm.hasAttribute('role')) {
 7400    -1         return '[role="' + escapeSelector(elm.getAttribute('role')) + '"]';
 7401    -1       }
 7402    -1     },
 7403    -1     getUncommonElm: function getUncommonElm(elm, _ref2) {
 7404    -1       var isCommonElm = _ref2.isCommonElm, isCustomElm = _ref2.isCustomElm, nodeName = _ref2.nodeName;
 7405    -1       if (!isCommonElm && !isCustomElm) {
 7406    -1         if (nodeName === 'input' && elm.hasAttribute('type')) {
 7407    -1           nodeName += '[type="' + elm.type + '"]';
   -1  8178   function getElmId(elm) {
   -1  8179     if (!elm.getAttribute('id')) {
   -1  8180       return;
   -1  8181     }
   -1  8182     var doc = elm.getRootNode && elm.getRootNode() || document;
   -1  8183     var id = '#' + escapeSelector(elm.getAttribute('id') || '');
   -1  8184     if (!id.match(/player_uid_/) && doc.querySelectorAll(id).length === 1) {
   -1  8185       return id;
   -1  8186     }
   -1  8187   }
   -1  8188   function getBaseSelector(elm) {
   -1  8189     if (typeof isXHTML === 'undefined') {
   -1  8190       isXHTML = axe.utils.isXHTML(document);
   -1  8191     }
   -1  8192     return escapeSelector(isXHTML ? elm.localName : elm.nodeName.toLowerCase());
   -1  8193   }
   -1  8194   function uncommonAttributes(node, selectorData) {
   -1  8195     var retVal = [];
   -1  8196     var attData = selectorData.attributes;
   -1  8197     var tagData = selectorData.tags;
   -1  8198     if (node.attributes) {
   -1  8199       Array.from(node.attributes).filter(filterAttributes).forEach(function(at) {
   -1  8200         var atnv = getAttributeNameValue(node, at);
   -1  8201         if (atnv && attData[atnv] < tagData[node.nodeName]) {
   -1  8202           retVal.push({
   -1  8203             name: atnv,
   -1  8204             count: attData[atnv],
   -1  8205             species: 'attribute'
   -1  8206           });
 7408  8207         }
 7409    -1         return nodeName;
   -1  8208       });
   -1  8209     }
   -1  8210     return retVal.sort(countSort);
   -1  8211   }
   -1  8212   function getThreeLeastCommonFeatures(elm, selectorData) {
   -1  8213     var selector = '';
   -1  8214     var features = void 0;
   -1  8215     var clss = uncommonClasses(elm, selectorData);
   -1  8216     var atts = uncommonAttributes(elm, selectorData);
   -1  8217     if (clss.length && clss[0].count === 1) {
   -1  8218       features = [ clss[0] ];
   -1  8219     } else if (atts.length && atts[0].count === 1) {
   -1  8220       features = [ atts[0] ];
   -1  8221       selector = getBaseSelector(elm);
   -1  8222     } else {
   -1  8223       features = clss.concat(atts);
   -1  8224       features.sort(countSort);
   -1  8225       features = features.slice(0, 3);
   -1  8226       if (!features.some(function(feat) {
   -1  8227         return feat.species === 'class';
   -1  8228       })) {
   -1  8229         selector = getBaseSelector(elm);
   -1  8230       } else {
   -1  8231         features.sort(function(a, b) {
   -1  8232           return a.species !== b.species && a.species === 'class' ? -1 : a.species === b.species ? 0 : 1;
   -1  8233         });
 7410  8234       }
 7411    -1     },
 7412    -1     getElmNameProp: function getElmNameProp(elm) {
 7413    -1       if (!elm.hasAttribute('id') && elm.name) {
 7414    -1         return '[name="' + escapeSelector(elm.name) + '"]';
   -1  8235     }
   -1  8236     return selector += features.reduce(function(val, feat) {
   -1  8237       switch (feat.species) {
   -1  8238        case 'class':
   -1  8239         return val + '.' + feat.name;
   -1  8240 
   -1  8241        case 'attribute':
   -1  8242         return val + '[' + feat.name + ']';
 7415  8243       }
 7416    -1     },
 7417    -1     getDistinctClass: function getDistinctClass(elm, _ref3) {
 7418    -1       var distinctClassList = _ref3.distinctClassList;
 7419    -1       if (distinctClassList.length > 0 && distinctClassList.length < 3) {
 7420    -1         return '.' + distinctClassList.map(escapeSelector).join('.');
   -1  8244       return val;
   -1  8245     }, '');
   -1  8246   }
   -1  8247   function generateSelector(elm, options, doc) {
   -1  8248     if (!axe._selectorData) {
   -1  8249       throw new Error('Expect axe._selectorData to be set up');
   -1  8250     }
   -1  8251     var _options$toRoot = options.toRoot, toRoot = _options$toRoot === undefined ? false : _options$toRoot;
   -1  8252     var selector = void 0;
   -1  8253     var similar = void 0;
   -1  8254     do {
   -1  8255       var features = getElmId(elm);
   -1  8256       if (!features) {
   -1  8257         features = getThreeLeastCommonFeatures(elm, axe._selectorData);
   -1  8258         features += getNthChildString(elm, features);
 7421  8259       }
 7422    -1     },
 7423    -1     getFileRefProp: function getFileRefProp(elm) {
 7424    -1       var attr = void 0;
 7425    -1       if (elm.hasAttribute('href')) {
 7426    -1         attr = 'href';
 7427    -1       } else if (elm.hasAttribute('src')) {
 7428    -1         attr = 'src';
   -1  8260       if (selector) {
   -1  8261         selector = features + ' > ' + selector;
 7429  8262       } else {
 7430    -1         return;
   -1  8263         selector = features;
 7431  8264       }
 7432    -1       var friendlyUriEnd = axe.utils.getFriendlyUriEnd(elm.getAttribute(attr));
 7433    -1       if (friendlyUriEnd) {
 7434    -1         return '[' + attr + '$="' + encodeURI(friendlyUriEnd) + '"]';
 7435    -1       }
 7436    -1     },
 7437    -1     getCommonName: function getCommonName(elm, _ref4) {
 7438    -1       var nodeName = _ref4.nodeName, isCommonElm = _ref4.isCommonElm;
 7439    -1       if (isCommonElm) {
 7440    -1         return nodeName;
   -1  8265       if (!similar) {
   -1  8266         similar = Array.from(doc.querySelectorAll(selector));
   -1  8267       } else {
   -1  8268         similar = similar.filter(function(item) {
   -1  8269           return axe.utils.matchesSelector(item, selector);
   -1  8270         });
 7441  8271       }
   -1  8272       elm = elm.parentElement;
   -1  8273     } while ((similar.length > 1 || toRoot) && elm && elm.nodeType !== 11);
   -1  8274     if (similar.length === 1) {
   -1  8275       return selector;
   -1  8276     } else if (selector.indexOf(' > ') !== -1) {
   -1  8277       return ':root' + selector.substring(selector.indexOf(' > '));
 7442  8278     }
 7443    -1   };
 7444    -1   function getElmFeatures(elm, featureCount) {
 7445    -1     if (typeof isXHTML === 'undefined') {
 7446    -1       isXHTML = axe.utils.isXHTML(document);
 7447    -1     }
 7448    -1     var nodeName = escapeSelector(isXHTML ? elm.localName : elm.nodeName.toLowerCase());
 7449    -1     var classList = Array.from(elm.classList) || [];
 7450    -1     var props = {
 7451    -1       nodeName: nodeName,
 7452    -1       classList: classList,
 7453    -1       isCustomElm: nodeName.includes('-'),
 7454    -1       isCommonElm: commonNodes.includes(nodeName),
 7455    -1       distinctClassList: getDistinctClassList(elm)
 7456    -1     };
 7457    -1     return [ createSelector.getCustomElm, createSelector.getElmRoleProp, createSelector.getUncommonElm, createSelector.getElmNameProp, createSelector.getDistinctClass, createSelector.getFileRefProp, createSelector.getCommonName ].reduce(function(features, func) {
 7458    -1       if (features.length === featureCount) {
 7459    -1         return features;
 7460    -1       }
 7461    -1       var feature = func(elm, props);
 7462    -1       if (feature) {
 7463    -1         if (!feature[0].match(/[a-z]/)) {
 7464    -1           features.push(feature);
 7465    -1         } else {
 7466    -1           features.unshift(feature);
 7467    -1         }
 7468    -1       }
 7469    -1       return features;
 7470    -1     }, []);
   -1  8279     return ':root';
 7471  8280   }
 7472  8281   axe.utils.getSelector = function createUniqueSelector(elm) {
 7473  8282     var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
 7474  8283     if (!elm) {
 7475  8284       return '';
 7476  8285     }
 7477    -1     var selector = void 0, addParent = void 0;
 7478    -1     var _options$isUnique = options.isUnique, isUnique = _options$isUnique === undefined ? false : _options$isUnique;
 7479    -1     var idSelector = createSelector.getElmId(elm);
 7480    -1     var _options$featureCount = options.featureCount, featureCount = _options$featureCount === undefined ? 2 : _options$featureCount, _options$minDepth = options.minDepth, minDepth = _options$minDepth === undefined ? 1 : _options$minDepth, _options$toRoot = options.toRoot, toRoot = _options$toRoot === undefined ? false : _options$toRoot, _options$childSelecto = options.childSelectors, childSelectors = _options$childSelecto === undefined ? [] : _options$childSelecto;
 7481    -1     if (idSelector) {
 7482    -1       selector = idSelector;
 7483    -1       isUnique = true;
 7484    -1     } else {
 7485    -1       selector = getElmFeatures(elm, featureCount).join('');
 7486    -1       selector += getNthChildString(elm, selector);
 7487    -1       isUnique = options.isUnique || document.querySelectorAll(selector).length === 1;
 7488    -1       if (!isUnique && elm === document.documentElement) {
 7489    -1         selector += ':root';
 7490    -1       }
 7491    -1       addParent = minDepth !== 0 || !isUnique;
 7492    -1     }
 7493    -1     var selectorParts = [ selector ].concat(_toConsumableArray(childSelectors));
 7494    -1     if (elm.parentElement && (toRoot || addParent)) {
 7495    -1       return createUniqueSelector(elm.parentNode, {
 7496    -1         toRoot: toRoot,
 7497    -1         isUnique: isUnique,
 7498    -1         childSelectors: selectorParts,
 7499    -1         featureCount: 1,
 7500    -1         minDepth: minDepth - 1
   -1  8286     var doc = elm.getRootNode && elm.getRootNode() || document;
   -1  8287     if (doc.nodeType === 11) {
   -1  8288       var stack = [];
   -1  8289       while (doc.nodeType === 11) {
   -1  8290         stack.push({
   -1  8291           elm: elm,
   -1  8292           doc: doc
   -1  8293         });
   -1  8294         elm = doc.host;
   -1  8295         doc = elm.getRootNode();
   -1  8296       }
   -1  8297       stack.push({
   -1  8298         elm: elm,
   -1  8299         doc: doc
   -1  8300       });
   -1  8301       return stack.reverse().map(function(comp) {
   -1  8302         return generateSelector(comp.elm, options, comp.doc);
 7501  8303       });
 7502  8304     } else {
 7503    -1       return selectorParts.join(' > ');
   -1  8305       return generateSelector(elm, options, doc);
 7504  8306     }
 7505  8307   };
 7506  8308   'use strict';
@@ -7600,14 +8402,30 @@ module.exports = {
 7600  8402   'use strict';
 7601  8403   axe.utils.isHidden = function isHidden(el, recursed) {
 7602  8404     'use strict';
   -1  8405     var parent;
 7603  8406     if (el.nodeType === 9) {
 7604  8407       return false;
 7605  8408     }
   -1  8409     if (el.nodeType === 11) {
   -1  8410       el = el.host;
   -1  8411     }
 7606  8412     var style = window.getComputedStyle(el, null);
 7607  8413     if (!style || !el.parentNode || style.getPropertyValue('display') === 'none' || !recursed && style.getPropertyValue('visibility') === 'hidden' || el.getAttribute('aria-hidden') === 'true') {
 7608  8414       return true;
 7609  8415     }
 7610    -1     return axe.utils.isHidden(el.parentNode, true);
   -1  8416     parent = el.assignedSlot ? el.assignedSlot : el.parentNode;
   -1  8417     return axe.utils.isHidden(parent, true);
   -1  8418   };
   -1  8419   'use strict';
   -1  8420   var possibleShadowRoots = [ 'article', 'aside', 'blockquote', 'body', 'div', 'footer', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'main', 'nav', 'p', 'section', 'span' ];
   -1  8421   axe.utils.isShadowRoot = function isShadowRoot(node) {
   -1  8422     var nodeName = node.nodeName.toLowerCase();
   -1  8423     if (node.shadowRoot) {
   -1  8424       if (/^[a-z][a-z0-9_.-]*-[a-z0-9_.-]*$/.test(nodeName) || possibleShadowRoots.includes(nodeName)) {
   -1  8425         return true;
   -1  8426       }
   -1  8427     }
   -1  8428     return false;
 7611  8429   };
 7612  8430   'use strict';
 7613  8431   axe.utils.isXHTML = function(doc) {
@@ -7643,7 +8461,11 @@ module.exports = {
 7643  8461     var firstFromFrame = to[0].node, sorterResult, t;
 7644  8462     for (var i = 0, l = target.length; i < l; i++) {
 7645  8463       t = target[i].node;
 7646    -1       sorterResult = axe.utils.nodeSorter(t.element, firstFromFrame.element);
   -1  8464       sorterResult = axe.utils.nodeSorter({
   -1  8465         actualNode: t.element
   -1  8466       }, {
   -1  8467         actualNode: firstFromFrame.element
   -1  8468       });
 7647  8469       if (sorterResult > 0 || sorterResult === 0 && firstFromFrame.selector.length < t.selector.length) {
 7648  8470         target.splice.apply(target, [ i, 0 ].concat(to));
 7649  8471         return;
@@ -7691,10 +8513,10 @@ module.exports = {
 7691  8513   'use strict';
 7692  8514   axe.utils.nodeSorter = function nodeSorter(a, b) {
 7693  8515     'use strict';
 7694    -1     if (a === b) {
   -1  8516     if (a.actualNode === b.actualNode) {
 7695  8517       return 0;
 7696  8518     }
 7697    -1     if (a.compareDocumentPosition(b) & 4) {
   -1  8519     if (a.actualNode.compareDocumentPosition(b.actualNode) & 4) {
 7698  8520       return -1;
 7699  8521     }
 7700  8522     return 1;
@@ -7838,6 +8660,10 @@ module.exports = {
 7838  8660         });
 7839  8661         current.style.setProperty(cssProp, cssDisableVal, 'important');
 7840  8662       }
   -1  8663       if (elements.indexOf(document.documentElement) < elements.length - 1) {
   -1  8664         elements.splice(elements.indexOf(document.documentElement), 1);
   -1  8665         elements.push(document.documentElement);
   -1  8666       }
 7841  8667       for (i = previousPointerEvents.length; !!(d = previousPointerEvents[--i]); ) {
 7842  8668         elements[i].style.setProperty(cssProp, d.value ? d.value : '', d.priority);
 7843  8669       }
@@ -8039,6 +8865,226 @@ module.exports = {
 8039  8865     axe.utils.extendMetaData(ruleResult, axe.utils.clone(rulesData[ruleResult.id] || {}));
 8040  8866   };
 8041  8867   'use strict';
   -1  8868   var convertExpressions = function convertExpressions() {};
   -1  8869   var matchExpressions = function matchExpressions() {};
   -1  8870   function matchesTag(node, exp) {
   -1  8871     return node.nodeType === 1 && (exp.tag === '*' || node.nodeName.toLowerCase() === exp.tag);
   -1  8872   }
   -1  8873   function matchesClasses(node, exp) {
   -1  8874     return !exp.classes || exp.classes.reduce(function(result, cl) {
   -1  8875       return result && node.className && node.className.match(cl.regexp);
   -1  8876     }, true);
   -1  8877   }
   -1  8878   function matchesAttributes(node, exp) {
   -1  8879     return !exp.attributes || exp.attributes.reduce(function(result, att) {
   -1  8880       var nodeAtt = node.getAttribute(att.key);
   -1  8881       return result && nodeAtt !== null && (!att.value || att.test(nodeAtt));
   -1  8882     }, true);
   -1  8883   }
   -1  8884   function matchesId(node, exp) {
   -1  8885     return !exp.id || node.id === exp.id;
   -1  8886   }
   -1  8887   function matchesPseudos(target, exp) {
   -1  8888     if (!exp.pseudos || exp.pseudos.reduce(function(result, pseudo) {
   -1  8889       if (pseudo.name === 'not') {
   -1  8890         return result && !matchExpressions([ target ], pseudo.expressions, false).length;
   -1  8891       }
   -1  8892       throw new Error('the pseudo selector ' + pseudo.name + ' has not yet been implemented');
   -1  8893     }, true)) {
   -1  8894       return true;
   -1  8895     }
   -1  8896     return false;
   -1  8897   }
   -1  8898   var escapeRegExp = function() {
   -1  8899     var from = /(?=[\-\[\]{}()*+?.\\\^$|,#\s])/g;
   -1  8900     var to = '\\';
   -1  8901     return function(string) {
   -1  8902       return string.replace(from, to);
   -1  8903     };
   -1  8904   }();
   -1  8905   var reUnescape = /\\/g;
   -1  8906   function convertAttributes(atts) {
   -1  8907     if (!atts) {
   -1  8908       return;
   -1  8909     }
   -1  8910     return atts.map(function(att) {
   -1  8911       var attributeKey = att.name.replace(reUnescape, '');
   -1  8912       var attributeValue = (att.value || '').replace(reUnescape, '');
   -1  8913       var test, regexp;
   -1  8914       switch (att.operator) {
   -1  8915        case '^=':
   -1  8916         regexp = new RegExp('^' + escapeRegExp(attributeValue));
   -1  8917         break;
   -1  8918 
   -1  8919        case '$=':
   -1  8920         regexp = new RegExp(escapeRegExp(attributeValue) + '$');
   -1  8921         break;
   -1  8922 
   -1  8923        case '~=':
   -1  8924         regexp = new RegExp('(^|\\s)' + escapeRegExp(attributeValue) + '(\\s|$)');
   -1  8925         break;
   -1  8926 
   -1  8927        case '|=':
   -1  8928         regexp = new RegExp('^' + escapeRegExp(attributeValue) + '(-|$)');
   -1  8929         break;
   -1  8930 
   -1  8931        case '=':
   -1  8932         test = function test(value) {
   -1  8933           return attributeValue === value;
   -1  8934         };
   -1  8935         break;
   -1  8936 
   -1  8937        case '*=':
   -1  8938         test = function test(value) {
   -1  8939           return value && value.includes(attributeValue);
   -1  8940         };
   -1  8941         break;
   -1  8942 
   -1  8943        case '!=':
   -1  8944         test = function test(value) {
   -1  8945           return attributeValue !== value;
   -1  8946         };
   -1  8947         break;
   -1  8948 
   -1  8949        default:
   -1  8950         test = function test(value) {
   -1  8951           return !!value;
   -1  8952         };
   -1  8953       }
   -1  8954       if (attributeValue === '' && /^[*$^]=$/.test(att.operator)) {
   -1  8955         test = function test() {
   -1  8956           return false;
   -1  8957         };
   -1  8958       }
   -1  8959       if (!test) {
   -1  8960         test = function test(value) {
   -1  8961           return value && regexp.test(value);
   -1  8962         };
   -1  8963       }
   -1  8964       return {
   -1  8965         key: attributeKey,
   -1  8966         value: attributeValue,
   -1  8967         test: test
   -1  8968       };
   -1  8969     });
   -1  8970   }
   -1  8971   function convertClasses(classes) {
   -1  8972     if (!classes) {
   -1  8973       return;
   -1  8974     }
   -1  8975     return classes.map(function(className) {
   -1  8976       className = className.replace(reUnescape, '');
   -1  8977       return {
   -1  8978         value: className,
   -1  8979         regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)')
   -1  8980       };
   -1  8981     });
   -1  8982   }
   -1  8983   function convertPseudos(pseudos) {
   -1  8984     if (!pseudos) {
   -1  8985       return;
   -1  8986     }
   -1  8987     return pseudos.map(function(p) {
   -1  8988       var expressions;
   -1  8989       if (p.name === 'not') {
   -1  8990         expressions = axe.utils.cssParser.parse(p.value);
   -1  8991         expressions = expressions.selectors ? expressions.selectors : [ expressions ];
   -1  8992         expressions = convertExpressions(expressions);
   -1  8993       }
   -1  8994       return {
   -1  8995         name: p.name,
   -1  8996         expressions: expressions,
   -1  8997         value: p.value
   -1  8998       };
   -1  8999     });
   -1  9000   }
   -1  9001   convertExpressions = function convertExpressions(expressions) {
   -1  9002     return expressions.map(function(exp) {
   -1  9003       var newExp = [];
   -1  9004       var rule = exp.rule;
   -1  9005       while (rule) {
   -1  9006         newExp.push({
   -1  9007           tag: rule.tagName ? rule.tagName.toLowerCase() : '*',
   -1  9008           combinator: rule.nestingOperator ? rule.nestingOperator : ' ',
   -1  9009           id: rule.id,
   -1  9010           attributes: convertAttributes(rule.attrs),
   -1  9011           classes: convertClasses(rule.classNames),
   -1  9012           pseudos: convertPseudos(rule.pseudos)
   -1  9013         });
   -1  9014         rule = rule.rule;
   -1  9015       }
   -1  9016       return newExp;
   -1  9017     });
   -1  9018   };
   -1  9019   function createLocalVariables(nodes, anyLevel, thisLevel, parentShadowId) {
   -1  9020     var retVal = {
   -1  9021       nodes: nodes.slice(),
   -1  9022       anyLevel: anyLevel,
   -1  9023       thisLevel: thisLevel,
   -1  9024       parentShadowId: parentShadowId
   -1  9025     };
   -1  9026     retVal.nodes.reverse();
   -1  9027     return retVal;
   -1  9028   }
   -1  9029   function matchesSelector(node, exp) {
   -1  9030     return matchesTag(node.actualNode, exp[0]) && matchesClasses(node.actualNode, exp[0]) && matchesAttributes(node.actualNode, exp[0]) && matchesId(node.actualNode, exp[0]) && matchesPseudos(node, exp[0]);
   -1  9031   }
   -1  9032   matchExpressions = function matchExpressions(domTree, expressions, recurse, filter) {
   -1  9033     var stack = [];
   -1  9034     var nodes = Array.isArray(domTree) ? domTree : [ domTree ];
   -1  9035     var currentLevel = createLocalVariables(nodes, expressions, [], domTree[0].shadowId);
   -1  9036     var result = [];
   -1  9037     while (currentLevel.nodes.length) {
   -1  9038       var node = currentLevel.nodes.pop();
   -1  9039       var childOnly = [];
   -1  9040       var childAny = [];
   -1  9041       var combined = currentLevel.anyLevel.slice().concat(currentLevel.thisLevel);
   -1  9042       var added = false;
   -1  9043       for (var i = 0; i < combined.length; i++) {
   -1  9044         var exp = combined[i];
   -1  9045         if (matchesSelector(node, exp) && (!exp[0].id || node.shadowId === currentLevel.parentShadowId)) {
   -1  9046           if (exp.length === 1) {
   -1  9047             if (!added && (!filter || filter(node))) {
   -1  9048               result.push(node);
   -1  9049               added = true;
   -1  9050             }
   -1  9051           } else {
   -1  9052             var rest = exp.slice(1);
   -1  9053             if ([ ' ', '>' ].includes(rest[0].combinator) === false) {
   -1  9054               throw new Error('axe.utils.querySelectorAll does not support the combinator: ' + exp[1].combinator);
   -1  9055             }
   -1  9056             if (rest[0].combinator === '>') {
   -1  9057               childOnly.push(rest);
   -1  9058             } else {
   -1  9059               childAny.push(rest);
   -1  9060             }
   -1  9061           }
   -1  9062         }
   -1  9063         if (currentLevel.anyLevel.includes(exp) && (!exp[0].id || node.shadowId === currentLevel.parentShadowId)) {
   -1  9064           childAny.push(exp);
   -1  9065         }
   -1  9066       }
   -1  9067       if (node.children && node.children.length && recurse) {
   -1  9068         stack.push(currentLevel);
   -1  9069         currentLevel = createLocalVariables(node.children, childAny, childOnly, node.shadowId);
   -1  9070       }
   -1  9071       while (!currentLevel.nodes.length && stack.length) {
   -1  9072         currentLevel = stack.pop();
   -1  9073       }
   -1  9074     }
   -1  9075     return result;
   -1  9076   };
   -1  9077   axe.utils.querySelectorAll = function(domTree, selector) {
   -1  9078     return axe.utils.querySelectorAllFilter(domTree, selector);
   -1  9079   };
   -1  9080   axe.utils.querySelectorAllFilter = function(domTree, selector, filter) {
   -1  9081     domTree = Array.isArray(domTree) ? domTree : [ domTree ];
   -1  9082     var expressions = axe.utils.cssParser.parse(selector);
   -1  9083     expressions = expressions.selectors ? expressions.selectors : [ expressions ];
   -1  9084     expressions = convertExpressions(expressions);
   -1  9085     return matchExpressions(domTree, expressions, true, filter);
   -1  9086   };
   -1  9087   'use strict';
 8042  9088   var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) {
 8043  9089     return typeof obj;
 8044  9090   } : function(obj) {
@@ -8156,8 +9202,8 @@ module.exports = {
 8156  9202     'use strict';
 8157  9203     var messages = {}, subscribers = {}, errorTypes = Object.freeze([ 'EvalError', 'RangeError', 'ReferenceError', 'SyntaxError', 'TypeError', 'URIError' ]);
 8158  9204     function _getSource() {
 8159    -1       var application = 'axe', version = '', src;
 8160    -1       if (typeof axe !== 'undefined' && axe._audit && !axe._audit.application) {
   -1  9205       var application = 'axeAPI', version = '', src;
   -1  9206       if (typeof axe !== 'undefined' && axe._audit && axe._audit.application) {
 8161  9207         application = axe._audit.application;
 8162  9208       }
 8163  9209       if (typeof axe !== 'undefined') {
@@ -8169,7 +9215,7 @@ module.exports = {
 8169  9215     function verify(postedMessage) {
 8170  9216       if ((typeof postedMessage === 'undefined' ? 'undefined' : _typeof(postedMessage)) === 'object' && typeof postedMessage.uuid === 'string' && postedMessage._respondable === true) {
 8171  9217         var messageSource = _getSource();
 8172    -1         return postedMessage._source === messageSource || postedMessage._source === 'axe.x.y.z' || messageSource === 'axe.x.y.z';
   -1  9218         return postedMessage._source === messageSource || postedMessage._source === 'axeAPI.x.y.z' || messageSource === 'axeAPI.x.y.z';
 8173  9219       }
 8174  9220       return false;
 8175  9221     }
@@ -8213,11 +9259,11 @@ module.exports = {
 8213  9259         post(source, topic, message, uuid, keepalive, callback);
 8214  9260       };
 8215  9261     }
 8216    -1     function publish(target, data, keepalive) {
   -1  9262     function publish(source, data, keepalive) {
 8217  9263       var topic = data.topic;
 8218  9264       var subscriber = subscribers[topic];
 8219  9265       if (subscriber) {
 8220    -1         var responder = createResponder(target, null, data.uuid);
   -1  9266         var responder = createResponder(source, null, data.uuid);
 8221  9267         subscriber(data.message, keepalive, responder);
 8222  9268       }
 8223  9269     }
@@ -8395,31 +9441,74 @@ module.exports = {
 8395  9441     }
 8396  9442     return false;
 8397  9443   }
 8398    -1   function pushNode(result, nodes, context) {
   -1  9444   function pushNode(result, nodes) {
 8399  9445     'use strict';
   -1  9446     var temp;
   -1  9447     if (result.length === 0) {
   -1  9448       return nodes;
   -1  9449     }
   -1  9450     if (result.length < nodes.length) {
   -1  9451       temp = result;
   -1  9452       result = nodes;
   -1  9453       nodes = temp;
   -1  9454     }
 8400  9455     for (var i = 0, l = nodes.length; i < l; i++) {
 8401    -1       if (result.indexOf(nodes[i]) === -1 && isNodeInContext(nodes[i], context)) {
   -1  9456       if (!result.includes(nodes[i])) {
 8402  9457         result.push(nodes[i]);
 8403  9458       }
 8404  9459     }
   -1  9460     return result;
   -1  9461   }
   -1  9462   function reduceIncludes(includes) {
   -1  9463     return includes.reduce(function(res, el) {
   -1  9464       if (!res.length || !res[res.length - 1].actualNode.contains(el.actualNode)) {
   -1  9465         res.push(el);
   -1  9466       }
   -1  9467       return res;
   -1  9468     }, []);
 8405  9469   }
 8406  9470   axe.utils.select = function select(selector, context) {
 8407  9471     'use strict';
 8408  9472     var result = [], candidate;
 8409    -1     for (var i = 0, l = context.include.length; i < l; i++) {
 8410    -1       candidate = context.include[i];
 8411    -1       if (candidate.nodeType === candidate.ELEMENT_NODE && axe.utils.matchesSelector(candidate, selector)) {
 8412    -1         pushNode(result, [ candidate ], context);
   -1  9473     if (axe._selectCache) {
   -1  9474       for (var j = 0, l = axe._selectCache.length; j < l; j++) {
   -1  9475         var item = axe._selectCache[j];
   -1  9476         if (item.selector === selector) {
   -1  9477           return item.result;
   -1  9478         }
   -1  9479       }
   -1  9480     }
   -1  9481     var curried = function(context) {
   -1  9482       return function(node) {
   -1  9483         return isNodeInContext(node, context);
   -1  9484       };
   -1  9485     }(context);
   -1  9486     var reducedIncludes = reduceIncludes(context.include);
   -1  9487     for (var i = 0; i < reducedIncludes.length; i++) {
   -1  9488       candidate = reducedIncludes[i];
   -1  9489       if (candidate.actualNode.nodeType === candidate.actualNode.ELEMENT_NODE && axe.utils.matchesSelector(candidate.actualNode, selector) && curried(candidate)) {
   -1  9490         result = pushNode(result, [ candidate ]);
 8413  9491       }
 8414    -1       pushNode(result, candidate.querySelectorAll(selector), context);
   -1  9492       result = pushNode(result, axe.utils.querySelectorAllFilter(candidate, selector, curried));
 8415  9493     }
 8416    -1     return result.sort(axe.utils.nodeSorter);
   -1  9494     if (axe._selectCache) {
   -1  9495       axe._selectCache.push({
   -1  9496         selector: selector,
   -1  9497         result: result
   -1  9498       });
   -1  9499     }
   -1  9500     return result;
 8417  9501   };
 8418  9502   'use strict';
 8419  9503   axe.utils.toArray = function(thing) {
 8420  9504     'use strict';
 8421  9505     return Array.prototype.slice.call(thing);
 8422  9506   };
   -1  9507   axe.utils.uniqueArray = function(arr1, arr2) {
   -1  9508     return arr1.concat(arr2).filter(function(elem, pos, arr) {
   -1  9509       return arr.indexOf(elem) === pos;
   -1  9510     });
   -1  9511   };
 8423  9512   'use strict';
 8424  9513   var uuid;
 8425  9514   (function(_global) {
@@ -8551,6 +9640,10 @@ module.exports = {
 8551  9640           description: 'Ensures ARIA attributes are allowed for an element\'s role',
 8552  9641           help: 'Elements must only use allowed ARIA attributes'
 8553  9642         },
   -1  9643         'aria-dpub-role-fallback': {
   -1  9644           description: 'Ensures unsupported DPUB roles are only used on elements with implicit fallback roles',
   -1  9645           help: 'Unsupported DPUB ARIA roles should be used on elements with implicit fallback roles'
   -1  9646         },
 8554  9647         'aria-hidden-body': {
 8555  9648           description: 'Ensures aria-hidden=\'true\' is not present on the document body.',
 8556  9649           help: 'aria-hidden=\'true\' must not be present on the document body'
@@ -8596,7 +9689,7 @@ module.exports = {
 8596  9689           help: 'Page must have means to bypass repeated blocks'
 8597  9690         },
 8598  9691         checkboxgroup: {
 8599    -1           description: 'Ensures related <input type="checkbox"> elements have a group and that that group designation is consistent',
   -1  9692           description: 'Ensures related <input type="checkbox"> elements have a group and that the group designation is consistent',
 8600  9693           help: 'Checkbox inputs with the same name attribute value must be part of a group'
 8601  9694         },
 8602  9695         'color-contrast': {
@@ -8623,6 +9716,14 @@ module.exports = {
 8623  9716           description: 'Ensures headings have discernible text',
 8624  9717           help: 'Headings must not be empty'
 8625  9718         },
   -1  9719         'focus-order-semantics': {
   -1  9720           description: 'Ensures elements in the focus order have an appropriate role',
   -1  9721           help: 'Elements in the focus order need a role appropriate for interactive content'
   -1  9722         },
   -1  9723         'frame-tested': {
   -1  9724           description: 'Ensures <iframe> and <frame> elements contain the axe-core script',
   -1  9725           help: 'Frames must be tested with axe-core'
   -1  9726         },
 8626  9727         'frame-title-unique': {
 8627  9728           description: 'Ensures <iframe> and <frame> elements contain a unique title attribute',
 8628  9729           help: 'Frames must have a unique title attribute'
@@ -8639,10 +9740,6 @@ module.exports = {
 8639  9740           description: 'Informs users about hidden content.',
 8640  9741           help: 'Hidden content on the page cannot be analyzed'
 8641  9742         },
 8642    -1         'href-no-hash': {
 8643    -1           description: 'Ensures that href values are valid link references to promote only using anchors as links',
 8644    -1           help: 'Anchors must only be used as links with valid URLs or URL fragments'
 8645    -1         },
 8646  9743         'html-has-lang': {
 8647  9744           description: 'Ensures every HTML document has a lang attribute',
 8648  9745           help: '<html> element must have a lang attribute'
@@ -8671,13 +9768,29 @@ module.exports = {
 8671  9768           description: 'Ensures every form element has a label',
 8672  9769           help: 'Form elements must have labels'
 8673  9770         },
   -1  9771         'landmark-banner-is-top-level': {
   -1  9772           description: 'The banner landmark should not be contained in another landmark',
   -1  9773           help: 'Banner landmark must be at top level'
   -1  9774         },
   -1  9775         'landmark-contentinfo-is-top-level': {
   -1  9776           description: 'The contentinfo landmark should not be contained in another landmark',
   -1  9777           help: 'Contentinfo landmark must be at top level'
   -1  9778         },
 8674  9779         'landmark-main-is-top-level': {
 8675  9780           description: 'The main landmark should not be contained in another landmark',
 8676  9781           help: 'Main landmark is not at top level'
 8677  9782         },
   -1  9783         'landmark-no-duplicate-banner': {
   -1  9784           description: 'Ensures the document has no more than one banner landmark',
   -1  9785           help: 'Document contain at most one banner landmark'
   -1  9786         },
   -1  9787         'landmark-no-duplicate-contentinfo': {
   -1  9788           description: 'Ensures the document has no more than one contentinfo landmark',
   -1  9789           help: 'Document contain at most one contentinfo landmark'
   -1  9790         },
 8678  9791         'landmark-one-main': {
 8679    -1           description: 'Ensures a navigation point to the primary content of the page. If the page contains iframes, each iframe should contain either no main landmarks or just one.',
 8680    -1           help: 'Page must contain one main landmark.'
   -1  9792           description: 'Ensures a navigation point to the primary content of the page. If the page contains iframes, each iframe should contain either no main landmarks or just one',
   -1  9793           help: 'Page must contain one main landmark'
 8681  9794         },
 8682  9795         'layout-table': {
 8683  9796           description: 'Ensures presentational <table> elements do not use <th>, <caption> elements or the summary attribute',
@@ -8723,6 +9836,10 @@ module.exports = {
 8723  9836           description: 'Ensure p elements are not used to style headings',
 8724  9837           help: 'Bold, italic text and font-size are not used to style p elements as a heading'
 8725  9838         },
   -1  9839         'page-has-heading-one': {
   -1  9840           description: 'Ensure that the page, or at least one of its frames contains a level-one heading',
   -1  9841           help: 'Page must contain a level-one heading'
   -1  9842         },
 8726  9843         radiogroup: {
 8727  9844           description: 'Ensures related <input type="radio"> elements have a group and that the group designation is consistent',
 8728  9845           help: 'Radio inputs with the same name attribute value must be part of a group'
@@ -8740,8 +9857,8 @@ module.exports = {
 8740  9857           help: 'Server-side image maps must not be used'
 8741  9858         },
 8742  9859         'skip-link': {
 8743    -1           description: 'Ensures the first link on the page is a skip link',
 8744    -1           help: 'The page should have a skip link as its first link'
   -1  9860           description: 'Ensure all skip links have a focusable target',
   -1  9861           help: 'The skip-link target should exist and be focusable'
 8745  9862         },
 8746  9863         tabindex: {
 8747  9864           description: 'Ensures tabindex attribute values are not greater than 0',
@@ -8867,6 +9984,19 @@ module.exports = {
 8867  9984             }
 8868  9985           }
 8869  9986         },
   -1  9987         'implicit-role-fallback': {
   -1  9988           impact: 'moderate',
   -1  9989           messages: {
   -1  9990             pass: function anonymous(it) {
   -1  9991               var out = 'Element’s implicit ARIA role is an appropriate fallback';
   -1  9992               return out;
   -1  9993             },
   -1  9994             fail: function anonymous(it) {
   -1  9995               var out = 'Element’s implicit ARIA role is not a good fallback for the (unsupported) role';
   -1  9996               return out;
   -1  9997             }
   -1  9998           }
   -1  9999         },
 8870 10000         'aria-hidden-body': {
 8871 10001           impact: 'critical',
 8872 10002           messages: {
@@ -8919,6 +10049,18 @@ module.exports = {
 8919 10049                 }
 8920 10050               }
 8921 10051               return out;
   -1 10052             },
   -1 10053             incomplete: function anonymous(it) {
   -1 10054               var out = 'Expecting ARIA ' + (it.data && it.data.length > 1 ? 'children' : 'child') + ' role to be added:';
   -1 10055               var arr1 = it.data;
   -1 10056               if (arr1) {
   -1 10057                 var value, i1 = -1, l1 = arr1.length - 1;
   -1 10058                 while (i1 < l1) {
   -1 10059                   value = arr1[i1 += 1];
   -1 10060                   out += ' ' + value;
   -1 10061                 }
   -1 10062               }
   -1 10063               return out;
 8922 10064             }
 8923 10065           }
 8924 10066         },
@@ -9328,7 +10470,50 @@ module.exports = {
 9328 10470             }
 9329 10471           }
 9330 10472         },
 9331    -1         'unique-frame-title': {
   -1 10473         'has-widget-role': {
   -1 10474           impact: 'minor',
   -1 10475           messages: {
   -1 10476             pass: function anonymous(it) {
   -1 10477               var out = 'Element has a widget role.';
   -1 10478               return out;
   -1 10479             },
   -1 10480             fail: function anonymous(it) {
   -1 10481               var out = 'Element does not have a widget role.';
   -1 10482               return out;
   -1 10483             }
   -1 10484           }
   -1 10485         },
   -1 10486         'valid-scrollable-semantics': {
   -1 10487           impact: 'minor',
   -1 10488           messages: {
   -1 10489             pass: function anonymous(it) {
   -1 10490               var out = 'Element has valid semantics for an element in the focus order.';
   -1 10491               return out;
   -1 10492             },
   -1 10493             fail: function anonymous(it) {
   -1 10494               var out = 'Element has invalid semantics for an element in the focus order.';
   -1 10495               return out;
   -1 10496             }
   -1 10497           }
   -1 10498         },
   -1 10499         'frame-tested': {
   -1 10500           impact: 'critical',
   -1 10501           messages: {
   -1 10502             pass: function anonymous(it) {
   -1 10503               var out = 'The iframe was tested with axe-core';
   -1 10504               return out;
   -1 10505             },
   -1 10506             fail: function anonymous(it) {
   -1 10507               var out = 'The iframe could not be tested with axe-core';
   -1 10508               return out;
   -1 10509             },
   -1 10510             incomplete: function anonymous(it) {
   -1 10511               var out = 'The iframe still has to be tested with axe-core';
   -1 10512               return out;
   -1 10513             }
   -1 10514           }
   -1 10515         },
   -1 10516         'unique-frame-title': {
 9332 10517           impact: 'serious',
 9333 10518           messages: {
 9334 10519             pass: function anonymous(it) {
@@ -9371,19 +10556,6 @@ module.exports = {
 9371 10556             }
 9372 10557           }
 9373 10558         },
 9374    -1         'href-no-hash': {
 9375    -1           impact: 'moderate',
 9376    -1           messages: {
 9377    -1             pass: function anonymous(it) {
 9378    -1               var out = 'Anchor does not have an href value of #';
 9379    -1               return out;
 9380    -1             },
 9381    -1             fail: function anonymous(it) {
 9382    -1               var out = 'Anchor has an href value of #';
 9383    -1               return out;
 9384    -1             }
 9385    -1           }
 9386    -1         },
 9387 10559         'has-lang': {
 9388 10560           impact: 'serious',
 9389 10561           messages: {
@@ -9501,33 +10673,59 @@ module.exports = {
 9501 10673             }
 9502 10674           }
 9503 10675         },
 9504    -1         'main-is-top-level': {
   -1 10676         'landmark-is-top-level': {
   -1 10677           impact: 'moderate',
   -1 10678           messages: {
   -1 10679             pass: function anonymous(it) {
   -1 10680               var out = 'The ' + it.data.role + ' landmark is at the top level.';
   -1 10681               return out;
   -1 10682             },
   -1 10683             fail: function anonymous(it) {
   -1 10684               var out = 'The ' + it.data.role + ' landmark is contained in another landmark.';
   -1 10685               return out;
   -1 10686             }
   -1 10687           }
   -1 10688         },
   -1 10689         'page-no-duplicate-banner': {
   -1 10690           impact: 'moderate',
   -1 10691           messages: {
   -1 10692             pass: function anonymous(it) {
   -1 10693               var out = 'Document has no more than one banner landmark';
   -1 10694               return out;
   -1 10695             },
   -1 10696             fail: function anonymous(it) {
   -1 10697               var out = 'Document has more than one banner landmark';
   -1 10698               return out;
   -1 10699             }
   -1 10700           }
   -1 10701         },
   -1 10702         'page-no-duplicate-contentinfo': {
 9505 10703           impact: 'moderate',
 9506 10704           messages: {
 9507 10705             pass: function anonymous(it) {
 9508    -1               var out = 'The main landmark is at the top level.';
   -1 10706               var out = 'Document has no more than one contentinfo landmark';
 9509 10707               return out;
 9510 10708             },
 9511 10709             fail: function anonymous(it) {
 9512    -1               var out = 'The main landmark is contained in another landmark.';
   -1 10710               var out = 'Document has more than one contentinfo landmark';
 9513 10711               return out;
 9514 10712             }
 9515 10713           }
 9516 10714         },
 9517    -1         'has-at-least-one-main': {
   -1 10715         'page-has-main': {
 9518 10716           impact: 'moderate',
 9519 10717           messages: {
 9520 10718             pass: function anonymous(it) {
 9521    -1               var out = 'Document has at least one main landmark';
   -1 10719               var out = 'Page has at least one main landmark';
 9522 10720               return out;
 9523 10721             },
 9524 10722             fail: function anonymous(it) {
 9525    -1               var out = 'Document has no main landmarks';
   -1 10723               var out = 'Page must have a main landmark';
 9526 10724               return out;
 9527 10725             }
 9528 10726           }
 9529 10727         },
 9530    -1         'has-no-more-than-one-main': {
   -1 10728         'page-no-duplicate-main': {
 9531 10729           impact: 'moderate',
 9532 10730           messages: {
 9533 10731             pass: function anonymous(it) {
@@ -9583,11 +10781,11 @@ module.exports = {
 9583 10781           impact: 'serious',
 9584 10782           messages: {
 9585 10783             pass: function anonymous(it) {
 9586    -1               var out = 'Links can be distinguished from surrounding text in a way that does not rely on color';
   -1 10784               var out = 'Links can be distinguished from surrounding text in some way other than by color';
 9587 10785               return out;
 9588 10786             },
 9589 10787             fail: function anonymous(it) {
 9590    -1               var out = 'Links can not be distinguished from surrounding text in a way that does not rely on color';
   -1 10788               var out = 'Links need to be distinguished from surrounding text in some way other than by color';
 9591 10789               return out;
 9592 10790             },
 9593 10791             incomplete: {
@@ -9678,6 +10876,19 @@ module.exports = {
 9678 10876             }
 9679 10877           }
 9680 10878         },
   -1 10879         'page-has-heading-one': {
   -1 10880           impact: 'moderate',
   -1 10881           messages: {
   -1 10882             pass: function anonymous(it) {
   -1 10883               var out = 'Page has at least one level-one heading';
   -1 10884               return out;
   -1 10885             },
   -1 10886             fail: function anonymous(it) {
   -1 10887               var out = 'Page must have a level-one heading';
   -1 10888               return out;
   -1 10889             }
   -1 10890           }
   -1 10891         },
 9681 10892         region: {
 9682 10893           impact: 'moderate',
 9683 10894           messages: {
@@ -9734,11 +10945,15 @@ module.exports = {
 9734 10945           impact: 'moderate',
 9735 10946           messages: {
 9736 10947             pass: function anonymous(it) {
 9737    -1               var out = 'Valid skip link found';
   -1 10948               var out = 'Skip link target exists';
   -1 10949               return out;
   -1 10950             },
   -1 10951             incomplete: function anonymous(it) {
   -1 10952               var out = 'Skip link target should become visible on activation';
 9738 10953               return out;
 9739 10954             },
 9740 10955             fail: function anonymous(it) {
 9741    -1               var out = 'No valid skip link found';
   -1 10956               var out = 'No skip link target';
 9742 10957               return out;
 9743 10958             }
 9744 10959           }
@@ -9882,7 +11097,7 @@ module.exports = {
 9882 11097       id: 'accesskeys',
 9883 11098       selector: '[accesskey]',
 9884 11099       excludeHidden: false,
 9885    -1       tags: [ 'wcag2a', 'wcag211', 'cat.keyboard' ],
   -1 11100       tags: [ 'best-practice', 'cat.keyboard' ],
 9886 11101       all: [],
 9887 11102       any: [],
 9888 11103       none: [ 'accesskeys' ]
@@ -9896,7 +11111,7 @@ module.exports = {
 9896 11111       none: []
 9897 11112     }, {
 9898 11113       id: 'aria-allowed-attr',
 9899    -1       matches: function matches(node) {
   -1 11114       matches: function matches(node, virtualNode) {
 9900 11115         var role = node.getAttribute('role');
 9901 11116         if (!role) {
 9902 11117           role = axe.commons.aria.implicitRole(node);
@@ -9920,6 +11135,17 @@ module.exports = {
 9920 11135       any: [ 'aria-allowed-attr' ],
 9921 11136       none: []
 9922 11137     }, {
   -1 11138       id: 'aria-dpub-role-fallback',
   -1 11139       selector: '[role]',
   -1 11140       matches: function matches(node, virtualNode) {
   -1 11141         var role = node.getAttribute('role');
   -1 11142         return [ 'doc-backlink', 'doc-biblioentry', 'doc-biblioref', 'doc-cover', 'doc-endnote', 'doc-glossref', 'doc-noteref' ].includes(role);
   -1 11143       },
   -1 11144       tags: [ 'cat.aria', 'wcag2a', 'wcag131' ],
   -1 11145       all: [ 'implicit-role-fallback' ],
   -1 11146       any: [],
   -1 11147       none: []
   -1 11148     }, {
 9923 11149       id: 'aria-hidden-body',
 9924 11150       selector: 'body',
 9925 11151       excludeHidden: false,
@@ -9939,7 +11165,12 @@ module.exports = {
 9939 11165       selector: '[role]',
 9940 11166       tags: [ 'cat.aria', 'wcag2a', 'wcag131' ],
 9941 11167       all: [],
 9942    -1       any: [ 'aria-required-children' ],
   -1 11168       any: [ {
   -1 11169         options: {
   -1 11170           reviewEmpty: [ 'listbox' ]
   -1 11171         },
   -1 11172         id: 'aria-required-children'
   -1 11173       } ],
 9943 11174       none: []
 9944 11175     }, {
 9945 11176       id: 'aria-required-parent',
@@ -9957,7 +11188,7 @@ module.exports = {
 9957 11188       none: [ 'invalidrole', 'abstractrole' ]
 9958 11189     }, {
 9959 11190       id: 'aria-valid-attr-value',
 9960    -1       matches: function matches(node) {
   -1 11191       matches: function matches(node, virtualNode) {
 9961 11192         var aria = /^aria-/;
 9962 11193         if (node.hasAttributes()) {
 9963 11194           var attrs = node.attributes;
@@ -9978,7 +11209,7 @@ module.exports = {
 9978 11209       none: []
 9979 11210     }, {
 9980 11211       id: 'aria-valid-attr',
 9981    -1       matches: function matches(node) {
   -1 11212       matches: function matches(node, virtualNode) {
 9982 11213         var aria = /^aria-/;
 9983 11214         if (node.hasAttributes()) {
 9984 11215           var attrs = node.attributes;
@@ -10001,7 +11232,7 @@ module.exports = {
10001 11232       id: 'audio-caption',
10002 11233       selector: 'audio',
10003 11234       excludeHidden: false,
10004    -1       tags: [ 'cat.time-and-media', 'wcag2a', 'wcag122', 'section508', 'section508.22.a' ],
   -1 11235       tags: [ 'cat.time-and-media', 'wcag2a', 'wcag121', 'section508', 'section508.22.a' ],
10005 11236       all: [],
10006 11237       any: [],
10007 11238       none: [ 'caption' ]
@@ -10018,13 +11249,13 @@ module.exports = {
10018 11249       selector: 'button, [role="button"], input[type="button"], input[type="submit"], input[type="reset"]',
10019 11250       tags: [ 'cat.name-role-value', 'wcag2a', 'wcag412', 'section508', 'section508.22.a' ],
10020 11251       all: [],
10021    -1       any: [ 'non-empty-if-present', 'non-empty-value', 'button-has-visible-text', 'aria-label', 'aria-labelledby', 'role-presentation', 'role-none' ],
   -1 11252       any: [ 'non-empty-if-present', 'non-empty-value', 'button-has-visible-text', 'aria-label', 'aria-labelledby', 'role-presentation', 'role-none', 'non-empty-title' ],
10022 11253       none: [ 'focusable-no-name' ]
10023 11254     }, {
10024 11255       id: 'bypass',
10025 11256       selector: 'html',
10026 11257       pageLevel: true,
10027    -1       matches: function matches(node) {
   -1 11258       matches: function matches(node, virtualNode) {
10028 11259         return !!node.querySelector('a[href]');
10029 11260       },
10030 11261       tags: [ 'cat.keyboard', 'wcag2a', 'wcag241', 'section508', 'section508.22.o' ],
@@ -10040,9 +11271,9 @@ module.exports = {
10040 11271       none: []
10041 11272     }, {
10042 11273       id: 'color-contrast',
10043    -1       matches: function matches(node) {
10044    -1         var nodeName = node.nodeName.toUpperCase(), nodeType = node.type, doc = document;
10045    -1         if (node.getAttribute('aria-disabled') === 'true' || axe.commons.dom.findUp(node, '[aria-disabled="true"]')) {
   -1 11274       matches: function matches(node, virtualNode) {
   -1 11275         var nodeName = node.nodeName.toUpperCase(), nodeType = node.type;
   -1 11276         if (node.getAttribute('aria-disabled') === 'true' || axe.commons.dom.findUpVirtual(virtualNode, '[aria-disabled="true"]')) {
10046 11277           return false;
10047 11278         }
10048 11279         if (nodeName === 'INPUT') {
@@ -10057,42 +11288,46 @@ module.exports = {
10057 11288         if (nodeName === 'OPTION') {
10058 11289           return false;
10059 11290         }
10060    -1         if (nodeName === 'BUTTON' && node.disabled || axe.commons.dom.findUp(node, 'button[disabled]')) {
   -1 11291         if (nodeName === 'BUTTON' && node.disabled || axe.commons.dom.findUpVirtual(virtualNode, 'button[disabled]')) {
10061 11292           return false;
10062 11293         }
10063    -1         if (nodeName === 'FIELDSET' && node.disabled || axe.commons.dom.findUp(node, 'fieldset[disabled]')) {
   -1 11294         if (nodeName === 'FIELDSET' && node.disabled || axe.commons.dom.findUpVirtual(virtualNode, 'fieldset[disabled]')) {
10064 11295           return false;
10065 11296         }
10066    -1         var nodeParentLabel = axe.commons.dom.findUp(node, 'label');
   -1 11297         var nodeParentLabel = axe.commons.dom.findUpVirtual(virtualNode, 'label');
10067 11298         if (nodeName === 'LABEL' || nodeParentLabel) {
10068 11299           var relevantNode = node;
   -1 11300           var relevantVirtualNode = virtualNode;
10069 11301           if (nodeParentLabel) {
10070 11302             relevantNode = nodeParentLabel;
   -1 11303             relevantVirtualNode = axe.utils.getNodeFromTree(axe._tree[0], nodeParentLabel);
10071 11304           }
   -1 11305           var doc = axe.commons.dom.getRootNode(relevantNode);
10072 11306           var candidate = relevantNode.htmlFor && doc.getElementById(relevantNode.htmlFor);
10073 11307           if (candidate && candidate.disabled) {
10074 11308             return false;
10075 11309           }
10076    -1           var candidate = relevantNode.querySelector('input:not([type="hidden"]):not([type="image"])' + ':not([type="button"]):not([type="submit"]):not([type="reset"]), select, textarea');
10077    -1           if (candidate && candidate.disabled) {
   -1 11310           var candidate = axe.utils.querySelectorAll(relevantVirtualNode, 'input:not([type="hidden"]):not([type="image"])' + ':not([type="button"]):not([type="submit"]):not([type="reset"]), select, textarea');
   -1 11311           if (candidate.length && candidate[0].actualNode.disabled) {
10078 11312             return false;
10079 11313           }
10080 11314         }
10081 11315         if (node.getAttribute('id')) {
10082 11316           var id = axe.commons.utils.escapeSelector(node.getAttribute('id'));
10083    -1           var _candidate = doc.querySelector('[aria-labelledby~="' + id + '"]');
10084    -1           if (_candidate && _candidate.hasAttribute('disabled')) {
   -1 11317           var _doc = axe.commons.dom.getRootNode(node);
   -1 11318           var candidate = _doc.querySelector('[aria-labelledby~=' + id + ']');
   -1 11319           if (candidate && candidate.disabled) {
10085 11320             return false;
10086 11321           }
10087 11322         }
10088    -1         if (axe.commons.text.visible(node, false, true) === '') {
   -1 11323         if (axe.commons.text.visibleVirtual(virtualNode, false, true) === '') {
10089 11324           return false;
10090 11325         }
10091    -1         var range = document.createRange(), childNodes = node.childNodes, length = childNodes.length, child, index;
   -1 11326         var range = document.createRange(), childNodes = virtualNode.children, length = childNodes.length, child, index;
10092 11327         for (index = 0; index < length; index++) {
10093 11328           child = childNodes[index];
10094    -1           if (child.nodeType === 3 && axe.commons.text.sanitize(child.nodeValue) !== '') {
10095    -1             range.selectNodeContents(child);
   -1 11329           if (child.actualNode.nodeType === 3 && axe.commons.text.sanitize(child.actualNode.nodeValue) !== '') {
   -1 11330             range.selectNodeContents(child.actualNode);
10096 11331           }
10097 11332         }
10098 11333         var rects = range.getClientRects();
@@ -10114,14 +11349,20 @@ module.exports = {
10114 11349       none: []
10115 11350     }, {
10116 11351       id: 'definition-list',
10117    -1       selector: 'dl:not([role])',
   -1 11352       selector: 'dl',
   -1 11353       matches: function matches(node, virtualNode) {
   -1 11354         return !node.getAttribute('role');
   -1 11355       },
10118 11356       tags: [ 'cat.structure', 'wcag2a', 'wcag131' ],
10119 11357       all: [],
10120 11358       any: [],
10121 11359       none: [ 'structured-dlitems', 'only-dlitems' ]
10122 11360     }, {
10123 11361       id: 'dlitem',
10124    -1       selector: 'dd:not([role]), dt:not([role])',
   -1 11362       selector: 'dd, dt',
   -1 11363       matches: function matches(node, virtualNode) {
   -1 11364         return !node.getAttribute('role');
   -1 11365       },
10125 11366       tags: [ 'cat.structure', 'wcag2a', 'wcag131' ],
10126 11367       all: [],
10127 11368       any: [ 'dlitem' ],
@@ -10129,7 +11370,7 @@ module.exports = {
10129 11370     }, {
10130 11371       id: 'document-title',
10131 11372       selector: 'html',
10132    -1       matches: function matches(node) {
   -1 11373       matches: function matches(node, virtualNode) {
10133 11374         return node.ownerDocument.defaultView.self === node.ownerDocument.defaultView.top;
10134 11375       },
10135 11376       tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag242' ],
@@ -10147,15 +11388,53 @@ module.exports = {
10147 11388     }, {
10148 11389       id: 'empty-heading',
10149 11390       selector: 'h1, h2, h3, h4, h5, h6, [role="heading"]',
10150    -1       enabled: true,
   -1 11391       matches: function matches(node, virtualNode) {
   -1 11392         var explicitRoles = void 0;
   -1 11393         if (node.hasAttribute('role')) {
   -1 11394           explicitRoles = node.getAttribute('role').split(/\s+/i).filter(axe.commons.aria.isValidRole);
   -1 11395         }
   -1 11396         if (explicitRoles && explicitRoles.length > 0) {
   -1 11397           return explicitRoles.includes('heading');
   -1 11398         } else {
   -1 11399           return axe.commons.aria.implicitRole(node) === 'heading';
   -1 11400         }
   -1 11401       },
10151 11402       tags: [ 'cat.name-role-value', 'best-practice' ],
10152 11403       all: [],
10153    -1       any: [ 'has-visible-text', 'role-presentation', 'role-none' ],
   -1 11404       any: [ 'has-visible-text' ],
   -1 11405       none: []
   -1 11406     }, {
   -1 11407       id: 'focus-order-semantics',
   -1 11408       selector: 'div, h1, h2, h3, h4, h5, h6, [role=heading], p, span',
   -1 11409       matches: function matches(node, virtualNode) {
   -1 11410         return axe.commons.dom.insertedIntoFocusOrder(node);
   -1 11411       },
   -1 11412       tags: [ 'cat.keyboard', 'best-practice', 'experimental' ],
   -1 11413       all: [],
   -1 11414       any: [ {
   -1 11415         options: [],
   -1 11416         id: 'has-widget-role'
   -1 11417       }, {
   -1 11418         options: [],
   -1 11419         id: 'valid-scrollable-semantics'
   -1 11420       } ],
   -1 11421       none: []
   -1 11422     }, {
   -1 11423       id: 'frame-tested',
   -1 11424       selector: 'frame, iframe',
   -1 11425       tags: [ 'cat.structure', 'review-item' ],
   -1 11426       all: [ {
   -1 11427         options: {
   -1 11428           isViolation: false
   -1 11429         },
   -1 11430         id: 'frame-tested'
   -1 11431       } ],
   -1 11432       any: [],
10154 11433       none: []
10155 11434     }, {
10156 11435       id: 'frame-title-unique',
10157    -1       selector: 'frame[title]:not([title=\'\']), iframe[title]:not([title=\'\'])',
10158    -1       matches: function matches(node) {
   -1 11436       selector: 'frame[title], iframe[title]',
   -1 11437       matches: function matches(node, virtualNode) {
10159 11438         var title = node.getAttribute('title');
10160 11439         return !!(title ? axe.commons.text.sanitize(title).trim() : '');
10161 11440       },
@@ -10166,14 +11445,24 @@ module.exports = {
10166 11445     }, {
10167 11446       id: 'frame-title',
10168 11447       selector: 'frame, iframe',
10169    -1       tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag241', 'section508', 'section508.22.i' ],
   -1 11448       tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag241', 'wcag412', 'section508', 'section508.22.i' ],
10170 11449       all: [],
10171 11450       any: [ 'aria-label', 'aria-labelledby', 'non-empty-title', 'role-presentation', 'role-none' ],
10172 11451       none: []
10173 11452     }, {
10174 11453       id: 'heading-order',
10175    -1       selector: 'h1,h2,h3,h4,h5,h6,[role=heading]',
10176    -1       enabled: false,
   -1 11454       selector: 'h1, h2, h3, h4, h5, h6, [role=heading]',
   -1 11455       matches: function matches(node, virtualNode) {
   -1 11456         var explicitRoles = void 0;
   -1 11457         if (node.hasAttribute('role')) {
   -1 11458           explicitRoles = node.getAttribute('role').split(/\s+/i).filter(axe.commons.aria.isValidRole);
   -1 11459         }
   -1 11460         if (explicitRoles && explicitRoles.length > 0) {
   -1 11461           return explicitRoles.includes('heading');
   -1 11462         } else {
   -1 11463           return axe.commons.aria.implicitRole(node) === 'heading';
   -1 11464         }
   -1 11465       },
10177 11466       tags: [ 'cat.semantics', 'best-practice' ],
10178 11467       all: [],
10179 11468       any: [ 'heading-order' ],
@@ -10182,18 +11471,9 @@ module.exports = {
10182 11471       id: 'hidden-content',
10183 11472       selector: '*',
10184 11473       excludeHidden: false,
10185    -1       tags: [ 'experimental', 'review-item' ],
   -1 11474       tags: [ 'cat.structure', 'experimental', 'review-item' ],
10186 11475       all: [],
10187 11476       any: [ 'hidden-content' ],
10188    -1       none: [],
10189    -1       enabled: false
10190    -1     }, {
10191    -1       id: 'href-no-hash',
10192    -1       selector: 'a[href]',
10193    -1       enabled: false,
10194    -1       tags: [ 'cat.semantics', 'best-practice' ],
10195    -1       all: [],
10196    -1       any: [ 'href-no-hash' ],
10197 11477       none: []
10198 11478     }, {
10199 11479       id: 'html-has-lang',
@@ -10211,7 +11491,7 @@ module.exports = {
10211 11491       none: [ 'valid-lang' ]
10212 11492     }, {
10213 11493       id: 'image-alt',
10214    -1       selector: 'img, [role=\'img\']',
   -1 11494       selector: 'img, [role=\'img\']:not(svg)',
10215 11495       tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag111', 'section508', 'section508.22.a' ],
10216 11496       all: [],
10217 11497       any: [ 'has-alt', 'aria-label', 'aria-labelledby', 'non-empty-title', 'role-presentation', 'role-none' ],
@@ -10232,38 +11512,110 @@ module.exports = {
10232 11512       none: []
10233 11513     }, {
10234 11514       id: 'label-title-only',
10235    -1       selector: 'input:not([type=\'hidden\']):not([type=\'image\']):not([type=\'button\']):not([type=\'submit\']):not([type=\'reset\']), select, textarea',
10236    -1       enabled: false,
   -1 11515       selector: 'input, select, textarea',
   -1 11516       matches: function matches(node, virtualNode) {
   -1 11517         if (node.nodeName.toLowerCase() !== 'input' || node.hasAttribute('type') === false) {
   -1 11518           return true;
   -1 11519         }
   -1 11520         var type = node.getAttribute('type').toLowerCase();
   -1 11521         return [ 'hidden', 'image', 'button', 'submit', 'reset' ].includes(type) === false;
   -1 11522       },
10237 11523       tags: [ 'cat.forms', 'best-practice' ],
10238 11524       all: [],
10239 11525       any: [],
10240 11526       none: [ 'title-only' ]
10241 11527     }, {
10242 11528       id: 'label',
10243    -1       selector: 'input:not([type=\'hidden\']):not([type=\'image\']):not([type=\'button\']):not([type=\'submit\']):not([type=\'reset\']), select, textarea',
   -1 11529       selector: 'input, select, textarea',
   -1 11530       matches: function matches(node, virtualNode) {
   -1 11531         if (node.nodeName.toLowerCase() !== 'input' || node.hasAttribute('type') === false) {
   -1 11532           return true;
   -1 11533         }
   -1 11534         var type = node.getAttribute('type').toLowerCase();
   -1 11535         return [ 'hidden', 'image', 'button', 'submit', 'reset' ].includes(type) === false;
   -1 11536       },
10244 11537       tags: [ 'cat.forms', 'wcag2a', 'wcag332', 'wcag131', 'section508', 'section508.22.n' ],
10245 11538       all: [],
10246 11539       any: [ 'aria-label', 'aria-labelledby', 'implicit-label', 'explicit-label', 'non-empty-title' ],
10247 11540       none: [ 'help-same-as-label', 'multiple-label' ]
10248 11541     }, {
   -1 11542       id: 'landmark-banner-is-top-level',
   -1 11543       selector: 'header:not([role]), [role=banner]',
   -1 11544       matches: function matches(node, virtualNode) {
   -1 11545         var nativeScopeFilter = 'article, aside, main, nav, section';
   -1 11546         return node.hasAttribute('role') || !axe.commons.dom.findUpVirtual(virtualNode, nativeScopeFilter);
   -1 11547       },
   -1 11548       tags: [ 'cat.semantics', 'best-practice' ],
   -1 11549       all: [],
   -1 11550       any: [ 'landmark-is-top-level' ],
   -1 11551       none: []
   -1 11552     }, {
   -1 11553       id: 'landmark-contentinfo-is-top-level',
   -1 11554       selector: 'footer:not([role]), [role=contentinfo]',
   -1 11555       matches: function matches(node, virtualNode) {
   -1 11556         var nativeScopeFilter = 'article, aside, main, nav, section';
   -1 11557         return node.hasAttribute('role') || !axe.commons.dom.findUpVirtual(virtualNode, nativeScopeFilter);
   -1 11558       },
   -1 11559       tags: [ 'cat.semantics', 'best-practice' ],
   -1 11560       all: [],
   -1 11561       any: [ 'landmark-is-top-level' ],
   -1 11562       none: []
   -1 11563     }, {
10249 11564       id: 'landmark-main-is-top-level',
10250    -1       selector: 'main,[role=main]',
10251    -1       tags: [ 'best-practice' ],
   -1 11565       selector: 'main:not([role]), [role=main]',
   -1 11566       tags: [ 'cat.semantics', 'best-practice' ],
   -1 11567       all: [],
   -1 11568       any: [ 'landmark-is-top-level' ],
   -1 11569       none: []
   -1 11570     }, {
   -1 11571       id: 'landmark-no-duplicate-banner',
   -1 11572       selector: 'html',
   -1 11573       tags: [ 'cat.semantics', 'best-practice' ],
10252 11574       all: [],
10253    -1       any: [ 'main-is-top-level' ],
   -1 11575       any: [ {
   -1 11576         options: {
   -1 11577           selector: 'header:not([role]), [role=banner]',
   -1 11578           nativeScopeFilter: 'article, aside, main, nav, section'
   -1 11579         },
   -1 11580         id: 'page-no-duplicate-banner'
   -1 11581       } ],
   -1 11582       none: []
   -1 11583     }, {
   -1 11584       id: 'landmark-no-duplicate-contentinfo',
   -1 11585       selector: 'html',
   -1 11586       tags: [ 'cat.semantics', 'best-practice' ],
   -1 11587       all: [],
   -1 11588       any: [ {
   -1 11589         options: {
   -1 11590           selector: 'footer:not([role]), [role=contentinfo]',
   -1 11591           nativeScopeFilter: 'article, aside, main, nav, section'
   -1 11592         },
   -1 11593         id: 'page-no-duplicate-contentinfo'
   -1 11594       } ],
10254 11595       none: []
10255 11596     }, {
10256 11597       id: 'landmark-one-main',
10257 11598       selector: 'html',
10258    -1       tags: [ 'best-practice' ],
10259    -1       all: [ 'has-at-least-one-main', 'has-no-more-than-one-main' ],
   -1 11599       tags: [ 'cat.semantics', 'best-practice' ],
   -1 11600       all: [ {
   -1 11601         options: {
   -1 11602           selector: 'main:not([role]), [role=\'main\']'
   -1 11603         },
   -1 11604         id: 'page-has-main'
   -1 11605       }, {
   -1 11606         options: {
   -1 11607           selector: 'main:not([role]), [role=\'main\']'
   -1 11608         },
   -1 11609         id: 'page-no-duplicate-main'
   -1 11610       } ],
10260 11611       any: [],
10261 11612       none: []
10262 11613     }, {
10263 11614       id: 'layout-table',
10264 11615       selector: 'table',
10265    -1       matches: function matches(node) {
10266    -1         return !axe.commons.table.isDataTable(node);
   -1 11616       matches: function matches(node, virtualNode) {
   -1 11617         var role = (node.getAttribute('role') || '').toLowerCase();
   -1 11618         return !((role === 'presentation' || role === 'none') && !axe.commons.dom.isFocusable(node)) && !axe.commons.table.isDataTable(node);
10267 11619       },
10268 11620       tags: [ 'cat.semantics', 'wcag2a', 'wcag131' ],
10269 11621       all: [],
@@ -10271,9 +11623,13 @@ module.exports = {
10271 11623       none: [ 'has-th', 'has-caption', 'has-summary' ]
10272 11624     }, {
10273 11625       id: 'link-in-text-block',
10274    -1       selector: 'a[href]:not([role]), *[role=link]',
10275    -1       matches: function matches(node) {
   -1 11626       selector: 'a[href], [role=link]',
   -1 11627       matches: function matches(node, virtualNode) {
10276 11628         var text = axe.commons.text.sanitize(node.textContent);
   -1 11629         var role = node.getAttribute('role');
   -1 11630         if (role && role !== 'link') {
   -1 11631           return false;
   -1 11632         }
10277 11633         if (!text) {
10278 11634           return false;
10279 11635         }
@@ -10289,21 +11645,30 @@ module.exports = {
10289 11645       none: []
10290 11646     }, {
10291 11647       id: 'link-name',
10292    -1       selector: 'a[href]:not([role="button"]), [role=link][href]',
10293    -1       tags: [ 'cat.name-role-value', 'wcag2a', 'wcag111', 'wcag412', 'wcag244', 'section508', 'section508.22.a' ],
   -1 11648       selector: 'a[href], [role=link][href]',
   -1 11649       matches: function matches(node, virtualNode) {
   -1 11650         return node.getAttribute('role') !== 'button';
   -1 11651       },
   -1 11652       tags: [ 'cat.name-role-value', 'wcag2a', 'wcag412', 'wcag244', 'section508', 'section508.22.a' ],
10294 11653       all: [],
10295 11654       any: [ 'has-visible-text', 'aria-label', 'aria-labelledby', 'role-presentation', 'role-none' ],
10296 11655       none: [ 'focusable-no-name' ]
10297 11656     }, {
10298 11657       id: 'list',
10299    -1       selector: 'ul:not([role]), ol:not([role])',
   -1 11658       selector: 'ul, ol',
   -1 11659       matches: function matches(node, virtualNode) {
   -1 11660         return !node.getAttribute('role');
   -1 11661       },
10300 11662       tags: [ 'cat.structure', 'wcag2a', 'wcag131' ],
10301 11663       all: [],
10302 11664       any: [],
10303 11665       none: [ 'only-listitems' ]
10304 11666     }, {
10305 11667       id: 'listitem',
10306    -1       selector: 'li:not([role])',
   -1 11668       selector: 'li',
   -1 11669       matches: function matches(node, virtualNode) {
   -1 11670         return !node.getAttribute('role');
   -1 11671       },
10307 11672       tags: [ 'cat.structure', 'wcag2a', 'wcag131' ],
10308 11673       all: [],
10309 11674       any: [ 'listitem' ],
@@ -10361,7 +11726,7 @@ module.exports = {
10361 11726     }, {
10362 11727       id: 'p-as-heading',
10363 11728       selector: 'p',
10364    -1       matches: function matches(node) {
   -1 11729       matches: function matches(node, virtualNode) {
10365 11730         var children = Array.from(node.parentNode.childNodes);
10366 11731         var nodeText = node.textContent.trim();
10367 11732         var isSentence = /[.!?:;](?![.!?:;])/g;
@@ -10394,6 +11759,18 @@ module.exports = {
10394 11759       any: [],
10395 11760       none: []
10396 11761     }, {
   -1 11762       id: 'page-has-heading-one',
   -1 11763       selector: 'html',
   -1 11764       tags: [ 'cat.semantics', 'best-practice' ],
   -1 11765       all: [ {
   -1 11766         options: {
   -1 11767           selector: 'h1:not([role]), [role="heading"][aria-level="1"]'
   -1 11768         },
   -1 11769         id: 'page-has-heading-one'
   -1 11770       } ],
   -1 11771       any: [],
   -1 11772       none: []
   -1 11773     }, {
10397 11774       id: 'radiogroup',
10398 11775       selector: 'input[type=radio][name]',
10399 11776       tags: [ 'cat.forms', 'best-practice' ],
@@ -10404,7 +11781,6 @@ module.exports = {
10404 11781       id: 'region',
10405 11782       selector: 'html',
10406 11783       pageLevel: true,
10407    -1       enabled: false,
10408 11784       tags: [ 'cat.keyboard', 'best-practice' ],
10409 11785       all: [],
10410 11786       any: [ 'region' ],
@@ -10412,7 +11788,6 @@ module.exports = {
10412 11788     }, {
10413 11789       id: 'scope-attr-valid',
10414 11790       selector: 'td[scope], th[scope]',
10415    -1       enabled: true,
10416 11791       tags: [ 'cat.tables', 'best-practice' ],
10417 11792       all: [ 'html5-scope', 'scope-value' ],
10418 11793       any: [],
@@ -10427,8 +11802,9 @@ module.exports = {
10427 11802     }, {
10428 11803       id: 'skip-link',
10429 11804       selector: 'a[href]',
10430    -1       pageLevel: true,
10431    -1       enabled: false,
   -1 11805       matches: function matches(node, virtualNode) {
   -1 11806         return /^#[^/!]/.test(node.getAttribute('href'));
   -1 11807       },
10432 11808       tags: [ 'cat.keyboard', 'best-practice' ],
10433 11809       all: [],
10434 11810       any: [ 'skip-link' ],
@@ -10450,7 +11826,7 @@ module.exports = {
10450 11826     }, {
10451 11827       id: 'table-fake-caption',
10452 11828       selector: 'table',
10453    -1       matches: function matches(node) {
   -1 11829       matches: function matches(node, virtualNode) {
10454 11830         return axe.commons.table.isDataTable(node);
10455 11831       },
10456 11832       tags: [ 'cat.tables', 'experimental', 'wcag2a', 'wcag131', 'section508', 'section508.22.g' ],
@@ -10460,7 +11836,7 @@ module.exports = {
10460 11836     }, {
10461 11837       id: 'td-has-header',
10462 11838       selector: 'table',
10463    -1       matches: function matches(node) {
   -1 11839       matches: function matches(node, virtualNode) {
10464 11840         if (axe.commons.table.isDataTable(node)) {
10465 11841           var tableArray = axe.commons.table.toArray(node);
10466 11842           return tableArray.length >= 3 && tableArray[0].length >= 3 && tableArray[1].length >= 3 && tableArray[2].length >= 3;
@@ -10481,7 +11857,7 @@ module.exports = {
10481 11857     }, {
10482 11858       id: 'th-has-data-cells',
10483 11859       selector: 'table',
10484    -1       matches: function matches(node) {
   -1 11860       matches: function matches(node, virtualNode) {
10485 11861         return axe.commons.table.isDataTable(node);
10486 11862       },
10487 11863       tags: [ 'cat.tables', 'wcag2a', 'wcag131', 'section508', 'section508.22.g' ],
@@ -10490,7 +11866,10 @@ module.exports = {
10490 11866       none: []
10491 11867     }, {
10492 11868       id: 'valid-lang',
10493    -1       selector: '[lang]:not(html), [xml\\:lang]:not(html)',
   -1 11869       selector: '[lang], [xml\\:lang]',
   -1 11870       matches: function matches(node, virtualNode) {
   -1 11871         return node.nodeName.toLowerCase() !== 'html';
   -1 11872       },
10494 11873       tags: [ 'cat.language', 'wcag2aa', 'wcag312' ],
10495 11874       all: [],
10496 11875       any: [],
@@ -10499,7 +11878,7 @@ module.exports = {
10499 11878       id: 'video-caption',
10500 11879       selector: 'video',
10501 11880       excludeHidden: false,
10502    -1       tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag122', 'wcag123', 'section508', 'section508.22.a' ],
   -1 11881       tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag122', 'section508', 'section508.22.a' ],
10503 11882       all: [],
10504 11883       any: [],
10505 11884       none: [ 'caption' ]
@@ -10514,23 +11893,27 @@ module.exports = {
10514 11893     } ],
10515 11894     checks: [ {
10516 11895       id: 'abstractrole',
10517    -1       evaluate: function evaluate(node, options) {
   -1 11896       evaluate: function evaluate(node, options, virtualNode) {
10518 11897         return axe.commons.aria.getRoleType(node.getAttribute('role')) === 'abstract';
10519 11898       }
10520 11899     }, {
10521 11900       id: 'aria-allowed-attr',
10522    -1       evaluate: function evaluate(node, options) {
   -1 11901       evaluate: function evaluate(node, options, virtualNode) {
   -1 11902         options = options || {};
10523 11903         var invalid = [];
10524 11904         var attr, attrName, allowed, role = node.getAttribute('role'), attrs = node.attributes;
10525 11905         if (!role) {
10526 11906           role = axe.commons.aria.implicitRole(node);
10527 11907         }
10528 11908         allowed = axe.commons.aria.allowedAttr(role);
   -1 11909         if (Array.isArray(options[role])) {
   -1 11910           allowed = axe.utils.uniqueArray(options[role].concat(allowed));
   -1 11911         }
10529 11912         if (role && allowed) {
10530 11913           for (var i = 0, l = attrs.length; i < l; i++) {
10531 11914             attr = attrs[i];
10532 11915             attrName = attr.name;
10533    -1             if (axe.commons.aria.validateAttr(attrName) && allowed.indexOf(attrName) === -1) {
   -1 11916             if (axe.commons.aria.validateAttr(attrName) && !allowed.includes(attrName)) {
10534 11917               invalid.push(attrName + '="' + attr.nodeValue + '"');
10535 11918             }
10536 11919           }
@@ -10543,15 +11926,15 @@ module.exports = {
10543 11926       }
10544 11927     }, {
10545 11928       id: 'aria-hidden-body',
10546    -1       evaluate: function evaluate(node, options) {
   -1 11929       evaluate: function evaluate(node, options, virtualNode) {
10547 11930         return node.getAttribute('aria-hidden') !== 'true';
10548 11931       }
10549 11932     }, {
10550 11933       id: 'aria-errormessage',
10551    -1       evaluate: function evaluate(node, options) {
   -1 11934       evaluate: function evaluate(node, options, virtualNode) {
10552 11935         options = Array.isArray(options) ? options : [];
10553 11936         var attr = node.getAttribute('aria-errormessage'), hasAttr = node.hasAttribute('aria-errormessage');
10554    -1         var doc = document;
   -1 11937         var doc = axe.commons.dom.getRootNode(node);
10555 11938         function validateAttrValue() {
10556 11939           var idref = attr && doc.getElementById(attr);
10557 11940           if (idref) {
@@ -10567,16 +11950,41 @@ module.exports = {
10567 11950         return true;
10568 11951       }
10569 11952     }, {
   -1 11953       id: 'has-widget-role',
   -1 11954       evaluate: function evaluate(node, options, virtualNode) {
   -1 11955         var role = node.getAttribute('role');
   -1 11956         if (role === null) {
   -1 11957           return false;
   -1 11958         }
   -1 11959         var roleType = axe.commons.aria.getRoleType(role);
   -1 11960         return roleType === 'widget' || roleType === 'composite';
   -1 11961       },
   -1 11962       options: []
   -1 11963     }, {
   -1 11964       id: 'implicit-role-fallback',
   -1 11965       evaluate: function evaluate(node, options, virtualNode) {
   -1 11966         var role = node.getAttribute('role');
   -1 11967         if (role === null || !axe.commons.aria.isValidRole(role)) {
   -1 11968           return true;
   -1 11969         }
   -1 11970         var roleType = axe.commons.aria.getRoleType(role);
   -1 11971         return axe.commons.aria.implicitRole(node) === roleType;
   -1 11972       }
   -1 11973     }, {
10570 11974       id: 'invalidrole',
10571    -1       evaluate: function evaluate(node, options) {
   -1 11975       evaluate: function evaluate(node, options, virtualNode) {
10572 11976         return !axe.commons.aria.isValidRole(node.getAttribute('role'));
10573 11977       }
10574 11978     }, {
10575 11979       id: 'aria-required-attr',
10576    -1       evaluate: function evaluate(node, options) {
   -1 11980       evaluate: function evaluate(node, options, virtualNode) {
   -1 11981         options = options || {};
10577 11982         var missing = [];
10578 11983         if (node.hasAttributes()) {
10579 11984           var attr, role = node.getAttribute('role'), required = axe.commons.aria.requiredAttr(role);
   -1 11985           if (Array.isArray(options[role])) {
   -1 11986             required = axe.utils.uniqueArray(options[role], required);
   -1 11987           }
10580 11988           if (role && required) {
10581 11989             for (var i = 0, l = required.length; i < l; i++) {
10582 11990               attr = required[i];
@@ -10594,9 +12002,13 @@ module.exports = {
10594 12002       }
10595 12003     }, {
10596 12004       id: 'aria-required-children',
10597    -1       evaluate: function evaluate(node, options) {
10598    -1         var requiredOwned = axe.commons.aria.requiredOwned, implicitNodes = axe.commons.aria.implicitNodes, matchesSelector = axe.commons.utils.matchesSelector, idrefs = axe.commons.dom.idrefs;
10599    -1         function owns(node, role, ariaOwned) {
   -1 12005       evaluate: function evaluate(node, options, virtualNode) {
   -1 12006         var requiredOwned = axe.commons.aria.requiredOwned;
   -1 12007         var implicitNodes = axe.commons.aria.implicitNodes;
   -1 12008         var matchesSelector = axe.commons.utils.matchesSelector;
   -1 12009         var idrefs = axe.commons.dom.idrefs;
   -1 12010         var reviewEmpty = options && Array.isArray(options.reviewEmpty) ? options.reviewEmpty : [];
   -1 12011         function owns(node, virtualTree, role, ariaOwned) {
10600 12012           if (node === null) {
10601 12013             return false;
10602 12014           }
@@ -10605,7 +12017,7 @@ module.exports = {
10605 12017             selector = selector.concat(implicit);
10606 12018           }
10607 12019           selector = selector.join(',');
10608    -1           return ariaOwned ? matchesSelector(node, selector) || !!node.querySelector(selector) : !!node.querySelector(selector);
   -1 12020           return ariaOwned ? matchesSelector(node, selector) || !!axe.utils.querySelectorAll(virtualTree, selector)[0] : !!axe.utils.querySelectorAll(virtualTree, selector)[0];
10609 12021         }
10610 12022         function ariaOwns(nodes, role) {
10611 12023           var index, length;
@@ -10613,7 +12025,8 @@ module.exports = {
10613 12025             if (nodes[index] === null) {
10614 12026               continue;
10615 12027             }
10616    -1             if (owns(nodes[index], role, true)) {
   -1 12028             var virtualTree = axe.utils.getNodeFromTree(axe._tree[0], nodes[index]);
   -1 12029             if (owns(nodes[index], virtualTree, role, true)) {
10617 12030               return true;
10618 12031             }
10619 12032           }
@@ -10623,7 +12036,7 @@ module.exports = {
10623 12036           var i, l = childRoles.length, missing = [], ownedElements = idrefs(node, 'aria-owns');
10624 12037           for (i = 0; i < l; i++) {
10625 12038             var r = childRoles[i];
10626    -1             if (owns(node, r) || ariaOwns(ownedElements, r)) {
   -1 12039             if (owns(node, virtualNode, r) || ariaOwns(ownedElements, r)) {
10627 12040               if (!all) {
10628 12041                 return null;
10629 12042               }
@@ -10669,17 +12082,24 @@ module.exports = {
10669 12082           return true;
10670 12083         }
10671 12084         this.data(missing);
10672    -1         return false;
   -1 12085         if (reviewEmpty.includes(role)) {
   -1 12086           return undefined;
   -1 12087         } else {
   -1 12088           return false;
   -1 12089         }
   -1 12090       },
   -1 12091       options: {
   -1 12092         reviewEmpty: [ 'listbox' ]
10673 12093       }
10674 12094     }, {
10675 12095       id: 'aria-required-parent',
10676    -1       evaluate: function evaluate(node, options) {
   -1 12096       evaluate: function evaluate(node, options, virtualNode) {
10677 12097         function getSelector(role) {
10678 12098           var impliedNative = axe.commons.aria.implicitNodes(role) || [];
10679 12099           return impliedNative.concat('[role="' + role + '"]').join(',');
10680 12100         }
10681    -1         function getMissingContext(element, requiredContext, includeElement) {
10682    -1           var index, length, role = element.getAttribute('role'), missing = [];
   -1 12101         function getMissingContext(virtualNode, requiredContext, includeElement) {
   -1 12102           var index, length, role = virtualNode.actualNode.getAttribute('role'), missing = [];
10683 12103           if (!requiredContext) {
10684 12104             requiredContext = axe.commons.aria.requiredContext(role);
10685 12105           }
@@ -10687,10 +12107,10 @@ module.exports = {
10687 12107             return null;
10688 12108           }
10689 12109           for (index = 0, length = requiredContext.length; index < length; index++) {
10690    -1             if (includeElement && axe.utils.matchesSelector(element, getSelector(requiredContext[index]))) {
   -1 12110             if (includeElement && axe.utils.matchesSelector(virtualNode.actualNode, getSelector(requiredContext[index]))) {
10691 12111               return null;
10692 12112             }
10693    -1             if (axe.commons.dom.findUp(element, getSelector(requiredContext[index]))) {
   -1 12113             if (axe.commons.dom.findUpVirtual(virtualNode, getSelector(requiredContext[index]))) {
10694 12114               return null;
10695 12115             } else {
10696 12116               missing.push(requiredContext[index]);
@@ -10703,7 +12123,8 @@ module.exports = {
10703 12123           while (element) {
10704 12124             if (element.getAttribute('id')) {
10705 12125               var id = axe.commons.utils.escapeSelector(element.getAttribute('id'));
10706    -1               o = document.querySelector('[aria-owns~=' + id + ']');
   -1 12126               var doc = axe.commons.dom.getRootNode(element);
   -1 12127               o = doc.querySelector('[aria-owns~=' + id + ']');
10707 12128               if (o) {
10708 12129                 owners.push(o);
10709 12130               }
@@ -10712,14 +12133,14 @@ module.exports = {
10712 12133           }
10713 12134           return owners.length ? owners : null;
10714 12135         }
10715    -1         var missingParents = getMissingContext(node);
   -1 12136         var missingParents = getMissingContext(virtualNode);
10716 12137         if (!missingParents) {
10717 12138           return true;
10718 12139         }
10719 12140         var owners = getAriaOwners(node);
10720 12141         if (owners) {
10721 12142           for (var i = 0, l = owners.length; i < l; i++) {
10722    -1             missingParents = getMissingContext(owners[i], missingParents, true);
   -1 12143             missingParents = getMissingContext(axe.utils.getNodeFromTree(axe._tree[0], owners[i]), missingParents, true);
10723 12144             if (!missingParents) {
10724 12145               return true;
10725 12146             }
@@ -10730,7 +12151,7 @@ module.exports = {
10730 12151       }
10731 12152     }, {
10732 12153       id: 'aria-valid-attr-value',
10733    -1       evaluate: function evaluate(node, options) {
   -1 12154       evaluate: function evaluate(node, options, virtualNode) {
10734 12155         options = Array.isArray(options) ? options : [];
10735 12156         var invalid = [], aria = /^aria-/;
10736 12157         var attr, attrName, attrs = node.attributes;
@@ -10753,7 +12174,7 @@ module.exports = {
10753 12174       options: []
10754 12175     }, {
10755 12176       id: 'aria-valid-attr',
10756    -1       evaluate: function evaluate(node, options) {
   -1 12177       evaluate: function evaluate(node, options, virtualNode) {
10757 12178         options = Array.isArray(options) ? options : [];
10758 12179         var invalid = [], aria = /^aria-/;
10759 12180         var attr, attrs = node.attributes;
@@ -10771,8 +12192,45 @@ module.exports = {
10771 12192       },
10772 12193       options: []
10773 12194     }, {
   -1 12195       id: 'valid-scrollable-semantics',
   -1 12196       evaluate: function evaluate(node, options, virtualNode) {
   -1 12197         var VALID_TAG_NAMES_FOR_SCROLLABLE_REGIONS = {
   -1 12198           ARTICLE: true,
   -1 12199           ASIDE: true,
   -1 12200           NAV: true,
   -1 12201           SECTION: true
   -1 12202         };
   -1 12203         var VALID_ROLES_FOR_SCROLLABLE_REGIONS = {
   -1 12204           application: true,
   -1 12205           banner: false,
   -1 12206           complementary: true,
   -1 12207           contentinfo: true,
   -1 12208           form: true,
   -1 12209           main: true,
   -1 12210           navigation: true,
   -1 12211           region: true,
   -1 12212           search: false
   -1 12213         };
   -1 12214         function validScrollableTagName(node) {
   -1 12215           var tagName = node.tagName.toUpperCase();
   -1 12216           return VALID_TAG_NAMES_FOR_SCROLLABLE_REGIONS[tagName] || false;
   -1 12217         }
   -1 12218         function validScrollableRole(node) {
   -1 12219           var role = node.getAttribute('role');
   -1 12220           if (!role) {
   -1 12221             return false;
   -1 12222           }
   -1 12223           return VALID_ROLES_FOR_SCROLLABLE_REGIONS[role.toLowerCase()] || false;
   -1 12224         }
   -1 12225         function validScrollableSemantics(node) {
   -1 12226           return validScrollableRole(node) || validScrollableTagName(node);
   -1 12227         }
   -1 12228         return validScrollableSemantics(node);
   -1 12229       },
   -1 12230       options: []
   -1 12231     }, {
10774 12232       id: 'color-contrast',
10775    -1       evaluate: function evaluate(node, options) {
   -1 12233       evaluate: function evaluate(node, options, virtualNode) {
10776 12234         if (!axe.commons.dom.isVisible(node, false)) {
10777 12235           return true;
10778 12236         }
@@ -10815,8 +12273,8 @@ module.exports = {
10815 12273       }
10816 12274     }, {
10817 12275       id: 'link-in-text-block',
10818    -1       evaluate: function evaluate(node, options) {
10819    -1         var color = axe.commons.color;
   -1 12276       evaluate: function evaluate(node, options, virtualNode) {
   -1 12277         var _axe$commons = axe.commons, color = _axe$commons.color, dom = _axe$commons.dom;
10820 12278         function getContrast(color1, color2) {
10821 12279           var c1lum = color1.getRelativeLuminance();
10822 12280           var c2lum = color2.getRelativeLuminance();
@@ -10830,9 +12288,9 @@ module.exports = {
10830 12288         if (isBlock(node)) {
10831 12289           return false;
10832 12290         }
10833    -1         var parentBlock = node.parentNode;
   -1 12291         var parentBlock = dom.getComposedParent(node);
10834 12292         while (parentBlock.nodeType === 1 && !isBlock(parentBlock)) {
10835    -1           parentBlock = parentBlock.parentNode;
   -1 12293           parentBlock = dom.getComposedParent(parentBlock);
10836 12294         }
10837 12295         this.relatedNodes([ parentBlock ]);
10838 12296         if (color.elementIsDistinct(node, parentBlock)) {
@@ -10876,7 +12334,7 @@ module.exports = {
10876 12334       }
10877 12335     }, {
10878 12336       id: 'fieldset',
10879    -1       evaluate: function evaluate(node, options) {
   -1 12337       evaluate: function evaluate(node, options, virtualNode) {
10880 12338         var failureCode, self = this;
10881 12339         function getUnrelatedElements(parent, name) {
10882 12340           return axe.commons.utils.toArray(parent.querySelectorAll('select,textarea,button,input:not([name="' + name + '"]):not([type="hidden"])'));
@@ -10924,26 +12382,30 @@ module.exports = {
10924 12382             return candidate !== current;
10925 12383           });
10926 12384         }
10927    -1         function runCheck(element) {
10928    -1           var name = axe.commons.utils.escapeSelector(node.name);
10929    -1           var matchingNodes = document.querySelectorAll('input[type="' + axe.commons.utils.escapeSelector(node.type) + '"][name="' + name + '"]');
   -1 12385         function runCheck(virtualNode) {
   -1 12386           var name = axe.commons.utils.escapeSelector(virtualNode.actualNode.name);
   -1 12387           var root = axe.commons.dom.getRootNode(virtualNode.actualNode);
   -1 12388           var matchingNodes = root.querySelectorAll('input[type="' + axe.commons.utils.escapeSelector(virtualNode.actualNode.type) + '"][name="' + name + '"]');
10930 12389           if (matchingNodes.length < 2) {
10931 12390             return true;
10932 12391           }
10933    -1           var fieldset = axe.commons.dom.findUp(element, 'fieldset');
10934    -1           var group = axe.commons.dom.findUp(element, '[role="group"]' + (node.type === 'radio' ? ',[role="radiogroup"]' : ''));
   -1 12392           var fieldset = axe.commons.dom.findUpVirtual(virtualNode, 'fieldset');
   -1 12393           var group = axe.commons.dom.findUpVirtual(virtualNode, '[role="group"]' + (virtualNode.actualNode.type === 'radio' ? ',[role="radiogroup"]' : ''));
10935 12394           if (!group && !fieldset) {
10936 12395             failureCode = 'no-group';
10937    -1             self.relatedNodes(spliceCurrentNode(matchingNodes, element));
   -1 12396             self.relatedNodes(spliceCurrentNode(matchingNodes, virtualNode.actualNode));
10938 12397             return false;
   -1 12398           } else if (fieldset) {
   -1 12399             return checkFieldset(fieldset, name);
   -1 12400           } else {
   -1 12401             return checkARIAGroup(group, name);
10939 12402           }
10940    -1           return fieldset ? checkFieldset(fieldset, name) : checkARIAGroup(group, name);
10941 12403         }
10942 12404         var data = {
10943 12405           name: node.getAttribute('name'),
10944 12406           type: node.getAttribute('type')
10945 12407         };
10946    -1         var result = runCheck(node);
   -1 12408         var result = runCheck(virtualNode);
10947 12409         if (!result) {
10948 12410           data.failureCode = failureCode;
10949 12411         }
@@ -10976,12 +12438,13 @@ module.exports = {
10976 12438       }
10977 12439     }, {
10978 12440       id: 'group-labelledby',
10979    -1       evaluate: function evaluate(node, options) {
   -1 12441       evaluate: function evaluate(node, options, virtualNode) {
10980 12442         this.data({
10981 12443           name: node.getAttribute('name'),
10982 12444           type: node.getAttribute('type')
10983 12445         });
10984    -1         var matchingNodes = document.querySelectorAll('input[type="' + axe.commons.utils.escapeSelector(node.type) + '"][name="' + axe.commons.utils.escapeSelector(node.name) + '"]');
   -1 12446         var doc = axe.commons.dom.getRootNode(node);
   -1 12447         var matchingNodes = doc.querySelectorAll('input[type="' + axe.commons.utils.escapeSelector(node.type) + '"][name="' + axe.commons.utils.escapeSelector(node.name) + '"]');
10985 12448         if (matchingNodes.length <= 1) {
10986 12449           return true;
10987 12450         }
@@ -10990,11 +12453,11 @@ module.exports = {
10990 12453           return l ? l.split(/\s+/) : [];
10991 12454         }).reduce(function(prev, curr) {
10992 12455           return prev.filter(function(n) {
10993    -1             return curr.indexOf(n) !== -1;
   -1 12456             return curr.includes(n);
10994 12457           });
10995 12458         }).filter(function(n) {
10996    -1           var labelNode = document.getElementById(n);
10997    -1           return labelNode && axe.commons.text.accessibleText(labelNode);
   -1 12459           var labelNode = doc.getElementById(n);
   -1 12460           return labelNode && axe.commons.text.accessibleText(labelNode, true);
10998 12461         }).length !== 0;
10999 12462       },
11000 12463       after: function after(results, options) {
@@ -11013,7 +12476,7 @@ module.exports = {
11013 12476       }
11014 12477     }, {
11015 12478       id: 'accesskeys',
11016    -1       evaluate: function evaluate(node, options) {
   -1 12479       evaluate: function evaluate(node, options, virtualNode) {
11017 12480         if (axe.commons.dom.isVisible(node, false)) {
11018 12481           this.data(node.getAttribute('accesskey'));
11019 12482           this.relatedNodes([ node ]);
@@ -11041,83 +12504,174 @@ module.exports = {
11041 12504       }
11042 12505     }, {
11043 12506       id: 'focusable-no-name',
11044    -1       evaluate: function evaluate(node, options) {
11045    -1         var tabIndex = node.getAttribute('tabindex'), isFocusable = axe.commons.dom.isFocusable(node) && tabIndex > -1;
11046    -1         if (!isFocusable) {
   -1 12507       evaluate: function evaluate(node, options, virtualNode) {
   -1 12508         var tabIndex = node.getAttribute('tabindex'), inFocusOrder = axe.commons.dom.isFocusable(node) && tabIndex > -1;
   -1 12509         if (!inFocusOrder) {
11047 12510           return false;
11048 12511         }
11049    -1         return !axe.commons.text.accessibleText(node);
   -1 12512         return !axe.commons.text.accessibleTextVirtual(virtualNode);
   -1 12513       }
   -1 12514     }, {
   -1 12515       id: 'landmark-is-top-level',
   -1 12516       evaluate: function evaluate(node, options, virtualNode) {
   -1 12517         var landmarks = axe.commons.aria.getRolesByType('landmark');
   -1 12518         var parent = axe.commons.dom.getComposedParent(node);
   -1 12519         this.data({
   -1 12520           role: node.getAttribute('role') || axe.commons.aria.implicitRole(node)
   -1 12521         });
   -1 12522         while (parent) {
   -1 12523           var role = parent.getAttribute('role');
   -1 12524           if (!role && parent.tagName.toLowerCase() !== 'form') {
   -1 12525             role = axe.commons.aria.implicitRole(parent);
   -1 12526           }
   -1 12527           if (role && landmarks.includes(role)) {
   -1 12528             return false;
   -1 12529           }
   -1 12530           parent = axe.commons.dom.getComposedParent(parent);
   -1 12531         }
   -1 12532         return true;
11050 12533       }
11051 12534     }, {
11052    -1       id: 'has-at-least-one-main',
11053    -1       evaluate: function evaluate(node, options) {
11054    -1         var mains = document.querySelectorAll('main,[role=main]');
11055    -1         this.data(!!mains[0]);
11056    -1         return !!mains[0];
   -1 12535       id: 'page-has-heading-one',
   -1 12536       evaluate: function evaluate(node, options, virtualNode) {
   -1 12537         if (!options || !options.selector || typeof options.selector !== 'string') {
   -1 12538           throw new TypeError('visible-in-page requires options.selector to be a string');
   -1 12539         }
   -1 12540         var matchingElms = axe.utils.querySelectorAll(virtualNode, options.selector);
   -1 12541         this.relatedNodes(matchingElms.map(function(vNode) {
   -1 12542           return vNode.actualNode;
   -1 12543         }));
   -1 12544         return matchingElms.length > 0;
11057 12545       },
11058 12546       after: function after(results, options) {
11059    -1         var hasMain = false;
11060    -1         for (var i = 0; i < results.length && !hasMain; i++) {
11061    -1           hasMain = results[i].data;
11062    -1         }
11063    -1         for (var i = 0; i < results.length; i++) {
11064    -1           results[i].result = hasMain;
   -1 12547         var elmUsedAnywhere = results.some(function(frameResult) {
   -1 12548           return frameResult.result === true;
   -1 12549         });
   -1 12550         if (elmUsedAnywhere) {
   -1 12551           results.forEach(function(result) {
   -1 12552             result.result = true;
   -1 12553           });
11065 12554         }
11066 12555         return results;
   -1 12556       },
   -1 12557       options: {
   -1 12558         selector: 'h1:not([role]), [role="heading"][aria-level="1"]'
11067 12559       }
11068 12560     }, {
11069    -1       id: 'has-no-more-than-one-main',
11070    -1       evaluate: function evaluate(node, options) {
11071    -1         var mains = document.querySelectorAll('main,[role=main]');
11072    -1         return mains.length <= 1;
   -1 12561       id: 'page-has-main',
   -1 12562       evaluate: function evaluate(node, options, virtualNode) {
   -1 12563         if (!options || !options.selector || typeof options.selector !== 'string') {
   -1 12564           throw new TypeError('visible-in-page requires options.selector to be a string');
   -1 12565         }
   -1 12566         var matchingElms = axe.utils.querySelectorAll(virtualNode, options.selector);
   -1 12567         this.relatedNodes(matchingElms.map(function(vNode) {
   -1 12568           return vNode.actualNode;
   -1 12569         }));
   -1 12570         return matchingElms.length > 0;
   -1 12571       },
   -1 12572       after: function after(results, options) {
   -1 12573         var elmUsedAnywhere = results.some(function(frameResult) {
   -1 12574           return frameResult.result === true;
   -1 12575         });
   -1 12576         if (elmUsedAnywhere) {
   -1 12577           results.forEach(function(result) {
   -1 12578             result.result = true;
   -1 12579           });
   -1 12580         }
   -1 12581         return results;
   -1 12582       },
   -1 12583       options: {
   -1 12584         selector: 'main:not([role]), [role=\'main\']'
11073 12585       }
11074 12586     }, {
11075    -1       id: 'main-is-top-level',
11076    -1       evaluate: function evaluate(node, options) {
11077    -1         var landmarks = axe.commons.aria.getRolesByType('landmark');
11078    -1         var parent = node.parentNode;
11079    -1         while (parent) {
11080    -1           if (parent.nodeType === 1) {
11081    -1             var role = parent.getAttribute('role');
11082    -1             if (!role && parent.tagName.toLowerCase() !== 'form') {
11083    -1               role = axe.commons.aria.implicitRole(parent);
11084    -1             }
11085    -1             if (role && landmarks.includes(role)) {
11086    -1               return false;
11087    -1             }
11088    -1           }
11089    -1           parent = parent.parentNode;
   -1 12587       id: 'page-no-duplicate-banner',
   -1 12588       evaluate: function evaluate(node, options, virtualNode) {
   -1 12589         if (!options || !options.selector || typeof options.selector !== 'string') {
   -1 12590           throw new TypeError('visible-in-page requires options.selector to be a string');
   -1 12591         }
   -1 12592         var elms = axe.utils.querySelectorAll(virtualNode, options.selector);
   -1 12593         if (typeof options.nativeScopeFilter === 'string') {
   -1 12594           elms = elms.filter(function(elm) {
   -1 12595             return elm.actualNode.hasAttribute('role') || !axe.commons.dom.findUpVirtual(elm, options.nativeScopeFilter);
   -1 12596           });
11090 12597         }
11091    -1         return true;
   -1 12598         this.relatedNodes(elms.map(function(elm) {
   -1 12599           return elm.actualNode;
   -1 12600         }));
   -1 12601         return elms.length <= 1;
   -1 12602       },
   -1 12603       options: {
   -1 12604         selector: 'header:not([role]), [role=banner]',
   -1 12605         nativeScopeFilter: 'article, aside, main, nav, section'
11092 12606       }
11093 12607     }, {
11094    -1       id: 'tabindex',
11095    -1       evaluate: function evaluate(node, options) {
11096    -1         return node.tabIndex <= 0;
   -1 12608       id: 'page-no-duplicate-contentinfo',
   -1 12609       evaluate: function evaluate(node, options, virtualNode) {
   -1 12610         if (!options || !options.selector || typeof options.selector !== 'string') {
   -1 12611           throw new TypeError('visible-in-page requires options.selector to be a string');
   -1 12612         }
   -1 12613         var elms = axe.utils.querySelectorAll(virtualNode, options.selector);
   -1 12614         if (typeof options.nativeScopeFilter === 'string') {
   -1 12615           elms = elms.filter(function(elm) {
   -1 12616             return elm.actualNode.hasAttribute('role') || !axe.commons.dom.findUpVirtual(elm, options.nativeScopeFilter);
   -1 12617           });
   -1 12618         }
   -1 12619         this.relatedNodes(elms.map(function(elm) {
   -1 12620           return elm.actualNode;
   -1 12621         }));
   -1 12622         return elms.length <= 1;
   -1 12623       },
   -1 12624       options: {
   -1 12625         selector: 'footer:not([role]), [role=contentinfo]',
   -1 12626         nativeScopeFilter: 'article, aside, main, nav, section'
   -1 12627       }
   -1 12628     }, {
   -1 12629       id: 'page-no-duplicate-main',
   -1 12630       evaluate: function evaluate(node, options, virtualNode) {
   -1 12631         if (!options || !options.selector || typeof options.selector !== 'string') {
   -1 12632           throw new TypeError('visible-in-page requires options.selector to be a string');
   -1 12633         }
   -1 12634         var elms = axe.utils.querySelectorAll(virtualNode, options.selector);
   -1 12635         if (typeof options.nativeScopeFilter === 'string') {
   -1 12636           elms = elms.filter(function(elm) {
   -1 12637             return elm.actualNode.hasAttribute('role') || !axe.commons.dom.findUpVirtual(elm, options.nativeScopeFilter);
   -1 12638           });
   -1 12639         }
   -1 12640         this.relatedNodes(elms.map(function(elm) {
   -1 12641           return elm.actualNode;
   -1 12642         }));
   -1 12643         return elms.length <= 1;
   -1 12644       },
   -1 12645       options: {
   -1 12646         selector: 'main:not([role]), [role=\'main\']'
   -1 12647       }
   -1 12648     }, {
   -1 12649       id: 'tabindex',
   -1 12650       evaluate: function evaluate(node, options, virtualNode) {
   -1 12651         return node.tabIndex <= 0;
11097 12652       }
11098 12653     }, {
11099 12654       id: 'duplicate-img-label',
11100    -1       evaluate: function evaluate(node, options) {
11101    -1         var imgs = node.querySelectorAll('img');
11102    -1         var text = axe.commons.text.visible(node, true).toLowerCase();
   -1 12655       evaluate: function evaluate(node, options, virtualNode) {
   -1 12656         var text = axe.commons.text.visibleVirtual(virtualNode, true).toLowerCase();
11103 12657         if (text === '') {
11104 12658           return false;
11105 12659         }
11106    -1         for (var i = 0, len = imgs.length; i < len; i++) {
11107    -1           var img = imgs[i];
11108    -1           var imgAlt = axe.commons.text.accessibleText(img).toLowerCase();
11109    -1           if (imgAlt === text && img.getAttribute('role') !== 'presentation' && axe.commons.dom.isVisible(img)) {
11110    -1             return true;
11111    -1           }
11112    -1         }
11113    -1         return false;
   -1 12660         var images = axe.utils.querySelectorAll(virtualNode, 'img').filter(function(_ref) {
   -1 12661           var actualNode = _ref.actualNode;
   -1 12662           return axe.commons.dom.isVisible(actualNode) && ![ 'none', 'presentation' ].includes(actualNode.getAttribute('role'));
   -1 12663         });
   -1 12664         return images.some(function(img) {
   -1 12665           return text === axe.commons.text.accessibleTextVirtual(img).toLowerCase();
   -1 12666         });
11114 12667       }
11115 12668     }, {
11116 12669       id: 'explicit-label',
11117    -1       evaluate: function evaluate(node, options) {
   -1 12670       evaluate: function evaluate(node, options, virtualNode) {
11118 12671         if (node.getAttribute('id')) {
   -1 12672           var root = axe.commons.dom.getRootNode(node);
11119 12673           var id = axe.commons.utils.escapeSelector(node.getAttribute('id'));
11120    -1           var label = document.querySelector('label[for="' + id + '"]');
   -1 12674           var label = root.querySelector('label[for="' + id + '"]');
11121 12675           if (label) {
11122 12676             return !!axe.commons.text.accessibleText(label);
11123 12677           }
@@ -11126,8 +12680,8 @@ module.exports = {
11126 12680       }
11127 12681     }, {
11128 12682       id: 'help-same-as-label',
11129    -1       evaluate: function evaluate(node, options) {
11130    -1         var labelText = axe.commons.text.label(node), check = node.getAttribute('title');
   -1 12683       evaluate: function evaluate(node, options, virtualNode) {
   -1 12684         var labelText = axe.commons.text.labelVirtual(virtualNode), check = node.getAttribute('title');
11131 12685         if (!labelText) {
11132 12686           return false;
11133 12687         }
@@ -11145,16 +12699,16 @@ module.exports = {
11145 12699       enabled: false
11146 12700     }, {
11147 12701       id: 'implicit-label',
11148    -1       evaluate: function evaluate(node, options) {
11149    -1         var label = axe.commons.dom.findUp(node, 'label');
   -1 12702       evaluate: function evaluate(node, options, virtualNode) {
   -1 12703         var label = axe.commons.dom.findUpVirtual(virtualNode, 'label');
11150 12704         if (label) {
11151    -1           return !!axe.commons.text.accessibleText(label);
   -1 12705           return !!axe.commons.text.accessibleTextVirtual(label);
11152 12706         }
11153 12707         return false;
11154 12708       }
11155 12709     }, {
11156 12710       id: 'multiple-label',
11157    -1       evaluate: function evaluate(node, options) {
   -1 12711       evaluate: function evaluate(node, options, virtualNode) {
11158 12712         var id = axe.commons.utils.escapeSelector(node.getAttribute('id'));
11159 12713         var labels = Array.from(document.querySelectorAll('label[for="' + id + '"]'));
11160 12714         var parent = node.parentNode;
@@ -11176,18 +12730,18 @@ module.exports = {
11176 12730       }
11177 12731     }, {
11178 12732       id: 'title-only',
11179    -1       evaluate: function evaluate(node, options) {
11180    -1         var labelText = axe.commons.text.label(node);
   -1 12733       evaluate: function evaluate(node, options, virtualNode) {
   -1 12734         var labelText = axe.commons.text.labelVirtual(virtualNode);
11181 12735         return !labelText && !!(node.getAttribute('title') || node.getAttribute('aria-describedby'));
11182 12736       }
11183 12737     }, {
11184 12738       id: 'has-lang',
11185    -1       evaluate: function evaluate(node, options) {
   -1 12739       evaluate: function evaluate(node, options, virtualNode) {
11186 12740         return !!(node.getAttribute('lang') || node.getAttribute('xml:lang') || '').trim();
11187 12741       }
11188 12742     }, {
11189 12743       id: 'valid-lang',
11190    -1       evaluate: function evaluate(node, options) {
   -1 12744       evaluate: function evaluate(node, options, virtualNode) {
11191 12745         function getBaseLang(lang) {
11192 12746           return lang.trim().split('-')[0].toLowerCase();
11193 12747         }
@@ -11212,44 +12766,37 @@ module.exports = {
11212 12766       }
11213 12767     }, {
11214 12768       id: 'dlitem',
11215    -1       evaluate: function evaluate(node, options) {
11216    -1         return node.parentNode.tagName.toUpperCase() === 'DL';
   -1 12769       evaluate: function evaluate(node, options, virtualNode) {
   -1 12770         var parent = axe.commons.dom.getComposedParent(node);
   -1 12771         return parent.nodeName.toUpperCase() === 'DL';
11217 12772       }
11218 12773     }, {
11219 12774       id: 'has-listitem',
11220    -1       evaluate: function evaluate(node, options) {
11221    -1         var children = node.children;
11222    -1         if (children.length === 0) {
11223    -1           return true;
11224    -1         }
11225    -1         for (var i = 0; i < children.length; i++) {
11226    -1           if (children[i].nodeName.toUpperCase() === 'LI') {
11227    -1             return false;
11228    -1           }
11229    -1         }
11230    -1         return true;
   -1 12775       evaluate: function evaluate(node, options, virtualNode) {
   -1 12776         return virtualNode.children.every(function(_ref2) {
   -1 12777           var actualNode = _ref2.actualNode;
   -1 12778           return actualNode.nodeName.toUpperCase() !== 'LI';
   -1 12779         });
11231 12780       }
11232 12781     }, {
11233 12782       id: 'listitem',
11234    -1       evaluate: function evaluate(node, options) {
11235    -1         if ([ 'UL', 'OL' ].indexOf(node.parentNode.nodeName.toUpperCase()) !== -1) {
11236    -1           return true;
11237    -1         }
11238    -1         return node.parentNode.getAttribute('role') === 'list';
   -1 12783       evaluate: function evaluate(node, options, virtualNode) {
   -1 12784         var parent = axe.commons.dom.getComposedParent(node);
   -1 12785         return [ 'UL', 'OL' ].includes(parent.nodeName.toUpperCase()) || (parent.getAttribute('role') || '').toLowerCase() === 'list';
11239 12786       }
11240 12787     }, {
11241 12788       id: 'only-dlitems',
11242    -1       evaluate: function evaluate(node, options) {
11243    -1         var child, nodeName, bad = [], children = node.childNodes, permitted = [ 'STYLE', 'META', 'LINK', 'MAP', 'AREA', 'SCRIPT', 'DATALIST', 'TEMPLATE' ], hasNonEmptyTextNode = false;
11244    -1         for (var i = 0; i < children.length; i++) {
11245    -1           child = children[i];
11246    -1           var nodeName = child.nodeName.toUpperCase();
11247    -1           if (child.nodeType === 1 && nodeName !== 'DT' && nodeName !== 'DD' && permitted.indexOf(nodeName) === -1) {
11248    -1             bad.push(child);
11249    -1           } else if (child.nodeType === 3 && child.nodeValue.trim() !== '') {
   -1 12789       evaluate: function evaluate(node, options, virtualNode) {
   -1 12790         var bad = [], permitted = [ 'STYLE', 'META', 'LINK', 'MAP', 'AREA', 'SCRIPT', 'DATALIST', 'TEMPLATE' ], hasNonEmptyTextNode = false;
   -1 12791         virtualNode.children.forEach(function(_ref3) {
   -1 12792           var actualNode = _ref3.actualNode;
   -1 12793           var nodeName = actualNode.nodeName.toUpperCase();
   -1 12794           if (actualNode.nodeType === 1 && nodeName !== 'DT' && nodeName !== 'DD' && permitted.indexOf(nodeName) === -1) {
   -1 12795             bad.push(actualNode);
   -1 12796           } else if (actualNode.nodeType === 3 && actualNode.nodeValue.trim() !== '') {
11250 12797             hasNonEmptyTextNode = true;
11251 12798           }
11252    -1         }
   -1 12799         });
11253 12800         if (bad.length) {
11254 12801           this.relatedNodes(bad);
11255 12802         }
@@ -11258,17 +12805,17 @@ module.exports = {
11258 12805       }
11259 12806     }, {
11260 12807       id: 'only-listitems',
11261    -1       evaluate: function evaluate(node, options) {
11262    -1         var child, nodeName, bad = [], children = node.childNodes, permitted = [ 'STYLE', 'META', 'LINK', 'MAP', 'AREA', 'SCRIPT', 'DATALIST', 'TEMPLATE' ], hasNonEmptyTextNode = false;
11263    -1         for (var i = 0; i < children.length; i++) {
11264    -1           child = children[i];
11265    -1           nodeName = child.nodeName.toUpperCase();
11266    -1           if (child.nodeType === 1 && nodeName !== 'LI' && permitted.indexOf(nodeName) === -1) {
11267    -1             bad.push(child);
11268    -1           } else if (child.nodeType === 3 && child.nodeValue.trim() !== '') {
   -1 12808       evaluate: function evaluate(node, options, virtualNode) {
   -1 12809         var bad = [], permitted = [ 'STYLE', 'META', 'LINK', 'MAP', 'AREA', 'SCRIPT', 'DATALIST', 'TEMPLATE' ], hasNonEmptyTextNode = false;
   -1 12810         virtualNode.children.forEach(function(_ref4) {
   -1 12811           var actualNode = _ref4.actualNode;
   -1 12812           var nodeName = actualNode.nodeName.toUpperCase();
   -1 12813           if (actualNode.nodeType === 1 && nodeName !== 'LI' && permitted.indexOf(nodeName) === -1) {
   -1 12814             bad.push(actualNode);
   -1 12815           } else if (actualNode.nodeType === 3 && actualNode.nodeValue.trim() !== '') {
11269 12816             hasNonEmptyTextNode = true;
11270 12817           }
11271    -1         }
   -1 12818         });
11272 12819         if (bad.length) {
11273 12820           this.relatedNodes(bad);
11274 12821         }
@@ -11276,14 +12823,14 @@ module.exports = {
11276 12823       }
11277 12824     }, {
11278 12825       id: 'structured-dlitems',
11279    -1       evaluate: function evaluate(node, options) {
11280    -1         var children = node.children;
   -1 12826       evaluate: function evaluate(node, options, virtualNode) {
   -1 12827         var children = virtualNode.children;
11281 12828         if (!children || !children.length) {
11282 12829           return false;
11283 12830         }
11284 12831         var hasDt = false, hasDd = false, nodeName;
11285 12832         for (var i = 0; i < children.length; i++) {
11286    -1           nodeName = children[i].nodeName.toUpperCase();
   -1 12833           nodeName = children[i].actualNode.nodeName.toUpperCase();
11287 12834           if (nodeName === 'DT') {
11288 12835             hasDt = true;
11289 12836           }
@@ -11298,37 +12845,56 @@ module.exports = {
11298 12845       }
11299 12846     }, {
11300 12847       id: 'caption',
11301    -1       evaluate: function evaluate(node, options) {
11302    -1         var tracks = node.querySelectorAll('track');
   -1 12848       evaluate: function evaluate(node, options, virtualNode) {
   -1 12849         var tracks = axe.utils.querySelectorAll(virtualNode, 'track');
11303 12850         if (tracks.length) {
11304    -1           for (var i = 0; i < tracks.length; i++) {
11305    -1             var kind = tracks[i].getAttribute('kind');
11306    -1             if (kind && kind === 'captions') {
11307    -1               return false;
11308    -1             }
11309    -1           }
11310    -1           return true;
   -1 12851           return !tracks.some(function(_ref5) {
   -1 12852             var actualNode = _ref5.actualNode;
   -1 12853             return (actualNode.getAttribute('kind') || '').toLowerCase() === 'captions';
   -1 12854           });
11311 12855         }
11312 12856         return undefined;
11313 12857       }
11314 12858     }, {
11315 12859       id: 'description',
11316    -1       evaluate: function evaluate(node, options) {
11317    -1         var tracks = node.querySelectorAll('track');
   -1 12860       evaluate: function evaluate(node, options, virtualNode) {
   -1 12861         var tracks = axe.utils.querySelectorAll(virtualNode, 'track');
11318 12862         if (tracks.length) {
11319    -1           for (var i = 0; i < tracks.length; i++) {
11320    -1             var kind = tracks[i].getAttribute('kind');
11321    -1             if (kind && kind === 'descriptions') {
11322    -1               return false;
11323    -1             }
11324    -1           }
11325    -1           return true;
   -1 12863           var out = !tracks.some(function(_ref6) {
   -1 12864             var actualNode = _ref6.actualNode;
   -1 12865             return (actualNode.getAttribute('kind') || '').toLowerCase() === 'descriptions';
   -1 12866           });
   -1 12867           return out;
11326 12868         }
11327 12869         return undefined;
11328 12870       }
11329 12871     }, {
   -1 12872       id: 'frame-tested',
   -1 12873       evaluate: function evaluate(node, options, virtualNode) {
   -1 12874         var resolve = this.async();
   -1 12875         var _Object$assign = Object.assign({
   -1 12876           isViolation: false,
   -1 12877           timeout: 500
   -1 12878         }, options), isViolation = _Object$assign.isViolation, timeout = _Object$assign.timeout;
   -1 12879         var timer = setTimeout(function() {
   -1 12880           timer = setTimeout(function() {
   -1 12881             timer = null;
   -1 12882             resolve(isViolation ? false : undefined);
   -1 12883           }, 0);
   -1 12884         }, timeout);
   -1 12885         axe.utils.respondable(node.contentWindow, 'axe.ping', null, undefined, function() {
   -1 12886           if (timer !== null) {
   -1 12887             clearTimeout(timer);
   -1 12888             resolve(true);
   -1 12889           }
   -1 12890         });
   -1 12891       },
   -1 12892       options: {
   -1 12893         isViolation: false
   -1 12894       }
   -1 12895     }, {
11330 12896       id: 'meta-viewport-large',
11331    -1       evaluate: function evaluate(node, options) {
   -1 12897       evaluate: function evaluate(node, options, virtualNode) {
11332 12898         options = options || {};
11333 12899         var params, content = node.getAttribute('content') || '', parsedParams = content.split(/[;,]/), result = {}, minimum = options.scaleMinimum || 2, lowerBound = options.lowerBound || false;
11334 12900         for (var i = 0, l = parsedParams.length; i < l; i++) {
@@ -11355,7 +12921,7 @@ module.exports = {
11355 12921       }
11356 12922     }, {
11357 12923       id: 'meta-viewport',
11358    -1       evaluate: function evaluate(node, options) {
   -1 12924       evaluate: function evaluate(node, options, virtualNode) {
11359 12925         options = options || {};
11360 12926         var params, content = node.getAttribute('content') || '', parsedParams = content.split(/[;,]/), result = {}, minimum = options.scaleMinimum || 2, lowerBound = options.lowerBound || false;
11361 12927         for (var i = 0, l = parsedParams.length; i < l; i++) {
@@ -11381,12 +12947,12 @@ module.exports = {
11381 12947       }
11382 12948     }, {
11383 12949       id: 'header-present',
11384    -1       evaluate: function evaluate(node, options) {
11385    -1         return !!node.querySelector('h1, h2, h3, h4, h5, h6, [role="heading"]');
   -1 12950       evaluate: function evaluate(node, options, virtualNode) {
   -1 12951         return !!axe.utils.querySelectorAll(virtualNode, 'h1, h2, h3, h4, h5, h6, [role="heading"]')[0];
11386 12952       }
11387 12953     }, {
11388 12954       id: 'heading-order',
11389    -1       evaluate: function evaluate(node, options) {
   -1 12955       evaluate: function evaluate(node, options, virtualNode) {
11390 12956         var ariaHeadingLevel = node.getAttribute('aria-level');
11391 12957         if (ariaHeadingLevel !== null) {
11392 12958           this.data(parseInt(ariaHeadingLevel, 10));
@@ -11413,33 +12979,27 @@ module.exports = {
11413 12979         return results;
11414 12980       }
11415 12981     }, {
11416    -1       id: 'href-no-hash',
11417    -1       evaluate: function evaluate(node, options) {
11418    -1         var href = node.getAttribute('href');
11419    -1         if (href === '#') {
11420    -1           return false;
11421    -1         }
11422    -1         return true;
11423    -1       }
11424    -1     }, {
11425 12982       id: 'internal-link-present',
11426    -1       evaluate: function evaluate(node, options) {
11427    -1         return !!node.querySelector('a[href^="#"]');
   -1 12983       evaluate: function evaluate(node, options, virtualNode) {
   -1 12984         var links = axe.utils.querySelectorAll(virtualNode, 'a[href]');
   -1 12985         return links.some(function(vLink) {
   -1 12986           return /^#[^/!]/.test(vLink.actualNode.getAttribute('href'));
   -1 12987         });
11428 12988       }
11429 12989     }, {
11430 12990       id: 'landmark',
11431    -1       evaluate: function evaluate(node, options) {
11432    -1         return node.getElementsByTagName('main').length > 0 || !!node.querySelector('[role="main"]');
   -1 12991       evaluate: function evaluate(node, options, virtualNode) {
   -1 12992         return axe.utils.querySelectorAll(virtualNode, 'main, [role="main"]').length > 0;
11433 12993       }
11434 12994     }, {
11435 12995       id: 'meta-refresh',
11436    -1       evaluate: function evaluate(node, options) {
   -1 12996       evaluate: function evaluate(node, options, virtualNode) {
11437 12997         var content = node.getAttribute('content') || '', parsedParams = content.split(/[;,]/);
11438 12998         return content === '' || parsedParams[0] === '0';
11439 12999       }
11440 13000     }, {
11441 13001       id: 'p-as-heading',
11442    -1       evaluate: function evaluate(node, options) {
   -1 13002       evaluate: function evaluate(node, options, virtualNode) {
11443 13003         var siblings = Array.from(node.parentNode.children);
11444 13004         var currentIndex = siblings.indexOf(node);
11445 13005         options = options || {};
@@ -11504,7 +13064,7 @@ module.exports = {
11504 13064         if (!nextStyle || !isHeaderStyle(currStyle, nextStyle, margins)) {
11505 13065           return true;
11506 13066         }
11507    -1         var blockquote = axe.commons.dom.findUp(node, 'blockquote');
   -1 13067         var blockquote = axe.commons.dom.findUpVirtual(virtualNode, 'blockquote');
11508 13068         if (blockquote && blockquote.nodeName.toUpperCase() === 'BLOCKQUOTE') {
11509 13069           return undefined;
11510 13070         }
@@ -11529,67 +13089,76 @@ module.exports = {
11529 13089       }
11530 13090     }, {
11531 13091       id: 'region',
11532    -1       evaluate: function evaluate(node, options) {
11533    -1         var landmarkRoles = axe.commons.aria.getRolesByType('landmark'), firstLink = node.querySelector('a[href]');
   -1 13092       evaluate: function evaluate(node, options, virtualNode) {
   -1 13093         var _axe$commons2 = axe.commons, dom = _axe$commons2.dom, aria = _axe$commons2.aria;
   -1 13094         function getSkiplink(virtualNode) {
   -1 13095           var firstLink = axe.utils.querySelectorAll(virtualNode, 'a[href]')[0];
   -1 13096           if (firstLink && axe.commons.dom.getElementByReference(firstLink.actualNode, 'href')) {
   -1 13097             return firstLink.actualNode;
   -1 13098           }
   -1 13099         }
   -1 13100         var skipLink = getSkiplink(virtualNode);
   -1 13101         var landmarkRoles = aria.getRolesByType('landmark');
11534 13102         var implicitLandmarks = landmarkRoles.reduce(function(arr, role) {
11535    -1           return arr.concat(axe.commons.aria.implicitNodes(role));
   -1 13103           return arr.concat(aria.implicitNodes(role));
11536 13104         }, []).filter(function(r) {
11537 13105           return r !== null;
11538 13106         });
11539    -1         function isSkipLink(n) {
11540    -1           return firstLink && axe.commons.dom.getElementByReference(firstLink, 'href') && firstLink === n;
11541    -1         }
11542    -1         function isLandmark(node) {
11543    -1           if (node.hasAttribute('role')) {
11544    -1             return landmarkRoles.includes(node.getAttribute('role').toLowerCase());
   -1 13107         function isSkipLink(vNode) {
   -1 13108           return skipLink && skipLink === vNode.actualNode;
   -1 13109         }
   -1 13110         function isLandmark(virtualNode) {
   -1 13111           var node = virtualNode.actualNode;
   -1 13112           var explictRole = (node.getAttribute('role') || '').trim().toLowerCase();
   -1 13113           if (explictRole) {
   -1 13114             if (explictRole === 'form') {
   -1 13115               return !!aria.labelVirtual(virtualNode);
   -1 13116             }
   -1 13117             return landmarkRoles.includes(explictRole);
11545 13118           } else {
11546 13119             return implicitLandmarks.some(function(implicitSelector) {
11547    -1               return axe.utils.matchesSelector(node, implicitSelector);
   -1 13120               var matches = axe.utils.matchesSelector(node, implicitSelector);
   -1 13121               if (node.tagName.toLowerCase() === 'form') {
   -1 13122                 return matches && !!aria.labelVirtual(virtualNode);
   -1 13123               }
   -1 13124               return matches;
11548 13125             });
11549 13126           }
11550 13127         }
11551    -1         function checkRegion(n) {
11552    -1           if (isLandmark(n)) {
11553    -1             return null;
11554    -1           }
11555    -1           if (isSkipLink(n)) {
11556    -1             return getViolatingChildren(n);
11557    -1           }
11558    -1           if (axe.commons.dom.isVisible(n, true) && (axe.commons.text.visible(n, true, true) || axe.commons.dom.isVisualContent(n))) {
11559    -1             return n;
11560    -1           }
11561    -1           return getViolatingChildren(n);
11562    -1         }
11563    -1         function getViolatingChildren(n) {
11564    -1           var children = axe.commons.utils.toArray(n.children);
11565    -1           if (children.length === 0) {
   -1 13128         function findRegionlessElms(virtualNode) {
   -1 13129           var node = virtualNode.actualNode;
   -1 13130           if (isLandmark(virtualNode) || isSkipLink(virtualNode) || !dom.isVisible(node, true)) {
11566 13131             return [];
   -1 13132           } else if (dom.hasContent(node, true)) {
   -1 13133             return [ node ];
   -1 13134           } else {
   -1 13135             return virtualNode.children.filter(function(_ref7) {
   -1 13136               var actualNode = _ref7.actualNode;
   -1 13137               return actualNode.nodeType === 1;
   -1 13138             }).map(findRegionlessElms).reduce(function(a, b) {
   -1 13139               return a.concat(b);
   -1 13140             }, []);
11567 13141           }
11568    -1           return children.map(checkRegion).filter(function(c) {
11569    -1             return c !== null;
11570    -1           }).reduce(function(a, b) {
11571    -1             return a.concat(b);
11572    -1           }, []);
11573 13142         }
11574    -1         var v = getViolatingChildren(node);
11575    -1         this.relatedNodes(v);
11576    -1         return !v.length;
   -1 13143         var regionlessNodes = findRegionlessElms(virtualNode);
   -1 13144         this.relatedNodes(regionlessNodes);
   -1 13145         return regionlessNodes.length === 0;
11577 13146       },
11578 13147       after: function after(results, options) {
11579 13148         return [ results[0] ];
11580 13149       }
11581 13150     }, {
11582 13151       id: 'skip-link',
11583    -1       evaluate: function evaluate(node, options) {
   -1 13152       evaluate: function evaluate(node, options, virtualNode) {
11584 13153         var target = axe.commons.dom.getElementByReference(node, 'href');
11585    -1         return !!target && axe.commons.dom.isFocusable(target);
11586    -1       },
11587    -1       after: function after(results, options) {
11588    -1         return [ results[0] ];
   -1 13154         if (target) {
   -1 13155           return axe.commons.dom.isVisible(target, true) || undefined;
   -1 13156         }
   -1 13157         return false;
11589 13158       }
11590 13159     }, {
11591 13160       id: 'unique-frame-title',
11592    -1       evaluate: function evaluate(node, options) {
   -1 13161       evaluate: function evaluate(node, options, virtualNode) {
11593 13162         var title = axe.commons.text.sanitize(node.title).trim().toLowerCase();
11594 13163         this.data(title);
11595 13164         return true;
@@ -11606,13 +13175,13 @@ module.exports = {
11606 13175       }
11607 13176     }, {
11608 13177       id: 'aria-label',
11609    -1       evaluate: function evaluate(node, options) {
   -1 13178       evaluate: function evaluate(node, options, virtualNode) {
11610 13179         var label = node.getAttribute('aria-label');
11611 13180         return !!(label ? axe.commons.text.sanitize(label).trim() : '');
11612 13181       }
11613 13182     }, {
11614 13183       id: 'aria-labelledby',
11615    -1       evaluate: function evaluate(node, options) {
   -1 13184       evaluate: function evaluate(node, options, virtualNode) {
11616 13185         var getIdRefs = axe.commons.dom.idrefs;
11617 13186         return getIdRefs(node, 'aria-labelledby').some(function(elm) {
11618 13187           return elm && axe.commons.text.accessibleText(elm, true);
@@ -11620,12 +13189,12 @@ module.exports = {
11620 13189       }
11621 13190     }, {
11622 13191       id: 'button-has-visible-text',
11623    -1       evaluate: function evaluate(node, options) {
   -1 13192       evaluate: function evaluate(node, options, virtualNode) {
11624 13193         var nodeName = node.nodeName.toUpperCase();
11625 13194         var role = node.getAttribute('role');
11626 13195         var label = void 0;
11627 13196         if (nodeName === 'BUTTON' || role === 'button' && nodeName !== 'INPUT') {
11628    -1           label = axe.commons.text.accessibleText(node);
   -1 13197           label = axe.commons.text.accessibleTextVirtual(virtualNode);
11629 13198           this.data(label);
11630 13199           return !!label;
11631 13200         } else {
@@ -11634,29 +13203,26 @@ module.exports = {
11634 13203       }
11635 13204     }, {
11636 13205       id: 'doc-has-title',
11637    -1       evaluate: function evaluate(node, options) {
   -1 13206       evaluate: function evaluate(node, options, virtualNode) {
11638 13207         var title = document.title;
11639 13208         return !!(title ? axe.commons.text.sanitize(title).trim() : '');
11640 13209       }
11641 13210     }, {
11642 13211       id: 'duplicate-id',
11643    -1       evaluate: function evaluate(node, options) {
11644    -1         if (!node.getAttribute('id').trim()) {
   -1 13212       evaluate: function evaluate(node, options, virtualNode) {
   -1 13213         var id = node.getAttribute('id').trim();
   -1 13214         if (!id) {
11645 13215           return true;
11646 13216         }
11647    -1         var id = axe.commons.utils.escapeSelector(node.getAttribute('id'));
11648    -1         var matchingNodes = document.querySelectorAll('[id="' + id + '"]');
11649    -1         var related = [];
11650    -1         for (var i = 0; i < matchingNodes.length; i++) {
11651    -1           if (matchingNodes[i] !== node) {
11652    -1             related.push(matchingNodes[i]);
11653    -1           }
11654    -1         }
11655    -1         if (related.length) {
11656    -1           this.relatedNodes(related);
   -1 13217         var root = axe.commons.dom.getRootNode(node);
   -1 13218         var matchingNodes = Array.from(root.querySelectorAll('[id="' + axe.commons.utils.escapeSelector(id) + '"]')).filter(function(foundNode) {
   -1 13219           return foundNode !== node;
   -1 13220         });
   -1 13221         if (matchingNodes.length) {
   -1 13222           this.relatedNodes(matchingNodes);
11657 13223         }
11658    -1         this.data(node.getAttribute('id'));
11659    -1         return matchingNodes.length <= 1;
   -1 13224         this.data(id);
   -1 13225         return matchingNodes.length === 0;
11660 13226       },
11661 13227       after: function after(results, options) {
11662 13228         var uniqueIds = [];
@@ -11670,68 +13236,68 @@ module.exports = {
11670 13236       }
11671 13237     }, {
11672 13238       id: 'exists',
11673    -1       evaluate: function evaluate(node, options) {
   -1 13239       evaluate: function evaluate(node, options, virtualNode) {
11674 13240         return true;
11675 13241       }
11676 13242     }, {
11677 13243       id: 'has-alt',
11678    -1       evaluate: function evaluate(node, options) {
   -1 13244       evaluate: function evaluate(node, options, virtualNode) {
11679 13245         var nn = node.nodeName.toLowerCase();
11680 13246         return node.hasAttribute('alt') && (nn === 'img' || nn === 'input' || nn === 'area');
11681 13247       }
11682 13248     }, {
11683 13249       id: 'has-visible-text',
11684    -1       evaluate: function evaluate(node, options) {
11685    -1         return axe.commons.text.accessibleText(node).length > 0;
   -1 13250       evaluate: function evaluate(node, options, virtualNode) {
   -1 13251         return axe.commons.text.accessibleTextVirtual(virtualNode).length > 0;
11686 13252       }
11687 13253     }, {
11688 13254       id: 'is-on-screen',
11689    -1       evaluate: function evaluate(node, options) {
   -1 13255       evaluate: function evaluate(node, options, virtualNode) {
11690 13256         return axe.commons.dom.isVisible(node, false) && !axe.commons.dom.isOffscreen(node);
11691 13257       }
11692 13258     }, {
11693 13259       id: 'non-empty-alt',
11694    -1       evaluate: function evaluate(node, options) {
   -1 13260       evaluate: function evaluate(node, options, virtualNode) {
11695 13261         var label = node.getAttribute('alt');
11696 13262         return !!(label ? axe.commons.text.sanitize(label).trim() : '');
11697 13263       }
11698 13264     }, {
11699 13265       id: 'non-empty-if-present',
11700    -1       evaluate: function evaluate(node, options) {
   -1 13266       evaluate: function evaluate(node, options, virtualNode) {
11701 13267         var nodeName = node.nodeName.toUpperCase();
11702 13268         var type = (node.getAttribute('type') || '').toLowerCase();
11703 13269         var label = node.getAttribute('value');
11704 13270         this.data(label);
11705    -1         if (nodeName === 'INPUT' && [ 'submit', 'reset' ].indexOf(type) !== -1) {
   -1 13271         if (nodeName === 'INPUT' && [ 'submit', 'reset' ].includes(type)) {
11706 13272           return label === null;
11707 13273         }
11708 13274         return false;
11709 13275       }
11710 13276     }, {
11711 13277       id: 'non-empty-title',
11712    -1       evaluate: function evaluate(node, options) {
   -1 13278       evaluate: function evaluate(node, options, virtualNode) {
11713 13279         var title = node.getAttribute('title');
11714 13280         return !!(title ? axe.commons.text.sanitize(title).trim() : '');
11715 13281       }
11716 13282     }, {
11717 13283       id: 'non-empty-value',
11718    -1       evaluate: function evaluate(node, options) {
   -1 13284       evaluate: function evaluate(node, options, virtualNode) {
11719 13285         var label = node.getAttribute('value');
11720 13286         return !!(label ? axe.commons.text.sanitize(label).trim() : '');
11721 13287       }
11722 13288     }, {
11723 13289       id: 'role-none',
11724    -1       evaluate: function evaluate(node, options) {
   -1 13290       evaluate: function evaluate(node, options, virtualNode) {
11725 13291         return node.getAttribute('role') === 'none';
11726 13292       }
11727 13293     }, {
11728 13294       id: 'role-presentation',
11729    -1       evaluate: function evaluate(node, options) {
   -1 13295       evaluate: function evaluate(node, options, virtualNode) {
11730 13296         return node.getAttribute('role') === 'presentation';
11731 13297       }
11732 13298     }, {
11733 13299       id: 'caption-faked',
11734    -1       evaluate: function evaluate(node, options) {
   -1 13300       evaluate: function evaluate(node, options, virtualNode) {
11735 13301         var table = axe.commons.table.toGrid(node);
11736 13302         var firstRow = table[0];
11737 13303         if (table.length <= 1 || firstRow.length <= 1 || node.rows.length <= 1) {
@@ -11743,17 +13309,17 @@ module.exports = {
11743 13309       }
11744 13310     }, {
11745 13311       id: 'has-caption',
11746    -1       evaluate: function evaluate(node, options) {
   -1 13312       evaluate: function evaluate(node, options, virtualNode) {
11747 13313         return !!node.caption;
11748 13314       }
11749 13315     }, {
11750 13316       id: 'has-summary',
11751    -1       evaluate: function evaluate(node, options) {
   -1 13317       evaluate: function evaluate(node, options, virtualNode) {
11752 13318         return !!node.summary;
11753 13319       }
11754 13320     }, {
11755 13321       id: 'has-th',
11756    -1       evaluate: function evaluate(node, options) {
   -1 13322       evaluate: function evaluate(node, options, virtualNode) {
11757 13323         var row, cell, badCells = [];
11758 13324         for (var rowIndex = 0, rowLength = node.rows.length; rowIndex < rowLength; rowIndex++) {
11759 13325           row = node.rows[rowIndex];
@@ -11772,7 +13338,7 @@ module.exports = {
11772 13338       }
11773 13339     }, {
11774 13340       id: 'html5-scope',
11775    -1       evaluate: function evaluate(node, options) {
   -1 13341       evaluate: function evaluate(node, options, virtualNode) {
11776 13342         if (!axe.commons.dom.isHTML5(document)) {
11777 13343           return true;
11778 13344         }
@@ -11780,12 +13346,12 @@ module.exports = {
11780 13346       }
11781 13347     }, {
11782 13348       id: 'same-caption-summary',
11783    -1       evaluate: function evaluate(node, options) {
11784    -1         return !!(node.summary && node.caption) && node.summary === axe.commons.text.accessibleText(node.caption);
   -1 13349       evaluate: function evaluate(node, options, virtualNode) {
   -1 13350         return !!(node.summary && node.caption) && node.summary.toLowerCase() === axe.commons.text.accessibleText(node.caption).toLowerCase();
11785 13351       }
11786 13352     }, {
11787 13353       id: 'scope-value',
11788    -1       evaluate: function evaluate(node, options) {
   -1 13354       evaluate: function evaluate(node, options, virtualNode) {
11789 13355         options = options || {};
11790 13356         var value = node.getAttribute('scope').toLowerCase();
11791 13357         var validVals = [ 'row', 'col', 'rowgroup', 'colgroup' ] || options.values;
@@ -11793,16 +13359,15 @@ module.exports = {
11793 13359       }
11794 13360     }, {
11795 13361       id: 'td-has-header',
11796    -1       evaluate: function evaluate(node, options) {
   -1 13362       evaluate: function evaluate(node, options, virtualNode) {
11797 13363         var tableUtils = axe.commons.table;
11798 13364         var badCells = [];
11799 13365         var cells = tableUtils.getAllCells(node);
11800 13366         cells.forEach(function(cell) {
11801 13367           if (axe.commons.dom.hasContent(cell) && tableUtils.isDataCell(cell) && !axe.commons.aria.label(cell)) {
11802    -1             var hasHeaders = tableUtils.getHeaders(cell);
11803    -1             hasHeaders = hasHeaders.reduce(function(hasHeaders, header) {
11804    -1               return hasHeaders || header !== null && !!axe.commons.dom.hasContent(header);
11805    -1             }, false);
   -1 13368             var hasHeaders = tableUtils.getHeaders(cell).some(function(header) {
   -1 13369               return header !== null && !!axe.commons.dom.hasContent(header);
   -1 13370             });
11806 13371             if (!hasHeaders) {
11807 13372               badCells.push(cell);
11808 13373             }
@@ -11816,7 +13381,7 @@ module.exports = {
11816 13381       }
11817 13382     }, {
11818 13383       id: 'td-headers-attr',
11819    -1       evaluate: function evaluate(node, options) {
   -1 13384       evaluate: function evaluate(node, options, virtualNode) {
11820 13385         var cells = [];
11821 13386         for (var rowIndex = 0, rowLength = node.rows.length; rowIndex < rowLength; rowIndex++) {
11822 13387           var row = node.rows[rowIndex];
@@ -11861,7 +13426,7 @@ module.exports = {
11861 13426       }
11862 13427     }, {
11863 13428       id: 'th-has-data-cells',
11864    -1       evaluate: function evaluate(node, options) {
   -1 13429       evaluate: function evaluate(node, options, virtualNode) {
11865 13430         var tableUtils = axe.commons.table;
11866 13431         var cells = tableUtils.getAllCells(node);
11867 13432         var checkResult = this;
@@ -11908,16 +13473,15 @@ module.exports = {
11908 13473       }
11909 13474     }, {
11910 13475       id: 'hidden-content',
11911    -1       evaluate: function evaluate(node, options) {
11912    -1         var styles = window.getComputedStyle(node);
   -1 13476       evaluate: function evaluate(node, options, virtualNode) {
11913 13477         var whitelist = [ 'SCRIPT', 'HEAD', 'TITLE', 'NOSCRIPT', 'STYLE', 'TEMPLATE' ];
11914    -1         if (!whitelist.includes(node.tagName.toUpperCase()) && axe.commons.dom.hasContent(node)) {
   -1 13478         if (!whitelist.includes(node.tagName.toUpperCase()) && axe.commons.dom.hasContentVirtual(virtualNode)) {
   -1 13479           var styles = window.getComputedStyle(node);
11915 13480           if (styles.getPropertyValue('display') === 'none') {
11916 13481             return undefined;
11917 13482           } else if (styles.getPropertyValue('visibility') === 'hidden') {
11918    -1             if (node.parentNode) {
11919    -1               var parentStyle = window.getComputedStyle(node.parentNode);
11920    -1             }
   -1 13483             var parent = axe.commons.dom.getComposedParent(node);
   -1 13484             var parentStyle = parent && window.getComputedStyle(parent);
11921 13485             if (!parentStyle || parentStyle.getPropertyValue('visibility') !== 'hidden') {
11922 13486               return undefined;
11923 13487             }
@@ -12009,7 +13573,8 @@ module.exports = {
12009 13573           type: 'string'
12010 13574         },
12011 13575         'aria-labelledby': {
12012    -1           type: 'idrefs'
   -1 13576           type: 'idrefs',
   -1 13577           values: [ '' ]
12013 13578         },
12014 13579         'aria-level': {
12015 13580           type: 'int'
@@ -12100,164 +13665,515 @@ module.exports = {
12100 13665             allowed: [ 'aria-expanded' ]
12101 13666           },
12102 13667           owned: null,
12103    -1           nameFrom: [ 'author' ],
   -1 13668           nameFrom: [ 'author' ],
   -1 13669           context: null
   -1 13670         },
   -1 13671         alertdialog: {
   -1 13672           type: 'widget',
   -1 13673           attributes: {
   -1 13674             allowed: [ 'aria-expanded', 'aria-modal' ]
   -1 13675           },
   -1 13676           owned: null,
   -1 13677           nameFrom: [ 'author' ],
   -1 13678           context: null
   -1 13679         },
   -1 13680         application: {
   -1 13681           type: 'landmark',
   -1 13682           attributes: {
   -1 13683             allowed: [ 'aria-expanded' ]
   -1 13684           },
   -1 13685           owned: null,
   -1 13686           nameFrom: [ 'author' ],
   -1 13687           context: null
   -1 13688         },
   -1 13689         article: {
   -1 13690           type: 'structure',
   -1 13691           attributes: {
   -1 13692             allowed: [ 'aria-expanded', 'aria-posinset', 'aria-setsize' ]
   -1 13693           },
   -1 13694           owned: null,
   -1 13695           nameFrom: [ 'author' ],
   -1 13696           context: null,
   -1 13697           implicit: [ 'article' ]
   -1 13698         },
   -1 13699         banner: {
   -1 13700           type: 'landmark',
   -1 13701           attributes: {
   -1 13702             allowed: [ 'aria-expanded' ]
   -1 13703           },
   -1 13704           owned: null,
   -1 13705           nameFrom: [ 'author' ],
   -1 13706           context: null,
   -1 13707           implicit: [ 'header' ]
   -1 13708         },
   -1 13709         button: {
   -1 13710           type: 'widget',
   -1 13711           attributes: {
   -1 13712             allowed: [ 'aria-expanded', 'aria-pressed' ]
   -1 13713           },
   -1 13714           owned: null,
   -1 13715           nameFrom: [ 'author', 'contents' ],
   -1 13716           context: null,
   -1 13717           implicit: [ 'button', 'input[type="button"]', 'input[type="image"]', 'input[type="reset"]', 'input[type="submit"]', 'summary' ]
   -1 13718         },
   -1 13719         cell: {
   -1 13720           type: 'structure',
   -1 13721           attributes: {
   -1 13722             allowed: [ 'aria-colindex', 'aria-colspan', 'aria-rowindex', 'aria-rowspan' ]
   -1 13723           },
   -1 13724           owned: null,
   -1 13725           nameFrom: [ 'author', 'contents' ],
   -1 13726           context: [ 'row' ],
   -1 13727           implicit: [ 'td', 'th' ]
   -1 13728         },
   -1 13729         checkbox: {
   -1 13730           type: 'widget',
   -1 13731           attributes: {
   -1 13732             allowed: [ 'aria-checked', 'aria-required' ]
   -1 13733           },
   -1 13734           owned: null,
   -1 13735           nameFrom: [ 'author', 'contents' ],
   -1 13736           context: null,
   -1 13737           implicit: [ 'input[type="checkbox"]' ]
   -1 13738         },
   -1 13739         columnheader: {
   -1 13740           type: 'structure',
   -1 13741           attributes: {
   -1 13742             allowed: [ 'aria-colindex', 'aria-colspan', 'aria-expanded', 'aria-rowindex', 'aria-rowspan', 'aria-required', 'aria-readonly', 'aria-selected', 'aria-sort' ]
   -1 13743           },
   -1 13744           owned: null,
   -1 13745           nameFrom: [ 'author', 'contents' ],
   -1 13746           context: [ 'row' ],
   -1 13747           implicit: [ 'th' ]
   -1 13748         },
   -1 13749         combobox: {
   -1 13750           type: 'composite',
   -1 13751           attributes: {
   -1 13752             allowed: [ 'aria-expanded', 'aria-autocomplete', 'aria-required', 'aria-activedescendant', 'aria-orientation' ]
   -1 13753           },
   -1 13754           owned: {
   -1 13755             all: [ 'listbox', 'textbox' ]
   -1 13756           },
   -1 13757           nameFrom: [ 'author' ],
   -1 13758           context: null
   -1 13759         },
   -1 13760         command: {
   -1 13761           nameFrom: [ 'author' ],
   -1 13762           type: 'abstract'
   -1 13763         },
   -1 13764         complementary: {
   -1 13765           type: 'landmark',
   -1 13766           attributes: {
   -1 13767             allowed: [ 'aria-expanded' ]
   -1 13768           },
   -1 13769           owned: null,
   -1 13770           nameFrom: [ 'author' ],
   -1 13771           context: null,
   -1 13772           implicit: [ 'aside' ]
   -1 13773         },
   -1 13774         composite: {
   -1 13775           nameFrom: [ 'author' ],
   -1 13776           type: 'abstract'
   -1 13777         },
   -1 13778         contentinfo: {
   -1 13779           type: 'landmark',
   -1 13780           attributes: {
   -1 13781             allowed: [ 'aria-expanded' ]
   -1 13782           },
   -1 13783           owned: null,
   -1 13784           nameFrom: [ 'author' ],
   -1 13785           context: null,
   -1 13786           implicit: [ 'footer' ]
   -1 13787         },
   -1 13788         definition: {
   -1 13789           type: 'structure',
   -1 13790           attributes: {
   -1 13791             allowed: [ 'aria-expanded' ]
   -1 13792           },
   -1 13793           owned: null,
   -1 13794           nameFrom: [ 'author' ],
   -1 13795           context: null,
   -1 13796           implicit: [ 'dd', 'dfn' ]
   -1 13797         },
   -1 13798         dialog: {
   -1 13799           type: 'widget',
   -1 13800           attributes: {
   -1 13801             allowed: [ 'aria-expanded', 'aria-modal' ]
   -1 13802           },
   -1 13803           owned: null,
   -1 13804           nameFrom: [ 'author' ],
   -1 13805           context: null,
   -1 13806           implicit: [ 'dialog' ]
   -1 13807         },
   -1 13808         directory: {
   -1 13809           type: 'structure',
   -1 13810           attributes: {
   -1 13811             allowed: [ 'aria-expanded' ]
   -1 13812           },
   -1 13813           owned: null,
   -1 13814           nameFrom: [ 'author', 'contents' ],
   -1 13815           context: null
   -1 13816         },
   -1 13817         document: {
   -1 13818           type: 'structure',
   -1 13819           attributes: {
   -1 13820             allowed: [ 'aria-expanded' ]
   -1 13821           },
   -1 13822           owned: null,
   -1 13823           nameFrom: [ 'author' ],
   -1 13824           context: null,
   -1 13825           implicit: [ 'body' ]
   -1 13826         },
   -1 13827         'doc-abstract': {
   -1 13828           type: 'section',
   -1 13829           attributes: {
   -1 13830             allowed: [ 'aria-expanded' ]
   -1 13831           },
   -1 13832           owned: null,
   -1 13833           nameFrom: [ 'author' ],
   -1 13834           context: null
   -1 13835         },
   -1 13836         'doc-acknowledgments': {
   -1 13837           type: 'landmark',
   -1 13838           attributes: {
   -1 13839             allowed: [ 'aria-expanded' ]
   -1 13840           },
   -1 13841           owned: null,
   -1 13842           nameFrom: [ 'author' ],
   -1 13843           context: null
   -1 13844         },
   -1 13845         'doc-afterword': {
   -1 13846           type: 'landmark',
   -1 13847           attributes: {
   -1 13848             allowed: [ 'aria-expanded' ]
   -1 13849           },
   -1 13850           owned: null,
   -1 13851           nameFrom: [ 'author' ],
   -1 13852           context: null
   -1 13853         },
   -1 13854         'doc-appendix': {
   -1 13855           type: 'landmark',
   -1 13856           attributes: {
   -1 13857             allowed: [ 'aria-expanded' ]
   -1 13858           },
   -1 13859           owned: null,
   -1 13860           nameFrom: [ 'author' ],
   -1 13861           context: null
   -1 13862         },
   -1 13863         'doc-backlink': {
   -1 13864           type: 'link',
   -1 13865           attributes: {
   -1 13866             allowed: [ 'aria-expanded' ]
   -1 13867           },
   -1 13868           owned: null,
   -1 13869           nameFrom: [ 'author', 'contents' ],
   -1 13870           context: null
   -1 13871         },
   -1 13872         'doc-biblioentry': {
   -1 13873           type: 'listitem',
   -1 13874           attributes: {
   -1 13875             allowed: [ 'aria-expanded', 'aria-level', 'aria-posinset', 'aria-setsize' ]
   -1 13876           },
   -1 13877           owned: null,
   -1 13878           nameFrom: [ 'author' ],
   -1 13879           context: [ 'doc-bibliography' ]
   -1 13880         },
   -1 13881         'doc-bibliography': {
   -1 13882           type: 'landmark',
   -1 13883           attributes: {
   -1 13884             allowed: [ 'aria-expanded' ]
   -1 13885           },
   -1 13886           owned: null,
   -1 13887           nameFrom: [ 'author' ],
   -1 13888           context: null
   -1 13889         },
   -1 13890         'doc-biblioref': {
   -1 13891           type: 'link',
   -1 13892           attributes: {
   -1 13893             allowed: [ 'aria-expanded' ]
   -1 13894           },
   -1 13895           owned: null,
   -1 13896           nameFrom: [ 'author', 'contents' ],
   -1 13897           context: null
   -1 13898         },
   -1 13899         'doc-chapter': {
   -1 13900           type: 'landmark',
   -1 13901           attributes: {
   -1 13902             allowed: [ 'aria-expanded' ]
   -1 13903           },
   -1 13904           owned: null,
   -1 13905           namefrom: [ 'author' ],
   -1 13906           context: null
   -1 13907         },
   -1 13908         'doc-colophon': {
   -1 13909           type: 'section',
   -1 13910           attributes: {
   -1 13911             allowed: [ 'aria-expanded' ]
   -1 13912           },
   -1 13913           owned: null,
   -1 13914           namefrom: [ 'author' ],
   -1 13915           context: null
   -1 13916         },
   -1 13917         'doc-conclusion': {
   -1 13918           type: 'landmark',
   -1 13919           attributes: {
   -1 13920             allowed: [ 'aria-expanded' ]
   -1 13921           },
   -1 13922           owned: null,
   -1 13923           namefrom: [ 'author' ],
   -1 13924           context: null
   -1 13925         },
   -1 13926         'doc-cover': {
   -1 13927           type: 'img',
   -1 13928           attributes: {
   -1 13929             allowed: [ 'aria-expanded' ]
   -1 13930           },
   -1 13931           owned: null,
   -1 13932           namefrom: [ 'author' ],
   -1 13933           context: null
   -1 13934         },
   -1 13935         'doc-credit': {
   -1 13936           type: 'section',
   -1 13937           attributes: {
   -1 13938             allowed: [ 'aria-expanded' ]
   -1 13939           },
   -1 13940           owned: null,
   -1 13941           namefrom: [ 'author' ],
   -1 13942           context: null
   -1 13943         },
   -1 13944         'doc-credits': {
   -1 13945           type: 'landmark',
   -1 13946           attributes: {
   -1 13947             allowed: [ 'aria-expanded' ]
   -1 13948           },
   -1 13949           owned: null,
   -1 13950           namefrom: [ 'author' ],
   -1 13951           context: null
   -1 13952         },
   -1 13953         'doc-dedication': {
   -1 13954           type: 'section',
   -1 13955           attributes: {
   -1 13956             allowed: [ 'aria-expanded' ]
   -1 13957           },
   -1 13958           owned: null,
   -1 13959           namefrom: [ 'author' ],
   -1 13960           context: null
   -1 13961         },
   -1 13962         'doc-endnote': {
   -1 13963           type: 'listitem',
   -1 13964           attributes: {
   -1 13965             allowed: [ 'aria-expanded', 'aria-level', 'aria-posinset', 'aria-setsize' ]
   -1 13966           },
   -1 13967           owned: null,
   -1 13968           namefrom: [ 'author' ],
   -1 13969           context: [ 'doc-endnotes' ]
   -1 13970         },
   -1 13971         'doc-endnotes': {
   -1 13972           type: 'landmark',
   -1 13973           attributes: {
   -1 13974             allowed: [ 'aria-expanded' ]
   -1 13975           },
   -1 13976           owned: [ 'doc-endnote' ],
   -1 13977           namefrom: [ 'author' ],
   -1 13978           context: null
   -1 13979         },
   -1 13980         'doc-epigraph': {
   -1 13981           type: 'section',
   -1 13982           attributes: {
   -1 13983             allowed: [ 'aria-expanded' ]
   -1 13984           },
   -1 13985           owned: null,
   -1 13986           namefrom: [ 'author' ],
12104 13987           context: null
12105 13988         },
12106    -1         alertdialog: {
12107    -1           type: 'widget',
   -1 13989         'doc-epilogue': {
   -1 13990           type: 'landmark',
12108 13991           attributes: {
12109    -1             allowed: [ 'aria-expanded', 'aria-modal' ]
   -1 13992             allowed: [ 'aria-expanded' ]
12110 13993           },
12111 13994           owned: null,
12112    -1           nameFrom: [ 'author' ],
   -1 13995           namefrom: [ 'author' ],
12113 13996           context: null
12114 13997         },
12115    -1         application: {
   -1 13998         'doc-errata': {
12116 13999           type: 'landmark',
12117 14000           attributes: {
12118 14001             allowed: [ 'aria-expanded' ]
12119 14002           },
12120 14003           owned: null,
12121    -1           nameFrom: [ 'author' ],
   -1 14004           namefrom: [ 'author' ],
12122 14005           context: null
12123 14006         },
12124    -1         article: {
12125    -1           type: 'structure',
   -1 14007         'doc-example': {
   -1 14008           type: 'section',
12126 14009           attributes: {
12127    -1             allowed: [ 'aria-expanded', 'aria-posinset', 'aria-setsize' ]
   -1 14010             allowed: [ 'aria-expanded' ]
12128 14011           },
12129 14012           owned: null,
12130    -1           nameFrom: [ 'author' ],
12131    -1           context: null,
12132    -1           implicit: [ 'article' ]
   -1 14013           namefrom: [ 'author' ],
   -1 14014           context: null
12133 14015         },
12134    -1         banner: {
   -1 14016         'doc-footnote': {
   -1 14017           type: 'section',
   -1 14018           attributes: {
   -1 14019             allowed: [ 'aria-expanded' ]
   -1 14020           },
   -1 14021           owned: null,
   -1 14022           namefrom: [ 'author' ],
   -1 14023           context: null
   -1 14024         },
   -1 14025         'doc-foreword': {
12135 14026           type: 'landmark',
12136 14027           attributes: {
12137 14028             allowed: [ 'aria-expanded' ]
12138 14029           },
12139 14030           owned: null,
12140    -1           nameFrom: [ 'author' ],
12141    -1           context: null,
12142    -1           implicit: [ 'header' ]
   -1 14031           namefrom: [ 'author' ],
   -1 14032           context: null
12143 14033         },
12144    -1         button: {
12145    -1           type: 'widget',
   -1 14034         'doc-glossary': {
   -1 14035           type: 'landmark',
12146 14036           attributes: {
12147    -1             allowed: [ 'aria-expanded', 'aria-pressed' ]
   -1 14037             allowed: [ 'aria-expanded' ]
   -1 14038           },
   -1 14039           owned: [ 'term', 'definition' ],
   -1 14040           namefrom: [ 'author' ],
   -1 14041           context: null
   -1 14042         },
   -1 14043         'doc-glossref': {
   -1 14044           type: 'link',
   -1 14045           attributes: {
   -1 14046             allowed: [ 'aria-expanded' ]
12148 14047           },
12149 14048           owned: null,
12150    -1           nameFrom: [ 'author', 'contents' ],
12151    -1           context: null,
12152    -1           implicit: [ 'button', 'input[type="button"]', 'input[type="image"]', 'input[type="reset"]', 'input[type="submit"]', 'summary' ]
   -1 14049           namefrom: [ 'author', 'contents' ],
   -1 14050           context: null
12153 14051         },
12154    -1         cell: {
12155    -1           type: 'structure',
   -1 14052         'doc-index': {
   -1 14053           type: 'navigation',
12156 14054           attributes: {
12157    -1             allowed: [ 'aria-colindex', 'aria-colspan', 'aria-rowindex', 'aria-rowspan' ]
   -1 14055             allowed: [ 'aria-expanded' ]
12158 14056           },
12159 14057           owned: null,
12160    -1           nameFrom: [ 'author', 'contents' ],
12161    -1           context: [ 'row' ],
12162    -1           implicit: [ 'td', 'th' ]
   -1 14058           namefrom: [ 'author' ],
   -1 14059           context: null
12163 14060         },
12164    -1         checkbox: {
12165    -1           type: 'widget',
   -1 14061         'doc-introduction': {
   -1 14062           type: 'landmark',
12166 14063           attributes: {
12167    -1             allowed: [ 'aria-checked', 'aria-required' ]
   -1 14064             allowed: [ 'aria-expanded' ]
12168 14065           },
12169 14066           owned: null,
12170    -1           nameFrom: [ 'author', 'contents' ],
12171    -1           context: null,
12172    -1           implicit: [ 'input[type="checkbox"]' ]
   -1 14067           namefrom: [ 'author' ],
   -1 14068           context: null
12173 14069         },
12174    -1         columnheader: {
12175    -1           type: 'structure',
   -1 14070         'doc-noteref': {
   -1 14071           type: 'link',
12176 14072           attributes: {
12177    -1             allowed: [ 'aria-colindex', 'aria-colspan', 'aria-expanded', 'aria-rowindex', 'aria-rowspan', 'aria-required', 'aria-readonly', 'aria-selected', 'aria-sort' ]
   -1 14073             allowed: [ 'aria-expanded' ]
12178 14074           },
12179 14075           owned: null,
12180    -1           nameFrom: [ 'author', 'contents' ],
12181    -1           context: [ 'row' ],
12182    -1           implicit: [ 'th' ]
   -1 14076           namefrom: [ 'author', 'contents' ],
   -1 14077           context: null
12183 14078         },
12184    -1         combobox: {
12185    -1           type: 'composite',
   -1 14079         'doc-notice': {
   -1 14080           type: 'note',
12186 14081           attributes: {
12187    -1             allowed: [ 'aria-expanded', 'aria-autocomplete', 'aria-required', 'aria-activedescendant', 'aria-orientation' ]
   -1 14082             allowed: [ 'aria-expanded' ]
12188 14083           },
12189    -1           owned: {
12190    -1             all: [ 'listbox', 'textbox' ]
   -1 14084           owned: null,
   -1 14085           namefrom: [ 'author' ],
   -1 14086           context: null
   -1 14087         },
   -1 14088         'doc-pagebreak': {
   -1 14089           type: 'separator',
   -1 14090           attributes: {
   -1 14091             allowed: [ 'aria-expanded' ]
12191 14092           },
12192    -1           nameFrom: [ 'author' ],
   -1 14093           owned: null,
   -1 14094           namefrom: [ 'author' ],
12193 14095           context: null
12194 14096         },
12195    -1         command: {
12196    -1           nameFrom: [ 'author' ],
12197    -1           type: 'abstract'
   -1 14097         'doc-pagelist': {
   -1 14098           type: 'navigation',
   -1 14099           attributes: {
   -1 14100             allowed: [ 'aria-expanded' ]
   -1 14101           },
   -1 14102           owned: null,
   -1 14103           namefrom: [ 'author' ],
   -1 14104           context: null
12198 14105         },
12199    -1         complementary: {
   -1 14106         'doc-part': {
12200 14107           type: 'landmark',
12201 14108           attributes: {
12202 14109             allowed: [ 'aria-expanded' ]
12203 14110           },
12204 14111           owned: null,
12205    -1           nameFrom: [ 'author' ],
12206    -1           context: null,
12207    -1           implicit: [ 'aside' ]
   -1 14112           namefrom: [ 'author' ],
   -1 14113           context: null
12208 14114         },
12209    -1         composite: {
12210    -1           nameFrom: [ 'author' ],
12211    -1           type: 'abstract'
   -1 14115         'doc-preface': {
   -1 14116           type: 'landmark',
   -1 14117           attributes: {
   -1 14118             allowed: [ 'aria-expanded' ]
   -1 14119           },
   -1 14120           owned: null,
   -1 14121           namefrom: [ 'author' ],
   -1 14122           context: null
12212 14123         },
12213    -1         contentinfo: {
   -1 14124         'doc-prologue': {
12214 14125           type: 'landmark',
12215 14126           attributes: {
12216 14127             allowed: [ 'aria-expanded' ]
12217 14128           },
12218 14129           owned: null,
12219    -1           nameFrom: [ 'author' ],
12220    -1           context: null,
12221    -1           implicit: [ 'footer' ]
   -1 14130           namefrom: [ 'author' ],
   -1 14131           context: null
12222 14132         },
12223    -1         definition: {
12224    -1           type: 'structure',
   -1 14133         'doc-pullquote': {
   -1 14134           type: 'none',
12225 14135           attributes: {
12226 14136             allowed: [ 'aria-expanded' ]
12227 14137           },
12228 14138           owned: null,
12229    -1           nameFrom: [ 'author' ],
12230    -1           context: null,
12231    -1           implicit: [ 'dd', 'dfn' ]
   -1 14139           namefrom: [ 'author' ],
   -1 14140           context: null
12232 14141         },
12233    -1         dialog: {
12234    -1           type: 'widget',
   -1 14142         'doc-qna': {
   -1 14143           type: 'section',
12235 14144           attributes: {
12236    -1             allowed: [ 'aria-expanded', 'aria-modal' ]
   -1 14145             allowed: [ 'aria-expanded' ]
12237 14146           },
12238 14147           owned: null,
12239    -1           nameFrom: [ 'author' ],
12240    -1           context: null,
12241    -1           implicit: [ 'dialog' ]
   -1 14148           namefrom: [ 'author' ],
   -1 14149           context: null
12242 14150         },
12243    -1         directory: {
12244    -1           type: 'structure',
   -1 14151         'doc-subtitle': {
   -1 14152           type: 'sectionhead',
12245 14153           attributes: {
12246 14154             allowed: [ 'aria-expanded' ]
12247 14155           },
12248 14156           owned: null,
12249    -1           nameFrom: [ 'author', 'contents' ],
   -1 14157           namefrom: [ 'author' ],
12250 14158           context: null
12251 14159         },
12252    -1         document: {
12253    -1           type: 'structure',
   -1 14160         'doc-tip': {
   -1 14161           type: 'note',
12254 14162           attributes: {
12255 14163             allowed: [ 'aria-expanded' ]
12256 14164           },
12257 14165           owned: null,
12258    -1           nameFrom: [ 'author' ],
12259    -1           context: null,
12260    -1           implicit: [ 'body' ]
   -1 14166           namefrom: [ 'author' ],
   -1 14167           context: null
   -1 14168         },
   -1 14169         'doc-toc': {
   -1 14170           type: 'navigation',
   -1 14171           attributes: {
   -1 14172             allowed: [ 'aria-expanded' ]
   -1 14173           },
   -1 14174           owned: null,
   -1 14175           namefrom: [ 'author' ],
   -1 14176           context: null
12261 14177         },
12262 14178         feed: {
12263 14179           type: 'structure',
@@ -12315,7 +14231,8 @@ module.exports = {
12315 14231         heading: {
12316 14232           type: 'structure',
12317 14233           attributes: {
12318    -1             allowed: [ 'aria-level', 'aria-expanded' ]
   -1 14234             required: [ 'aria-level' ],
   -1 14235             allowed: [ 'aria-expanded' ]
12319 14236           },
12320 14237           owned: null,
12321 14238           nameFrom: [ 'author', 'contents' ],
@@ -12831,7 +14748,9 @@ module.exports = {
12831 14748       commons.color = color;
12832 14749       var dom = commons.dom = {};
12833 14750       var table = commons.table = {};
12834    -1       var text = commons.text = {};
   -1 14751       var text = commons.text = {
   -1 14752         EdgeFormDefaults: {}
   -1 14753       };
12835 14754       var utils = commons.utils = axe.utils;
12836 14755       aria.requiredAttr = function(role) {
12837 14756         'use strict';
@@ -12849,7 +14768,8 @@ module.exports = {
12849 14768       };
12850 14769       aria.validateAttrValue = function(node, attr) {
12851 14770         'use strict';
12852    -1         var matches, list, doc = document, value = node.getAttribute(attr), attrInfo = aria.lookupTable.attributes[attr];
   -1 14771         var matches, list, value = node.getAttribute(attr), attrInfo = aria.lookupTable.attributes[attr];
   -1 14772         var doc = dom.getRootNode(node);
12853 14773         if (!attrInfo) {
12854 14774           return true;
12855 14775         }
@@ -12868,10 +14788,13 @@ module.exports = {
12868 14788           return !!(value && doc.getElementById(value));
12869 14789 
12870 14790          case 'idrefs':
   -1 14791           if (attrInfo.values && attrInfo.values.indexOf('') !== -1 && value.trim().length === 0) {
   -1 14792             return true;
   -1 14793           }
12871 14794           list = axe.utils.tokenList(value);
12872    -1           return list.reduce(function(result, token) {
12873    -1             return !!(result && doc.getElementById(token));
12874    -1           }, list.length !== 0);
   -1 14795           return list.some(function(token) {
   -1 14796             return doc.getElementById(token);
   -1 14797           });
12875 14798 
12876 14799          case 'string':
12877 14800           return true;
@@ -12884,18 +14807,20 @@ module.exports = {
12884 14807           return /^[-+]?[0-9]+$/.test(value);
12885 14808         }
12886 14809       };
12887    -1       aria.label = function(node) {
12888    -1         var ref, candidate;
12889    -1         if (node.getAttribute('aria-labelledby')) {
12890    -1           ref = dom.idrefs(node, 'aria-labelledby');
   -1 14810       aria.labelVirtual = function(_ref8) {
   -1 14811         var actualNode = _ref8.actualNode;
   -1 14812         var ref = void 0, candidate = void 0;
   -1 14813         if (actualNode.getAttribute('aria-labelledby')) {
   -1 14814           ref = dom.idrefs(actualNode, 'aria-labelledby');
12891 14815           candidate = ref.map(function(thing) {
12892    -1             return thing ? text.visible(thing, true) : '';
   -1 14816             var vNode = axe.utils.getNodeFromTree(axe._tree[0], thing);
   -1 14817             return vNode ? text.visibleVirtual(vNode, true) : '';
12893 14818           }).join(' ').trim();
12894 14819           if (candidate) {
12895 14820             return candidate;
12896 14821           }
12897 14822         }
12898    -1         candidate = node.getAttribute('aria-label');
   -1 14823         candidate = actualNode.getAttribute('aria-label');
12899 14824         if (candidate) {
12900 14825           candidate = text.sanitize(candidate).trim();
12901 14826           if (candidate) {
@@ -12904,6 +14829,10 @@ module.exports = {
12904 14829         }
12905 14830         return null;
12906 14831       };
   -1 14832       aria.label = function(node) {
   -1 14833         node = axe.utils.getNodeFromTree(axe._tree[0], node);
   -1 14834         return aria.labelVirtual(node);
   -1 14835       };
12907 14836       aria.isValidRole = function(role) {
12908 14837         'use strict';
12909 14838         if (aria.lookupTable.role[role]) {
@@ -13138,7 +15067,7 @@ module.exports = {
13138 15067       }
13139 15068       function contentOverlapping(targetElement, bgNode) {
13140 15069         var targetRect = targetElement.getClientRects()[0];
13141    -1         var obscuringElements = document.elementsFromPoint(targetRect.left, targetRect.top);
   -1 15070         var obscuringElements = dom.shadowElementsFromPoint(targetRect.left, targetRect.top);
13142 15071         if (obscuringElements) {
13143 15072           for (var i = 0; i < obscuringElements.length; i++) {
13144 15073             if (obscuringElements[i] !== targetElement && obscuringElements[i] === bgNode) {
@@ -13229,15 +15158,15 @@ module.exports = {
13229 15158       color.getRectStack = function(elm) {
13230 15159         var boundingCoords = color.getCoords(elm.getBoundingClientRect());
13231 15160         if (boundingCoords) {
   -1 15161           var boundingStack = dom.shadowElementsFromPoint(boundingCoords.x, boundingCoords.y);
13232 15162           var rects = Array.from(elm.getClientRects());
13233    -1           var boundingStack = Array.from(document.elementsFromPoint(boundingCoords.x, boundingCoords.y));
13234 15163           if (rects && rects.length > 1) {
13235 15164             var filteredArr = rects.filter(function(rect) {
13236 15165               return rect.width && rect.width > 0;
13237 15166             }).map(function(rect) {
13238 15167               var coords = color.getCoords(rect);
13239 15168               if (coords) {
13240    -1                 return Array.from(document.elementsFromPoint(coords.x, coords.y));
   -1 15169                 return dom.shadowElementsFromPoint(coords.x, coords.y);
13241 15170               }
13242 15171             });
13243 15172             filteredArr.splice(0, 0, boundingStack);
@@ -13378,29 +15307,63 @@ module.exports = {
13378 15307         }
13379 15308         return finalElements;
13380 15309       };
   -1 15310       dom.findElmsInContext = function(_ref9) {
   -1 15311         var context = _ref9.context, value = _ref9.value, attr = _ref9.attr, _ref9$elm = _ref9.elm, elm = _ref9$elm === undefined ? '' : _ref9$elm;
   -1 15312         var root = void 0;
   -1 15313         var escapedValue = axe.utils.escapeSelector(value);
   -1 15314         if (context.nodeType === 9 || context.nodeType === 11) {
   -1 15315           root = context;
   -1 15316         } else {
   -1 15317           root = dom.getRootNode(context);
   -1 15318         }
   -1 15319         return Array.from(root.querySelectorAll(elm + '[' + attr + '=' + escapedValue + ']'));
   -1 15320       };
13381 15321       dom.findUp = function(element, target) {
13382    -1         'use strict';
13383    -1         var parent, matches = document.querySelectorAll(target), length = matches.length;
13384    -1         if (!length) {
   -1 15322         return dom.findUpVirtual(axe.utils.getNodeFromTree(axe._tree[0], element), target);
   -1 15323       };
   -1 15324       dom.findUpVirtual = function(element, target) {
   -1 15325         var parent = void 0;
   -1 15326         parent = element.actualNode;
   -1 15327         if (!element.shadowId && typeof element.actualNode.closest === 'function') {
   -1 15328           var match = element.actualNode.closest(target);
   -1 15329           if (match) {
   -1 15330             return match;
   -1 15331           }
13385 15332           return null;
13386 15333         }
13387    -1         matches = axe.utils.toArray(matches);
13388    -1         parent = element.parentNode;
13389    -1         while (parent && matches.indexOf(parent) === -1) {
13390    -1           parent = parent.parentNode;
   -1 15334         do {
   -1 15335           parent = parent.assignedSlot ? parent.assignedSlot : parent.parentNode;
   -1 15336           if (parent && parent.nodeType === 11) {
   -1 15337             parent = parent.host;
   -1 15338           }
   -1 15339         } while (parent && !axe.utils.matchesSelector(parent, target) && parent !== document.documentElement);
   -1 15340         if (!axe.utils.matchesSelector(parent, target)) {
   -1 15341           return null;
13391 15342         }
13392 15343         return parent;
13393 15344       };
   -1 15345       dom.getComposedParent = function getComposedParent(element) {
   -1 15346         if (element.assignedSlot) {
   -1 15347           return getComposedParent(element.assignedSlot);
   -1 15348         } else if (element.parentNode) {
   -1 15349           var parentNode = element.parentNode;
   -1 15350           if (parentNode.nodeType === 1) {
   -1 15351             return parentNode;
   -1 15352           } else if (parentNode.host) {
   -1 15353             return parentNode.host;
   -1 15354           }
   -1 15355         }
   -1 15356         return null;
   -1 15357       };
13394 15358       dom.getElementByReference = function(node, attr) {
13395    -1         'use strict';
13396    -1         var candidate, fragment = node.getAttribute(attr), doc = document;
   -1 15359         var fragment = node.getAttribute(attr);
13397 15360         if (fragment && fragment.charAt(0) === '#') {
13398    -1           fragment = fragment.substring(1);
13399    -1           candidate = doc.getElementById(fragment);
   -1 15361           fragment = decodeURIComponent(fragment.substring(1));
   -1 15362           var candidate = document.getElementById(fragment);
13400 15363           if (candidate) {
13401 15364             return candidate;
13402 15365           }
13403    -1           candidate = doc.getElementsByName(fragment);
   -1 15366           candidate = document.getElementsByName(fragment);
13404 15367           if (candidate.length) {
13405 15368             return candidate[0];
13406 15369           }
@@ -13419,6 +15382,13 @@ module.exports = {
13419 15382           height: coords.bottom - coords.top
13420 15383         };
13421 15384       };
   -1 15385       dom.getRootNode = function(node) {
   -1 15386         var doc = node.getRootNode && node.getRootNode() || document;
   -1 15387         if (doc === node) {
   -1 15388           doc = document;
   -1 15389         }
   -1 15390         return doc;
   -1 15391       };
13422 15392       dom.getScrollOffset = function(element) {
13423 15393         'use strict';
13424 15394         if (!element.nodeType && element.document) {
@@ -13457,22 +15427,27 @@ module.exports = {
13457 15427           height: body.clientHeight
13458 15428         };
13459 15429       };
13460    -1       dom.hasContent = function hasContent(elm) {
13461    -1         var skipItems = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
13462    -1         if (elm.textContent.trim() || aria.label(elm)) {
13463    -1           return true;
13464    -1         }
13465    -1         var contentElms = elm.querySelectorAll('*');
13466    -1         for (var i = 0; i < contentElms.length; i++) {
13467    -1           if (skipItems.indexOf(contentElms[i]) === -1 && aria.label(contentElms[i]) || dom.isVisualContent(contentElms[i])) {
13468    -1             return true;
13469    -1           }
   -1 15430       var hiddenTextElms = [ 'HEAD', 'TITLE', 'TEMPLATE', 'SCRIPT', 'STYLE', 'IFRAME', 'OBJECT', 'VIDEO', 'AUDIO', 'NOSCRIPT' ];
   -1 15431       function hasChildTextNodes(elm) {
   -1 15432         if (!hiddenTextElms.includes(elm.actualNode.nodeName.toUpperCase())) {
   -1 15433           return elm.children.some(function(_ref10) {
   -1 15434             var actualNode = _ref10.actualNode;
   -1 15435             return actualNode.nodeType === 3 && actualNode.nodeValue.trim();
   -1 15436           });
13470 15437         }
13471    -1         return false;
   -1 15438       }
   -1 15439       dom.hasContentVirtual = function(elm, noRecursion) {
   -1 15440         return hasChildTextNodes(elm) || dom.isVisualContent(elm.actualNode) || !!aria.labelVirtual(elm) || !noRecursion && elm.children.some(function(child) {
   -1 15441           return child.actualNode.nodeType === 1 && dom.hasContentVirtual(child);
   -1 15442         });
   -1 15443       };
   -1 15444       dom.hasContent = function hasContent(elm, noRecursion) {
   -1 15445         elm = axe.utils.getNodeFromTree(axe._tree[0], elm);
   -1 15446         return dom.hasContentVirtual(elm, noRecursion);
13472 15447       };
13473 15448       dom.idrefs = function(node, attr) {
13474 15449         'use strict';
13475    -1         var index, length, doc = document, result = [], idrefs = node.getAttribute(attr);
   -1 15450         var index, length, doc = dom.getRootNode(node), result = [], idrefs = node.getAttribute(attr);
13476 15451         if (idrefs) {
13477 15452           idrefs = axe.utils.tokenList(idrefs);
13478 15453           for (index = 0, length = idrefs.length; index < length; index++) {
@@ -13481,9 +15456,14 @@ module.exports = {
13481 15456         }
13482 15457         return result;
13483 15458       };
   -1 15459       function focusDisabled(el) {
   -1 15460         return el.disabled || !dom.isVisible(el, true) && el.nodeName.toUpperCase() !== 'AREA';
   -1 15461       }
13484 15462       dom.isFocusable = function(el) {
13485 15463         'use strict';
13486    -1         if (dom.isNativelyFocusable(el)) {
   -1 15464         if (focusDisabled(el)) {
   -1 15465           return false;
   -1 15466         } else if (dom.isNativelyFocusable(el)) {
13487 15467           return true;
13488 15468         }
13489 15469         var tabindex = el.getAttribute('tabindex');
@@ -13494,7 +15474,7 @@ module.exports = {
13494 15474       };
13495 15475       dom.isNativelyFocusable = function(el) {
13496 15476         'use strict';
13497    -1         if (!el || el.disabled || !dom.isVisible(el) && el.nodeName.toUpperCase() !== 'AREA') {
   -1 15477         if (!el || focusDisabled(el)) {
13498 15478           return false;
13499 15479         }
13500 15480         switch (el.nodeName.toUpperCase()) {
@@ -13516,6 +15496,9 @@ module.exports = {
13516 15496         }
13517 15497         return false;
13518 15498       };
   -1 15499       dom.insertedIntoFocusOrder = function(el) {
   -1 15500         return el.tabIndex > -1 && dom.isFocusable(el) && !dom.isNativelyFocusable(el);
   -1 15501       };
13519 15502       dom.isHTML5 = function(doc) {
13520 15503         var node = doc.doctype;
13521 15504         if (node === null) {
@@ -13524,35 +15507,33 @@ module.exports = {
13524 15507         return node.name === 'html' && !node.publicId && !node.systemId;
13525 15508       };
13526 15509       function walkDomNode(node, functor) {
13527    -1         'use strict';
13528    -1         var shouldWalk = functor(node);
13529    -1         node = node.firstChild;
13530    -1         while (node) {
13531    -1           if (shouldWalk !== false) {
13532    -1             walkDomNode(node, functor);
13533    -1           }
13534    -1           node = node.nextSibling;
   -1 15510         if (functor(node.actualNode) !== false) {
   -1 15511           node.children.forEach(function(child) {
   -1 15512             return walkDomNode(child, functor);
   -1 15513           });
13535 15514         }
13536 15515       }
13537 15516       var blockLike = [ 'block', 'list-item', 'table', 'flex', 'grid', 'inline-block' ];
13538 15517       function isBlock(elm) {
13539    -1         'use strict';
13540 15518         var display = window.getComputedStyle(elm).getPropertyValue('display');
13541    -1         return blockLike.indexOf(display) !== -1 || display.substr(0, 6) === 'table-';
   -1 15519         return blockLike.includes(display) || display.substr(0, 6) === 'table-';
   -1 15520       }
   -1 15521       function getBlockParent(node) {
   -1 15522         var parentBlock = dom.getComposedParent(node);
   -1 15523         while (parentBlock && !isBlock(parentBlock)) {
   -1 15524           parentBlock = dom.getComposedParent(parentBlock);
   -1 15525         }
   -1 15526         return axe.utils.getNodeFromTree(axe._tree[0], parentBlock);
13542 15527       }
13543 15528       dom.isInTextBlock = function isInTextBlock(node) {
13544    -1         'use strict';
13545 15529         if (isBlock(node)) {
13546 15530           return false;
13547 15531         }
13548    -1         var parentBlock = node.parentNode;
13549    -1         while (parentBlock.nodeType === 1 && !isBlock(parentBlock)) {
13550    -1           parentBlock = parentBlock.parentNode;
13551    -1         }
   -1 15532         var virtualParent = getBlockParent(node);
13552 15533         var parentText = '';
13553 15534         var linkText = '';
13554 15535         var inBrBlock = 0;
13555    -1         walkDomNode(parentBlock, function(currNode) {
   -1 15536         walkDomNode(virtualParent, function(currNode) {
13556 15537           if (inBrBlock === 2) {
13557 15538             return false;
13558 15539           }
@@ -13563,14 +15544,14 @@ module.exports = {
13563 15544             return;
13564 15545           }
13565 15546           var nodeName = (currNode.nodeName || '').toUpperCase();
13566    -1           if ([ 'BR', 'HR' ].indexOf(nodeName) !== -1) {
   -1 15547           if ([ 'BR', 'HR' ].includes(nodeName)) {
13567 15548             if (inBrBlock === 0) {
13568 15549               parentText = '';
13569 15550               linkText = '';
13570 15551             } else {
13571 15552               inBrBlock = 2;
13572 15553             }
13573    -1           } else if (currNode.style.display === 'none' || currNode.style.overflow === 'hidden' || [ '', null, 'none' ].indexOf(currNode.style.float) === -1 || [ '', null, 'relative' ].indexOf(currNode.style.position) === -1) {
   -1 15554           } else if (currNode.style.display === 'none' || currNode.style.overflow === 'hidden' || ![ '', null, 'none' ].includes(currNode.style.float) || ![ '', null, 'relative' ].includes(currNode.style.position)) {
13574 15555             return false;
13575 15556           } else if (nodeName === 'A' && currNode.href || (currNode.getAttribute('role') || '').toLowerCase() === 'link') {
13576 15557             if (currNode === node) {
@@ -13588,23 +15569,26 @@ module.exports = {
13588 15569         'use strict';
13589 15570         return element instanceof Node;
13590 15571       };
13591    -1       dom.isOffscreen = function(element) {
13592    -1         'use strict';
13593    -1         var noParentScrolled = function noParentScrolled(element, offset) {
13594    -1           element = element.parentNode;
13595    -1           while (element.nodeName.toLowerCase() !== 'html') {
13596    -1             if (element.scrollTop) {
13597    -1               offset += element.scrollTop;
13598    -1               if (offset >= 0) {
13599    -1                 return false;
13600    -1               }
   -1 15572       function noParentScrolled(element, offset) {
   -1 15573         element = dom.getComposedParent(element);
   -1 15574         while (element && element.nodeName.toLowerCase() !== 'html') {
   -1 15575           if (element.scrollTop) {
   -1 15576             offset += element.scrollTop;
   -1 15577             if (offset >= 0) {
   -1 15578               return false;
13601 15579             }
13602    -1             element = element.parentNode;
13603 15580           }
13604    -1           return true;
13605    -1         };
13606    -1         var leftBoundary, docElement = document.documentElement, dir = window.getComputedStyle(document.body || docElement).getPropertyValue('direction'), coords = dom.getElementCoordinates(element);
13607    -1         if (coords.bottom < 0 && noParentScrolled(element, coords.bottom)) {
   -1 15581           element = dom.getComposedParent(element);
   -1 15582         }
   -1 15583         return true;
   -1 15584       }
   -1 15585       dom.isOffscreen = function(element) {
   -1 15586         var leftBoundary = void 0;
   -1 15587         var docElement = document.documentElement;
   -1 15588         var styl = window.getComputedStyle(element);
   -1 15589         var dir = window.getComputedStyle(document.body || docElement).getPropertyValue('direction');
   -1 15590         var coords = dom.getElementCoordinates(element);
   -1 15591         if (coords.bottom < 0 && (noParentScrolled(element, coords.bottom) || styl.position === 'absolute')) {
13608 15592           return true;
13609 15593         }
13610 15594         if (coords.left === 0 && coords.right === 0) {
@@ -13632,17 +15616,22 @@ module.exports = {
13632 15616       }
13633 15617       dom.isVisible = function(el, screenReader, recursed) {
13634 15618         'use strict';
13635    -1         var style, nodeName = el.nodeName.toUpperCase(), parent = el.parentNode;
   -1 15619         var style, nodeName, parent;
13636 15620         if (el.nodeType === 9) {
13637 15621           return true;
13638 15622         }
   -1 15623         if (el.nodeType === 11) {
   -1 15624           el = el.host;
   -1 15625         }
13639 15626         style = window.getComputedStyle(el, null);
13640 15627         if (style === null) {
13641 15628           return false;
13642 15629         }
   -1 15630         nodeName = el.nodeName.toUpperCase();
13643 15631         if (style.getPropertyValue('display') === 'none' || nodeName.toUpperCase() === 'STYLE' || nodeName.toUpperCase() === 'SCRIPT' || !screenReader && isClipped(style.getPropertyValue('clip')) || !recursed && (style.getPropertyValue('visibility') === 'hidden' || !screenReader && dom.isOffscreen(el)) || screenReader && el.getAttribute('aria-hidden') === 'true') {
13644 15632           return false;
13645 15633         }
   -1 15634         parent = el.assignedSlot ? el.assignedSlot : el.parentNode;
13646 15635         if (parent) {
13647 15636           return dom.isVisible(parent, screenReader, true);
13648 15637         }
@@ -13678,6 +15667,27 @@ module.exports = {
13678 15667           return false;
13679 15668         }
13680 15669       };
   -1 15670       dom.shadowElementsFromPoint = function(nodeX, nodeY) {
   -1 15671         var root = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document;
   -1 15672         var i = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
   -1 15673         if (i > 999) {
   -1 15674           throw new Error('Infinite loop detected');
   -1 15675         }
   -1 15676         return Array.from(root.elementsFromPoint(nodeX, nodeY)).filter(function(nodes) {
   -1 15677           return dom.getRootNode(nodes) === root;
   -1 15678         }).reduce(function(stack, elm) {
   -1 15679           if (axe.utils.isShadowRoot(elm)) {
   -1 15680             var shadowStack = dom.shadowElementsFromPoint(nodeX, nodeY, elm.shadowRoot, i + 1);
   -1 15681             stack = stack.concat(shadowStack);
   -1 15682             if (stack.length && axe.commons.dom.visuallyContains(stack[0], elm)) {
   -1 15683               stack.push(elm);
   -1 15684             }
   -1 15685           } else {
   -1 15686             stack.push(elm);
   -1 15687           }
   -1 15688           return stack;
   -1 15689         }, []);
   -1 15690       };
13681 15691       dom.visuallyContains = function(node, parent) {
13682 15692         var rectBound = node.getBoundingClientRect();
13683 15693         var margin = .01;
@@ -13808,10 +15818,15 @@ module.exports = {
13808 15818         if (!cell.children.length && !cell.textContent.trim()) {
13809 15819           return false;
13810 15820         }
13811    -1         return cell.nodeName.toUpperCase() === 'TD';
   -1 15821         var role = cell.getAttribute('role');
   -1 15822         if (axe.commons.aria.isValidRole(role)) {
   -1 15823           return [ 'cell', 'gridcell' ].includes(role);
   -1 15824         } else {
   -1 15825           return cell.nodeName.toUpperCase() === 'TD';
   -1 15826         }
13812 15827       };
13813 15828       table.isDataTable = function(node) {
13814    -1         var role = node.getAttribute('role');
   -1 15829         var role = (node.getAttribute('role') || '').toLowerCase();
13815 15830         if ((role === 'presentation' || role === 'none') && !dom.isFocusable(node)) {
13816 15831           return false;
13817 15832         }
@@ -13855,7 +15870,7 @@ module.exports = {
13855 15870             if (cell.getAttribute('scope') || cell.getAttribute('headers') || cell.getAttribute('abbr')) {
13856 15871               return true;
13857 15872             }
13858    -1             if ([ 'columnheader', 'rowheader' ].indexOf(cell.getAttribute('role')) !== -1) {
   -1 15873             if ([ 'columnheader', 'rowheader' ].includes((cell.getAttribute('role') || '').toLowerCase())) {
13859 15874               return true;
13860 15875             }
13861 15876             if (cell.children.length === 1 && cell.children[0].nodeName.toUpperCase() === 'ABBR') {
@@ -14016,41 +16031,48 @@ module.exports = {
14016 16031       };
14017 16032       var inputTypes = [ 'text', 'search', 'tel', 'url', 'email', 'date', 'time', 'number', 'range', 'color' ];
14018 16033       var phrasingElements = [ 'A', 'EM', 'STRONG', 'SMALL', 'MARK', 'ABBR', 'DFN', 'I', 'B', 'S', 'U', 'CODE', 'VAR', 'SAMP', 'KBD', 'SUP', 'SUB', 'Q', 'CITE', 'SPAN', 'BDO', 'BDI', 'BR', 'WBR', 'INS', 'DEL', 'IMG', 'EMBED', 'OBJECT', 'IFRAME', 'MAP', 'AREA', 'SCRIPT', 'NOSCRIPT', 'RUBY', 'VIDEO', 'AUDIO', 'INPUT', 'TEXTAREA', 'SELECT', 'BUTTON', 'LABEL', 'OUTPUT', 'DATALIST', 'KEYGEN', 'PROGRESS', 'COMMAND', 'CANVAS', 'TIME', 'METER' ];
14019    -1       function findLabel(element) {
14020    -1         var ref = null;
14021    -1         if (element.getAttribute('id')) {
14022    -1           var id = axe.utils.escapeSelector(element.getAttribute('id'));
14023    -1           ref = document.querySelector('label[for="' + id + '"]');
14024    -1           if (ref) {
14025    -1             return ref;
14026    -1           }
   -1 16034       function findLabel(virtualNode) {
   -1 16035         var label = void 0;
   -1 16036         if (virtualNode.actualNode.id) {
   -1 16037           label = dom.findElmsInContext({
   -1 16038             elm: 'label',
   -1 16039             attr: 'for',
   -1 16040             value: virtualNode.actualNode.id,
   -1 16041             context: virtualNode.actualNode
   -1 16042           })[0];
   -1 16043         } else {
   -1 16044           label = dom.findUpVirtual(virtualNode, 'label');
14027 16045         }
14028    -1         ref = dom.findUp(element, 'label');
14029    -1         return ref;
   -1 16046         return axe.utils.getNodeFromTree(axe._tree[0], label);
14030 16047       }
14031    -1       function isButton(element) {
14032    -1         return [ 'button', 'reset', 'submit' ].indexOf(element.type) !== -1;
   -1 16048       function isButton(_ref11) {
   -1 16049         var actualNode = _ref11.actualNode;
   -1 16050         return [ 'button', 'reset', 'submit' ].includes(actualNode.type.toLowerCase());
14033 16051       }
14034    -1       function isInput(element) {
14035    -1         var nodeName = element.nodeName.toUpperCase();
14036    -1         return nodeName === 'TEXTAREA' || nodeName === 'SELECT' || nodeName === 'INPUT' && element.type.toLowerCase() !== 'hidden';
   -1 16052       function isInput(_ref12) {
   -1 16053         var actualNode = _ref12.actualNode;
   -1 16054         var nodeName = actualNode.nodeName.toUpperCase();
   -1 16055         return nodeName === 'TEXTAREA' || nodeName === 'SELECT' || nodeName === 'INPUT' && actualNode.type.toLowerCase() !== 'hidden';
14037 16056       }
14038    -1       function shouldCheckSubtree(element) {
14039    -1         return [ 'BUTTON', 'SUMMARY', 'A' ].indexOf(element.nodeName.toUpperCase()) !== -1;
   -1 16057       function shouldCheckSubtree(_ref13) {
   -1 16058         var actualNode = _ref13.actualNode;
   -1 16059         return [ 'BUTTON', 'SUMMARY', 'A' ].includes(actualNode.nodeName.toUpperCase());
14040 16060       }
14041    -1       function shouldNeverCheckSubtree(element) {
14042    -1         return [ 'TABLE', 'FIGURE' ].indexOf(element.nodeName.toUpperCase()) !== -1;
   -1 16061       function shouldNeverCheckSubtree(_ref14) {
   -1 16062         var actualNode = _ref14.actualNode;
   -1 16063         return [ 'TABLE', 'FIGURE', 'SELECT' ].includes(actualNode.nodeName.toUpperCase());
14043 16064       }
14044    -1       function formValueText(element) {
14045    -1         var nodeName = element.nodeName.toUpperCase();
   -1 16065       function formValueText(_ref15, inLabelledByContext) {
   -1 16066         var actualNode = _ref15.actualNode;
   -1 16067         var nodeName = actualNode.nodeName.toUpperCase();
14046 16068         if (nodeName === 'INPUT') {
14047    -1           if (!element.hasAttribute('type') || inputTypes.indexOf(element.getAttribute('type').toLowerCase()) !== -1 && element.value) {
14048    -1             return element.value;
   -1 16069           if (!actualNode.hasAttribute('type') || inputTypes.includes(actualNode.type.toLowerCase())) {
   -1 16070             return actualNode.value;
14049 16071           }
14050 16072           return '';
14051 16073         }
14052    -1         if (nodeName === 'SELECT') {
14053    -1           var opts = element.options;
   -1 16074         if (nodeName === 'SELECT' && inLabelledByContext) {
   -1 16075           var opts = actualNode.options;
14054 16076           if (opts && opts.length) {
14055 16077             var returnText = '';
14056 16078             for (var i = 0; i < opts.length; i++) {
@@ -14062,70 +16084,78 @@ module.exports = {
14062 16084           }
14063 16085           return '';
14064 16086         }
14065    -1         if (nodeName === 'TEXTAREA' && element.value) {
14066    -1           return element.value;
   -1 16087         if (nodeName === 'TEXTAREA' && actualNode.value) {
   -1 16088           return actualNode.value;
14067 16089         }
14068 16090         return '';
14069 16091       }
14070    -1       function checkDescendant(element, nodeName) {
14071    -1         var candidate = element.querySelector(nodeName.toLowerCase());
   -1 16092       function checkDescendant(_ref16, nodeName) {
   -1 16093         var actualNode = _ref16.actualNode;
   -1 16094         var candidate = actualNode.querySelector(nodeName.toLowerCase());
14072 16095         if (candidate) {
14073 16096           return text.accessibleText(candidate);
14074 16097         }
14075 16098         return '';
14076 16099       }
14077    -1       function isEmbeddedControl(e) {
14078    -1         if (!e) {
   -1 16100       function isEmbeddedControl(elm) {
   -1 16101         if (!elm) {
14079 16102           return false;
14080 16103         }
14081    -1         switch (e.nodeName.toUpperCase()) {
   -1 16104         var actualNode = elm.actualNode;
   -1 16105         switch (actualNode.nodeName.toUpperCase()) {
14082 16106          case 'SELECT':
14083 16107          case 'TEXTAREA':
14084 16108           return true;
14085 16109 
14086 16110          case 'INPUT':
14087    -1           return !e.hasAttribute('type') || inputTypes.indexOf(e.getAttribute('type').toLowerCase()) !== -1;
   -1 16111           return !actualNode.hasAttribute('type') || inputTypes.includes(actualNode.getAttribute('type').toLowerCase());
14088 16112 
14089 16113          default:
14090 16114           return false;
14091 16115         }
14092 16116       }
14093    -1       function shouldCheckAlt(element) {
14094    -1         var nodeName = element.nodeName.toUpperCase();
14095    -1         return nodeName === 'INPUT' && element.type.toLowerCase() === 'image' || [ 'IMG', 'APPLET', 'AREA' ].indexOf(nodeName) !== -1;
   -1 16117       function shouldCheckAlt(_ref17) {
   -1 16118         var actualNode = _ref17.actualNode;
   -1 16119         var nodeName = actualNode.nodeName.toUpperCase();
   -1 16120         return [ 'IMG', 'APPLET', 'AREA' ].includes(nodeName) || nodeName === 'INPUT' && actualNode.type.toLowerCase() === 'image';
14096 16121       }
14097 16122       function nonEmptyText(t) {
14098 16123         return !!text.sanitize(t);
14099 16124       }
14100    -1       text.accessibleText = function(element, inLabelledByContext) {
14101    -1         var accessibleNameComputation;
   -1 16125       text.accessibleText = function accessibleText(element, inLabelledByContext) {
   -1 16126         var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], element);
   -1 16127         return axe.commons.text.accessibleTextVirtual(virtualNode, inLabelledByContext);
   -1 16128       };
   -1 16129       text.accessibleTextVirtual = function accessibleTextVirtual(element, inLabelledByContext) {
   -1 16130         var accessibleNameComputation = void 0;
14102 16131         var encounteredNodes = [];
   -1 16132         if (element instanceof Node) {
   -1 16133           element = axe.utils.getNodeFromTree(axe._tree[0], element);
   -1 16134         }
14103 16135         function getInnerText(element, inLabelledByContext, inControlContext) {
14104    -1           var nodes = element.childNodes;
14105    -1           var returnText = '';
14106    -1           var node;
14107    -1           for (var i = 0; i < nodes.length; i++) {
14108    -1             node = nodes[i];
14109    -1             if (node.nodeType === 3) {
14110    -1               returnText += node.textContent;
14111    -1             } else if (node.nodeType === 1) {
14112    -1               if (phrasingElements.indexOf(node.nodeName.toUpperCase()) === -1) {
   -1 16136           return element.children.reduce(function(returnText, child) {
   -1 16137             var actualNode = child.actualNode;
   -1 16138             if (actualNode.nodeType === 3) {
   -1 16139               returnText += actualNode.nodeValue;
   -1 16140             } else if (actualNode.nodeType === 1) {
   -1 16141               if (!phrasingElements.includes(actualNode.nodeName.toUpperCase())) {
14113 16142                 returnText += ' ';
14114 16143               }
14115    -1               returnText += accessibleNameComputation(nodes[i], inLabelledByContext, inControlContext);
   -1 16144               returnText += accessibleNameComputation(child, inLabelledByContext, inControlContext);
14116 16145             }
14117    -1           }
14118    -1           return returnText;
   -1 16146             return returnText;
   -1 16147           }, '');
14119 16148         }
14120 16149         function getLayoutTableText(element) {
14121    -1           if (!axe.commons.table.isDataTable(element) && axe.commons.table.getAllCells(element).length === 1) {
   -1 16150           if (!axe.commons.table.isDataTable(element.actualNode) && axe.commons.table.getAllCells(element.actualNode).length === 1) {
14122 16151             return getInnerText(element, false, false).trim();
14123 16152           }
14124 16153           return '';
14125 16154         }
14126 16155         function checkNative(element, inLabelledByContext, inControlContext) {
14127 16156           var returnText = '';
14128    -1           var nodeName = element.nodeName.toUpperCase();
   -1 16157           var actualNode = element.actualNode;
   -1 16158           var nodeName = actualNode.nodeName.toUpperCase();
14129 16159           if (shouldCheckSubtree(element)) {
14130 16160             returnText = getInnerText(element, false, false) || '';
14131 16161             if (nonEmptyText(returnText)) {
@@ -14143,17 +16173,17 @@ module.exports = {
14143 16173             if (nonEmptyText(returnText)) {
14144 16174               return returnText;
14145 16175             }
14146    -1             returnText = element.getAttribute('title') || element.getAttribute('summary') || getLayoutTableText(element) || '';
   -1 16176             returnText = actualNode.getAttribute('title') || actualNode.getAttribute('summary') || getLayoutTableText(element) || '';
14147 16177             if (nonEmptyText(returnText)) {
14148 16178               return returnText;
14149 16179             }
14150 16180           }
14151 16181           if (shouldCheckAlt(element)) {
14152    -1             return element.getAttribute('alt') || '';
   -1 16182             return actualNode.getAttribute('alt') || '';
14153 16183           }
14154 16184           if (isInput(element) && !inControlContext) {
14155 16185             if (isButton(element)) {
14156    -1               return element.value || element.title || defaultButtonValues[element.type] || '';
   -1 16186               return actualNode.value || actualNode.title || defaultButtonValues[actualNode.type] || '';
14157 16187             }
14158 16188             var labelElement = findLabel(element);
14159 16189             if (labelElement) {
@@ -14163,29 +16193,37 @@ module.exports = {
14163 16193           return '';
14164 16194         }
14165 16195         function checkARIA(element, inLabelledByContext, inControlContext) {
14166    -1           if (!inLabelledByContext && element.hasAttribute('aria-labelledby')) {
14167    -1             return text.sanitize(dom.idrefs(element, 'aria-labelledby').map(function(l) {
14168    -1               if (element === l) {
14169    -1                 encounteredNodes.pop();
   -1 16196           var returnText = '';
   -1 16197           var actualNode = element.actualNode;
   -1 16198           if (!inLabelledByContext && actualNode.hasAttribute('aria-labelledby')) {
   -1 16199             returnText = text.sanitize(dom.idrefs(actualNode, 'aria-labelledby').map(function(label) {
   -1 16200               if (label !== null) {
   -1 16201                 if (actualNode === label) {
   -1 16202                   encounteredNodes.pop();
   -1 16203                 }
   -1 16204                 var vLabel = axe.utils.getNodeFromTree(axe._tree[0], label);
   -1 16205                 return accessibleNameComputation(vLabel, true, actualNode !== label);
   -1 16206               } else {
   -1 16207                 return '';
14170 16208               }
14171    -1               return accessibleNameComputation(l, true, element !== l);
14172 16209             }).join(' '));
14173 16210           }
14174    -1           if (!(inControlContext && isEmbeddedControl(element)) && element.hasAttribute('aria-label')) {
14175    -1             return text.sanitize(element.getAttribute('aria-label'));
   -1 16211           if (!returnText && !(inControlContext && isEmbeddedControl(element)) && actualNode.hasAttribute('aria-label')) {
   -1 16212             return text.sanitize(actualNode.getAttribute('aria-label'));
14176 16213           }
14177    -1           return '';
   -1 16214           return returnText;
14178 16215         }
14179 16216         accessibleNameComputation = function accessibleNameComputation(element, inLabelledByContext, inControlContext) {
14180    -1           'use strict';
14181    -1           var returnText;
14182    -1           if (element === null || encounteredNodes.indexOf(element) !== -1) {
   -1 16217           var returnText = void 0;
   -1 16218           if (!element || encounteredNodes.includes(element)) {
14183 16219             return '';
14184    -1           } else if (!inLabelledByContext && !dom.isVisible(element, true)) {
   -1 16220           } else if (element !== null && element.actualNode instanceof Node !== true) {
   -1 16221             throw new Error('Invalid argument. Virtual Node must be provided');
   -1 16222           } else if (!inLabelledByContext && !dom.isVisible(element.actualNode, true)) {
14185 16223             return '';
14186 16224           }
14187 16225           encounteredNodes.push(element);
14188    -1           var role = element.getAttribute('role');
   -1 16226           var role = element.actualNode.getAttribute('role');
14189 16227           returnText = checkARIA(element, inLabelledByContext, inControlContext);
14190 16228           if (nonEmptyText(returnText)) {
14191 16229             return returnText;
@@ -14195,74 +16233,76 @@ module.exports = {
14195 16233             return returnText;
14196 16234           }
14197 16235           if (inControlContext) {
14198    -1             returnText = formValueText(element);
   -1 16236             returnText = formValueText(element, inLabelledByContext);
14199 16237             if (nonEmptyText(returnText)) {
14200 16238               return returnText;
14201 16239             }
14202 16240           }
14203    -1           if (!shouldNeverCheckSubtree(element) && (!role || aria.getRolesWithNameFromContents().indexOf(role) !== -1)) {
   -1 16241           if ((inLabelledByContext || !shouldNeverCheckSubtree(element)) && (!role || aria.getRolesWithNameFromContents().indexOf(role) !== -1)) {
14204 16242             returnText = getInnerText(element, inLabelledByContext, inControlContext);
14205 16243             if (nonEmptyText(returnText)) {
14206 16244               return returnText;
14207 16245             }
14208 16246           }
14209    -1           if (element.hasAttribute('title')) {
14210    -1             return element.getAttribute('title');
   -1 16247           if (element.actualNode.hasAttribute('title')) {
   -1 16248             return element.actualNode.getAttribute('title');
14211 16249           }
14212 16250           return '';
14213 16251         };
14214 16252         return text.sanitize(accessibleNameComputation(element, inLabelledByContext));
14215 16253       };
14216    -1       text.label = function(node) {
14217    -1         var ref, candidate;
14218    -1         candidate = aria.label(node);
   -1 16254       text.labelVirtual = function(node) {
   -1 16255         var ref, candidate, doc;
   -1 16256         candidate = aria.labelVirtual(node);
14219 16257         if (candidate) {
14220 16258           return candidate;
14221 16259         }
14222    -1         if (node.getAttribute('id')) {
14223    -1           var id = axe.commons.utils.escapeSelector(node.getAttribute('id'));
14224    -1           ref = document.querySelector('label[for="' + id + '"]');
   -1 16260         if (node.actualNode.id) {
   -1 16261           var id = axe.commons.utils.escapeSelector(node.actualNode.getAttribute('id'));
   -1 16262           doc = axe.commons.dom.getRootNode(node.actualNode);
   -1 16263           ref = doc.querySelector('label[for="' + id + '"]');
14225 16264           candidate = ref && text.visible(ref, true);
14226 16265           if (candidate) {
14227 16266             return candidate;
14228 16267           }
14229 16268         }
14230    -1         ref = dom.findUp(node, 'label');
   -1 16269         ref = dom.findUpVirtual(node, 'label');
14231 16270         candidate = ref && text.visible(ref, true);
14232 16271         if (candidate) {
14233 16272           return candidate;
14234 16273         }
14235 16274         return null;
14236 16275       };
   -1 16276       text.label = function(node) {
   -1 16277         node = axe.utils.getNodeFromTree(axe._tree[0], node);
   -1 16278         return text.labelVirtual(node);
   -1 16279       };
14237 16280       text.sanitize = function(str) {
14238 16281         'use strict';
14239 16282         return str.replace(/\r\n/g, '\n').replace(/\u00A0/g, ' ').replace(/[\s]{2,}/g, ' ').trim();
14240 16283       };
14241    -1       text.visible = function(element, screenReader, noRecursing) {
14242    -1         'use strict';
14243    -1         var index, child, nodeValue, childNodes = element.childNodes, length = childNodes.length, result = '';
14244    -1         for (index = 0; index < length; index++) {
14245    -1           child = childNodes[index];
14246    -1           if (child.nodeType === 3) {
14247    -1             nodeValue = child.nodeValue;
14248    -1             if (nodeValue && dom.isVisible(element, screenReader)) {
14249    -1               result += child.nodeValue;
   -1 16284       text.visibleVirtual = function(element, screenReader, noRecursing) {
   -1 16285         var result = element.children.map(function(child) {
   -1 16286           if (child.actualNode.nodeType === 3) {
   -1 16287             var nodeValue = child.actualNode.nodeValue;
   -1 16288             if (nodeValue && dom.isVisible(element.actualNode, screenReader)) {
   -1 16289               return nodeValue;
14250 16290             }
14251 16291           } else if (!noRecursing) {
14252    -1             result += text.visible(child, screenReader);
   -1 16292             return text.visibleVirtual(child, screenReader);
14253 16293           }
14254    -1         }
   -1 16294         }).join('');
14255 16295         return text.sanitize(result);
14256 16296       };
14257    -1       axe.utils.toArray = function(thing) {
14258    -1         'use strict';
14259    -1         return Array.prototype.slice.call(thing);
   -1 16297       text.visible = function(element, screenReader, noRecursing) {
   -1 16298         element = axe.utils.getNodeFromTree(axe._tree[0], element);
   -1 16299         return text.visibleVirtual(element, screenReader, noRecursing);
14260 16300       };
14261 16301       axe.utils.tokenList = function(str) {
14262 16302         'use strict';
14263 16303         return str.trim().replace(/\s{2,}/g, ' ').split(' ');
14264 16304       };
14265    -1       var langs = [ 'aa', 'ab', 'ae', 'af', 'ak', 'am', 'an', 'ar', 'as', 'av', 'ay', 'az', 'ba', 'be', 'bg', 'bh', 'bi', 'bm', 'bn', 'bo', 'br', 'bs', 'ca', 'ce', 'ch', 'co', 'cr', 'cs', 'cu', 'cv', 'cy', 'da', 'de', 'dv', 'dz', 'ee', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fa', 'ff', 'fi', 'fj', 'fo', 'fr', 'fy', 'ga', 'gd', 'gl', 'gn', 'gu', 'gv', 'ha', 'he', 'hi', 'ho', 'hr', 'ht', 'hu', 'hy', 'hz', 'ia', 'id', 'ie', 'ig', 'ii', 'ik', 'in', 'io', 'is', 'it', 'iu', 'iw', 'ja', 'ji', 'jv', 'jw', 'ka', 'kg', 'ki', 'kj', 'kk', 'kl', 'km', 'kn', 'ko', 'kr', 'ks', 'ku', 'kv', 'kw', 'ky', 'la', 'lb', 'lg', 'li', 'ln', 'lo', 'lt', 'lu', 'lv', 'mg', 'mh', 'mi', 'mk', 'ml', 'mn', 'mo', 'mr', 'ms', 'mt', 'my', 'na', 'nb', 'nd', 'ne', 'ng', 'nl', 'nn', 'no', 'nr', 'nv', 'ny', 'oc', 'oj', 'om', 'or', 'os', 'pa', 'pi', 'pl', 'ps', 'pt', 'qu', 'rm', 'rn', 'ro', 'ru', 'rw', 'sa', 'sc', 'sd', 'se', 'sg', 'sh', 'si', 'sk', 'sl', 'sm', 'sn', 'so', 'sq', 'sr', 'ss', 'st', 'su', 'sv', 'sw', 'ta', 'te', 'tg', 'th', 'ti', 'tk', 'tl', 'tn', 'to', 'tr', 'ts', 'tt', 'tw', 'ty', 'ug', 'uk', 'ur', 'uz', 've', 'vi', 'vo', 'wa', 'wo', 'xh', 'yi', 'yo', 'za', 'zh', 'zu', 'aaa', 'aab', 'aac', 'aad', 'aae', 'aaf', 'aag', 'aah', 'aai', 'aak', 'aal', 'aam', 'aan', 'aao', 'aap', 'aaq', 'aas', 'aat', 'aau', 'aav', 'aaw', 'aax', 'aaz', 'aba', 'abb', 'abc', 'abd', 'abe', 'abf', 'abg', 'abh', 'abi', 'abj', 'abl', 'abm', 'abn', 'abo', 'abp', 'abq', 'abr', 'abs', 'abt', 'abu', 'abv', 'abw', 'abx', 'aby', 'abz', 'aca', 'acb', 'acd', 'ace', 'acf', 'ach', 'aci', 'ack', 'acl', 'acm', 'acn', 'acp', 'acq', 'acr', 'acs', 'act', 'acu', 'acv', 'acw', 'acx', 'acy', 'acz', 'ada', 'adb', 'add', 'ade', 'adf', 'adg', 'adh', 'adi', 'adj', 'adl', 'adn', 'ado', 'adp', 'adq', 'adr', 'ads', 'adt', 'adu', 'adw', 'adx', 'ady', 'adz', 'aea', 'aeb', 'aec', 'aed', 'aee', 'aek', 'ael', 'aem', 'aen', 'aeq', 'aer', 'aes', 'aeu', 'aew', 'aey', 'aez', 'afa', 'afb', 'afd', 'afe', 'afg', 'afh', 'afi', 'afk', 'afn', 'afo', 'afp', 'afs', 'aft', 'afu', 'afz', 'aga', 'agb', 'agc', 'agd', 'age', 'agf', 'agg', 'agh', 'agi', 'agj', 'agk', 'agl', 'agm', 'agn', 'ago', 'agp', 'agq', 'agr', 'ags', 'agt', 'agu', 'agv', 'agw', 'agx', 'agy', 'agz', 'aha', 'ahb', 'ahg', 'ahh', 'ahi', 'ahk', 'ahl', 'ahm', 'ahn', 'aho', 'ahp', 'ahr', 'ahs', 'aht', 'aia', 'aib', 'aic', 'aid', 'aie', 'aif', 'aig', 'aih', 'aii', 'aij', 'aik', 'ail', 'aim', 'ain', 'aio', 'aip', 'aiq', 'air', 'ais', 'ait', 'aiw', 'aix', 'aiy', 'aja', 'ajg', 'aji', 'ajn', 'ajp', 'ajt', 'aju', 'ajw', 'ajz', 'akb', 'akc', 'akd', 'ake', 'akf', 'akg', 'akh', 'aki', 'akj', 'akk', 'akl', 'akm', 'ako', 'akp', 'akq', 'akr', 'aks', 'akt', 'aku', 'akv', 'akw', 'akx', 'aky', 'akz', 'ala', 'alc', 'ald', 'ale', 'alf', 'alg', 'alh', 'ali', 'alj', 'alk', 'all', 'alm', 'aln', 'alo', 'alp', 'alq', 'alr', 'als', 'alt', 'alu', 'alv', 'alw', 'alx', 'aly', 'alz', 'ama', 'amb', 'amc', 'ame', 'amf', 'amg', 'ami', 'amj', 'amk', 'aml', 'amm', 'amn', 'amo', 'amp', 'amq', 'amr', 'ams', 'amt', 'amu', 'amv', 'amw', 'amx', 'amy', 'amz', 'ana', 'anb', 'anc', 'and', 'ane', 'anf', 'ang', 'anh', 'ani', 'anj', 'ank', 'anl', 'anm', 'ann', 'ano', 'anp', 'anq', 'anr', 'ans', 'ant', 'anu', 'anv', 'anw', 'anx', 'any', 'anz', 'aoa', 'aob', 'aoc', 'aod', 'aoe', 'aof', 'aog', 'aoh', 'aoi', 'aoj', 'aok', 'aol', 'aom', 'aon', 'aor', 'aos', 'aot', 'aou', 'aox', 'aoz', 'apa', 'apb', 'apc', 'apd', 'ape', 'apf', 'apg', 'aph', 'api', 'apj', 'apk', 'apl', 'apm', 'apn', 'apo', 'app', 'apq', 'apr', 'aps', 'apt', 'apu', 'apv', 'apw', 'apx', 'apy', 'apz', 'aqa', 'aqc', 'aqd', 'aqg', 'aql', 'aqm', 'aqn', 'aqp', 'aqr', 'aqt', 'aqz', 'arb', 'arc', 'ard', 'are', 'arh', 'ari', 'arj', 'ark', 'arl', 'arn', 'aro', 'arp', 'arq', 'arr', 'ars', 'art', 'aru', 'arv', 'arw', 'arx', 'ary', 'arz', 'asa', 'asb', 'asc', 'asd', 'ase', 'asf', 'asg', 'ash', 'asi', 'asj', 'ask', 'asl', 'asn', 'aso', 'asp', 'asq', 'asr', 'ass', 'ast', 'asu', 'asv', 'asw', 'asx', 'asy', 'asz', 'ata', 'atb', 'atc', 'atd', 'ate', 'atg', 'ath', 'ati', 'atj', 'atk', 'atl', 'atm', 'atn', 'ato', 'atp', 'atq', 'atr', 'ats', 'att', 'atu', 'atv', 'atw', 'atx', 'aty', 'atz', 'aua', 'aub', 'auc', 'aud', 'aue', 'auf', 'aug', 'auh', 'aui', 'auj', 'auk', 'aul', 'aum', 'aun', 'auo', 'aup', 'auq', 'aur', 'aus', 'aut', 'auu', 'auw', 'aux', 'auy', 'auz', 'avb', 'avd', 'avi', 'avk', 'avl', 'avm', 'avn', 'avo', 'avs', 'avt', 'avu', 'avv', 'awa', 'awb', 'awc', 'awd', 'awe', 'awg', 'awh', 'awi', 'awk', 'awm', 'awn', 'awo', 'awr', 'aws', 'awt', 'awu', 'awv', 'aww', 'awx', 'awy', 'axb', 'axe', 'axg', 'axk', 'axl', 'axm', 'axx', 'aya', 'ayb', 'ayc', 'ayd', 'aye', 'ayg', 'ayh', 'ayi', 'ayk', 'ayl', 'ayn', 'ayo', 'ayp', 'ayq', 'ayr', 'ays', 'ayt', 'ayu', 'ayx', 'ayy', 'ayz', 'aza', 'azb', 'azc', 'azd', 'azg', 'azj', 'azm', 'azn', 'azo', 'azt', 'azz', 'baa', 'bab', 'bac', 'bad', 'bae', 'baf', 'bag', 'bah', 'bai', 'baj', 'bal', 'ban', 'bao', 'bap', 'bar', 'bas', 'bat', 'bau', 'bav', 'baw', 'bax', 'bay', 'baz', 'bba', 'bbb', 'bbc', 'bbd', 'bbe', 'bbf', 'bbg', 'bbh', 'bbi', 'bbj', 'bbk', 'bbl', 'bbm', 'bbn', 'bbo', 'bbp', 'bbq', 'bbr', 'bbs', 'bbt', 'bbu', 'bbv', 'bbw', 'bbx', 'bby', 'bbz', 'bca', 'bcb', 'bcc', 'bcd', 'bce', 'bcf', 'bcg', 'bch', 'bci', 'bcj', 'bck', 'bcl', 'bcm', 'bcn', 'bco', 'bcp', 'bcq', 'bcr', 'bcs', 'bct', 'bcu', 'bcv', 'bcw', 'bcy', 'bcz', 'bda', 'bdb', 'bdc', 'bdd', 'bde', 'bdf', 'bdg', 'bdh', 'bdi', 'bdj', 'bdk', 'bdl', 'bdm', 'bdn', 'bdo', 'bdp', 'bdq', 'bdr', 'bds', 'bdt', 'bdu', 'bdv', 'bdw', 'bdx', 'bdy', 'bdz', 'bea', 'beb', 'bec', 'bed', 'bee', 'bef', 'beg', 'beh', 'bei', 'bej', 'bek', 'bem', 'beo', 'bep', 'beq', 'ber', 'bes', 'bet', 'beu', 'bev', 'bew', 'bex', 'bey', 'bez', 'bfa', 'bfb', 'bfc', 'bfd', 'bfe', 'bff', 'bfg', 'bfh', 'bfi', 'bfj', 'bfk', 'bfl', 'bfm', 'bfn', 'bfo', 'bfp', 'bfq', 'bfr', 'bfs', 'bft', 'bfu', 'bfw', 'bfx', 'bfy', 'bfz', 'bga', 'bgb', 'bgc', 'bgd', 'bge', 'bgf', 'bgg', 'bgi', 'bgj', 'bgk', 'bgl', 'bgm', 'bgn', 'bgo', 'bgp', 'bgq', 'bgr', 'bgs', 'bgt', 'bgu', 'bgv', 'bgw', 'bgx', 'bgy', 'bgz', 'bha', 'bhb', 'bhc', 'bhd', 'bhe', 'bhf', 'bhg', 'bhh', 'bhi', 'bhj', 'bhk', 'bhl', 'bhm', 'bhn', 'bho', 'bhp', 'bhq', 'bhr', 'bhs', 'bht', 'bhu', 'bhv', 'bhw', 'bhx', 'bhy', 'bhz', 'bia', 'bib', 'bic', 'bid', 'bie', 'bif', 'big', 'bij', 'bik', 'bil', 'bim', 'bin', 'bio', 'bip', 'biq', 'bir', 'bit', 'biu', 'biv', 'biw', 'bix', 'biy', 'biz', 'bja', 'bjb', 'bjc', 'bjd', 'bje', 'bjf', 'bjg', 'bjh', 'bji', 'bjj', 'bjk', 'bjl', 'bjm', 'bjn', 'bjo', 'bjp', 'bjq', 'bjr', 'bjs', 'bjt', 'bju', 'bjv', 'bjw', 'bjx', 'bjy', 'bjz', 'bka', 'bkb', 'bkc', 'bkd', 'bkf', 'bkg', 'bkh', 'bki', 'bkj', 'bkk', 'bkl', 'bkm', 'bkn', 'bko', 'bkp', 'bkq', 'bkr', 'bks', 'bkt', 'bku', 'bkv', 'bkw', 'bkx', 'bky', 'bkz', 'bla', 'blb', 'blc', 'bld', 'ble', 'blf', 'blg', 'blh', 'bli', 'blj', 'blk', 'bll', 'blm', 'bln', 'blo', 'blp', 'blq', 'blr', 'bls', 'blt', 'blv', 'blw', 'blx', 'bly', 'blz', 'bma', 'bmb', 'bmc', 'bmd', 'bme', 'bmf', 'bmg', 'bmh', 'bmi', 'bmj', 'bmk', 'bml', 'bmm', 'bmn', 'bmo', 'bmp', 'bmq', 'bmr', 'bms', 'bmt', 'bmu', 'bmv', 'bmw', 'bmx', 'bmy', 'bmz', 'bna', 'bnb', 'bnc', 'bnd', 'bne', 'bnf', 'bng', 'bni', 'bnj', 'bnk', 'bnl', 'bnm', 'bnn', 'bno', 'bnp', 'bnq', 'bnr', 'bns', 'bnt', 'bnu', 'bnv', 'bnw', 'bnx', 'bny', 'bnz', 'boa', 'bob', 'boe', 'bof', 'bog', 'boh', 'boi', 'boj', 'bok', 'bol', 'bom', 'bon', 'boo', 'bop', 'boq', 'bor', 'bot', 'bou', 'bov', 'bow', 'box', 'boy', 'boz', 'bpa', 'bpb', 'bpd', 'bpg', 'bph', 'bpi', 'bpj', 'bpk', 'bpl', 'bpm', 'bpn', 'bpo', 'bpp', 'bpq', 'bpr', 'bps', 'bpt', 'bpu', 'bpv', 'bpw', 'bpx', 'bpy', 'bpz', 'bqa', 'bqb', 'bqc', 'bqd', 'bqf', 'bqg', 'bqh', 'bqi', 'bqj', 'bqk', 'bql', 'bqm', 'bqn', 'bqo', 'bqp', 'bqq', 'bqr', 'bqs', 'bqt', 'bqu', 'bqv', 'bqw', 'bqx', 'bqy', 'bqz', 'bra', 'brb', 'brc', 'brd', 'brf', 'brg', 'brh', 'bri', 'brj', 'brk', 'brl', 'brm', 'brn', 'bro', 'brp', 'brq', 'brr', 'brs', 'brt', 'bru', 'brv', 'brw', 'brx', 'bry', 'brz', 'bsa', 'bsb', 'bsc', 'bse', 'bsf', 'bsg', 'bsh', 'bsi', 'bsj', 'bsk', 'bsl', 'bsm', 'bsn', 'bso', 'bsp', 'bsq', 'bsr', 'bss', 'bst', 'bsu', 'bsv', 'bsw', 'bsx', 'bsy', 'bta', 'btb', 'btc', 'btd', 'bte', 'btf', 'btg', 'bth', 'bti', 'btj', 'btk', 'btl', 'btm', 'btn', 'bto', 'btp', 'btq', 'btr', 'bts', 'btt', 'btu', 'btv', 'btw', 'btx', 'bty', 'btz', 'bua', 'bub', 'buc', 'bud', 'bue', 'buf', 'bug', 'buh', 'bui', 'buj', 'buk', 'bum', 'bun', 'buo', 'bup', 'buq', 'bus', 'but', 'buu', 'buv', 'buw', 'bux', 'buy', 'buz', 'bva', 'bvb', 'bvc', 'bvd', 'bve', 'bvf', 'bvg', 'bvh', 'bvi', 'bvj', 'bvk', 'bvl', 'bvm', 'bvn', 'bvo', 'bvp', 'bvq', 'bvr', 'bvt', 'bvu', 'bvv', 'bvw', 'bvx', 'bvy', 'bvz', 'bwa', 'bwb', 'bwc', 'bwd', 'bwe', 'bwf', 'bwg', 'bwh', 'bwi', 'bwj', 'bwk', 'bwl', 'bwm', 'bwn', 'bwo', 'bwp', 'bwq', 'bwr', 'bws', 'bwt', 'bwu', 'bww', 'bwx', 'bwy', 'bwz', 'bxa', 'bxb', 'bxc', 'bxd', 'bxe', 'bxf', 'bxg', 'bxh', 'bxi', 'bxj', 'bxk', 'bxl', 'bxm', 'bxn', 'bxo', 'bxp', 'bxq', 'bxr', 'bxs', 'bxu', 'bxv', 'bxw', 'bxx', 'bxz', 'bya', 'byb', 'byc', 'byd', 'bye', 'byf', 'byg', 'byh', 'byi', 'byj', 'byk', 'byl', 'bym', 'byn', 'byo', 'byp', 'byq', 'byr', 'bys', 'byt', 'byv', 'byw', 'byx', 'byy', 'byz', 'bza', 'bzb', 'bzc', 'bzd', 'bze', 'bzf', 'bzg', 'bzh', 'bzi', 'bzj', 'bzk', 'bzl', 'bzm', 'bzn', 'bzo', 'bzp', 'bzq', 'bzr', 'bzs', 'bzt', 'bzu', 'bzv', 'bzw', 'bzx', 'bzy', 'bzz', 'caa', 'cab', 'cac', 'cad', 'cae', 'caf', 'cag', 'cah', 'cai', 'caj', 'cak', 'cal', 'cam', 'can', 'cao', 'cap', 'caq', 'car', 'cas', 'cau', 'cav', 'caw', 'cax', 'cay', 'caz', 'cba', 'cbb', 'cbc', 'cbd', 'cbe', 'cbg', 'cbh', 'cbi', 'cbj', 'cbk', 'cbl', 'cbn', 'cbo', 'cbq', 'cbr', 'cbs', 'cbt', 'cbu', 'cbv', 'cbw', 'cby', 'cca', 'ccc', 'ccd', 'cce', 'ccg', 'cch', 'ccj', 'ccl', 'ccm', 'ccn', 'cco', 'ccp', 'ccq', 'ccr', 'ccs', 'cda', 'cdc', 'cdd', 'cde', 'cdf', 'cdg', 'cdh', 'cdi', 'cdj', 'cdm', 'cdn', 'cdo', 'cdr', 'cds', 'cdy', 'cdz', 'cea', 'ceb', 'ceg', 'cek', 'cel', 'cen', 'cet', 'cfa', 'cfd', 'cfg', 'cfm', 'cga', 'cgc', 'cgg', 'cgk', 'chb', 'chc', 'chd', 'chf', 'chg', 'chh', 'chj', 'chk', 'chl', 'chm', 'chn', 'cho', 'chp', 'chq', 'chr', 'cht', 'chw', 'chx', 'chy', 'chz', 'cia', 'cib', 'cic', 'cid', 'cie', 'cih', 'cik', 'cim', 'cin', 'cip', 'cir', 'ciw', 'ciy', 'cja', 'cje', 'cjh', 'cji', 'cjk', 'cjm', 'cjn', 'cjo', 'cjp', 'cjr', 'cjs', 'cjv', 'cjy', 'cka', 'ckb', 'ckh', 'ckl', 'ckn', 'cko', 'ckq', 'ckr', 'cks', 'ckt', 'cku', 'ckv', 'ckx', 'cky', 'ckz', 'cla', 'clc', 'cld', 'cle', 'clh', 'cli', 'clj', 'clk', 'cll', 'clm', 'clo', 'clt', 'clu', 'clw', 'cly', 'cma', 'cmc', 'cme', 'cmg', 'cmi', 'cmk', 'cml', 'cmm', 'cmn', 'cmo', 'cmr', 'cms', 'cmt', 'cna', 'cnb', 'cnc', 'cng', 'cnh', 'cni', 'cnk', 'cnl', 'cno', 'cns', 'cnt', 'cnu', 'cnw', 'cnx', 'coa', 'cob', 'coc', 'cod', 'coe', 'cof', 'cog', 'coh', 'coj', 'cok', 'col', 'com', 'con', 'coo', 'cop', 'coq', 'cot', 'cou', 'cov', 'cow', 'cox', 'coy', 'coz', 'cpa', 'cpb', 'cpc', 'cpe', 'cpf', 'cpg', 'cpi', 'cpn', 'cpo', 'cpp', 'cps', 'cpu', 'cpx', 'cpy', 'cqd', 'cqu', 'cra', 'crb', 'crc', 'crd', 'crf', 'crg', 'crh', 'cri', 'crj', 'crk', 'crl', 'crm', 'crn', 'cro', 'crp', 'crq', 'crr', 'crs', 'crt', 'crv', 'crw', 'crx', 'cry', 'crz', 'csa', 'csb', 'csc', 'csd', 'cse', 'csf', 'csg', 'csh', 'csi', 'csj', 'csk', 'csl', 'csm', 'csn', 'cso', 'csq', 'csr', 'css', 'cst', 'csu', 'csv', 'csw', 'csy', 'csz', 'cta', 'ctc', 'ctd', 'cte', 'ctg', 'cth', 'ctl', 'ctm', 'ctn', 'cto', 'ctp', 'cts', 'ctt', 'ctu', 'ctz', 'cua', 'cub', 'cuc', 'cug', 'cuh', 'cui', 'cuj', 'cuk', 'cul', 'cum', 'cuo', 'cup', 'cuq', 'cur', 'cus', 'cut', 'cuu', 'cuv', 'cuw', 'cux', 'cvg', 'cvn', 'cwa', 'cwb', 'cwd', 'cwe', 'cwg', 'cwt', 'cya', 'cyb', 'cyo', 'czh', 'czk', 'czn', 'czo', 'czt', 'daa', 'dac', 'dad', 'dae', 'daf', 'dag', 'dah', 'dai', 'daj', 'dak', 'dal', 'dam', 'dao', 'dap', 'daq', 'dar', 'das', 'dau', 'dav', 'daw', 'dax', 'day', 'daz', 'dba', 'dbb', 'dbd', 'dbe', 'dbf', 'dbg', 'dbi', 'dbj', 'dbl', 'dbm', 'dbn', 'dbo', 'dbp', 'dbq', 'dbr', 'dbt', 'dbu', 'dbv', 'dbw', 'dby', 'dcc', 'dcr', 'dda', 'ddd', 'dde', 'ddg', 'ddi', 'ddj', 'ddn', 'ddo', 'ddr', 'dds', 'ddw', 'dec', 'ded', 'dee', 'def', 'deg', 'deh', 'dei', 'dek', 'del', 'dem', 'den', 'dep', 'deq', 'der', 'des', 'dev', 'dez', 'dga', 'dgb', 'dgc', 'dgd', 'dge', 'dgg', 'dgh', 'dgi', 'dgk', 'dgl', 'dgn', 'dgo', 'dgr', 'dgs', 'dgt', 'dgu', 'dgw', 'dgx', 'dgz', 'dha', 'dhd', 'dhg', 'dhi', 'dhl', 'dhm', 'dhn', 'dho', 'dhr', 'dhs', 'dhu', 'dhv', 'dhw', 'dhx', 'dia', 'dib', 'dic', 'did', 'dif', 'dig', 'dih', 'dii', 'dij', 'dik', 'dil', 'dim', 'din', 'dio', 'dip', 'diq', 'dir', 'dis', 'dit', 'diu', 'diw', 'dix', 'diy', 'diz', 'dja', 'djb', 'djc', 'djd', 'dje', 'djf', 'dji', 'djj', 'djk', 'djl', 'djm', 'djn', 'djo', 'djr', 'dju', 'djw', 'dka', 'dkk', 'dkl', 'dkr', 'dks', 'dkx', 'dlg', 'dlk', 'dlm', 'dln', 'dma', 'dmb', 'dmc', 'dmd', 'dme', 'dmg', 'dmk', 'dml', 'dmm', 'dmn', 'dmo', 'dmr', 'dms', 'dmu', 'dmv', 'dmw', 'dmx', 'dmy', 'dna', 'dnd', 'dne', 'dng', 'dni', 'dnj', 'dnk', 'dnn', 'dnr', 'dnt', 'dnu', 'dnv', 'dnw', 'dny', 'doa', 'dob', 'doc', 'doe', 'dof', 'doh', 'doi', 'dok', 'dol', 'don', 'doo', 'dop', 'doq', 'dor', 'dos', 'dot', 'dov', 'dow', 'dox', 'doy', 'doz', 'dpp', 'dra', 'drb', 'drc', 'drd', 'dre', 'drg', 'drh', 'dri', 'drl', 'drn', 'dro', 'drq', 'drr', 'drs', 'drt', 'dru', 'drw', 'dry', 'dsb', 'dse', 'dsh', 'dsi', 'dsl', 'dsn', 'dso', 'dsq', 'dta', 'dtb', 'dtd', 'dth', 'dti', 'dtk', 'dtm', 'dtn', 'dto', 'dtp', 'dtr', 'dts', 'dtt', 'dtu', 'dty', 'dua', 'dub', 'duc', 'dud', 'due', 'duf', 'dug', 'duh', 'dui', 'duj', 'duk', 'dul', 'dum', 'dun', 'duo', 'dup', 'duq', 'dur', 'dus', 'duu', 'duv', 'duw', 'dux', 'duy', 'duz', 'dva', 'dwa', 'dwl', 'dwr', 'dws', 'dwu', 'dww', 'dwy', 'dya', 'dyb', 'dyd', 'dyg', 'dyi', 'dym', 'dyn', 'dyo', 'dyu', 'dyy', 'dza', 'dzd', 'dze', 'dzg', 'dzl', 'dzn', 'eaa', 'ebg', 'ebk', 'ebo', 'ebr', 'ebu', 'ecr', 'ecs', 'ecy', 'eee', 'efa', 'efe', 'efi', 'ega', 'egl', 'ego', 'egx', 'egy', 'ehu', 'eip', 'eit', 'eiv', 'eja', 'eka', 'ekc', 'eke', 'ekg', 'eki', 'ekk', 'ekl', 'ekm', 'eko', 'ekp', 'ekr', 'eky', 'ele', 'elh', 'eli', 'elk', 'elm', 'elo', 'elp', 'elu', 'elx', 'ema', 'emb', 'eme', 'emg', 'emi', 'emk', 'emm', 'emn', 'emo', 'emp', 'ems', 'emu', 'emw', 'emx', 'emy', 'ena', 'enb', 'enc', 'end', 'enf', 'enh', 'enl', 'enm', 'enn', 'eno', 'enq', 'enr', 'enu', 'env', 'enw', 'enx', 'eot', 'epi', 'era', 'erg', 'erh', 'eri', 'erk', 'ero', 'err', 'ers', 'ert', 'erw', 'ese', 'esg', 'esh', 'esi', 'esk', 'esl', 'esm', 'esn', 'eso', 'esq', 'ess', 'esu', 'esx', 'esy', 'etb', 'etc', 'eth', 'etn', 'eto', 'etr', 'ets', 'ett', 'etu', 'etx', 'etz', 'euq', 'eve', 'evh', 'evn', 'ewo', 'ext', 'eya', 'eyo', 'eza', 'eze', 'faa', 'fab', 'fad', 'faf', 'fag', 'fah', 'fai', 'faj', 'fak', 'fal', 'fam', 'fan', 'fap', 'far', 'fat', 'fau', 'fax', 'fay', 'faz', 'fbl', 'fcs', 'fer', 'ffi', 'ffm', 'fgr', 'fia', 'fie', 'fil', 'fip', 'fir', 'fit', 'fiu', 'fiw', 'fkk', 'fkv', 'fla', 'flh', 'fli', 'fll', 'fln', 'flr', 'fly', 'fmp', 'fmu', 'fnb', 'fng', 'fni', 'fod', 'foi', 'fom', 'fon', 'for', 'fos', 'fox', 'fpe', 'fqs', 'frc', 'frd', 'frk', 'frm', 'fro', 'frp', 'frq', 'frr', 'frs', 'frt', 'fse', 'fsl', 'fss', 'fub', 'fuc', 'fud', 'fue', 'fuf', 'fuh', 'fui', 'fuj', 'fum', 'fun', 'fuq', 'fur', 'fut', 'fuu', 'fuv', 'fuy', 'fvr', 'fwa', 'fwe', 'gaa', 'gab', 'gac', 'gad', 'gae', 'gaf', 'gag', 'gah', 'gai', 'gaj', 'gak', 'gal', 'gam', 'gan', 'gao', 'gap', 'gaq', 'gar', 'gas', 'gat', 'gau', 'gav', 'gaw', 'gax', 'gay', 'gaz', 'gba', 'gbb', 'gbc', 'gbd', 'gbe', 'gbf', 'gbg', 'gbh', 'gbi', 'gbj', 'gbk', 'gbl', 'gbm', 'gbn', 'gbo', 'gbp', 'gbq', 'gbr', 'gbs', 'gbu', 'gbv', 'gbw', 'gbx', 'gby', 'gbz', 'gcc', 'gcd', 'gce', 'gcf', 'gcl', 'gcn', 'gcr', 'gct', 'gda', 'gdb', 'gdc', 'gdd', 'gde', 'gdf', 'gdg', 'gdh', 'gdi', 'gdj', 'gdk', 'gdl', 'gdm', 'gdn', 'gdo', 'gdq', 'gdr', 'gds', 'gdt', 'gdu', 'gdx', 'gea', 'geb', 'gec', 'ged', 'geg', 'geh', 'gei', 'gej', 'gek', 'gel', 'gem', 'geq', 'ges', 'gev', 'gew', 'gex', 'gey', 'gez', 'gfk', 'gft', 'gfx', 'gga', 'ggb', 'ggd', 'gge', 'ggg', 'ggk', 'ggl', 'ggn', 'ggo', 'ggr', 'ggt', 'ggu', 'ggw', 'gha', 'ghc', 'ghe', 'ghh', 'ghk', 'ghl', 'ghn', 'gho', 'ghr', 'ghs', 'ght', 'gia', 'gib', 'gic', 'gid', 'gie', 'gig', 'gih', 'gil', 'gim', 'gin', 'gio', 'gip', 'giq', 'gir', 'gis', 'git', 'giu', 'giw', 'gix', 'giy', 'giz', 'gji', 'gjk', 'gjm', 'gjn', 'gjr', 'gju', 'gka', 'gke', 'gkn', 'gko', 'gkp', 'gku', 'glc', 'gld', 'glh', 'gli', 'glj', 'glk', 'gll', 'glo', 'glr', 'glu', 'glw', 'gly', 'gma', 'gmb', 'gmd', 'gme', 'gmg', 'gmh', 'gml', 'gmm', 'gmn', 'gmq', 'gmu', 'gmv', 'gmw', 'gmx', 'gmy', 'gmz', 'gna', 'gnb', 'gnc', 'gnd', 'gne', 'gng', 'gnh', 'gni', 'gnk', 'gnl', 'gnm', 'gnn', 'gno', 'gnq', 'gnr', 'gnt', 'gnu', 'gnw', 'gnz', 'goa', 'gob', 'goc', 'god', 'goe', 'gof', 'gog', 'goh', 'goi', 'goj', 'gok', 'gol', 'gom', 'gon', 'goo', 'gop', 'goq', 'gor', 'gos', 'got', 'gou', 'gow', 'gox', 'goy', 'goz', 'gpa', 'gpe', 'gpn', 'gqa', 'gqi', 'gqn', 'gqr', 'gqu', 'gra', 'grb', 'grc', 'grd', 'grg', 'grh', 'gri', 'grj', 'grk', 'grm', 'gro', 'grq', 'grr', 'grs', 'grt', 'gru', 'grv', 'grw', 'grx', 'gry', 'grz', 'gse', 'gsg', 'gsl', 'gsm', 'gsn', 'gso', 'gsp', 'gss', 'gsw', 'gta', 'gti', 'gtu', 'gua', 'gub', 'guc', 'gud', 'gue', 'guf', 'gug', 'guh', 'gui', 'guk', 'gul', 'gum', 'gun', 'guo', 'gup', 'guq', 'gur', 'gus', 'gut', 'guu', 'guv', 'guw', 'gux', 'guz', 'gva', 'gvc', 'gve', 'gvf', 'gvj', 'gvl', 'gvm', 'gvn', 'gvo', 'gvp', 'gvr', 'gvs', 'gvy', 'gwa', 'gwb', 'gwc', 'gwd', 'gwe', 'gwf', 'gwg', 'gwi', 'gwj', 'gwm', 'gwn', 'gwr', 'gwt', 'gwu', 'gww', 'gwx', 'gxx', 'gya', 'gyb', 'gyd', 'gye', 'gyf', 'gyg', 'gyi', 'gyl', 'gym', 'gyn', 'gyr', 'gyy', 'gza', 'gzi', 'gzn', 'haa', 'hab', 'hac', 'had', 'hae', 'haf', 'hag', 'hah', 'hai', 'haj', 'hak', 'hal', 'ham', 'han', 'hao', 'hap', 'haq', 'har', 'has', 'hav', 'haw', 'hax', 'hay', 'haz', 'hba', 'hbb', 'hbn', 'hbo', 'hbu', 'hca', 'hch', 'hdn', 'hds', 'hdy', 'hea', 'hed', 'heg', 'heh', 'hei', 'hem', 'hgm', 'hgw', 'hhi', 'hhr', 'hhy', 'hia', 'hib', 'hid', 'hif', 'hig', 'hih', 'hii', 'hij', 'hik', 'hil', 'him', 'hio', 'hir', 'hit', 'hiw', 'hix', 'hji', 'hka', 'hke', 'hkk', 'hks', 'hla', 'hlb', 'hld', 'hle', 'hlt', 'hlu', 'hma', 'hmb', 'hmc', 'hmd', 'hme', 'hmf', 'hmg', 'hmh', 'hmi', 'hmj', 'hmk', 'hml', 'hmm', 'hmn', 'hmp', 'hmq', 'hmr', 'hms', 'hmt', 'hmu', 'hmv', 'hmw', 'hmx', 'hmy', 'hmz', 'hna', 'hnd', 'hne', 'hnh', 'hni', 'hnj', 'hnn', 'hno', 'hns', 'hnu', 'hoa', 'hob', 'hoc', 'hod', 'hoe', 'hoh', 'hoi', 'hoj', 'hok', 'hol', 'hom', 'hoo', 'hop', 'hor', 'hos', 'hot', 'hov', 'how', 'hoy', 'hoz', 'hpo', 'hps', 'hra', 'hrc', 'hre', 'hrk', 'hrm', 'hro', 'hrp', 'hrr', 'hrt', 'hru', 'hrw', 'hrx', 'hrz', 'hsb', 'hsh', 'hsl', 'hsn', 'hss', 'hti', 'hto', 'hts', 'htu', 'htx', 'hub', 'huc', 'hud', 'hue', 'huf', 'hug', 'huh', 'hui', 'huj', 'huk', 'hul', 'hum', 'huo', 'hup', 'huq', 'hur', 'hus', 'hut', 'huu', 'huv', 'huw', 'hux', 'huy', 'huz', 'hvc', 'hve', 'hvk', 'hvn', 'hvv', 'hwa', 'hwc', 'hwo', 'hya', 'hyx', 'iai', 'ian', 'iap', 'iar', 'iba', 'ibb', 'ibd', 'ibe', 'ibg', 'ibh', 'ibi', 'ibl', 'ibm', 'ibn', 'ibr', 'ibu', 'iby', 'ica', 'ich', 'icl', 'icr', 'ida', 'idb', 'idc', 'idd', 'ide', 'idi', 'idr', 'ids', 'idt', 'idu', 'ifa', 'ifb', 'ife', 'iff', 'ifk', 'ifm', 'ifu', 'ify', 'igb', 'ige', 'igg', 'igl', 'igm', 'ign', 'igo', 'igs', 'igw', 'ihb', 'ihi', 'ihp', 'ihw', 'iin', 'iir', 'ijc', 'ije', 'ijj', 'ijn', 'ijo', 'ijs', 'ike', 'iki', 'ikk', 'ikl', 'iko', 'ikp', 'ikr', 'iks', 'ikt', 'ikv', 'ikw', 'ikx', 'ikz', 'ila', 'ilb', 'ilg', 'ili', 'ilk', 'ill', 'ilm', 'ilo', 'ilp', 'ils', 'ilu', 'ilv', 'ilw', 'ima', 'ime', 'imi', 'iml', 'imn', 'imo', 'imr', 'ims', 'imy', 'inb', 'inc', 'ine', 'ing', 'inh', 'inj', 'inl', 'inm', 'inn', 'ino', 'inp', 'ins', 'int', 'inz', 'ior', 'iou', 'iow', 'ipi', 'ipo', 'iqu', 'iqw', 'ira', 'ire', 'irh', 'iri', 'irk', 'irn', 'iro', 'irr', 'iru', 'irx', 'iry', 'isa', 'isc', 'isd', 'ise', 'isg', 'ish', 'isi', 'isk', 'ism', 'isn', 'iso', 'isr', 'ist', 'isu', 'itb', 'itc', 'itd', 'ite', 'iti', 'itk', 'itl', 'itm', 'ito', 'itr', 'its', 'itt', 'itv', 'itw', 'itx', 'ity', 'itz', 'ium', 'ivb', 'ivv', 'iwk', 'iwm', 'iwo', 'iws', 'ixc', 'ixl', 'iya', 'iyo', 'iyx', 'izh', 'izi', 'izr', 'izz', 'jaa', 'jab', 'jac', 'jad', 'jae', 'jaf', 'jah', 'jaj', 'jak', 'jal', 'jam', 'jan', 'jao', 'jaq', 'jar', 'jas', 'jat', 'jau', 'jax', 'jay', 'jaz', 'jbe', 'jbi', 'jbj', 'jbk', 'jbn', 'jbo', 'jbr', 'jbt', 'jbu', 'jbw', 'jcs', 'jct', 'jda', 'jdg', 'jdt', 'jeb', 'jee', 'jeg', 'jeh', 'jei', 'jek', 'jel', 'jen', 'jer', 'jet', 'jeu', 'jgb', 'jge', 'jgk', 'jgo', 'jhi', 'jhs', 'jia', 'jib', 'jic', 'jid', 'jie', 'jig', 'jih', 'jii', 'jil', 'jim', 'jio', 'jiq', 'jit', 'jiu', 'jiv', 'jiy', 'jje', 'jjr', 'jka', 'jkm', 'jko', 'jkp', 'jkr', 'jku', 'jle', 'jls', 'jma', 'jmb', 'jmc', 'jmd', 'jmi', 'jml', 'jmn', 'jmr', 'jms', 'jmw', 'jmx', 'jna', 'jnd', 'jng', 'jni', 'jnj', 'jnl', 'jns', 'job', 'jod', 'jog', 'jor', 'jos', 'jow', 'jpa', 'jpr', 'jpx', 'jqr', 'jra', 'jrb', 'jrr', 'jrt', 'jru', 'jsl', 'jua', 'jub', 'juc', 'jud', 'juh', 'jui', 'juk', 'jul', 'jum', 'jun', 'juo', 'jup', 'jur', 'jus', 'jut', 'juu', 'juw', 'juy', 'jvd', 'jvn', 'jwi', 'jya', 'jye', 'jyy', 'kaa', 'kab', 'kac', 'kad', 'kae', 'kaf', 'kag', 'kah', 'kai', 'kaj', 'kak', 'kam', 'kao', 'kap', 'kaq', 'kar', 'kav', 'kaw', 'kax', 'kay', 'kba', 'kbb', 'kbc', 'kbd', 'kbe', 'kbf', 'kbg', 'kbh', 'kbi', 'kbj', 'kbk', 'kbl', 'kbm', 'kbn', 'kbo', 'kbp', 'kbq', 'kbr', 'kbs', 'kbt', 'kbu', 'kbv', 'kbw', 'kbx', 'kby', 'kbz', 'kca', 'kcb', 'kcc', 'kcd', 'kce', 'kcf', 'kcg', 'kch', 'kci', 'kcj', 'kck', 'kcl', 'kcm', 'kcn', 'kco', 'kcp', 'kcq', 'kcr', 'kcs', 'kct', 'kcu', 'kcv', 'kcw', 'kcx', 'kcy', 'kcz', 'kda', 'kdc', 'kdd', 'kde', 'kdf', 'kdg', 'kdh', 'kdi', 'kdj', 'kdk', 'kdl', 'kdm', 'kdn', 'kdo', 'kdp', 'kdq', 'kdr', 'kdt', 'kdu', 'kdv', 'kdw', 'kdx', 'kdy', 'kdz', 'kea', 'keb', 'kec', 'ked', 'kee', 'kef', 'keg', 'keh', 'kei', 'kej', 'kek', 'kel', 'kem', 'ken', 'keo', 'kep', 'keq', 'ker', 'kes', 'ket', 'keu', 'kev', 'kew', 'kex', 'key', 'kez', 'kfa', 'kfb', 'kfc', 'kfd', 'kfe', 'kff', 'kfg', 'kfh', 'kfi', 'kfj', 'kfk', 'kfl', 'kfm', 'kfn', 'kfo', 'kfp', 'kfq', 'kfr', 'kfs', 'kft', 'kfu', 'kfv', 'kfw', 'kfx', 'kfy', 'kfz', 'kga', 'kgb', 'kgc', 'kgd', 'kge', 'kgf', 'kgg', 'kgh', 'kgi', 'kgj', 'kgk', 'kgl', 'kgm', 'kgn', 'kgo', 'kgp', 'kgq', 'kgr', 'kgs', 'kgt', 'kgu', 'kgv', 'kgw', 'kgx', 'kgy', 'kha', 'khb', 'khc', 'khd', 'khe', 'khf', 'khg', 'khh', 'khi', 'khj', 'khk', 'khl', 'khn', 'kho', 'khp', 'khq', 'khr', 'khs', 'kht', 'khu', 'khv', 'khw', 'khx', 'khy', 'khz', 'kia', 'kib', 'kic', 'kid', 'kie', 'kif', 'kig', 'kih', 'kii', 'kij', 'kil', 'kim', 'kio', 'kip', 'kiq', 'kis', 'kit', 'kiu', 'kiv', 'kiw', 'kix', 'kiy', 'kiz', 'kja', 'kjb', 'kjc', 'kjd', 'kje', 'kjf', 'kjg', 'kjh', 'kji', 'kjj', 'kjk', 'kjl', 'kjm', 'kjn', 'kjo', 'kjp', 'kjq', 'kjr', 'kjs', 'kjt', 'kju', 'kjv', 'kjx', 'kjy', 'kjz', 'kka', 'kkb', 'kkc', 'kkd', 'kke', 'kkf', 'kkg', 'kkh', 'kki', 'kkj', 'kkk', 'kkl', 'kkm', 'kkn', 'kko', 'kkp', 'kkq', 'kkr', 'kks', 'kkt', 'kku', 'kkv', 'kkw', 'kkx', 'kky', 'kkz', 'kla', 'klb', 'klc', 'kld', 'kle', 'klf', 'klg', 'klh', 'kli', 'klj', 'klk', 'kll', 'klm', 'kln', 'klo', 'klp', 'klq', 'klr', 'kls', 'klt', 'klu', 'klv', 'klw', 'klx', 'kly', 'klz', 'kma', 'kmb', 'kmc', 'kmd', 'kme', 'kmf', 'kmg', 'kmh', 'kmi', 'kmj', 'kmk', 'kml', 'kmm', 'kmn', 'kmo', 'kmp', 'kmq', 'kmr', 'kms', 'kmt', 'kmu', 'kmv', 'kmw', 'kmx', 'kmy', 'kmz', 'kna', 'knb', 'knc', 'knd', 'kne', 'knf', 'kng', 'kni', 'knj', 'knk', 'knl', 'knm', 'knn', 'kno', 'knp', 'knq', 'knr', 'kns', 'knt', 'knu', 'knv', 'knw', 'knx', 'kny', 'knz', 'koa', 'koc', 'kod', 'koe', 'kof', 'kog', 'koh', 'koi', 'koj', 'kok', 'kol', 'koo', 'kop', 'koq', 'kos', 'kot', 'kou', 'kov', 'kow', 'kox', 'koy', 'koz', 'kpa', 'kpb', 'kpc', 'kpd', 'kpe', 'kpf', 'kpg', 'kph', 'kpi', 'kpj', 'kpk', 'kpl', 'kpm', 'kpn', 'kpo', 'kpp', 'kpq', 'kpr', 'kps', 'kpt', 'kpu', 'kpv', 'kpw', 'kpx', 'kpy', 'kpz', 'kqa', 'kqb', 'kqc', 'kqd', 'kqe', 'kqf', 'kqg', 'kqh', 'kqi', 'kqj', 'kqk', 'kql', 'kqm', 'kqn', 'kqo', 'kqp', 'kqq', 'kqr', 'kqs', 'kqt', 'kqu', 'kqv', 'kqw', 'kqx', 'kqy', 'kqz', 'kra', 'krb', 'krc', 'krd', 'kre', 'krf', 'krh', 'kri', 'krj', 'krk', 'krl', 'krm', 'krn', 'kro', 'krp', 'krr', 'krs', 'krt', 'kru', 'krv', 'krw', 'krx', 'kry', 'krz', 'ksa', 'ksb', 'ksc', 'ksd', 'kse', 'ksf', 'ksg', 'ksh', 'ksi', 'ksj', 'ksk', 'ksl', 'ksm', 'ksn', 'kso', 'ksp', 'ksq', 'ksr', 'kss', 'kst', 'ksu', 'ksv', 'ksw', 'ksx', 'ksy', 'ksz', 'kta', 'ktb', 'ktc', 'ktd', 'kte', 'ktf', 'ktg', 'kth', 'kti', 'ktj', 'ktk', 'ktl', 'ktm', 'ktn', 'kto', 'ktp', 'ktq', 'ktr', 'kts', 'ktt', 'ktu', 'ktv', 'ktw', 'ktx', 'kty', 'ktz', 'kub', 'kuc', 'kud', 'kue', 'kuf', 'kug', 'kuh', 'kui', 'kuj', 'kuk', 'kul', 'kum', 'kun', 'kuo', 'kup', 'kuq', 'kus', 'kut', 'kuu', 'kuv', 'kuw', 'kux', 'kuy', 'kuz', 'kva', 'kvb', 'kvc', 'kvd', 'kve', 'kvf', 'kvg', 'kvh', 'kvi', 'kvj', 'kvk', 'kvl', 'kvm', 'kvn', 'kvo', 'kvp', 'kvq', 'kvr', 'kvs', 'kvt', 'kvu', 'kvv', 'kvw', 'kvx', 'kvy', 'kvz', 'kwa', 'kwb', 'kwc', 'kwd', 'kwe', 'kwf', 'kwg', 'kwh', 'kwi', 'kwj', 'kwk', 'kwl', 'kwm', 'kwn', 'kwo', 'kwp', 'kwq', 'kwr', 'kws', 'kwt', 'kwu', 'kwv', 'kww', 'kwx', 'kwy', 'kwz', 'kxa', 'kxb', 'kxc', 'kxd', 'kxe', 'kxf', 'kxh', 'kxi', 'kxj', 'kxk', 'kxl', 'kxm', 'kxn', 'kxo', 'kxp', 'kxq', 'kxr', 'kxs', 'kxt', 'kxu', 'kxv', 'kxw', 'kxx', 'kxy', 'kxz', 'kya', 'kyb', 'kyc', 'kyd', 'kye', 'kyf', 'kyg', 'kyh', 'kyi', 'kyj', 'kyk', 'kyl', 'kym', 'kyn', 'kyo', 'kyp', 'kyq', 'kyr', 'kys', 'kyt', 'kyu', 'kyv', 'kyw', 'kyx', 'kyy', 'kyz', 'kza', 'kzb', 'kzc', 'kzd', 'kze', 'kzf', 'kzg', 'kzh', 'kzi', 'kzj', 'kzk', 'kzl', 'kzm', 'kzn', 'kzo', 'kzp', 'kzq', 'kzr', 'kzs', 'kzt', 'kzu', 'kzv', 'kzw', 'kzx', 'kzy', 'kzz', 'laa', 'lab', 'lac', 'lad', 'lae', 'laf', 'lag', 'lah', 'lai', 'laj', 'lak', 'lal', 'lam', 'lan', 'lap', 'laq', 'lar', 'las', 'lau', 'law', 'lax', 'lay', 'laz', 'lba', 'lbb', 'lbc', 'lbe', 'lbf', 'lbg', 'lbi', 'lbj', 'lbk', 'lbl', 'lbm', 'lbn', 'lbo', 'lbq', 'lbr', 'lbs', 'lbt', 'lbu', 'lbv', 'lbw', 'lbx', 'lby', 'lbz', 'lcc', 'lcd', 'lce', 'lcf', 'lch', 'lcl', 'lcm', 'lcp', 'lcq', 'lcs', 'lda', 'ldb', 'ldd', 'ldg', 'ldh', 'ldi', 'ldj', 'ldk', 'ldl', 'ldm', 'ldn', 'ldo', 'ldp', 'ldq', 'lea', 'leb', 'lec', 'led', 'lee', 'lef', 'leg', 'leh', 'lei', 'lej', 'lek', 'lel', 'lem', 'len', 'leo', 'lep', 'leq', 'ler', 'les', 'let', 'leu', 'lev', 'lew', 'lex', 'ley', 'lez', 'lfa', 'lfn', 'lga', 'lgb', 'lgg', 'lgh', 'lgi', 'lgk', 'lgl', 'lgm', 'lgn', 'lgq', 'lgr', 'lgt', 'lgu', 'lgz', 'lha', 'lhh', 'lhi', 'lhl', 'lhm', 'lhn', 'lhp', 'lhs', 'lht', 'lhu', 'lia', 'lib', 'lic', 'lid', 'lie', 'lif', 'lig', 'lih', 'lii', 'lij', 'lik', 'lil', 'lio', 'lip', 'liq', 'lir', 'lis', 'liu', 'liv', 'liw', 'lix', 'liy', 'liz', 'lja', 'lje', 'lji', 'ljl', 'ljp', 'ljw', 'ljx', 'lka', 'lkb', 'lkc', 'lkd', 'lke', 'lkh', 'lki', 'lkj', 'lkl', 'lkm', 'lkn', 'lko', 'lkr', 'lks', 'lkt', 'lku', 'lky', 'lla', 'llb', 'llc', 'lld', 'lle', 'llf', 'llg', 'llh', 'lli', 'llj', 'llk', 'lll', 'llm', 'lln', 'llo', 'llp', 'llq', 'lls', 'llu', 'llx', 'lma', 'lmb', 'lmc', 'lmd', 'lme', 'lmf', 'lmg', 'lmh', 'lmi', 'lmj', 'lmk', 'lml', 'lmm', 'lmn', 'lmo', 'lmp', 'lmq', 'lmr', 'lmu', 'lmv', 'lmw', 'lmx', 'lmy', 'lmz', 'lna', 'lnb', 'lnd', 'lng', 'lnh', 'lni', 'lnj', 'lnl', 'lnm', 'lnn', 'lno', 'lns', 'lnu', 'lnw', 'lnz', 'loa', 'lob', 'loc', 'loe', 'lof', 'log', 'loh', 'loi', 'loj', 'lok', 'lol', 'lom', 'lon', 'loo', 'lop', 'loq', 'lor', 'los', 'lot', 'lou', 'lov', 'low', 'lox', 'loy', 'loz', 'lpa', 'lpe', 'lpn', 'lpo', 'lpx', 'lra', 'lrc', 'lre', 'lrg', 'lri', 'lrk', 'lrl', 'lrm', 'lrn', 'lro', 'lrr', 'lrt', 'lrv', 'lrz', 'lsa', 'lsd', 'lse', 'lsg', 'lsh', 'lsi', 'lsl', 'lsm', 'lso', 'lsp', 'lsr', 'lss', 'lst', 'lsy', 'ltc', 'ltg', 'lth', 'lti', 'ltn', 'lto', 'lts', 'ltu', 'lua', 'luc', 'lud', 'lue', 'luf', 'lui', 'luj', 'luk', 'lul', 'lum', 'lun', 'luo', 'lup', 'luq', 'lur', 'lus', 'lut', 'luu', 'luv', 'luw', 'luy', 'luz', 'lva', 'lvk', 'lvs', 'lvu', 'lwa', 'lwe', 'lwg', 'lwh', 'lwl', 'lwm', 'lwo', 'lwt', 'lwu', 'lww', 'lya', 'lyg', 'lyn', 'lzh', 'lzl', 'lzn', 'lzz', 'maa', 'mab', 'mad', 'mae', 'maf', 'mag', 'mai', 'maj', 'mak', 'mam', 'man', 'map', 'maq', 'mas', 'mat', 'mau', 'mav', 'maw', 'max', 'maz', 'mba', 'mbb', 'mbc', 'mbd', 'mbe', 'mbf', 'mbh', 'mbi', 'mbj', 'mbk', 'mbl', 'mbm', 'mbn', 'mbo', 'mbp', 'mbq', 'mbr', 'mbs', 'mbt', 'mbu', 'mbv', 'mbw', 'mbx', 'mby', 'mbz', 'mca', 'mcb', 'mcc', 'mcd', 'mce', 'mcf', 'mcg', 'mch', 'mci', 'mcj', 'mck', 'mcl', 'mcm', 'mcn', 'mco', 'mcp', 'mcq', 'mcr', 'mcs', 'mct', 'mcu', 'mcv', 'mcw', 'mcx', 'mcy', 'mcz', 'mda', 'mdb', 'mdc', 'mdd', 'mde', 'mdf', 'mdg', 'mdh', 'mdi', 'mdj', 'mdk', 'mdl', 'mdm', 'mdn', 'mdp', 'mdq', 'mdr', 'mds', 'mdt', 'mdu', 'mdv', 'mdw', 'mdx', 'mdy', 'mdz', 'mea', 'meb', 'mec', 'med', 'mee', 'mef', 'meg', 'meh', 'mei', 'mej', 'mek', 'mel', 'mem', 'men', 'meo', 'mep', 'meq', 'mer', 'mes', 'met', 'meu', 'mev', 'mew', 'mey', 'mez', 'mfa', 'mfb', 'mfc', 'mfd', 'mfe', 'mff', 'mfg', 'mfh', 'mfi', 'mfj', 'mfk', 'mfl', 'mfm', 'mfn', 'mfo', 'mfp', 'mfq', 'mfr', 'mfs', 'mft', 'mfu', 'mfv', 'mfw', 'mfx', 'mfy', 'mfz', 'mga', 'mgb', 'mgc', 'mgd', 'mge', 'mgf', 'mgg', 'mgh', 'mgi', 'mgj', 'mgk', 'mgl', 'mgm', 'mgn', 'mgo', 'mgp', 'mgq', 'mgr', 'mgs', 'mgt', 'mgu', 'mgv', 'mgw', 'mgx', 'mgy', 'mgz', 'mha', 'mhb', 'mhc', 'mhd', 'mhe', 'mhf', 'mhg', 'mhh', 'mhi', 'mhj', 'mhk', 'mhl', 'mhm', 'mhn', 'mho', 'mhp', 'mhq', 'mhr', 'mhs', 'mht', 'mhu', 'mhw', 'mhx', 'mhy', 'mhz', 'mia', 'mib', 'mic', 'mid', 'mie', 'mif', 'mig', 'mih', 'mii', 'mij', 'mik', 'mil', 'mim', 'min', 'mio', 'mip', 'miq', 'mir', 'mis', 'mit', 'miu', 'miw', 'mix', 'miy', 'miz', 'mja', 'mjb', 'mjc', 'mjd', 'mje', 'mjg', 'mjh', 'mji', 'mjj', 'mjk', 'mjl', 'mjm', 'mjn', 'mjo', 'mjp', 'mjq', 'mjr', 'mjs', 'mjt', 'mju', 'mjv', 'mjw', 'mjx', 'mjy', 'mjz', 'mka', 'mkb', 'mkc', 'mke', 'mkf', 'mkg', 'mkh', 'mki', 'mkj', 'mkk', 'mkl', 'mkm', 'mkn', 'mko', 'mkp', 'mkq', 'mkr', 'mks', 'mkt', 'mku', 'mkv', 'mkw', 'mkx', 'mky', 'mkz', 'mla', 'mlb', 'mlc', 'mld', 'mle', 'mlf', 'mlh', 'mli', 'mlj', 'mlk', 'mll', 'mlm', 'mln', 'mlo', 'mlp', 'mlq', 'mlr', 'mls', 'mlu', 'mlv', 'mlw', 'mlx', 'mlz', 'mma', 'mmb', 'mmc', 'mmd', 'mme', 'mmf', 'mmg', 'mmh', 'mmi', 'mmj', 'mmk', 'mml', 'mmm', 'mmn', 'mmo', 'mmp', 'mmq', 'mmr', 'mmt', 'mmu', 'mmv', 'mmw', 'mmx', 'mmy', 'mmz', 'mna', 'mnb', 'mnc', 'mnd', 'mne', 'mnf', 'mng', 'mnh', 'mni', 'mnj', 'mnk', 'mnl', 'mnm', 'mnn', 'mno', 'mnp', 'mnq', 'mnr', 'mns', 'mnt', 'mnu', 'mnv', 'mnw', 'mnx', 'mny', 'mnz', 'moa', 'moc', 'mod', 'moe', 'mof', 'mog', 'moh', 'moi', 'moj', 'mok', 'mom', 'moo', 'mop', 'moq', 'mor', 'mos', 'mot', 'mou', 'mov', 'mow', 'mox', 'moy', 'moz', 'mpa', 'mpb', 'mpc', 'mpd', 'mpe', 'mpg', 'mph', 'mpi', 'mpj', 'mpk', 'mpl', 'mpm', 'mpn', 'mpo', 'mpp', 'mpq', 'mpr', 'mps', 'mpt', 'mpu', 'mpv', 'mpw', 'mpx', 'mpy', 'mpz', 'mqa', 'mqb', 'mqc', 'mqe', 'mqf', 'mqg', 'mqh', 'mqi', 'mqj', 'mqk', 'mql', 'mqm', 'mqn', 'mqo', 'mqp', 'mqq', 'mqr', 'mqs', 'mqt', 'mqu', 'mqv', 'mqw', 'mqx', 'mqy', 'mqz', 'mra', 'mrb', 'mrc', 'mrd', 'mre', 'mrf', 'mrg', 'mrh', 'mrj', 'mrk', 'mrl', 'mrm', 'mrn', 'mro', 'mrp', 'mrq', 'mrr', 'mrs', 'mrt', 'mru', 'mrv', 'mrw', 'mrx', 'mry', 'mrz', 'msb', 'msc', 'msd', 'mse', 'msf', 'msg', 'msh', 'msi', 'msj', 'msk', 'msl', 'msm', 'msn', 'mso', 'msp', 'msq', 'msr', 'mss', 'mst', 'msu', 'msv', 'msw', 'msx', 'msy', 'msz', 'mta', 'mtb', 'mtc', 'mtd', 'mte', 'mtf', 'mtg', 'mth', 'mti', 'mtj', 'mtk', 'mtl', 'mtm', 'mtn', 'mto', 'mtp', 'mtq', 'mtr', 'mts', 'mtt', 'mtu', 'mtv', 'mtw', 'mtx', 'mty', 'mua', 'mub', 'muc', 'mud', 'mue', 'mug', 'muh', 'mui', 'muj', 'muk', 'mul', 'mum', 'mun', 'muo', 'mup', 'muq', 'mur', 'mus', 'mut', 'muu', 'muv', 'mux', 'muy', 'muz', 'mva', 'mvb', 'mvd', 'mve', 'mvf', 'mvg', 'mvh', 'mvi', 'mvk', 'mvl', 'mvm', 'mvn', 'mvo', 'mvp', 'mvq', 'mvr', 'mvs', 'mvt', 'mvu', 'mvv', 'mvw', 'mvx', 'mvy', 'mvz', 'mwa', 'mwb', 'mwc', 'mwd', 'mwe', 'mwf', 'mwg', 'mwh', 'mwi', 'mwj', 'mwk', 'mwl', 'mwm', 'mwn', 'mwo', 'mwp', 'mwq', 'mwr', 'mws', 'mwt', 'mwu', 'mwv', 'mww', 'mwx', 'mwy', 'mwz', 'mxa', 'mxb', 'mxc', 'mxd', 'mxe', 'mxf', 'mxg', 'mxh', 'mxi', 'mxj', 'mxk', 'mxl', 'mxm', 'mxn', 'mxo', 'mxp', 'mxq', 'mxr', 'mxs', 'mxt', 'mxu', 'mxv', 'mxw', 'mxx', 'mxy', 'mxz', 'myb', 'myc', 'myd', 'mye', 'myf', 'myg', 'myh', 'myi', 'myj', 'myk', 'myl', 'mym', 'myn', 'myo', 'myp', 'myq', 'myr', 'mys', 'myt', 'myu', 'myv', 'myw', 'myx', 'myy', 'myz', 'mza', 'mzb', 'mzc', 'mzd', 'mze', 'mzg', 'mzh', 'mzi', 'mzj', 'mzk', 'mzl', 'mzm', 'mzn', 'mzo', 'mzp', 'mzq', 'mzr', 'mzs', 'mzt', 'mzu', 'mzv', 'mzw', 'mzx', 'mzy', 'mzz', 'naa', 'nab', 'nac', 'nad', 'nae', 'naf', 'nag', 'nah', 'nai', 'naj', 'nak', 'nal', 'nam', 'nan', 'nao', 'nap', 'naq', 'nar', 'nas', 'nat', 'naw', 'nax', 'nay', 'naz', 'nba', 'nbb', 'nbc', 'nbd', 'nbe', 'nbf', 'nbg', 'nbh', 'nbi', 'nbj', 'nbk', 'nbm', 'nbn', 'nbo', 'nbp', 'nbq', 'nbr', 'nbs', 'nbt', 'nbu', 'nbv', 'nbw', 'nbx', 'nby', 'nca', 'ncb', 'ncc', 'ncd', 'nce', 'ncf', 'ncg', 'nch', 'nci', 'ncj', 'nck', 'ncl', 'ncm', 'ncn', 'nco', 'ncp', 'ncq', 'ncr', 'ncs', 'nct', 'ncu', 'ncx', 'ncz', 'nda', 'ndb', 'ndc', 'ndd', 'ndf', 'ndg', 'ndh', 'ndi', 'ndj', 'ndk', 'ndl', 'ndm', 'ndn', 'ndp', 'ndq', 'ndr', 'nds', 'ndt', 'ndu', 'ndv', 'ndw', 'ndx', 'ndy', 'ndz', 'nea', 'neb', 'nec', 'ned', 'nee', 'nef', 'neg', 'neh', 'nei', 'nej', 'nek', 'nem', 'nen', 'neo', 'neq', 'ner', 'nes', 'net', 'neu', 'nev', 'new', 'nex', 'ney', 'nez', 'nfa', 'nfd', 'nfl', 'nfr', 'nfu', 'nga', 'ngb', 'ngc', 'ngd', 'nge', 'ngf', 'ngg', 'ngh', 'ngi', 'ngj', 'ngk', 'ngl', 'ngm', 'ngn', 'ngo', 'ngp', 'ngq', 'ngr', 'ngs', 'ngt', 'ngu', 'ngv', 'ngw', 'ngx', 'ngy', 'ngz', 'nha', 'nhb', 'nhc', 'nhd', 'nhe', 'nhf', 'nhg', 'nhh', 'nhi', 'nhk', 'nhm', 'nhn', 'nho', 'nhp', 'nhq', 'nhr', 'nht', 'nhu', 'nhv', 'nhw', 'nhx', 'nhy', 'nhz', 'nia', 'nib', 'nic', 'nid', 'nie', 'nif', 'nig', 'nih', 'nii', 'nij', 'nik', 'nil', 'nim', 'nin', 'nio', 'niq', 'nir', 'nis', 'nit', 'niu', 'niv', 'niw', 'nix', 'niy', 'niz', 'nja', 'njb', 'njd', 'njh', 'nji', 'njj', 'njl', 'njm', 'njn', 'njo', 'njr', 'njs', 'njt', 'nju', 'njx', 'njy', 'njz', 'nka', 'nkb', 'nkc', 'nkd', 'nke', 'nkf', 'nkg', 'nkh', 'nki', 'nkj', 'nkk', 'nkm', 'nkn', 'nko', 'nkp', 'nkq', 'nkr', 'nks', 'nkt', 'nku', 'nkv', 'nkw', 'nkx', 'nkz', 'nla', 'nlc', 'nle', 'nlg', 'nli', 'nlj', 'nlk', 'nll', 'nln', 'nlo', 'nlq', 'nlr', 'nlu', 'nlv', 'nlw', 'nlx', 'nly', 'nlz', 'nma', 'nmb', 'nmc', 'nmd', 'nme', 'nmf', 'nmg', 'nmh', 'nmi', 'nmj', 'nmk', 'nml', 'nmm', 'nmn', 'nmo', 'nmp', 'nmq', 'nmr', 'nms', 'nmt', 'nmu', 'nmv', 'nmw', 'nmx', 'nmy', 'nmz', 'nna', 'nnb', 'nnc', 'nnd', 'nne', 'nnf', 'nng', 'nnh', 'nni', 'nnj', 'nnk', 'nnl', 'nnm', 'nnn', 'nnp', 'nnq', 'nnr', 'nns', 'nnt', 'nnu', 'nnv', 'nnw', 'nnx', 'nny', 'nnz', 'noa', 'noc', 'nod', 'noe', 'nof', 'nog', 'noh', 'noi', 'noj', 'nok', 'nol', 'nom', 'non', 'noo', 'nop', 'noq', 'nos', 'not', 'nou', 'nov', 'now', 'noy', 'noz', 'npa', 'npb', 'npg', 'nph', 'npi', 'npl', 'npn', 'npo', 'nps', 'npu', 'npx', 'npy', 'nqg', 'nqk', 'nql', 'nqm', 'nqn', 'nqo', 'nqq', 'nqy', 'nra', 'nrb', 'nrc', 'nre', 'nrf', 'nrg', 'nri', 'nrk', 'nrl', 'nrm', 'nrn', 'nrp', 'nrr', 'nrt', 'nru', 'nrx', 'nrz', 'nsa', 'nsc', 'nsd', 'nse', 'nsf', 'nsg', 'nsh', 'nsi', 'nsk', 'nsl', 'nsm', 'nsn', 'nso', 'nsp', 'nsq', 'nsr', 'nss', 'nst', 'nsu', 'nsv', 'nsw', 'nsx', 'nsy', 'nsz', 'ntd', 'nte', 'ntg', 'nti', 'ntj', 'ntk', 'ntm', 'nto', 'ntp', 'ntr', 'nts', 'ntu', 'ntw', 'ntx', 'nty', 'ntz', 'nua', 'nub', 'nuc', 'nud', 'nue', 'nuf', 'nug', 'nuh', 'nui', 'nuj', 'nuk', 'nul', 'num', 'nun', 'nuo', 'nup', 'nuq', 'nur', 'nus', 'nut', 'nuu', 'nuv', 'nuw', 'nux', 'nuy', 'nuz', 'nvh', 'nvm', 'nvo', 'nwa', 'nwb', 'nwc', 'nwe', 'nwg', 'nwi', 'nwm', 'nwo', 'nwr', 'nwx', 'nwy', 'nxa', 'nxd', 'nxe', 'nxg', 'nxi', 'nxk', 'nxl', 'nxm', 'nxn', 'nxo', 'nxq', 'nxr', 'nxu', 'nxx', 'nyb', 'nyc', 'nyd', 'nye', 'nyf', 'nyg', 'nyh', 'nyi', 'nyj', 'nyk', 'nyl', 'nym', 'nyn', 'nyo', 'nyp', 'nyq', 'nyr', 'nys', 'nyt', 'nyu', 'nyv', 'nyw', 'nyx', 'nyy', 'nza', 'nzb', 'nzi', 'nzk', 'nzm', 'nzs', 'nzu', 'nzy', 'nzz', 'oaa', 'oac', 'oar', 'oav', 'obi', 'obk', 'obl', 'obm', 'obo', 'obr', 'obt', 'obu', 'oca', 'och', 'oco', 'ocu', 'oda', 'odk', 'odt', 'odu', 'ofo', 'ofs', 'ofu', 'ogb', 'ogc', 'oge', 'ogg', 'ogo', 'ogu', 'oht', 'ohu', 'oia', 'oin', 'ojb', 'ojc', 'ojg', 'ojp', 'ojs', 'ojv', 'ojw', 'oka', 'okb', 'okd', 'oke', 'okg', 'okh', 'oki', 'okj', 'okk', 'okl', 'okm', 'okn', 'oko', 'okr', 'oks', 'oku', 'okv', 'okx', 'ola', 'old', 'ole', 'olk', 'olm', 'olo', 'olr', 'olt', 'olu', 'oma', 'omb', 'omc', 'ome', 'omg', 'omi', 'omk', 'oml', 'omn', 'omo', 'omp', 'omq', 'omr', 'omt', 'omu', 'omv', 'omw', 'omx', 'ona', 'onb', 'one', 'ong', 'oni', 'onj', 'onk', 'onn', 'ono', 'onp', 'onr', 'ons', 'ont', 'onu', 'onw', 'onx', 'ood', 'oog', 'oon', 'oor', 'oos', 'opa', 'opk', 'opm', 'opo', 'opt', 'opy', 'ora', 'orc', 'ore', 'org', 'orh', 'orn', 'oro', 'orr', 'ors', 'ort', 'oru', 'orv', 'orw', 'orx', 'ory', 'orz', 'osa', 'osc', 'osi', 'oso', 'osp', 'ost', 'osu', 'osx', 'ota', 'otb', 'otd', 'ote', 'oti', 'otk', 'otl', 'otm', 'otn', 'oto', 'otq', 'otr', 'ots', 'ott', 'otu', 'otw', 'otx', 'oty', 'otz', 'oua', 'oub', 'oue', 'oui', 'oum', 'oun', 'ovd', 'owi', 'owl', 'oyb', 'oyd', 'oym', 'oyy', 'ozm', 'paa', 'pab', 'pac', 'pad', 'pae', 'paf', 'pag', 'pah', 'pai', 'pak', 'pal', 'pam', 'pao', 'pap', 'paq', 'par', 'pas', 'pat', 'pau', 'pav', 'paw', 'pax', 'pay', 'paz', 'pbb', 'pbc', 'pbe', 'pbf', 'pbg', 'pbh', 'pbi', 'pbl', 'pbn', 'pbo', 'pbp', 'pbr', 'pbs', 'pbt', 'pbu', 'pbv', 'pby', 'pbz', 'pca', 'pcb', 'pcc', 'pcd', 'pce', 'pcf', 'pcg', 'pch', 'pci', 'pcj', 'pck', 'pcl', 'pcm', 'pcn', 'pcp', 'pcr', 'pcw', 'pda', 'pdc', 'pdi', 'pdn', 'pdo', 'pdt', 'pdu', 'pea', 'peb', 'ped', 'pee', 'pef', 'peg', 'peh', 'pei', 'pej', 'pek', 'pel', 'pem', 'peo', 'pep', 'peq', 'pes', 'pev', 'pex', 'pey', 'pez', 'pfa', 'pfe', 'pfl', 'pga', 'pgd', 'pgg', 'pgi', 'pgk', 'pgl', 'pgn', 'pgs', 'pgu', 'pgy', 'pgz', 'pha', 'phd', 'phg', 'phh', 'phi', 'phk', 'phl', 'phm', 'phn', 'pho', 'phq', 'phr', 'pht', 'phu', 'phv', 'phw', 'pia', 'pib', 'pic', 'pid', 'pie', 'pif', 'pig', 'pih', 'pii', 'pij', 'pil', 'pim', 'pin', 'pio', 'pip', 'pir', 'pis', 'pit', 'piu', 'piv', 'piw', 'pix', 'piy', 'piz', 'pjt', 'pka', 'pkb', 'pkc', 'pkg', 'pkh', 'pkn', 'pko', 'pkp', 'pkr', 'pks', 'pkt', 'pku', 'pla', 'plb', 'plc', 'pld', 'ple', 'plf', 'plg', 'plh', 'plj', 'plk', 'pll', 'pln', 'plo', 'plp', 'plq', 'plr', 'pls', 'plt', 'plu', 'plv', 'plw', 'ply', 'plz', 'pma', 'pmb', 'pmc', 'pmd', 'pme', 'pmf', 'pmh', 'pmi', 'pmj', 'pmk', 'pml', 'pmm', 'pmn', 'pmo', 'pmq', 'pmr', 'pms', 'pmt', 'pmu', 'pmw', 'pmx', 'pmy', 'pmz', 'pna', 'pnb', 'pnc', 'pne', 'png', 'pnh', 'pni', 'pnj', 'pnk', 'pnl', 'pnm', 'pnn', 'pno', 'pnp', 'pnq', 'pnr', 'pns', 'pnt', 'pnu', 'pnv', 'pnw', 'pnx', 'pny', 'pnz', 'poc', 'pod', 'poe', 'pof', 'pog', 'poh', 'poi', 'pok', 'pom', 'pon', 'poo', 'pop', 'poq', 'pos', 'pot', 'pov', 'pow', 'pox', 'poy', 'poz', 'ppa', 'ppe', 'ppi', 'ppk', 'ppl', 'ppm', 'ppn', 'ppo', 'ppp', 'ppq', 'ppr', 'pps', 'ppt', 'ppu', 'pqa', 'pqe', 'pqm', 'pqw', 'pra', 'prb', 'prc', 'prd', 'pre', 'prf', 'prg', 'prh', 'pri', 'prk', 'prl', 'prm', 'prn', 'pro', 'prp', 'prq', 'prr', 'prs', 'prt', 'pru', 'prw', 'prx', 'pry', 'prz', 'psa', 'psc', 'psd', 'pse', 'psg', 'psh', 'psi', 'psl', 'psm', 'psn', 'pso', 'psp', 'psq', 'psr', 'pss', 'pst', 'psu', 'psw', 'psy', 'pta', 'pth', 'pti', 'ptn', 'pto', 'ptp', 'ptq', 'ptr', 'ptt', 'ptu', 'ptv', 'ptw', 'pty', 'pua', 'pub', 'puc', 'pud', 'pue', 'puf', 'pug', 'pui', 'puj', 'puk', 'pum', 'puo', 'pup', 'puq', 'pur', 'put', 'puu', 'puw', 'pux', 'puy', 'puz', 'pwa', 'pwb', 'pwg', 'pwi', 'pwm', 'pwn', 'pwo', 'pwr', 'pww', 'pxm', 'pye', 'pym', 'pyn', 'pys', 'pyu', 'pyx', 'pyy', 'pzn', 'qaa..qtz', 'qua', 'qub', 'quc', 'qud', 'quf', 'qug', 'quh', 'qui', 'quk', 'qul', 'qum', 'qun', 'qup', 'quq', 'qur', 'qus', 'quv', 'quw', 'qux', 'quy', 'quz', 'qva', 'qvc', 'qve', 'qvh', 'qvi', 'qvj', 'qvl', 'qvm', 'qvn', 'qvo', 'qvp', 'qvs', 'qvw', 'qvy', 'qvz', 'qwa', 'qwc', 'qwe', 'qwh', 'qwm', 'qws', 'qwt', 'qxa', 'qxc', 'qxh', 'qxl', 'qxn', 'qxo', 'qxp', 'qxq', 'qxr', 'qxs', 'qxt', 'qxu', 'qxw', 'qya', 'qyp', 'raa', 'rab', 'rac', 'rad', 'raf', 'rag', 'rah', 'rai', 'raj', 'rak', 'ral', 'ram', 'ran', 'rao', 'rap', 'raq', 'rar', 'ras', 'rat', 'rau', 'rav', 'raw', 'rax', 'ray', 'raz', 'rbb', 'rbk', 'rbl', 'rbp', 'rcf', 'rdb', 'rea', 'reb', 'ree', 'reg', 'rei', 'rej', 'rel', 'rem', 'ren', 'rer', 'res', 'ret', 'rey', 'rga', 'rge', 'rgk', 'rgn', 'rgr', 'rgs', 'rgu', 'rhg', 'rhp', 'ria', 'rie', 'rif', 'ril', 'rim', 'rin', 'rir', 'rit', 'riu', 'rjg', 'rji', 'rjs', 'rka', 'rkb', 'rkh', 'rki', 'rkm', 'rkt', 'rkw', 'rma', 'rmb', 'rmc', 'rmd', 'rme', 'rmf', 'rmg', 'rmh', 'rmi', 'rmk', 'rml', 'rmm', 'rmn', 'rmo', 'rmp', 'rmq', 'rmr', 'rms', 'rmt', 'rmu', 'rmv', 'rmw', 'rmx', 'rmy', 'rmz', 'rna', 'rnd', 'rng', 'rnl', 'rnn', 'rnp', 'rnr', 'rnw', 'roa', 'rob', 'roc', 'rod', 'roe', 'rof', 'rog', 'rol', 'rom', 'roo', 'rop', 'ror', 'rou', 'row', 'rpn', 'rpt', 'rri', 'rro', 'rrt', 'rsb', 'rsi', 'rsl', 'rsm', 'rtc', 'rth', 'rtm', 'rts', 'rtw', 'rub', 'ruc', 'rue', 'ruf', 'rug', 'ruh', 'rui', 'ruk', 'ruo', 'rup', 'ruq', 'rut', 'ruu', 'ruy', 'ruz', 'rwa', 'rwk', 'rwm', 'rwo', 'rwr', 'rxd', 'rxw', 'ryn', 'rys', 'ryu', 'rzh', 'saa', 'sab', 'sac', 'sad', 'sae', 'saf', 'sah', 'sai', 'saj', 'sak', 'sal', 'sam', 'sao', 'sap', 'saq', 'sar', 'sas', 'sat', 'sau', 'sav', 'saw', 'sax', 'say', 'saz', 'sba', 'sbb', 'sbc', 'sbd', 'sbe', 'sbf', 'sbg', 'sbh', 'sbi', 'sbj', 'sbk', 'sbl', 'sbm', 'sbn', 'sbo', 'sbp', 'sbq', 'sbr', 'sbs', 'sbt', 'sbu', 'sbv', 'sbw', 'sbx', 'sby', 'sbz', 'sca', 'scb', 'sce', 'scf', 'scg', 'sch', 'sci', 'sck', 'scl', 'scn', 'sco', 'scp', 'scq', 'scs', 'sct', 'scu', 'scv', 'scw', 'scx', 'sda', 'sdb', 'sdc', 'sde', 'sdf', 'sdg', 'sdh', 'sdj', 'sdk', 'sdl', 'sdm', 'sdn', 'sdo', 'sdp', 'sdr', 'sds', 'sdt', 'sdu', 'sdv', 'sdx', 'sdz', 'sea', 'seb', 'sec', 'sed', 'see', 'sef', 'seg', 'seh', 'sei', 'sej', 'sek', 'sel', 'sem', 'sen', 'seo', 'sep', 'seq', 'ser', 'ses', 'set', 'seu', 'sev', 'sew', 'sey', 'sez', 'sfb', 'sfe', 'sfm', 'sfs', 'sfw', 'sga', 'sgb', 'sgc', 'sgd', 'sge', 'sgg', 'sgh', 'sgi', 'sgj', 'sgk', 'sgl', 'sgm', 'sgn', 'sgo', 'sgp', 'sgr', 'sgs', 'sgt', 'sgu', 'sgw', 'sgx', 'sgy', 'sgz', 'sha', 'shb', 'shc', 'shd', 'she', 'shg', 'shh', 'shi', 'shj', 'shk', 'shl', 'shm', 'shn', 'sho', 'shp', 'shq', 'shr', 'shs', 'sht', 'shu', 'shv', 'shw', 'shx', 'shy', 'shz', 'sia', 'sib', 'sid', 'sie', 'sif', 'sig', 'sih', 'sii', 'sij', 'sik', 'sil', 'sim', 'sio', 'sip', 'siq', 'sir', 'sis', 'sit', 'siu', 'siv', 'siw', 'six', 'siy', 'siz', 'sja', 'sjb', 'sjd', 'sje', 'sjg', 'sjk', 'sjl', 'sjm', 'sjn', 'sjo', 'sjp', 'sjr', 'sjs', 'sjt', 'sju', 'sjw', 'ska', 'skb', 'skc', 'skd', 'ske', 'skf', 'skg', 'skh', 'ski', 'skj', 'skk', 'skm', 'skn', 'sko', 'skp', 'skq', 'skr', 'sks', 'skt', 'sku', 'skv', 'skw', 'skx', 'sky', 'skz', 'sla', 'slc', 'sld', 'sle', 'slf', 'slg', 'slh', 'sli', 'slj', 'sll', 'slm', 'sln', 'slp', 'slq', 'slr', 'sls', 'slt', 'slu', 'slw', 'slx', 'sly', 'slz', 'sma', 'smb', 'smc', 'smd', 'smf', 'smg', 'smh', 'smi', 'smj', 'smk', 'sml', 'smm', 'smn', 'smp', 'smq', 'smr', 'sms', 'smt', 'smu', 'smv', 'smw', 'smx', 'smy', 'smz', 'snb', 'snc', 'sne', 'snf', 'sng', 'snh', 'sni', 'snj', 'snk', 'snl', 'snm', 'snn', 'sno', 'snp', 'snq', 'snr', 'sns', 'snu', 'snv', 'snw', 'snx', 'sny', 'snz', 'soa', 'sob', 'soc', 'sod', 'soe', 'sog', 'soh', 'soi', 'soj', 'sok', 'sol', 'son', 'soo', 'sop', 'soq', 'sor', 'sos', 'sou', 'sov', 'sow', 'sox', 'soy', 'soz', 'spb', 'spc', 'spd', 'spe', 'spg', 'spi', 'spk', 'spl', 'spm', 'spn', 'spo', 'spp', 'spq', 'spr', 'sps', 'spt', 'spu', 'spv', 'spx', 'spy', 'sqa', 'sqh', 'sqj', 'sqk', 'sqm', 'sqn', 'sqo', 'sqq', 'sqr', 'sqs', 'sqt', 'squ', 'sra', 'srb', 'src', 'sre', 'srf', 'srg', 'srh', 'sri', 'srk', 'srl', 'srm', 'srn', 'sro', 'srq', 'srr', 'srs', 'srt', 'sru', 'srv', 'srw', 'srx', 'sry', 'srz', 'ssa', 'ssb', 'ssc', 'ssd', 'sse', 'ssf', 'ssg', 'ssh', 'ssi', 'ssj', 'ssk', 'ssl', 'ssm', 'ssn', 'sso', 'ssp', 'ssq', 'ssr', 'sss', 'sst', 'ssu', 'ssv', 'ssx', 'ssy', 'ssz', 'sta', 'stb', 'std', 'ste', 'stf', 'stg', 'sth', 'sti', 'stj', 'stk', 'stl', 'stm', 'stn', 'sto', 'stp', 'stq', 'str', 'sts', 'stt', 'stu', 'stv', 'stw', 'sty', 'sua', 'sub', 'suc', 'sue', 'sug', 'sui', 'suj', 'suk', 'sul', 'sum', 'suq', 'sur', 'sus', 'sut', 'suv', 'suw', 'sux', 'suy', 'suz', 'sva', 'svb', 'svc', 'sve', 'svk', 'svm', 'svr', 'svs', 'svx', 'swb', 'swc', 'swf', 'swg', 'swh', 'swi', 'swj', 'swk', 'swl', 'swm', 'swn', 'swo', 'swp', 'swq', 'swr', 'sws', 'swt', 'swu', 'swv', 'sww', 'swx', 'swy', 'sxb', 'sxc', 'sxe', 'sxg', 'sxk', 'sxl', 'sxm', 'sxn', 'sxo', 'sxr', 'sxs', 'sxu', 'sxw', 'sya', 'syb', 'syc', 'syd', 'syi', 'syk', 'syl', 'sym', 'syn', 'syo', 'syr', 'sys', 'syw', 'syx', 'syy', 'sza', 'szb', 'szc', 'szd', 'sze', 'szg', 'szl', 'szn', 'szp', 'szs', 'szv', 'szw', 'taa', 'tab', 'tac', 'tad', 'tae', 'taf', 'tag', 'tai', 'taj', 'tak', 'tal', 'tan', 'tao', 'tap', 'taq', 'tar', 'tas', 'tau', 'tav', 'taw', 'tax', 'tay', 'taz', 'tba', 'tbb', 'tbc', 'tbd', 'tbe', 'tbf', 'tbg', 'tbh', 'tbi', 'tbj', 'tbk', 'tbl', 'tbm', 'tbn', 'tbo', 'tbp', 'tbq', 'tbr', 'tbs', 'tbt', 'tbu', 'tbv', 'tbw', 'tbx', 'tby', 'tbz', 'tca', 'tcb', 'tcc', 'tcd', 'tce', 'tcf', 'tcg', 'tch', 'tci', 'tck', 'tcl', 'tcm', 'tcn', 'tco', 'tcp', 'tcq', 'tcs', 'tct', 'tcu', 'tcw', 'tcx', 'tcy', 'tcz', 'tda', 'tdb', 'tdc', 'tdd', 'tde', 'tdf', 'tdg', 'tdh', 'tdi', 'tdj', 'tdk', 'tdl', 'tdm', 'tdn', 'tdo', 'tdq', 'tdr', 'tds', 'tdt', 'tdu', 'tdv', 'tdx', 'tdy', 'tea', 'teb', 'tec', 'ted', 'tee', 'tef', 'teg', 'teh', 'tei', 'tek', 'tem', 'ten', 'teo', 'tep', 'teq', 'ter', 'tes', 'tet', 'teu', 'tev', 'tew', 'tex', 'tey', 'tfi', 'tfn', 'tfo', 'tfr', 'tft', 'tga', 'tgb', 'tgc', 'tgd', 'tge', 'tgf', 'tgg', 'tgh', 'tgi', 'tgj', 'tgn', 'tgo', 'tgp', 'tgq', 'tgr', 'tgs', 'tgt', 'tgu', 'tgv', 'tgw', 'tgx', 'tgy', 'tgz', 'thc', 'thd', 'the', 'thf', 'thh', 'thi', 'thk', 'thl', 'thm', 'thn', 'thp', 'thq', 'thr', 'ths', 'tht', 'thu', 'thv', 'thw', 'thx', 'thy', 'thz', 'tia', 'tic', 'tid', 'tie', 'tif', 'tig', 'tih', 'tii', 'tij', 'tik', 'til', 'tim', 'tin', 'tio', 'tip', 'tiq', 'tis', 'tit', 'tiu', 'tiv', 'tiw', 'tix', 'tiy', 'tiz', 'tja', 'tjg', 'tji', 'tjl', 'tjm', 'tjn', 'tjo', 'tjs', 'tju', 'tjw', 'tka', 'tkb', 'tkd', 'tke', 'tkf', 'tkg', 'tkk', 'tkl', 'tkm', 'tkn', 'tkp', 'tkq', 'tkr', 'tks', 'tkt', 'tku', 'tkv', 'tkw', 'tkx', 'tkz', 'tla', 'tlb', 'tlc', 'tld', 'tlf', 'tlg', 'tlh', 'tli', 'tlj', 'tlk', 'tll', 'tlm', 'tln', 'tlo', 'tlp', 'tlq', 'tlr', 'tls', 'tlt', 'tlu', 'tlv', 'tlw', 'tlx', 'tly', 'tma', 'tmb', 'tmc', 'tmd', 'tme', 'tmf', 'tmg', 'tmh', 'tmi', 'tmj', 'tmk', 'tml', 'tmm', 'tmn', 'tmo', 'tmp', 'tmq', 'tmr', 'tms', 'tmt', 'tmu', 'tmv', 'tmw', 'tmy', 'tmz', 'tna', 'tnb', 'tnc', 'tnd', 'tne', 'tnf', 'tng', 'tnh', 'tni', 'tnk', 'tnl', 'tnm', 'tnn', 'tno', 'tnp', 'tnq', 'tnr', 'tns', 'tnt', 'tnu', 'tnv', 'tnw', 'tnx', 'tny', 'tnz', 'tob', 'toc', 'tod', 'toe', 'tof', 'tog', 'toh', 'toi', 'toj', 'tol', 'tom', 'too', 'top', 'toq', 'tor', 'tos', 'tou', 'tov', 'tow', 'tox', 'toy', 'toz', 'tpa', 'tpc', 'tpe', 'tpf', 'tpg', 'tpi', 'tpj', 'tpk', 'tpl', 'tpm', 'tpn', 'tpo', 'tpp', 'tpq', 'tpr', 'tpt', 'tpu', 'tpv', 'tpw', 'tpx', 'tpy', 'tpz', 'tqb', 'tql', 'tqm', 'tqn', 'tqo', 'tqp', 'tqq', 'tqr', 'tqt', 'tqu', 'tqw', 'tra', 'trb', 'trc', 'trd', 'tre', 'trf', 'trg', 'trh', 'tri', 'trj', 'trk', 'trl', 'trm', 'trn', 'tro', 'trp', 'trq', 'trr', 'trs', 'trt', 'tru', 'trv', 'trw', 'trx', 'try', 'trz', 'tsa', 'tsb', 'tsc', 'tsd', 'tse', 'tsf', 'tsg', 'tsh', 'tsi', 'tsj', 'tsk', 'tsl', 'tsm', 'tsp', 'tsq', 'tsr', 'tss', 'tst', 'tsu', 'tsv', 'tsw', 'tsx', 'tsy', 'tsz', 'tta', 'ttb', 'ttc', 'ttd', 'tte', 'ttf', 'ttg', 'tth', 'tti', 'ttj', 'ttk', 'ttl', 'ttm', 'ttn', 'tto', 'ttp', 'ttq', 'ttr', 'tts', 'ttt', 'ttu', 'ttv', 'ttw', 'tty', 'ttz', 'tua', 'tub', 'tuc', 'tud', 'tue', 'tuf', 'tug', 'tuh', 'tui', 'tuj', 'tul', 'tum', 'tun', 'tuo', 'tup', 'tuq', 'tus', 'tut', 'tuu', 'tuv', 'tuw', 'tux', 'tuy', 'tuz', 'tva', 'tvd', 'tve', 'tvk', 'tvl', 'tvm', 'tvn', 'tvo', 'tvs', 'tvt', 'tvu', 'tvw', 'tvy', 'twa', 'twb', 'twc', 'twd', 'twe', 'twf', 'twg', 'twh', 'twl', 'twm', 'twn', 'two', 'twp', 'twq', 'twr', 'twt', 'twu', 'tww', 'twx', 'twy', 'txa', 'txb', 'txc', 'txe', 'txg', 'txh', 'txi', 'txj', 'txm', 'txn', 'txo', 'txq', 'txr', 'txs', 'txt', 'txu', 'txx', 'txy', 'tya', 'tye', 'tyh', 'tyi', 'tyj', 'tyl', 'tyn', 'typ', 'tyr', 'tys', 'tyt', 'tyu', 'tyv', 'tyx', 'tyz', 'tza', 'tzh', 'tzj', 'tzl', 'tzm', 'tzn', 'tzo', 'tzx', 'uam', 'uan', 'uar', 'uba', 'ubi', 'ubl', 'ubr', 'ubu', 'uby', 'uda', 'ude', 'udg', 'udi', 'udj', 'udl', 'udm', 'udu', 'ues', 'ufi', 'uga', 'ugb', 'uge', 'ugn', 'ugo', 'ugy', 'uha', 'uhn', 'uis', 'uiv', 'uji', 'uka', 'ukg', 'ukh', 'ukk', 'ukl', 'ukp', 'ukq', 'uks', 'uku', 'ukw', 'uky', 'ula', 'ulb', 'ulc', 'ule', 'ulf', 'uli', 'ulk', 'ull', 'ulm', 'uln', 'ulu', 'ulw', 'uma', 'umb', 'umc', 'umd', 'umg', 'umi', 'umm', 'umn', 'umo', 'ump', 'umr', 'ums', 'umu', 'una', 'und', 'une', 'ung', 'unk', 'unm', 'unn', 'unp', 'unr', 'unu', 'unx', 'unz', 'uok', 'upi', 'upv', 'ura', 'urb', 'urc', 'ure', 'urf', 'urg', 'urh', 'uri', 'urj', 'urk', 'url', 'urm', 'urn', 'uro', 'urp', 'urr', 'urt', 'uru', 'urv', 'urw', 'urx', 'ury', 'urz', 'usa', 'ush', 'usi', 'usk', 'usp', 'usu', 'uta', 'ute', 'utp', 'utr', 'utu', 'uum', 'uun', 'uur', 'uuu', 'uve', 'uvh', 'uvl', 'uwa', 'uya', 'uzn', 'uzs', 'vaa', 'vae', 'vaf', 'vag', 'vah', 'vai', 'vaj', 'val', 'vam', 'van', 'vao', 'vap', 'var', 'vas', 'vau', 'vav', 'vay', 'vbb', 'vbk', 'vec', 'ved', 'vel', 'vem', 'veo', 'vep', 'ver', 'vgr', 'vgt', 'vic', 'vid', 'vif', 'vig', 'vil', 'vin', 'vis', 'vit', 'viv', 'vka', 'vki', 'vkj', 'vkk', 'vkl', 'vkm', 'vko', 'vkp', 'vkt', 'vku', 'vlp', 'vls', 'vma', 'vmb', 'vmc', 'vmd', 'vme', 'vmf', 'vmg', 'vmh', 'vmi', 'vmj', 'vmk', 'vml', 'vmm', 'vmp', 'vmq', 'vmr', 'vms', 'vmu', 'vmv', 'vmw', 'vmx', 'vmy', 'vmz', 'vnk', 'vnm', 'vnp', 'vor', 'vot', 'vra', 'vro', 'vrs', 'vrt', 'vsi', 'vsl', 'vsv', 'vto', 'vum', 'vun', 'vut', 'vwa', 'waa', 'wab', 'wac', 'wad', 'wae', 'waf', 'wag', 'wah', 'wai', 'waj', 'wak', 'wal', 'wam', 'wan', 'wao', 'wap', 'waq', 'war', 'was', 'wat', 'wau', 'wav', 'waw', 'wax', 'way', 'waz', 'wba', 'wbb', 'wbe', 'wbf', 'wbh', 'wbi', 'wbj', 'wbk', 'wbl', 'wbm', 'wbp', 'wbq', 'wbr', 'wbs', 'wbt', 'wbv', 'wbw', 'wca', 'wci', 'wdd', 'wdg', 'wdj', 'wdk', 'wdu', 'wdy', 'wea', 'wec', 'wed', 'weg', 'weh', 'wei', 'wem', 'wen', 'weo', 'wep', 'wer', 'wes', 'wet', 'weu', 'wew', 'wfg', 'wga', 'wgb', 'wgg', 'wgi', 'wgo', 'wgu', 'wgw', 'wgy', 'wha', 'whg', 'whk', 'whu', 'wib', 'wic', 'wie', 'wif', 'wig', 'wih', 'wii', 'wij', 'wik', 'wil', 'wim', 'win', 'wir', 'wit', 'wiu', 'wiv', 'wiw', 'wiy', 'wja', 'wji', 'wka', 'wkb', 'wkd', 'wkl', 'wku', 'wkw', 'wky', 'wla', 'wlc', 'wle', 'wlg', 'wli', 'wlk', 'wll', 'wlm', 'wlo', 'wlr', 'wls', 'wlu', 'wlv', 'wlw', 'wlx', 'wly', 'wma', 'wmb', 'wmc', 'wmd', 'wme', 'wmh', 'wmi', 'wmm', 'wmn', 'wmo', 'wms', 'wmt', 'wmw', 'wmx', 'wnb', 'wnc', 'wnd', 'wne', 'wng', 'wni', 'wnk', 'wnm', 'wnn', 'wno', 'wnp', 'wnu', 'wnw', 'wny', 'woa', 'wob', 'woc', 'wod', 'woe', 'wof', 'wog', 'woi', 'wok', 'wom', 'won', 'woo', 'wor', 'wos', 'wow', 'woy', 'wpc', 'wra', 'wrb', 'wrd', 'wrg', 'wrh', 'wri', 'wrk', 'wrl', 'wrm', 'wrn', 'wro', 'wrp', 'wrr', 'wrs', 'wru', 'wrv', 'wrw', 'wrx', 'wry', 'wrz', 'wsa', 'wsg', 'wsi', 'wsk', 'wsr', 'wss', 'wsu', 'wsv', 'wtf', 'wth', 'wti', 'wtk', 'wtm', 'wtw', 'wua', 'wub', 'wud', 'wuh', 'wul', 'wum', 'wun', 'wur', 'wut', 'wuu', 'wuv', 'wux', 'wuy', 'wwa', 'wwb', 'wwo', 'wwr', 'www', 'wxa', 'wxw', 'wya', 'wyb', 'wyi', 'wym', 'wyr', 'wyy', 'xaa', 'xab', 'xac', 'xad', 'xae', 'xag', 'xai', 'xaj', 'xak', 'xal', 'xam', 'xan', 'xao', 'xap', 'xaq', 'xar', 'xas', 'xat', 'xau', 'xav', 'xaw', 'xay', 'xba', 'xbb', 'xbc', 'xbd', 'xbe', 'xbg', 'xbi', 'xbj', 'xbm', 'xbn', 'xbo', 'xbp', 'xbr', 'xbw', 'xbx', 'xby', 'xcb', 'xcc', 'xce', 'xcg', 'xch', 'xcl', 'xcm', 'xcn', 'xco', 'xcr', 'xct', 'xcu', 'xcv', 'xcw', 'xcy', 'xda', 'xdc', 'xdk', 'xdm', 'xdo', 'xdy', 'xeb', 'xed', 'xeg', 'xel', 'xem', 'xep', 'xer', 'xes', 'xet', 'xeu', 'xfa', 'xga', 'xgb', 'xgd', 'xgf', 'xgg', 'xgi', 'xgl', 'xgm', 'xgn', 'xgr', 'xgu', 'xgw', 'xha', 'xhc', 'xhd', 'xhe', 'xhr', 'xht', 'xhu', 'xhv', 'xia', 'xib', 'xii', 'xil', 'xin', 'xip', 'xir', 'xis', 'xiv', 'xiy', 'xjb', 'xjt', 'xka', 'xkb', 'xkc', 'xkd', 'xke', 'xkf', 'xkg', 'xkh', 'xki', 'xkj', 'xkk', 'xkl', 'xkn', 'xko', 'xkp', 'xkq', 'xkr', 'xks', 'xkt', 'xku', 'xkv', 'xkw', 'xkx', 'xky', 'xkz', 'xla', 'xlb', 'xlc', 'xld', 'xle', 'xlg', 'xli', 'xln', 'xlo', 'xlp', 'xls', 'xlu', 'xly', 'xma', 'xmb', 'xmc', 'xmd', 'xme', 'xmf', 'xmg', 'xmh', 'xmj', 'xmk', 'xml', 'xmm', 'xmn', 'xmo', 'xmp', 'xmq', 'xmr', 'xms', 'xmt', 'xmu', 'xmv', 'xmw', 'xmx', 'xmy', 'xmz', 'xna', 'xnb', 'xnd', 'xng', 'xnh', 'xni', 'xnk', 'xnn', 'xno', 'xnr', 'xns', 'xnt', 'xnu', 'xny', 'xnz', 'xoc', 'xod', 'xog', 'xoi', 'xok', 'xom', 'xon', 'xoo', 'xop', 'xor', 'xow', 'xpa', 'xpc', 'xpe', 'xpg', 'xpi', 'xpj', 'xpk', 'xpm', 'xpn', 'xpo', 'xpp', 'xpq', 'xpr', 'xps', 'xpt', 'xpu', 'xpy', 'xqa', 'xqt', 'xra', 'xrb', 'xrd', 'xre', 'xrg', 'xri', 'xrm', 'xrn', 'xrq', 'xrr', 'xrt', 'xru', 'xrw', 'xsa', 'xsb', 'xsc', 'xsd', 'xse', 'xsh', 'xsi', 'xsj', 'xsl', 'xsm', 'xsn', 'xso', 'xsp', 'xsq', 'xsr', 'xss', 'xsu', 'xsv', 'xsy', 'xta', 'xtb', 'xtc', 'xtd', 'xte', 'xtg', 'xth', 'xti', 'xtj', 'xtl', 'xtm', 'xtn', 'xto', 'xtp', 'xtq', 'xtr', 'xts', 'xtt', 'xtu', 'xtv', 'xtw', 'xty', 'xtz', 'xua', 'xub', 'xud', 'xug', 'xuj', 'xul', 'xum', 'xun', 'xuo', 'xup', 'xur', 'xut', 'xuu', 'xve', 'xvi', 'xvn', 'xvo', 'xvs', 'xwa', 'xwc', 'xwd', 'xwe', 'xwg', 'xwj', 'xwk', 'xwl', 'xwo', 'xwr', 'xwt', 'xww', 'xxb', 'xxk', 'xxm', 'xxr', 'xxt', 'xya', 'xyb', 'xyj', 'xyk', 'xyl', 'xyt', 'xyy', 'xzh', 'xzm', 'xzp', 'yaa', 'yab', 'yac', 'yad', 'yae', 'yaf', 'yag', 'yah', 'yai', 'yaj', 'yak', 'yal', 'yam', 'yan', 'yao', 'yap', 'yaq', 'yar', 'yas', 'yat', 'yau', 'yav', 'yaw', 'yax', 'yay', 'yaz', 'yba', 'ybb', 'ybd', 'ybe', 'ybh', 'ybi', 'ybj', 'ybk', 'ybl', 'ybm', 'ybn', 'ybo', 'ybx', 'yby', 'ych', 'ycl', 'ycn', 'ycp', 'yda', 'ydd', 'yde', 'ydg', 'ydk', 'yds', 'yea', 'yec', 'yee', 'yei', 'yej', 'yel', 'yen', 'yer', 'yes', 'yet', 'yeu', 'yev', 'yey', 'yga', 'ygi', 'ygl', 'ygm', 'ygp', 'ygr', 'ygs', 'ygu', 'ygw', 'yha', 'yhd', 'yhl', 'yhs', 'yia', 'yif', 'yig', 'yih', 'yii', 'yij', 'yik', 'yil', 'yim', 'yin', 'yip', 'yiq', 'yir', 'yis', 'yit', 'yiu', 'yiv', 'yix', 'yiy', 'yiz', 'yka', 'ykg', 'yki', 'ykk', 'ykl', 'ykm', 'ykn', 'yko', 'ykr', 'ykt', 'yku', 'yky', 'yla', 'ylb', 'yle', 'ylg', 'yli', 'yll', 'ylm', 'yln', 'ylo', 'ylr', 'ylu', 'yly', 'yma', 'ymb', 'ymc', 'ymd', 'yme', 'ymg', 'ymh', 'ymi', 'ymk', 'yml', 'ymm', 'ymn', 'ymo', 'ymp', 'ymq', 'ymr', 'yms', 'ymt', 'ymx', 'ymz', 'yna', 'ynd', 'yne', 'yng', 'ynh', 'ynk', 'ynl', 'ynn', 'yno', 'ynq', 'yns', 'ynu', 'yob', 'yog', 'yoi', 'yok', 'yol', 'yom', 'yon', 'yos', 'yot', 'yox', 'yoy', 'ypa', 'ypb', 'ypg', 'yph', 'ypk', 'ypm', 'ypn', 'ypo', 'ypp', 'ypz', 'yra', 'yrb', 'yre', 'yri', 'yrk', 'yrl', 'yrm', 'yrn', 'yro', 'yrs', 'yrw', 'yry', 'ysc', 'ysd', 'ysg', 'ysl', 'ysn', 'yso', 'ysp', 'ysr', 'yss', 'ysy', 'yta', 'ytl', 'ytp', 'ytw', 'yty', 'yua', 'yub', 'yuc', 'yud', 'yue', 'yuf', 'yug', 'yui', 'yuj', 'yuk', 'yul', 'yum', 'yun', 'yup', 'yuq', 'yur', 'yut', 'yuu', 'yuw', 'yux', 'yuy', 'yuz', 'yva', 'yvt', 'ywa', 'ywg', 'ywl', 'ywn', 'ywq', 'ywr', 'ywt', 'ywu', 'yww', 'yxa', 'yxg', 'yxl', 'yxm', 'yxu', 'yxy', 'yyr', 'yyu', 'yyz', 'yzg', 'yzk', 'zaa', 'zab', 'zac', 'zad', 'zae', 'zaf', 'zag', 'zah', 'zai', 'zaj', 'zak', 'zal', 'zam', 'zao', 'zap', 'zaq', 'zar', 'zas', 'zat', 'zau', 'zav', 'zaw', 'zax', 'zay', 'zaz', 'zbc', 'zbe', 'zbl', 'zbt', 'zbw', 'zca', 'zch', 'zdj', 'zea', 'zeg', 'zeh', 'zen', 'zga', 'zgb', 'zgh', 'zgm', 'zgn', 'zgr', 'zhb', 'zhd', 'zhi', 'zhn', 'zhw', 'zhx', 'zia', 'zib', 'zik', 'zil', 'zim', 'zin', 'zir', 'ziw', 'ziz', 'zka', 'zkb', 'zkd', 'zkg', 'zkh', 'zkk', 'zkn', 'zko', 'zkp', 'zkr', 'zkt', 'zku', 'zkv', 'zkz', 'zle', 'zlj', 'zlm', 'zln', 'zlq', 'zls', 'zlw', 'zma', 'zmb', 'zmc', 'zmd', 'zme', 'zmf', 'zmg', 'zmh', 'zmi', 'zmj', 'zmk', 'zml', 'zmm', 'zmn', 'zmo', 'zmp', 'zmq', 'zmr', 'zms', 'zmt', 'zmu', 'zmv', 'zmw', 'zmx', 'zmy', 'zmz', 'zna', 'znd', 'zne', 'zng', 'znk', 'zns', 'zoc', 'zoh', 'zom', 'zoo', 'zoq', 'zor', 'zos', 'zpa', 'zpb', 'zpc', 'zpd', 'zpe', 'zpf', 'zpg', 'zph', 'zpi', 'zpj', 'zpk', 'zpl', 'zpm', 'zpn', 'zpo', 'zpp', 'zpq', 'zpr', 'zps', 'zpt', 'zpu', 'zpv', 'zpw', 'zpx', 'zpy', 'zpz', 'zqe', 'zra', 'zrg', 'zrn', 'zro', 'zrp', 'zrs', 'zsa', 'zsk', 'zsl', 'zsm', 'zsr', 'zsu', 'zte', 'ztg', 'ztl', 'ztm', 'ztn', 'ztp', 'ztq', 'zts', 'ztt', 'ztu', 'ztx', 'zty', 'zua', 'zuh', 'zum', 'zun', 'zuy', 'zwa', 'zxx', 'zyb', 'zyg', 'zyj', 'zyn', 'zyp', 'zza', 'zzj' ];
   -1 16305       var langs = [ 'aa', 'ab', 'ae', 'af', 'ak', 'am', 'an', 'ar', 'as', 'av', 'ay', 'az', 'ba', 'be', 'bg', 'bh', 'bi', 'bm', 'bn', 'bo', 'br', 'bs', 'ca', 'ce', 'ch', 'co', 'cr', 'cs', 'cu', 'cv', 'cy', 'da', 'de', 'dv', 'dz', 'ee', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fa', 'ff', 'fi', 'fj', 'fo', 'fr', 'fy', 'ga', 'gd', 'gl', 'gn', 'gu', 'gv', 'ha', 'he', 'hi', 'ho', 'hr', 'ht', 'hu', 'hy', 'hz', 'ia', 'id', 'ie', 'ig', 'ii', 'ik', 'in', 'io', 'is', 'it', 'iu', 'iw', 'ja', 'ji', 'jv', 'jw', 'ka', 'kg', 'ki', 'kj', 'kk', 'kl', 'km', 'kn', 'ko', 'kr', 'ks', 'ku', 'kv', 'kw', 'ky', 'la', 'lb', 'lg', 'li', 'ln', 'lo', 'lt', 'lu', 'lv', 'mg', 'mh', 'mi', 'mk', 'ml', 'mn', 'mo', 'mr', 'ms', 'mt', 'my', 'na', 'nb', 'nd', 'ne', 'ng', 'nl', 'nn', 'no', 'nr', 'nv', 'ny', 'oc', 'oj', 'om', 'or', 'os', 'pa', 'pi', 'pl', 'ps', 'pt', 'qu', 'rm', 'rn', 'ro', 'ru', 'rw', 'sa', 'sc', 'sd', 'se', 'sg', 'sh', 'si', 'sk', 'sl', 'sm', 'sn', 'so', 'sq', 'sr', 'ss', 'st', 'su', 'sv', 'sw', 'ta', 'te', 'tg', 'th', 'ti', 'tk', 'tl', 'tn', 'to', 'tr', 'ts', 'tt', 'tw', 'ty', 'ug', 'uk', 'ur', 'uz', 've', 'vi', 'vo', 'wa', 'wo', 'xh', 'yi', 'yo', 'za', 'zh', 'zu', 'aaa', 'aab', 'aac', 'aad', 'aae', 'aaf', 'aag', 'aah', 'aai', 'aak', 'aal', 'aam', 'aan', 'aao', 'aap', 'aaq', 'aas', 'aat', 'aau', 'aav', 'aaw', 'aax', 'aaz', 'aba', 'abb', 'abc', 'abd', 'abe', 'abf', 'abg', 'abh', 'abi', 'abj', 'abl', 'abm', 'abn', 'abo', 'abp', 'abq', 'abr', 'abs', 'abt', 'abu', 'abv', 'abw', 'abx', 'aby', 'abz', 'aca', 'acb', 'acd', 'ace', 'acf', 'ach', 'aci', 'ack', 'acl', 'acm', 'acn', 'acp', 'acq', 'acr', 'acs', 'act', 'acu', 'acv', 'acw', 'acx', 'acy', 'acz', 'ada', 'adb', 'add', 'ade', 'adf', 'adg', 'adh', 'adi', 'adj', 'adl', 'adn', 'ado', 'adp', 'adq', 'adr', 'ads', 'adt', 'adu', 'adw', 'adx', 'ady', 'adz', 'aea', 'aeb', 'aec', 'aed', 'aee', 'aek', 'ael', 'aem', 'aen', 'aeq', 'aer', 'aes', 'aeu', 'aew', 'aey', 'aez', 'afa', 'afb', 'afd', 'afe', 'afg', 'afh', 'afi', 'afk', 'afn', 'afo', 'afp', 'afs', 'aft', 'afu', 'afz', 'aga', 'agb', 'agc', 'agd', 'age', 'agf', 'agg', 'agh', 'agi', 'agj', 'agk', 'agl', 'agm', 'agn', 'ago', 'agp', 'agq', 'agr', 'ags', 'agt', 'agu', 'agv', 'agw', 'agx', 'agy', 'agz', 'aha', 'ahb', 'ahg', 'ahh', 'ahi', 'ahk', 'ahl', 'ahm', 'ahn', 'aho', 'ahp', 'ahr', 'ahs', 'aht', 'aia', 'aib', 'aic', 'aid', 'aie', 'aif', 'aig', 'aih', 'aii', 'aij', 'aik', 'ail', 'aim', 'ain', 'aio', 'aip', 'aiq', 'air', 'ais', 'ait', 'aiw', 'aix', 'aiy', 'aja', 'ajg', 'aji', 'ajn', 'ajp', 'ajt', 'aju', 'ajw', 'ajz', 'akb', 'akc', 'akd', 'ake', 'akf', 'akg', 'akh', 'aki', 'akj', 'akk', 'akl', 'akm', 'ako', 'akp', 'akq', 'akr', 'aks', 'akt', 'aku', 'akv', 'akw', 'akx', 'aky', 'akz', 'ala', 'alc', 'ald', 'ale', 'alf', 'alg', 'alh', 'ali', 'alj', 'alk', 'all', 'alm', 'aln', 'alo', 'alp', 'alq', 'alr', 'als', 'alt', 'alu', 'alv', 'alw', 'alx', 'aly', 'alz', 'ama', 'amb', 'amc', 'ame', 'amf', 'amg', 'ami', 'amj', 'amk', 'aml', 'amm', 'amn', 'amo', 'amp', 'amq', 'amr', 'ams', 'amt', 'amu', 'amv', 'amw', 'amx', 'amy', 'amz', 'ana', 'anb', 'anc', 'and', 'ane', 'anf', 'ang', 'anh', 'ani', 'anj', 'ank', 'anl', 'anm', 'ann', 'ano', 'anp', 'anq', 'anr', 'ans', 'ant', 'anu', 'anv', 'anw', 'anx', 'any', 'anz', 'aoa', 'aob', 'aoc', 'aod', 'aoe', 'aof', 'aog', 'aoh', 'aoi', 'aoj', 'aok', 'aol', 'aom', 'aon', 'aor', 'aos', 'aot', 'aou', 'aox', 'aoz', 'apa', 'apb', 'apc', 'apd', 'ape', 'apf', 'apg', 'aph', 'api', 'apj', 'apk', 'apl', 'apm', 'apn', 'apo', 'app', 'apq', 'apr', 'aps', 'apt', 'apu', 'apv', 'apw', 'apx', 'apy', 'apz', 'aqa', 'aqc', 'aqd', 'aqg', 'aql', 'aqm', 'aqn', 'aqp', 'aqr', 'aqt', 'aqz', 'arb', 'arc', 'ard', 'are', 'arh', 'ari', 'arj', 'ark', 'arl', 'arn', 'aro', 'arp', 'arq', 'arr', 'ars', 'art', 'aru', 'arv', 'arw', 'arx', 'ary', 'arz', 'asa', 'asb', 'asc', 'asd', 'ase', 'asf', 'asg', 'ash', 'asi', 'asj', 'ask', 'asl', 'asn', 'aso', 'asp', 'asq', 'asr', 'ass', 'ast', 'asu', 'asv', 'asw', 'asx', 'asy', 'asz', 'ata', 'atb', 'atc', 'atd', 'ate', 'atg', 'ath', 'ati', 'atj', 'atk', 'atl', 'atm', 'atn', 'ato', 'atp', 'atq', 'atr', 'ats', 'att', 'atu', 'atv', 'atw', 'atx', 'aty', 'atz', 'aua', 'aub', 'auc', 'aud', 'aue', 'auf', 'aug', 'auh', 'aui', 'auj', 'auk', 'aul', 'aum', 'aun', 'auo', 'aup', 'auq', 'aur', 'aus', 'aut', 'auu', 'auw', 'aux', 'auy', 'auz', 'avb', 'avd', 'avi', 'avk', 'avl', 'avm', 'avn', 'avo', 'avs', 'avt', 'avu', 'avv', 'awa', 'awb', 'awc', 'awd', 'awe', 'awg', 'awh', 'awi', 'awk', 'awm', 'awn', 'awo', 'awr', 'aws', 'awt', 'awu', 'awv', 'aww', 'awx', 'awy', 'axb', 'axe', 'axg', 'axk', 'axl', 'axm', 'axx', 'aya', 'ayb', 'ayc', 'ayd', 'aye', 'ayg', 'ayh', 'ayi', 'ayk', 'ayl', 'ayn', 'ayo', 'ayp', 'ayq', 'ayr', 'ays', 'ayt', 'ayu', 'ayx', 'ayy', 'ayz', 'aza', 'azb', 'azc', 'azd', 'azg', 'azj', 'azm', 'azn', 'azo', 'azt', 'azz', 'baa', 'bab', 'bac', 'bad', 'bae', 'baf', 'bag', 'bah', 'bai', 'baj', 'bal', 'ban', 'bao', 'bap', 'bar', 'bas', 'bat', 'bau', 'bav', 'baw', 'bax', 'bay', 'baz', 'bba', 'bbb', 'bbc', 'bbd', 'bbe', 'bbf', 'bbg', 'bbh', 'bbi', 'bbj', 'bbk', 'bbl', 'bbm', 'bbn', 'bbo', 'bbp', 'bbq', 'bbr', 'bbs', 'bbt', 'bbu', 'bbv', 'bbw', 'bbx', 'bby', 'bbz', 'bca', 'bcb', 'bcc', 'bcd', 'bce', 'bcf', 'bcg', 'bch', 'bci', 'bcj', 'bck', 'bcl', 'bcm', 'bcn', 'bco', 'bcp', 'bcq', 'bcr', 'bcs', 'bct', 'bcu', 'bcv', 'bcw', 'bcy', 'bcz', 'bda', 'bdb', 'bdc', 'bdd', 'bde', 'bdf', 'bdg', 'bdh', 'bdi', 'bdj', 'bdk', 'bdl', 'bdm', 'bdn', 'bdo', 'bdp', 'bdq', 'bdr', 'bds', 'bdt', 'bdu', 'bdv', 'bdw', 'bdx', 'bdy', 'bdz', 'bea', 'beb', 'bec', 'bed', 'bee', 'bef', 'beg', 'beh', 'bei', 'bej', 'bek', 'bem', 'beo', 'bep', 'beq', 'ber', 'bes', 'bet', 'beu', 'bev', 'bew', 'bex', 'bey', 'bez', 'bfa', 'bfb', 'bfc', 'bfd', 'bfe', 'bff', 'bfg', 'bfh', 'bfi', 'bfj', 'bfk', 'bfl', 'bfm', 'bfn', 'bfo', 'bfp', 'bfq', 'bfr', 'bfs', 'bft', 'bfu', 'bfw', 'bfx', 'bfy', 'bfz', 'bga', 'bgb', 'bgc', 'bgd', 'bge', 'bgf', 'bgg', 'bgi', 'bgj', 'bgk', 'bgl', 'bgm', 'bgn', 'bgo', 'bgp', 'bgq', 'bgr', 'bgs', 'bgt', 'bgu', 'bgv', 'bgw', 'bgx', 'bgy', 'bgz', 'bha', 'bhb', 'bhc', 'bhd', 'bhe', 'bhf', 'bhg', 'bhh', 'bhi', 'bhj', 'bhk', 'bhl', 'bhm', 'bhn', 'bho', 'bhp', 'bhq', 'bhr', 'bhs', 'bht', 'bhu', 'bhv', 'bhw', 'bhx', 'bhy', 'bhz', 'bia', 'bib', 'bic', 'bid', 'bie', 'bif', 'big', 'bij', 'bik', 'bil', 'bim', 'bin', 'bio', 'bip', 'biq', 'bir', 'bit', 'biu', 'biv', 'biw', 'bix', 'biy', 'biz', 'bja', 'bjb', 'bjc', 'bjd', 'bje', 'bjf', 'bjg', 'bjh', 'bji', 'bjj', 'bjk', 'bjl', 'bjm', 'bjn', 'bjo', 'bjp', 'bjq', 'bjr', 'bjs', 'bjt', 'bju', 'bjv', 'bjw', 'bjx', 'bjy', 'bjz', 'bka', 'bkb', 'bkc', 'bkd', 'bkf', 'bkg', 'bkh', 'bki', 'bkj', 'bkk', 'bkl', 'bkm', 'bkn', 'bko', 'bkp', 'bkq', 'bkr', 'bks', 'bkt', 'bku', 'bkv', 'bkw', 'bkx', 'bky', 'bkz', 'bla', 'blb', 'blc', 'bld', 'ble', 'blf', 'blg', 'blh', 'bli', 'blj', 'blk', 'bll', 'blm', 'bln', 'blo', 'blp', 'blq', 'blr', 'bls', 'blt', 'blv', 'blw', 'blx', 'bly', 'blz', 'bma', 'bmb', 'bmc', 'bmd', 'bme', 'bmf', 'bmg', 'bmh', 'bmi', 'bmj', 'bmk', 'bml', 'bmm', 'bmn', 'bmo', 'bmp', 'bmq', 'bmr', 'bms', 'bmt', 'bmu', 'bmv', 'bmw', 'bmx', 'bmy', 'bmz', 'bna', 'bnb', 'bnc', 'bnd', 'bne', 'bnf', 'bng', 'bni', 'bnj', 'bnk', 'bnl', 'bnm', 'bnn', 'bno', 'bnp', 'bnq', 'bnr', 'bns', 'bnt', 'bnu', 'bnv', 'bnw', 'bnx', 'bny', 'bnz', 'boa', 'bob', 'boe', 'bof', 'bog', 'boh', 'boi', 'boj', 'bok', 'bol', 'bom', 'bon', 'boo', 'bop', 'boq', 'bor', 'bot', 'bou', 'bov', 'bow', 'box', 'boy', 'boz', 'bpa', 'bpb', 'bpd', 'bpg', 'bph', 'bpi', 'bpj', 'bpk', 'bpl', 'bpm', 'bpn', 'bpo', 'bpp', 'bpq', 'bpr', 'bps', 'bpt', 'bpu', 'bpv', 'bpw', 'bpx', 'bpy', 'bpz', 'bqa', 'bqb', 'bqc', 'bqd', 'bqf', 'bqg', 'bqh', 'bqi', 'bqj', 'bqk', 'bql', 'bqm', 'bqn', 'bqo', 'bqp', 'bqq', 'bqr', 'bqs', 'bqt', 'bqu', 'bqv', 'bqw', 'bqx', 'bqy', 'bqz', 'bra', 'brb', 'brc', 'brd', 'brf', 'brg', 'brh', 'bri', 'brj', 'brk', 'brl', 'brm', 'brn', 'bro', 'brp', 'brq', 'brr', 'brs', 'brt', 'bru', 'brv', 'brw', 'brx', 'bry', 'brz', 'bsa', 'bsb', 'bsc', 'bse', 'bsf', 'bsg', 'bsh', 'bsi', 'bsj', 'bsk', 'bsl', 'bsm', 'bsn', 'bso', 'bsp', 'bsq', 'bsr', 'bss', 'bst', 'bsu', 'bsv', 'bsw', 'bsx', 'bsy', 'bta', 'btb', 'btc', 'btd', 'bte', 'btf', 'btg', 'bth', 'bti', 'btj', 'btk', 'btl', 'btm', 'btn', 'bto', 'btp', 'btq', 'btr', 'bts', 'btt', 'btu', 'btv', 'btw', 'btx', 'bty', 'btz', 'bua', 'bub', 'buc', 'bud', 'bue', 'buf', 'bug', 'buh', 'bui', 'buj', 'buk', 'bum', 'bun', 'buo', 'bup', 'buq', 'bus', 'but', 'buu', 'buv', 'buw', 'bux', 'buy', 'buz', 'bva', 'bvb', 'bvc', 'bvd', 'bve', 'bvf', 'bvg', 'bvh', 'bvi', 'bvj', 'bvk', 'bvl', 'bvm', 'bvn', 'bvo', 'bvp', 'bvq', 'bvr', 'bvt', 'bvu', 'bvv', 'bvw', 'bvx', 'bvy', 'bvz', 'bwa', 'bwb', 'bwc', 'bwd', 'bwe', 'bwf', 'bwg', 'bwh', 'bwi', 'bwj', 'bwk', 'bwl', 'bwm', 'bwn', 'bwo', 'bwp', 'bwq', 'bwr', 'bws', 'bwt', 'bwu', 'bww', 'bwx', 'bwy', 'bwz', 'bxa', 'bxb', 'bxc', 'bxd', 'bxe', 'bxf', 'bxg', 'bxh', 'bxi', 'bxj', 'bxk', 'bxl', 'bxm', 'bxn', 'bxo', 'bxp', 'bxq', 'bxr', 'bxs', 'bxu', 'bxv', 'bxw', 'bxx', 'bxz', 'bya', 'byb', 'byc', 'byd', 'bye', 'byf', 'byg', 'byh', 'byi', 'byj', 'byk', 'byl', 'bym', 'byn', 'byo', 'byp', 'byq', 'byr', 'bys', 'byt', 'byv', 'byw', 'byx', 'byy', 'byz', 'bza', 'bzb', 'bzc', 'bzd', 'bze', 'bzf', 'bzg', 'bzh', 'bzi', 'bzj', 'bzk', 'bzl', 'bzm', 'bzn', 'bzo', 'bzp', 'bzq', 'bzr', 'bzs', 'bzt', 'bzu', 'bzv', 'bzw', 'bzx', 'bzy', 'bzz', 'caa', 'cab', 'cac', 'cad', 'cae', 'caf', 'cag', 'cah', 'cai', 'caj', 'cak', 'cal', 'cam', 'can', 'cao', 'cap', 'caq', 'car', 'cas', 'cau', 'cav', 'caw', 'cax', 'cay', 'caz', 'cba', 'cbb', 'cbc', 'cbd', 'cbe', 'cbg', 'cbh', 'cbi', 'cbj', 'cbk', 'cbl', 'cbn', 'cbo', 'cbq', 'cbr', 'cbs', 'cbt', 'cbu', 'cbv', 'cbw', 'cby', 'cca', 'ccc', 'ccd', 'cce', 'ccg', 'cch', 'ccj', 'ccl', 'ccm', 'ccn', 'cco', 'ccp', 'ccq', 'ccr', 'ccs', 'cda', 'cdc', 'cdd', 'cde', 'cdf', 'cdg', 'cdh', 'cdi', 'cdj', 'cdm', 'cdn', 'cdo', 'cdr', 'cds', 'cdy', 'cdz', 'cea', 'ceb', 'ceg', 'cek', 'cel', 'cen', 'cet', 'cfa', 'cfd', 'cfg', 'cfm', 'cga', 'cgc', 'cgg', 'cgk', 'chb', 'chc', 'chd', 'chf', 'chg', 'chh', 'chj', 'chk', 'chl', 'chm', 'chn', 'cho', 'chp', 'chq', 'chr', 'cht', 'chw', 'chx', 'chy', 'chz', 'cia', 'cib', 'cic', 'cid', 'cie', 'cih', 'cik', 'cim', 'cin', 'cip', 'cir', 'ciw', 'ciy', 'cja', 'cje', 'cjh', 'cji', 'cjk', 'cjm', 'cjn', 'cjo', 'cjp', 'cjr', 'cjs', 'cjv', 'cjy', 'cka', 'ckb', 'ckh', 'ckl', 'ckn', 'cko', 'ckq', 'ckr', 'cks', 'ckt', 'cku', 'ckv', 'ckx', 'cky', 'ckz', 'cla', 'clc', 'cld', 'cle', 'clh', 'cli', 'clj', 'clk', 'cll', 'clm', 'clo', 'clt', 'clu', 'clw', 'cly', 'cma', 'cmc', 'cme', 'cmg', 'cmi', 'cmk', 'cml', 'cmm', 'cmn', 'cmo', 'cmr', 'cms', 'cmt', 'cna', 'cnb', 'cnc', 'cng', 'cnh', 'cni', 'cnk', 'cnl', 'cno', 'cnr', 'cns', 'cnt', 'cnu', 'cnw', 'cnx', 'coa', 'cob', 'coc', 'cod', 'coe', 'cof', 'cog', 'coh', 'coj', 'cok', 'col', 'com', 'con', 'coo', 'cop', 'coq', 'cot', 'cou', 'cov', 'cow', 'cox', 'coy', 'coz', 'cpa', 'cpb', 'cpc', 'cpe', 'cpf', 'cpg', 'cpi', 'cpn', 'cpo', 'cpp', 'cps', 'cpu', 'cpx', 'cpy', 'cqd', 'cqu', 'cra', 'crb', 'crc', 'crd', 'crf', 'crg', 'crh', 'cri', 'crj', 'crk', 'crl', 'crm', 'crn', 'cro', 'crp', 'crq', 'crr', 'crs', 'crt', 'crv', 'crw', 'crx', 'cry', 'crz', 'csa', 'csb', 'csc', 'csd', 'cse', 'csf', 'csg', 'csh', 'csi', 'csj', 'csk', 'csl', 'csm', 'csn', 'cso', 'csq', 'csr', 'css', 'cst', 'csu', 'csv', 'csw', 'csy', 'csz', 'cta', 'ctc', 'ctd', 'cte', 'ctg', 'cth', 'ctl', 'ctm', 'ctn', 'cto', 'ctp', 'cts', 'ctt', 'ctu', 'ctz', 'cua', 'cub', 'cuc', 'cug', 'cuh', 'cui', 'cuj', 'cuk', 'cul', 'cum', 'cuo', 'cup', 'cuq', 'cur', 'cus', 'cut', 'cuu', 'cuv', 'cuw', 'cux', 'cuy', 'cvg', 'cvn', 'cwa', 'cwb', 'cwd', 'cwe', 'cwg', 'cwt', 'cya', 'cyb', 'cyo', 'czh', 'czk', 'czn', 'czo', 'czt', 'daa', 'dac', 'dad', 'dae', 'daf', 'dag', 'dah', 'dai', 'daj', 'dak', 'dal', 'dam', 'dao', 'dap', 'daq', 'dar', 'das', 'dau', 'dav', 'daw', 'dax', 'day', 'daz', 'dba', 'dbb', 'dbd', 'dbe', 'dbf', 'dbg', 'dbi', 'dbj', 'dbl', 'dbm', 'dbn', 'dbo', 'dbp', 'dbq', 'dbr', 'dbt', 'dbu', 'dbv', 'dbw', 'dby', 'dcc', 'dcr', 'dda', 'ddd', 'dde', 'ddg', 'ddi', 'ddj', 'ddn', 'ddo', 'ddr', 'dds', 'ddw', 'dec', 'ded', 'dee', 'def', 'deg', 'deh', 'dei', 'dek', 'del', 'dem', 'den', 'dep', 'deq', 'der', 'des', 'dev', 'dez', 'dga', 'dgb', 'dgc', 'dgd', 'dge', 'dgg', 'dgh', 'dgi', 'dgk', 'dgl', 'dgn', 'dgo', 'dgr', 'dgs', 'dgt', 'dgu', 'dgw', 'dgx', 'dgz', 'dha', 'dhd', 'dhg', 'dhi', 'dhl', 'dhm', 'dhn', 'dho', 'dhr', 'dhs', 'dhu', 'dhv', 'dhw', 'dhx', 'dia', 'dib', 'dic', 'did', 'dif', 'dig', 'dih', 'dii', 'dij', 'dik', 'dil', 'dim', 'din', 'dio', 'dip', 'diq', 'dir', 'dis', 'dit', 'diu', 'diw', 'dix', 'diy', 'diz', 'dja', 'djb', 'djc', 'djd', 'dje', 'djf', 'dji', 'djj', 'djk', 'djl', 'djm', 'djn', 'djo', 'djr', 'dju', 'djw', 'dka', 'dkk', 'dkl', 'dkr', 'dks', 'dkx', 'dlg', 'dlk', 'dlm', 'dln', 'dma', 'dmb', 'dmc', 'dmd', 'dme', 'dmg', 'dmk', 'dml', 'dmm', 'dmn', 'dmo', 'dmr', 'dms', 'dmu', 'dmv', 'dmw', 'dmx', 'dmy', 'dna', 'dnd', 'dne', 'dng', 'dni', 'dnj', 'dnk', 'dnn', 'dnr', 'dnt', 'dnu', 'dnv', 'dnw', 'dny', 'doa', 'dob', 'doc', 'doe', 'dof', 'doh', 'doi', 'dok', 'dol', 'don', 'doo', 'dop', 'doq', 'dor', 'dos', 'dot', 'dov', 'dow', 'dox', 'doy', 'doz', 'dpp', 'dra', 'drb', 'drc', 'drd', 'dre', 'drg', 'drh', 'dri', 'drl', 'drn', 'dro', 'drq', 'drr', 'drs', 'drt', 'dru', 'drw', 'dry', 'dsb', 'dse', 'dsh', 'dsi', 'dsl', 'dsn', 'dso', 'dsq', 'dta', 'dtb', 'dtd', 'dth', 'dti', 'dtk', 'dtm', 'dtn', 'dto', 'dtp', 'dtr', 'dts', 'dtt', 'dtu', 'dty', 'dua', 'dub', 'duc', 'dud', 'due', 'duf', 'dug', 'duh', 'dui', 'duj', 'duk', 'dul', 'dum', 'dun', 'duo', 'dup', 'duq', 'dur', 'dus', 'duu', 'duv', 'duw', 'dux', 'duy', 'duz', 'dva', 'dwa', 'dwl', 'dwr', 'dws', 'dwu', 'dww', 'dwy', 'dya', 'dyb', 'dyd', 'dyg', 'dyi', 'dym', 'dyn', 'dyo', 'dyu', 'dyy', 'dza', 'dzd', 'dze', 'dzg', 'dzl', 'dzn', 'eaa', 'ebg', 'ebk', 'ebo', 'ebr', 'ebu', 'ecr', 'ecs', 'ecy', 'eee', 'efa', 'efe', 'efi', 'ega', 'egl', 'ego', 'egx', 'egy', 'ehu', 'eip', 'eit', 'eiv', 'eja', 'eka', 'ekc', 'eke', 'ekg', 'eki', 'ekk', 'ekl', 'ekm', 'eko', 'ekp', 'ekr', 'eky', 'ele', 'elh', 'eli', 'elk', 'elm', 'elo', 'elp', 'elu', 'elx', 'ema', 'emb', 'eme', 'emg', 'emi', 'emk', 'emm', 'emn', 'emo', 'emp', 'ems', 'emu', 'emw', 'emx', 'emy', 'ena', 'enb', 'enc', 'end', 'enf', 'enh', 'enl', 'enm', 'enn', 'eno', 'enq', 'enr', 'enu', 'env', 'enw', 'enx', 'eot', 'epi', 'era', 'erg', 'erh', 'eri', 'erk', 'ero', 'err', 'ers', 'ert', 'erw', 'ese', 'esg', 'esh', 'esi', 'esk', 'esl', 'esm', 'esn', 'eso', 'esq', 'ess', 'esu', 'esx', 'esy', 'etb', 'etc', 'eth', 'etn', 'eto', 'etr', 'ets', 'ett', 'etu', 'etx', 'etz', 'euq', 'eve', 'evh', 'evn', 'ewo', 'ext', 'eya', 'eyo', 'eza', 'eze', 'faa', 'fab', 'fad', 'faf', 'fag', 'fah', 'fai', 'faj', 'fak', 'fal', 'fam', 'fan', 'fap', 'far', 'fat', 'fau', 'fax', 'fay', 'faz', 'fbl', 'fcs', 'fer', 'ffi', 'ffm', 'fgr', 'fia', 'fie', 'fil', 'fip', 'fir', 'fit', 'fiu', 'fiw', 'fkk', 'fkv', 'fla', 'flh', 'fli', 'fll', 'fln', 'flr', 'fly', 'fmp', 'fmu', 'fnb', 'fng', 'fni', 'fod', 'foi', 'fom', 'fon', 'for', 'fos', 'fox', 'fpe', 'fqs', 'frc', 'frd', 'frk', 'frm', 'fro', 'frp', 'frq', 'frr', 'frs', 'frt', 'fse', 'fsl', 'fss', 'fub', 'fuc', 'fud', 'fue', 'fuf', 'fuh', 'fui', 'fuj', 'fum', 'fun', 'fuq', 'fur', 'fut', 'fuu', 'fuv', 'fuy', 'fvr', 'fwa', 'fwe', 'gaa', 'gab', 'gac', 'gad', 'gae', 'gaf', 'gag', 'gah', 'gai', 'gaj', 'gak', 'gal', 'gam', 'gan', 'gao', 'gap', 'gaq', 'gar', 'gas', 'gat', 'gau', 'gav', 'gaw', 'gax', 'gay', 'gaz', 'gba', 'gbb', 'gbc', 'gbd', 'gbe', 'gbf', 'gbg', 'gbh', 'gbi', 'gbj', 'gbk', 'gbl', 'gbm', 'gbn', 'gbo', 'gbp', 'gbq', 'gbr', 'gbs', 'gbu', 'gbv', 'gbw', 'gbx', 'gby', 'gbz', 'gcc', 'gcd', 'gce', 'gcf', 'gcl', 'gcn', 'gcr', 'gct', 'gda', 'gdb', 'gdc', 'gdd', 'gde', 'gdf', 'gdg', 'gdh', 'gdi', 'gdj', 'gdk', 'gdl', 'gdm', 'gdn', 'gdo', 'gdq', 'gdr', 'gds', 'gdt', 'gdu', 'gdx', 'gea', 'geb', 'gec', 'ged', 'geg', 'geh', 'gei', 'gej', 'gek', 'gel', 'gem', 'geq', 'ges', 'gev', 'gew', 'gex', 'gey', 'gez', 'gfk', 'gft', 'gfx', 'gga', 'ggb', 'ggd', 'gge', 'ggg', 'ggk', 'ggl', 'ggn', 'ggo', 'ggr', 'ggt', 'ggu', 'ggw', 'gha', 'ghc', 'ghe', 'ghh', 'ghk', 'ghl', 'ghn', 'gho', 'ghr', 'ghs', 'ght', 'gia', 'gib', 'gic', 'gid', 'gie', 'gig', 'gih', 'gil', 'gim', 'gin', 'gio', 'gip', 'giq', 'gir', 'gis', 'git', 'giu', 'giw', 'gix', 'giy', 'giz', 'gji', 'gjk', 'gjm', 'gjn', 'gjr', 'gju', 'gka', 'gkd', 'gke', 'gkn', 'gko', 'gkp', 'gku', 'glc', 'gld', 'glh', 'gli', 'glj', 'glk', 'gll', 'glo', 'glr', 'glu', 'glw', 'gly', 'gma', 'gmb', 'gmd', 'gme', 'gmg', 'gmh', 'gml', 'gmm', 'gmn', 'gmq', 'gmu', 'gmv', 'gmw', 'gmx', 'gmy', 'gmz', 'gna', 'gnb', 'gnc', 'gnd', 'gne', 'gng', 'gnh', 'gni', 'gnj', 'gnk', 'gnl', 'gnm', 'gnn', 'gno', 'gnq', 'gnr', 'gnt', 'gnu', 'gnw', 'gnz', 'goa', 'gob', 'goc', 'god', 'goe', 'gof', 'gog', 'goh', 'goi', 'goj', 'gok', 'gol', 'gom', 'gon', 'goo', 'gop', 'goq', 'gor', 'gos', 'got', 'gou', 'gow', 'gox', 'goy', 'goz', 'gpa', 'gpe', 'gpn', 'gqa', 'gqi', 'gqn', 'gqr', 'gqu', 'gra', 'grb', 'grc', 'grd', 'grg', 'grh', 'gri', 'grj', 'grk', 'grm', 'gro', 'grq', 'grr', 'grs', 'grt', 'gru', 'grv', 'grw', 'grx', 'gry', 'grz', 'gse', 'gsg', 'gsl', 'gsm', 'gsn', 'gso', 'gsp', 'gss', 'gsw', 'gta', 'gti', 'gtu', 'gua', 'gub', 'guc', 'gud', 'gue', 'guf', 'gug', 'guh', 'gui', 'guk', 'gul', 'gum', 'gun', 'guo', 'gup', 'guq', 'gur', 'gus', 'gut', 'guu', 'guv', 'guw', 'gux', 'guz', 'gva', 'gvc', 'gve', 'gvf', 'gvj', 'gvl', 'gvm', 'gvn', 'gvo', 'gvp', 'gvr', 'gvs', 'gvy', 'gwa', 'gwb', 'gwc', 'gwd', 'gwe', 'gwf', 'gwg', 'gwi', 'gwj', 'gwm', 'gwn', 'gwr', 'gwt', 'gwu', 'gww', 'gwx', 'gxx', 'gya', 'gyb', 'gyd', 'gye', 'gyf', 'gyg', 'gyi', 'gyl', 'gym', 'gyn', 'gyo', 'gyr', 'gyy', 'gza', 'gzi', 'gzn', 'haa', 'hab', 'hac', 'had', 'hae', 'haf', 'hag', 'hah', 'hai', 'haj', 'hak', 'hal', 'ham', 'han', 'hao', 'hap', 'haq', 'har', 'has', 'hav', 'haw', 'hax', 'hay', 'haz', 'hba', 'hbb', 'hbn', 'hbo', 'hbu', 'hca', 'hch', 'hdn', 'hds', 'hdy', 'hea', 'hed', 'heg', 'heh', 'hei', 'hem', 'hgm', 'hgw', 'hhi', 'hhr', 'hhy', 'hia', 'hib', 'hid', 'hif', 'hig', 'hih', 'hii', 'hij', 'hik', 'hil', 'him', 'hio', 'hir', 'hit', 'hiw', 'hix', 'hji', 'hka', 'hke', 'hkk', 'hkn', 'hks', 'hla', 'hlb', 'hld', 'hle', 'hlt', 'hlu', 'hma', 'hmb', 'hmc', 'hmd', 'hme', 'hmf', 'hmg', 'hmh', 'hmi', 'hmj', 'hmk', 'hml', 'hmm', 'hmn', 'hmp', 'hmq', 'hmr', 'hms', 'hmt', 'hmu', 'hmv', 'hmw', 'hmx', 'hmy', 'hmz', 'hna', 'hnd', 'hne', 'hnh', 'hni', 'hnj', 'hnn', 'hno', 'hns', 'hnu', 'hoa', 'hob', 'hoc', 'hod', 'hoe', 'hoh', 'hoi', 'hoj', 'hok', 'hol', 'hom', 'hoo', 'hop', 'hor', 'hos', 'hot', 'hov', 'how', 'hoy', 'hoz', 'hpo', 'hps', 'hra', 'hrc', 'hre', 'hrk', 'hrm', 'hro', 'hrp', 'hrr', 'hrt', 'hru', 'hrw', 'hrx', 'hrz', 'hsb', 'hsh', 'hsl', 'hsn', 'hss', 'hti', 'hto', 'hts', 'htu', 'htx', 'hub', 'huc', 'hud', 'hue', 'huf', 'hug', 'huh', 'hui', 'huj', 'huk', 'hul', 'hum', 'huo', 'hup', 'huq', 'hur', 'hus', 'hut', 'huu', 'huv', 'huw', 'hux', 'huy', 'huz', 'hvc', 'hve', 'hvk', 'hvn', 'hvv', 'hwa', 'hwc', 'hwo', 'hya', 'hyw', 'hyx', 'iai', 'ian', 'iap', 'iar', 'iba', 'ibb', 'ibd', 'ibe', 'ibg', 'ibh', 'ibi', 'ibl', 'ibm', 'ibn', 'ibr', 'ibu', 'iby', 'ica', 'ich', 'icl', 'icr', 'ida', 'idb', 'idc', 'idd', 'ide', 'idi', 'idr', 'ids', 'idt', 'idu', 'ifa', 'ifb', 'ife', 'iff', 'ifk', 'ifm', 'ifu', 'ify', 'igb', 'ige', 'igg', 'igl', 'igm', 'ign', 'igo', 'igs', 'igw', 'ihb', 'ihi', 'ihp', 'ihw', 'iin', 'iir', 'ijc', 'ije', 'ijj', 'ijn', 'ijo', 'ijs', 'ike', 'iki', 'ikk', 'ikl', 'iko', 'ikp', 'ikr', 'iks', 'ikt', 'ikv', 'ikw', 'ikx', 'ikz', 'ila', 'ilb', 'ilg', 'ili', 'ilk', 'ill', 'ilm', 'ilo', 'ilp', 'ils', 'ilu', 'ilv', 'ilw', 'ima', 'ime', 'imi', 'iml', 'imn', 'imo', 'imr', 'ims', 'imy', 'inb', 'inc', 'ine', 'ing', 'inh', 'inj', 'inl', 'inm', 'inn', 'ino', 'inp', 'ins', 'int', 'inz', 'ior', 'iou', 'iow', 'ipi', 'ipo', 'iqu', 'iqw', 'ira', 'ire', 'irh', 'iri', 'irk', 'irn', 'iro', 'irr', 'iru', 'irx', 'iry', 'isa', 'isc', 'isd', 'ise', 'isg', 'ish', 'isi', 'isk', 'ism', 'isn', 'iso', 'isr', 'ist', 'isu', 'itb', 'itc', 'itd', 'ite', 'iti', 'itk', 'itl', 'itm', 'ito', 'itr', 'its', 'itt', 'itv', 'itw', 'itx', 'ity', 'itz', 'ium', 'ivb', 'ivv', 'iwk', 'iwm', 'iwo', 'iws', 'ixc', 'ixl', 'iya', 'iyo', 'iyx', 'izh', 'izi', 'izr', 'izz', 'jaa', 'jab', 'jac', 'jad', 'jae', 'jaf', 'jah', 'jaj', 'jak', 'jal', 'jam', 'jan', 'jao', 'jaq', 'jar', 'jas', 'jat', 'jau', 'jax', 'jay', 'jaz', 'jbe', 'jbi', 'jbj', 'jbk', 'jbn', 'jbo', 'jbr', 'jbt', 'jbu', 'jbw', 'jcs', 'jct', 'jda', 'jdg', 'jdt', 'jeb', 'jee', 'jeg', 'jeh', 'jei', 'jek', 'jel', 'jen', 'jer', 'jet', 'jeu', 'jgb', 'jge', 'jgk', 'jgo', 'jhi', 'jhs', 'jia', 'jib', 'jic', 'jid', 'jie', 'jig', 'jih', 'jii', 'jil', 'jim', 'jio', 'jiq', 'jit', 'jiu', 'jiv', 'jiy', 'jje', 'jjr', 'jka', 'jkm', 'jko', 'jkp', 'jkr', 'jku', 'jle', 'jls', 'jma', 'jmb', 'jmc', 'jmd', 'jmi', 'jml', 'jmn', 'jmr', 'jms', 'jmw', 'jmx', 'jna', 'jnd', 'jng', 'jni', 'jnj', 'jnl', 'jns', 'job', 'jod', 'jog', 'jor', 'jos', 'jow', 'jpa', 'jpr', 'jpx', 'jqr', 'jra', 'jrb', 'jrr', 'jrt', 'jru', 'jsl', 'jua', 'jub', 'juc', 'jud', 'juh', 'jui', 'juk', 'jul', 'jum', 'jun', 'juo', 'jup', 'jur', 'jus', 'jut', 'juu', 'juw', 'juy', 'jvd', 'jvn', 'jwi', 'jya', 'jye', 'jyy', 'kaa', 'kab', 'kac', 'kad', 'kae', 'kaf', 'kag', 'kah', 'kai', 'kaj', 'kak', 'kam', 'kao', 'kap', 'kaq', 'kar', 'kav', 'kaw', 'kax', 'kay', 'kba', 'kbb', 'kbc', 'kbd', 'kbe', 'kbf', 'kbg', 'kbh', 'kbi', 'kbj', 'kbk', 'kbl', 'kbm', 'kbn', 'kbo', 'kbp', 'kbq', 'kbr', 'kbs', 'kbt', 'kbu', 'kbv', 'kbw', 'kbx', 'kby', 'kbz', 'kca', 'kcb', 'kcc', 'kcd', 'kce', 'kcf', 'kcg', 'kch', 'kci', 'kcj', 'kck', 'kcl', 'kcm', 'kcn', 'kco', 'kcp', 'kcq', 'kcr', 'kcs', 'kct', 'kcu', 'kcv', 'kcw', 'kcx', 'kcy', 'kcz', 'kda', 'kdc', 'kdd', 'kde', 'kdf', 'kdg', 'kdh', 'kdi', 'kdj', 'kdk', 'kdl', 'kdm', 'kdn', 'kdo', 'kdp', 'kdq', 'kdr', 'kdt', 'kdu', 'kdv', 'kdw', 'kdx', 'kdy', 'kdz', 'kea', 'keb', 'kec', 'ked', 'kee', 'kef', 'keg', 'keh', 'kei', 'kej', 'kek', 'kel', 'kem', 'ken', 'keo', 'kep', 'keq', 'ker', 'kes', 'ket', 'keu', 'kev', 'kew', 'kex', 'key', 'kez', 'kfa', 'kfb', 'kfc', 'kfd', 'kfe', 'kff', 'kfg', 'kfh', 'kfi', 'kfj', 'kfk', 'kfl', 'kfm', 'kfn', 'kfo', 'kfp', 'kfq', 'kfr', 'kfs', 'kft', 'kfu', 'kfv', 'kfw', 'kfx', 'kfy', 'kfz', 'kga', 'kgb', 'kgc', 'kgd', 'kge', 'kgf', 'kgg', 'kgh', 'kgi', 'kgj', 'kgk', 'kgl', 'kgm', 'kgn', 'kgo', 'kgp', 'kgq', 'kgr', 'kgs', 'kgt', 'kgu', 'kgv', 'kgw', 'kgx', 'kgy', 'kha', 'khb', 'khc', 'khd', 'khe', 'khf', 'khg', 'khh', 'khi', 'khj', 'khk', 'khl', 'khn', 'kho', 'khp', 'khq', 'khr', 'khs', 'kht', 'khu', 'khv', 'khw', 'khx', 'khy', 'khz', 'kia', 'kib', 'kic', 'kid', 'kie', 'kif', 'kig', 'kih', 'kii', 'kij', 'kil', 'kim', 'kio', 'kip', 'kiq', 'kis', 'kit', 'kiu', 'kiv', 'kiw', 'kix', 'kiy', 'kiz', 'kja', 'kjb', 'kjc', 'kjd', 'kje', 'kjf', 'kjg', 'kjh', 'kji', 'kjj', 'kjk', 'kjl', 'kjm', 'kjn', 'kjo', 'kjp', 'kjq', 'kjr', 'kjs', 'kjt', 'kju', 'kjv', 'kjx', 'kjy', 'kjz', 'kka', 'kkb', 'kkc', 'kkd', 'kke', 'kkf', 'kkg', 'kkh', 'kki', 'kkj', 'kkk', 'kkl', 'kkm', 'kkn', 'kko', 'kkp', 'kkq', 'kkr', 'kks', 'kkt', 'kku', 'kkv', 'kkw', 'kkx', 'kky', 'kkz', 'kla', 'klb', 'klc', 'kld', 'kle', 'klf', 'klg', 'klh', 'kli', 'klj', 'klk', 'kll', 'klm', 'kln', 'klo', 'klp', 'klq', 'klr', 'kls', 'klt', 'klu', 'klv', 'klw', 'klx', 'kly', 'klz', 'kma', 'kmb', 'kmc', 'kmd', 'kme', 'kmf', 'kmg', 'kmh', 'kmi', 'kmj', 'kmk', 'kml', 'kmm', 'kmn', 'kmo', 'kmp', 'kmq', 'kmr', 'kms', 'kmt', 'kmu', 'kmv', 'kmw', 'kmx', 'kmy', 'kmz', 'kna', 'knb', 'knc', 'knd', 'kne', 'knf', 'kng', 'kni', 'knj', 'knk', 'knl', 'knm', 'knn', 'kno', 'knp', 'knq', 'knr', 'kns', 'knt', 'knu', 'knv', 'knw', 'knx', 'kny', 'knz', 'koa', 'koc', 'kod', 'koe', 'kof', 'kog', 'koh', 'koi', 'koj', 'kok', 'kol', 'koo', 'kop', 'koq', 'kos', 'kot', 'kou', 'kov', 'kow', 'kox', 'koy', 'koz', 'kpa', 'kpb', 'kpc', 'kpd', 'kpe', 'kpf', 'kpg', 'kph', 'kpi', 'kpj', 'kpk', 'kpl', 'kpm', 'kpn', 'kpo', 'kpp', 'kpq', 'kpr', 'kps', 'kpt', 'kpu', 'kpv', 'kpw', 'kpx', 'kpy', 'kpz', 'kqa', 'kqb', 'kqc', 'kqd', 'kqe', 'kqf', 'kqg', 'kqh', 'kqi', 'kqj', 'kqk', 'kql', 'kqm', 'kqn', 'kqo', 'kqp', 'kqq', 'kqr', 'kqs', 'kqt', 'kqu', 'kqv', 'kqw', 'kqx', 'kqy', 'kqz', 'kra', 'krb', 'krc', 'krd', 'kre', 'krf', 'krh', 'kri', 'krj', 'krk', 'krl', 'krm', 'krn', 'kro', 'krp', 'krr', 'krs', 'krt', 'kru', 'krv', 'krw', 'krx', 'kry', 'krz', 'ksa', 'ksb', 'ksc', 'ksd', 'kse', 'ksf', 'ksg', 'ksh', 'ksi', 'ksj', 'ksk', 'ksl', 'ksm', 'ksn', 'kso', 'ksp', 'ksq', 'ksr', 'kss', 'kst', 'ksu', 'ksv', 'ksw', 'ksx', 'ksy', 'ksz', 'kta', 'ktb', 'ktc', 'ktd', 'kte', 'ktf', 'ktg', 'kth', 'kti', 'ktj', 'ktk', 'ktl', 'ktm', 'ktn', 'kto', 'ktp', 'ktq', 'ktr', 'kts', 'ktt', 'ktu', 'ktv', 'ktw', 'ktx', 'kty', 'ktz', 'kub', 'kuc', 'kud', 'kue', 'kuf', 'kug', 'kuh', 'kui', 'kuj', 'kuk', 'kul', 'kum', 'kun', 'kuo', 'kup', 'kuq', 'kus', 'kut', 'kuu', 'kuv', 'kuw', 'kux', 'kuy', 'kuz', 'kva', 'kvb', 'kvc', 'kvd', 'kve', 'kvf', 'kvg', 'kvh', 'kvi', 'kvj', 'kvk', 'kvl', 'kvm', 'kvn', 'kvo', 'kvp', 'kvq', 'kvr', 'kvs', 'kvt', 'kvu', 'kvv', 'kvw', 'kvx', 'kvy', 'kvz', 'kwa', 'kwb', 'kwc', 'kwd', 'kwe', 'kwf', 'kwg', 'kwh', 'kwi', 'kwj', 'kwk', 'kwl', 'kwm', 'kwn', 'kwo', 'kwp', 'kwq', 'kwr', 'kws', 'kwt', 'kwu', 'kwv', 'kww', 'kwx', 'kwy', 'kwz', 'kxa', 'kxb', 'kxc', 'kxd', 'kxe', 'kxf', 'kxh', 'kxi', 'kxj', 'kxk', 'kxl', 'kxm', 'kxn', 'kxo', 'kxp', 'kxq', 'kxr', 'kxs', 'kxt', 'kxu', 'kxv', 'kxw', 'kxx', 'kxy', 'kxz', 'kya', 'kyb', 'kyc', 'kyd', 'kye', 'kyf', 'kyg', 'kyh', 'kyi', 'kyj', 'kyk', 'kyl', 'kym', 'kyn', 'kyo', 'kyp', 'kyq', 'kyr', 'kys', 'kyt', 'kyu', 'kyv', 'kyw', 'kyx', 'kyy', 'kyz', 'kza', 'kzb', 'kzc', 'kzd', 'kze', 'kzf', 'kzg', 'kzh', 'kzi', 'kzj', 'kzk', 'kzl', 'kzm', 'kzn', 'kzo', 'kzp', 'kzq', 'kzr', 'kzs', 'kzt', 'kzu', 'kzv', 'kzw', 'kzx', 'kzy', 'kzz', 'laa', 'lab', 'lac', 'lad', 'lae', 'laf', 'lag', 'lah', 'lai', 'laj', 'lak', 'lal', 'lam', 'lan', 'lap', 'laq', 'lar', 'las', 'lau', 'law', 'lax', 'lay', 'laz', 'lba', 'lbb', 'lbc', 'lbe', 'lbf', 'lbg', 'lbi', 'lbj', 'lbk', 'lbl', 'lbm', 'lbn', 'lbo', 'lbq', 'lbr', 'lbs', 'lbt', 'lbu', 'lbv', 'lbw', 'lbx', 'lby', 'lbz', 'lcc', 'lcd', 'lce', 'lcf', 'lch', 'lcl', 'lcm', 'lcp', 'lcq', 'lcs', 'lda', 'ldb', 'ldd', 'ldg', 'ldh', 'ldi', 'ldj', 'ldk', 'ldl', 'ldm', 'ldn', 'ldo', 'ldp', 'ldq', 'lea', 'leb', 'lec', 'led', 'lee', 'lef', 'leg', 'leh', 'lei', 'lej', 'lek', 'lel', 'lem', 'len', 'leo', 'lep', 'leq', 'ler', 'les', 'let', 'leu', 'lev', 'lew', 'lex', 'ley', 'lez', 'lfa', 'lfn', 'lga', 'lgb', 'lgg', 'lgh', 'lgi', 'lgk', 'lgl', 'lgm', 'lgn', 'lgq', 'lgr', 'lgt', 'lgu', 'lgz', 'lha', 'lhh', 'lhi', 'lhl', 'lhm', 'lhn', 'lhp', 'lhs', 'lht', 'lhu', 'lia', 'lib', 'lic', 'lid', 'lie', 'lif', 'lig', 'lih', 'lii', 'lij', 'lik', 'lil', 'lio', 'lip', 'liq', 'lir', 'lis', 'liu', 'liv', 'liw', 'lix', 'liy', 'liz', 'lja', 'lje', 'lji', 'ljl', 'ljp', 'ljw', 'ljx', 'lka', 'lkb', 'lkc', 'lkd', 'lke', 'lkh', 'lki', 'lkj', 'lkl', 'lkm', 'lkn', 'lko', 'lkr', 'lks', 'lkt', 'lku', 'lky', 'lla', 'llb', 'llc', 'lld', 'lle', 'llf', 'llg', 'llh', 'lli', 'llj', 'llk', 'lll', 'llm', 'lln', 'llo', 'llp', 'llq', 'lls', 'llu', 'llx', 'lma', 'lmb', 'lmc', 'lmd', 'lme', 'lmf', 'lmg', 'lmh', 'lmi', 'lmj', 'lmk', 'lml', 'lmm', 'lmn', 'lmo', 'lmp', 'lmq', 'lmr', 'lmu', 'lmv', 'lmw', 'lmx', 'lmy', 'lmz', 'lna', 'lnb', 'lnd', 'lng', 'lnh', 'lni', 'lnj', 'lnl', 'lnm', 'lnn', 'lno', 'lns', 'lnu', 'lnw', 'lnz', 'loa', 'lob', 'loc', 'loe', 'lof', 'log', 'loh', 'loi', 'loj', 'lok', 'lol', 'lom', 'lon', 'loo', 'lop', 'loq', 'lor', 'los', 'lot', 'lou', 'lov', 'low', 'lox', 'loy', 'loz', 'lpa', 'lpe', 'lpn', 'lpo', 'lpx', 'lra', 'lrc', 'lre', 'lrg', 'lri', 'lrk', 'lrl', 'lrm', 'lrn', 'lro', 'lrr', 'lrt', 'lrv', 'lrz', 'lsa', 'lsd', 'lse', 'lsg', 'lsh', 'lsi', 'lsl', 'lsm', 'lso', 'lsp', 'lsr', 'lss', 'lst', 'lsy', 'ltc', 'ltg', 'lth', 'lti', 'ltn', 'lto', 'lts', 'ltu', 'lua', 'luc', 'lud', 'lue', 'luf', 'lui', 'luj', 'luk', 'lul', 'lum', 'lun', 'luo', 'lup', 'luq', 'lur', 'lus', 'lut', 'luu', 'luv', 'luw', 'luy', 'luz', 'lva', 'lvk', 'lvs', 'lvu', 'lwa', 'lwe', 'lwg', 'lwh', 'lwl', 'lwm', 'lwo', 'lws', 'lwt', 'lwu', 'lww', 'lya', 'lyg', 'lyn', 'lzh', 'lzl', 'lzn', 'lzz', 'maa', 'mab', 'mad', 'mae', 'maf', 'mag', 'mai', 'maj', 'mak', 'mam', 'man', 'map', 'maq', 'mas', 'mat', 'mau', 'mav', 'maw', 'max', 'maz', 'mba', 'mbb', 'mbc', 'mbd', 'mbe', 'mbf', 'mbh', 'mbi', 'mbj', 'mbk', 'mbl', 'mbm', 'mbn', 'mbo', 'mbp', 'mbq', 'mbr', 'mbs', 'mbt', 'mbu', 'mbv', 'mbw', 'mbx', 'mby', 'mbz', 'mca', 'mcb', 'mcc', 'mcd', 'mce', 'mcf', 'mcg', 'mch', 'mci', 'mcj', 'mck', 'mcl', 'mcm', 'mcn', 'mco', 'mcp', 'mcq', 'mcr', 'mcs', 'mct', 'mcu', 'mcv', 'mcw', 'mcx', 'mcy', 'mcz', 'mda', 'mdb', 'mdc', 'mdd', 'mde', 'mdf', 'mdg', 'mdh', 'mdi', 'mdj', 'mdk', 'mdl', 'mdm', 'mdn', 'mdp', 'mdq', 'mdr', 'mds', 'mdt', 'mdu', 'mdv', 'mdw', 'mdx', 'mdy', 'mdz', 'mea', 'meb', 'mec', 'med', 'mee', 'mef', 'meg', 'meh', 'mei', 'mej', 'mek', 'mel', 'mem', 'men', 'meo', 'mep', 'meq', 'mer', 'mes', 'met', 'meu', 'mev', 'mew', 'mey', 'mez', 'mfa', 'mfb', 'mfc', 'mfd', 'mfe', 'mff', 'mfg', 'mfh', 'mfi', 'mfj', 'mfk', 'mfl', 'mfm', 'mfn', 'mfo', 'mfp', 'mfq', 'mfr', 'mfs', 'mft', 'mfu', 'mfv', 'mfw', 'mfx', 'mfy', 'mfz', 'mga', 'mgb', 'mgc', 'mgd', 'mge', 'mgf', 'mgg', 'mgh', 'mgi', 'mgj', 'mgk', 'mgl', 'mgm', 'mgn', 'mgo', 'mgp', 'mgq', 'mgr', 'mgs', 'mgt', 'mgu', 'mgv', 'mgw', 'mgx', 'mgy', 'mgz', 'mha', 'mhb', 'mhc', 'mhd', 'mhe', 'mhf', 'mhg', 'mhh', 'mhi', 'mhj', 'mhk', 'mhl', 'mhm', 'mhn', 'mho', 'mhp', 'mhq', 'mhr', 'mhs', 'mht', 'mhu', 'mhw', 'mhx', 'mhy', 'mhz', 'mia', 'mib', 'mic', 'mid', 'mie', 'mif', 'mig', 'mih', 'mii', 'mij', 'mik', 'mil', 'mim', 'min', 'mio', 'mip', 'miq', 'mir', 'mis', 'mit', 'miu', 'miw', 'mix', 'miy', 'miz', 'mja', 'mjb', 'mjc', 'mjd', 'mje', 'mjg', 'mjh', 'mji', 'mjj', 'mjk', 'mjl', 'mjm', 'mjn', 'mjo', 'mjp', 'mjq', 'mjr', 'mjs', 'mjt', 'mju', 'mjv', 'mjw', 'mjx', 'mjy', 'mjz', 'mka', 'mkb', 'mkc', 'mke', 'mkf', 'mkg', 'mkh', 'mki', 'mkj', 'mkk', 'mkl', 'mkm', 'mkn', 'mko', 'mkp', 'mkq', 'mkr', 'mks', 'mkt', 'mku', 'mkv', 'mkw', 'mkx', 'mky', 'mkz', 'mla', 'mlb', 'mlc', 'mld', 'mle', 'mlf', 'mlh', 'mli', 'mlj', 'mlk', 'mll', 'mlm', 'mln', 'mlo', 'mlp', 'mlq', 'mlr', 'mls', 'mlu', 'mlv', 'mlw', 'mlx', 'mlz', 'mma', 'mmb', 'mmc', 'mmd', 'mme', 'mmf', 'mmg', 'mmh', 'mmi', 'mmj', 'mmk', 'mml', 'mmm', 'mmn', 'mmo', 'mmp', 'mmq', 'mmr', 'mmt', 'mmu', 'mmv', 'mmw', 'mmx', 'mmy', 'mmz', 'mna', 'mnb', 'mnc', 'mnd', 'mne', 'mnf', 'mng', 'mnh', 'mni', 'mnj', 'mnk', 'mnl', 'mnm', 'mnn', 'mno', 'mnp', 'mnq', 'mnr', 'mns', 'mnt', 'mnu', 'mnv', 'mnw', 'mnx', 'mny', 'mnz', 'moa', 'moc', 'mod', 'moe', 'mof', 'mog', 'moh', 'moi', 'moj', 'mok', 'mom', 'moo', 'mop', 'moq', 'mor', 'mos', 'mot', 'mou', 'mov', 'mow', 'mox', 'moy', 'moz', 'mpa', 'mpb', 'mpc', 'mpd', 'mpe', 'mpg', 'mph', 'mpi', 'mpj', 'mpk', 'mpl', 'mpm', 'mpn', 'mpo', 'mpp', 'mpq', 'mpr', 'mps', 'mpt', 'mpu', 'mpv', 'mpw', 'mpx', 'mpy', 'mpz', 'mqa', 'mqb', 'mqc', 'mqe', 'mqf', 'mqg', 'mqh', 'mqi', 'mqj', 'mqk', 'mql', 'mqm', 'mqn', 'mqo', 'mqp', 'mqq', 'mqr', 'mqs', 'mqt', 'mqu', 'mqv', 'mqw', 'mqx', 'mqy', 'mqz', 'mra', 'mrb', 'mrc', 'mrd', 'mre', 'mrf', 'mrg', 'mrh', 'mrj', 'mrk', 'mrl', 'mrm', 'mrn', 'mro', 'mrp', 'mrq', 'mrr', 'mrs', 'mrt', 'mru', 'mrv', 'mrw', 'mrx', 'mry', 'mrz', 'msb', 'msc', 'msd', 'mse', 'msf', 'msg', 'msh', 'msi', 'msj', 'msk', 'msl', 'msm', 'msn', 'mso', 'msp', 'msq', 'msr', 'mss', 'mst', 'msu', 'msv', 'msw', 'msx', 'msy', 'msz', 'mta', 'mtb', 'mtc', 'mtd', 'mte', 'mtf', 'mtg', 'mth', 'mti', 'mtj', 'mtk', 'mtl', 'mtm', 'mtn', 'mto', 'mtp', 'mtq', 'mtr', 'mts', 'mtt', 'mtu', 'mtv', 'mtw', 'mtx', 'mty', 'mua', 'mub', 'muc', 'mud', 'mue', 'mug', 'muh', 'mui', 'muj', 'muk', 'mul', 'mum', 'mun', 'muo', 'mup', 'muq', 'mur', 'mus', 'mut', 'muu', 'muv', 'mux', 'muy', 'muz', 'mva', 'mvb', 'mvd', 'mve', 'mvf', 'mvg', 'mvh', 'mvi', 'mvk', 'mvl', 'mvm', 'mvn', 'mvo', 'mvp', 'mvq', 'mvr', 'mvs', 'mvt', 'mvu', 'mvv', 'mvw', 'mvx', 'mvy', 'mvz', 'mwa', 'mwb', 'mwc', 'mwd', 'mwe', 'mwf', 'mwg', 'mwh', 'mwi', 'mwj', 'mwk', 'mwl', 'mwm', 'mwn', 'mwo', 'mwp', 'mwq', 'mwr', 'mws', 'mwt', 'mwu', 'mwv', 'mww', 'mwx', 'mwy', 'mwz', 'mxa', 'mxb', 'mxc', 'mxd', 'mxe', 'mxf', 'mxg', 'mxh', 'mxi', 'mxj', 'mxk', 'mxl', 'mxm', 'mxn', 'mxo', 'mxp', 'mxq', 'mxr', 'mxs', 'mxt', 'mxu', 'mxv', 'mxw', 'mxx', 'mxy', 'mxz', 'myb', 'myc', 'myd', 'mye', 'myf', 'myg', 'myh', 'myi', 'myj', 'myk', 'myl', 'mym', 'myn', 'myo', 'myp', 'myq', 'myr', 'mys', 'myt', 'myu', 'myv', 'myw', 'myx', 'myy', 'myz', 'mza', 'mzb', 'mzc', 'mzd', 'mze', 'mzg', 'mzh', 'mzi', 'mzj', 'mzk', 'mzl', 'mzm', 'mzn', 'mzo', 'mzp', 'mzq', 'mzr', 'mzs', 'mzt', 'mzu', 'mzv', 'mzw', 'mzx', 'mzy', 'mzz', 'naa', 'nab', 'nac', 'nad', 'nae', 'naf', 'nag', 'nah', 'nai', 'naj', 'nak', 'nal', 'nam', 'nan', 'nao', 'nap', 'naq', 'nar', 'nas', 'nat', 'naw', 'nax', 'nay', 'naz', 'nba', 'nbb', 'nbc', 'nbd', 'nbe', 'nbf', 'nbg', 'nbh', 'nbi', 'nbj', 'nbk', 'nbm', 'nbn', 'nbo', 'nbp', 'nbq', 'nbr', 'nbs', 'nbt', 'nbu', 'nbv', 'nbw', 'nbx', 'nby', 'nca', 'ncb', 'ncc', 'ncd', 'nce', 'ncf', 'ncg', 'nch', 'nci', 'ncj', 'nck', 'ncl', 'ncm', 'ncn', 'nco', 'ncp', 'ncq', 'ncr', 'ncs', 'nct', 'ncu', 'ncx', 'ncz', 'nda', 'ndb', 'ndc', 'ndd', 'ndf', 'ndg', 'ndh', 'ndi', 'ndj', 'ndk', 'ndl', 'ndm', 'ndn', 'ndp', 'ndq', 'ndr', 'nds', 'ndt', 'ndu', 'ndv', 'ndw', 'ndx', 'ndy', 'ndz', 'nea', 'neb', 'nec', 'ned', 'nee', 'nef', 'neg', 'neh', 'nei', 'nej', 'nek', 'nem', 'nen', 'neo', 'neq', 'ner', 'nes', 'net', 'neu', 'nev', 'new', 'nex', 'ney', 'nez', 'nfa', 'nfd', 'nfl', 'nfr', 'nfu', 'nga', 'ngb', 'ngc', 'ngd', 'nge', 'ngf', 'ngg', 'ngh', 'ngi', 'ngj', 'ngk', 'ngl', 'ngm', 'ngn', 'ngo', 'ngp', 'ngq', 'ngr', 'ngs', 'ngt', 'ngu', 'ngv', 'ngw', 'ngx', 'ngy', 'ngz', 'nha', 'nhb', 'nhc', 'nhd', 'nhe', 'nhf', 'nhg', 'nhh', 'nhi', 'nhk', 'nhm', 'nhn', 'nho', 'nhp', 'nhq', 'nhr', 'nht', 'nhu', 'nhv', 'nhw', 'nhx', 'nhy', 'nhz', 'nia', 'nib', 'nic', 'nid', 'nie', 'nif', 'nig', 'nih', 'nii', 'nij', 'nik', 'nil', 'nim', 'nin', 'nio', 'niq', 'nir', 'nis', 'nit', 'niu', 'niv', 'niw', 'nix', 'niy', 'niz', 'nja', 'njb', 'njd', 'njh', 'nji', 'njj', 'njl', 'njm', 'njn', 'njo', 'njr', 'njs', 'njt', 'nju', 'njx', 'njy', 'njz', 'nka', 'nkb', 'nkc', 'nkd', 'nke', 'nkf', 'nkg', 'nkh', 'nki', 'nkj', 'nkk', 'nkm', 'nkn', 'nko', 'nkp', 'nkq', 'nkr', 'nks', 'nkt', 'nku', 'nkv', 'nkw', 'nkx', 'nkz', 'nla', 'nlc', 'nle', 'nlg', 'nli', 'nlj', 'nlk', 'nll', 'nlm', 'nln', 'nlo', 'nlq', 'nlr', 'nlu', 'nlv', 'nlw', 'nlx', 'nly', 'nlz', 'nma', 'nmb', 'nmc', 'nmd', 'nme', 'nmf', 'nmg', 'nmh', 'nmi', 'nmj', 'nmk', 'nml', 'nmm', 'nmn', 'nmo', 'nmp', 'nmq', 'nmr', 'nms', 'nmt', 'nmu', 'nmv', 'nmw', 'nmx', 'nmy', 'nmz', 'nna', 'nnb', 'nnc', 'nnd', 'nne', 'nnf', 'nng', 'nnh', 'nni', 'nnj', 'nnk', 'nnl', 'nnm', 'nnn', 'nnp', 'nnq', 'nnr', 'nns', 'nnt', 'nnu', 'nnv', 'nnw', 'nnx', 'nny', 'nnz', 'noa', 'noc', 'nod', 'noe', 'nof', 'nog', 'noh', 'noi', 'noj', 'nok', 'nol', 'nom', 'non', 'noo', 'nop', 'noq', 'nos', 'not', 'nou', 'nov', 'now', 'noy', 'noz', 'npa', 'npb', 'npg', 'nph', 'npi', 'npl', 'npn', 'npo', 'nps', 'npu', 'npx', 'npy', 'nqg', 'nqk', 'nql', 'nqm', 'nqn', 'nqo', 'nqq', 'nqy', 'nra', 'nrb', 'nrc', 'nre', 'nrf', 'nrg', 'nri', 'nrk', 'nrl', 'nrm', 'nrn', 'nrp', 'nrr', 'nrt', 'nru', 'nrx', 'nrz', 'nsa', 'nsc', 'nsd', 'nse', 'nsf', 'nsg', 'nsh', 'nsi', 'nsk', 'nsl', 'nsm', 'nsn', 'nso', 'nsp', 'nsq', 'nsr', 'nss', 'nst', 'nsu', 'nsv', 'nsw', 'nsx', 'nsy', 'nsz', 'ntd', 'nte', 'ntg', 'nti', 'ntj', 'ntk', 'ntm', 'nto', 'ntp', 'ntr', 'nts', 'ntu', 'ntw', 'ntx', 'nty', 'ntz', 'nua', 'nub', 'nuc', 'nud', 'nue', 'nuf', 'nug', 'nuh', 'nui', 'nuj', 'nuk', 'nul', 'num', 'nun', 'nuo', 'nup', 'nuq', 'nur', 'nus', 'nut', 'nuu', 'nuv', 'nuw', 'nux', 'nuy', 'nuz', 'nvh', 'nvm', 'nvo', 'nwa', 'nwb', 'nwc', 'nwe', 'nwg', 'nwi', 'nwm', 'nwo', 'nwr', 'nwx', 'nwy', 'nxa', 'nxd', 'nxe', 'nxg', 'nxi', 'nxk', 'nxl', 'nxm', 'nxn', 'nxo', 'nxq', 'nxr', 'nxu', 'nxx', 'nyb', 'nyc', 'nyd', 'nye', 'nyf', 'nyg', 'nyh', 'nyi', 'nyj', 'nyk', 'nyl', 'nym', 'nyn', 'nyo', 'nyp', 'nyq', 'nyr', 'nys', 'nyt', 'nyu', 'nyv', 'nyw', 'nyx', 'nyy', 'nza', 'nzb', 'nzd', 'nzi', 'nzk', 'nzm', 'nzs', 'nzu', 'nzy', 'nzz', 'oaa', 'oac', 'oar', 'oav', 'obi', 'obk', 'obl', 'obm', 'obo', 'obr', 'obt', 'obu', 'oca', 'och', 'oco', 'ocu', 'oda', 'odk', 'odt', 'odu', 'ofo', 'ofs', 'ofu', 'ogb', 'ogc', 'oge', 'ogg', 'ogo', 'ogu', 'oht', 'ohu', 'oia', 'oin', 'ojb', 'ojc', 'ojg', 'ojp', 'ojs', 'ojv', 'ojw', 'oka', 'okb', 'okd', 'oke', 'okg', 'okh', 'oki', 'okj', 'okk', 'okl', 'okm', 'okn', 'oko', 'okr', 'oks', 'oku', 'okv', 'okx', 'ola', 'old', 'ole', 'olk', 'olm', 'olo', 'olr', 'olt', 'olu', 'oma', 'omb', 'omc', 'ome', 'omg', 'omi', 'omk', 'oml', 'omn', 'omo', 'omp', 'omq', 'omr', 'omt', 'omu', 'omv', 'omw', 'omx', 'ona', 'onb', 'one', 'ong', 'oni', 'onj', 'onk', 'onn', 'ono', 'onp', 'onr', 'ons', 'ont', 'onu', 'onw', 'onx', 'ood', 'oog', 'oon', 'oor', 'oos', 'opa', 'opk', 'opm', 'opo', 'opt', 'opy', 'ora', 'orc', 'ore', 'org', 'orh', 'orn', 'oro', 'orr', 'ors', 'ort', 'oru', 'orv', 'orw', 'orx', 'ory', 'orz', 'osa', 'osc', 'osi', 'oso', 'osp', 'ost', 'osu', 'osx', 'ota', 'otb', 'otd', 'ote', 'oti', 'otk', 'otl', 'otm', 'otn', 'oto', 'otq', 'otr', 'ots', 'ott', 'otu', 'otw', 'otx', 'oty', 'otz', 'oua', 'oub', 'oue', 'oui', 'oum', 'oun', 'ovd', 'owi', 'owl', 'oyb', 'oyd', 'oym', 'oyy', 'ozm', 'paa', 'pab', 'pac', 'pad', 'pae', 'paf', 'pag', 'pah', 'pai', 'pak', 'pal', 'pam', 'pao', 'pap', 'paq', 'par', 'pas', 'pat', 'pau', 'pav', 'paw', 'pax', 'pay', 'paz', 'pbb', 'pbc', 'pbe', 'pbf', 'pbg', 'pbh', 'pbi', 'pbl', 'pbm', 'pbn', 'pbo', 'pbp', 'pbr', 'pbs', 'pbt', 'pbu', 'pbv', 'pby', 'pbz', 'pca', 'pcb', 'pcc', 'pcd', 'pce', 'pcf', 'pcg', 'pch', 'pci', 'pcj', 'pck', 'pcl', 'pcm', 'pcn', 'pcp', 'pcr', 'pcw', 'pda', 'pdc', 'pdi', 'pdn', 'pdo', 'pdt', 'pdu', 'pea', 'peb', 'ped', 'pee', 'pef', 'peg', 'peh', 'pei', 'pej', 'pek', 'pel', 'pem', 'peo', 'pep', 'peq', 'pes', 'pev', 'pex', 'pey', 'pez', 'pfa', 'pfe', 'pfl', 'pga', 'pgd', 'pgg', 'pgi', 'pgk', 'pgl', 'pgn', 'pgs', 'pgu', 'pgy', 'pgz', 'pha', 'phd', 'phg', 'phh', 'phi', 'phk', 'phl', 'phm', 'phn', 'pho', 'phq', 'phr', 'pht', 'phu', 'phv', 'phw', 'pia', 'pib', 'pic', 'pid', 'pie', 'pif', 'pig', 'pih', 'pii', 'pij', 'pil', 'pim', 'pin', 'pio', 'pip', 'pir', 'pis', 'pit', 'piu', 'piv', 'piw', 'pix', 'piy', 'piz', 'pjt', 'pka', 'pkb', 'pkc', 'pkg', 'pkh', 'pkn', 'pko', 'pkp', 'pkr', 'pks', 'pkt', 'pku', 'pla', 'plb', 'plc', 'pld', 'ple', 'plf', 'plg', 'plh', 'plj', 'plk', 'pll', 'pln', 'plo', 'plp', 'plq', 'plr', 'pls', 'plt', 'plu', 'plv', 'plw', 'ply', 'plz', 'pma', 'pmb', 'pmc', 'pmd', 'pme', 'pmf', 'pmh', 'pmi', 'pmj', 'pmk', 'pml', 'pmm', 'pmn', 'pmo', 'pmq', 'pmr', 'pms', 'pmt', 'pmu', 'pmw', 'pmx', 'pmy', 'pmz', 'pna', 'pnb', 'pnc', 'pne', 'png', 'pnh', 'pni', 'pnj', 'pnk', 'pnl', 'pnm', 'pnn', 'pno', 'pnp', 'pnq', 'pnr', 'pns', 'pnt', 'pnu', 'pnv', 'pnw', 'pnx', 'pny', 'pnz', 'poc', 'pod', 'poe', 'pof', 'pog', 'poh', 'poi', 'pok', 'pom', 'pon', 'poo', 'pop', 'poq', 'pos', 'pot', 'pov', 'pow', 'pox', 'poy', 'poz', 'ppa', 'ppe', 'ppi', 'ppk', 'ppl', 'ppm', 'ppn', 'ppo', 'ppp', 'ppq', 'ppr', 'pps', 'ppt', 'ppu', 'pqa', 'pqe', 'pqm', 'pqw', 'pra', 'prb', 'prc', 'prd', 'pre', 'prf', 'prg', 'prh', 'pri', 'prk', 'prl', 'prm', 'prn', 'pro', 'prp', 'prq', 'prr', 'prs', 'prt', 'pru', 'prw', 'prx', 'pry', 'prz', 'psa', 'psc', 'psd', 'pse', 'psg', 'psh', 'psi', 'psl', 'psm', 'psn', 'pso', 'psp', 'psq', 'psr', 'pss', 'pst', 'psu', 'psw', 'psy', 'pta', 'pth', 'pti', 'ptn', 'pto', 'ptp', 'ptq', 'ptr', 'ptt', 'ptu', 'ptv', 'ptw', 'pty', 'pua', 'pub', 'puc', 'pud', 'pue', 'puf', 'pug', 'pui', 'puj', 'puk', 'pum', 'puo', 'pup', 'puq', 'pur', 'put', 'puu', 'puw', 'pux', 'puy', 'puz', 'pwa', 'pwb', 'pwg', 'pwi', 'pwm', 'pwn', 'pwo', 'pwr', 'pww', 'pxm', 'pye', 'pym', 'pyn', 'pys', 'pyu', 'pyx', 'pyy', 'pzn', 'qaa..qtz', 'qua', 'qub', 'quc', 'qud', 'quf', 'qug', 'quh', 'qui', 'quk', 'qul', 'qum', 'qun', 'qup', 'quq', 'qur', 'qus', 'quv', 'quw', 'qux', 'quy', 'quz', 'qva', 'qvc', 'qve', 'qvh', 'qvi', 'qvj', 'qvl', 'qvm', 'qvn', 'qvo', 'qvp', 'qvs', 'qvw', 'qvy', 'qvz', 'qwa', 'qwc', 'qwe', 'qwh', 'qwm', 'qws', 'qwt', 'qxa', 'qxc', 'qxh', 'qxl', 'qxn', 'qxo', 'qxp', 'qxq', 'qxr', 'qxs', 'qxt', 'qxu', 'qxw', 'qya', 'qyp', 'raa', 'rab', 'rac', 'rad', 'raf', 'rag', 'rah', 'rai', 'raj', 'rak', 'ral', 'ram', 'ran', 'rao', 'rap', 'raq', 'rar', 'ras', 'rat', 'rau', 'rav', 'raw', 'rax', 'ray', 'raz', 'rbb', 'rbk', 'rbl', 'rbp', 'rcf', 'rdb', 'rea', 'reb', 'ree', 'reg', 'rei', 'rej', 'rel', 'rem', 'ren', 'rer', 'res', 'ret', 'rey', 'rga', 'rge', 'rgk', 'rgn', 'rgr', 'rgs', 'rgu', 'rhg', 'rhp', 'ria', 'rie', 'rif', 'ril', 'rim', 'rin', 'rir', 'rit', 'riu', 'rjg', 'rji', 'rjs', 'rka', 'rkb', 'rkh', 'rki', 'rkm', 'rkt', 'rkw', 'rma', 'rmb', 'rmc', 'rmd', 'rme', 'rmf', 'rmg', 'rmh', 'rmi', 'rmk', 'rml', 'rmm', 'rmn', 'rmo', 'rmp', 'rmq', 'rmr', 'rms', 'rmt', 'rmu', 'rmv', 'rmw', 'rmx', 'rmy', 'rmz', 'rna', 'rnd', 'rng', 'rnl', 'rnn', 'rnp', 'rnr', 'rnw', 'roa', 'rob', 'roc', 'rod', 'roe', 'rof', 'rog', 'rol', 'rom', 'roo', 'rop', 'ror', 'rou', 'row', 'rpn', 'rpt', 'rri', 'rro', 'rrt', 'rsb', 'rsi', 'rsl', 'rsm', 'rtc', 'rth', 'rtm', 'rts', 'rtw', 'rub', 'ruc', 'rue', 'ruf', 'rug', 'ruh', 'rui', 'ruk', 'ruo', 'rup', 'ruq', 'rut', 'ruu', 'ruy', 'ruz', 'rwa', 'rwk', 'rwm', 'rwo', 'rwr', 'rxd', 'rxw', 'ryn', 'rys', 'ryu', 'rzh', 'saa', 'sab', 'sac', 'sad', 'sae', 'saf', 'sah', 'sai', 'saj', 'sak', 'sal', 'sam', 'sao', 'sap', 'saq', 'sar', 'sas', 'sat', 'sau', 'sav', 'saw', 'sax', 'say', 'saz', 'sba', 'sbb', 'sbc', 'sbd', 'sbe', 'sbf', 'sbg', 'sbh', 'sbi', 'sbj', 'sbk', 'sbl', 'sbm', 'sbn', 'sbo', 'sbp', 'sbq', 'sbr', 'sbs', 'sbt', 'sbu', 'sbv', 'sbw', 'sbx', 'sby', 'sbz', 'sca', 'scb', 'sce', 'scf', 'scg', 'sch', 'sci', 'sck', 'scl', 'scn', 'sco', 'scp', 'scq', 'scs', 'sct', 'scu', 'scv', 'scw', 'scx', 'sda', 'sdb', 'sdc', 'sde', 'sdf', 'sdg', 'sdh', 'sdj', 'sdk', 'sdl', 'sdm', 'sdn', 'sdo', 'sdp', 'sdr', 'sds', 'sdt', 'sdu', 'sdv', 'sdx', 'sdz', 'sea', 'seb', 'sec', 'sed', 'see', 'sef', 'seg', 'seh', 'sei', 'sej', 'sek', 'sel', 'sem', 'sen', 'seo', 'sep', 'seq', 'ser', 'ses', 'set', 'seu', 'sev', 'sew', 'sey', 'sez', 'sfb', 'sfe', 'sfm', 'sfs', 'sfw', 'sga', 'sgb', 'sgc', 'sgd', 'sge', 'sgg', 'sgh', 'sgi', 'sgj', 'sgk', 'sgl', 'sgm', 'sgn', 'sgo', 'sgp', 'sgr', 'sgs', 'sgt', 'sgu', 'sgw', 'sgx', 'sgy', 'sgz', 'sha', 'shb', 'shc', 'shd', 'she', 'shg', 'shh', 'shi', 'shj', 'shk', 'shl', 'shm', 'shn', 'sho', 'shp', 'shq', 'shr', 'shs', 'sht', 'shu', 'shv', 'shw', 'shx', 'shy', 'shz', 'sia', 'sib', 'sid', 'sie', 'sif', 'sig', 'sih', 'sii', 'sij', 'sik', 'sil', 'sim', 'sio', 'sip', 'siq', 'sir', 'sis', 'sit', 'siu', 'siv', 'siw', 'six', 'siy', 'siz', 'sja', 'sjb', 'sjd', 'sje', 'sjg', 'sjk', 'sjl', 'sjm', 'sjn', 'sjo', 'sjp', 'sjr', 'sjs', 'sjt', 'sju', 'sjw', 'ska', 'skb', 'skc', 'skd', 'ske', 'skf', 'skg', 'skh', 'ski', 'skj', 'skk', 'skm', 'skn', 'sko', 'skp', 'skq', 'skr', 'sks', 'skt', 'sku', 'skv', 'skw', 'skx', 'sky', 'skz', 'sla', 'slc', 'sld', 'sle', 'slf', 'slg', 'slh', 'sli', 'slj', 'sll', 'slm', 'sln', 'slp', 'slq', 'slr', 'sls', 'slt', 'slu', 'slw', 'slx', 'sly', 'slz', 'sma', 'smb', 'smc', 'smd', 'smf', 'smg', 'smh', 'smi', 'smj', 'smk', 'sml', 'smm', 'smn', 'smp', 'smq', 'smr', 'sms', 'smt', 'smu', 'smv', 'smw', 'smx', 'smy', 'smz', 'snb', 'snc', 'sne', 'snf', 'sng', 'snh', 'sni', 'snj', 'snk', 'snl', 'snm', 'snn', 'sno', 'snp', 'snq', 'snr', 'sns', 'snu', 'snv', 'snw', 'snx', 'sny', 'snz', 'soa', 'sob', 'soc', 'sod', 'soe', 'sog', 'soh', 'soi', 'soj', 'sok', 'sol', 'son', 'soo', 'sop', 'soq', 'sor', 'sos', 'sou', 'sov', 'sow', 'sox', 'soy', 'soz', 'spb', 'spc', 'spd', 'spe', 'spg', 'spi', 'spk', 'spl', 'spm', 'spn', 'spo', 'spp', 'spq', 'spr', 'sps', 'spt', 'spu', 'spv', 'spx', 'spy', 'sqa', 'sqh', 'sqj', 'sqk', 'sqm', 'sqn', 'sqo', 'sqq', 'sqr', 'sqs', 'sqt', 'squ', 'sra', 'srb', 'src', 'sre', 'srf', 'srg', 'srh', 'sri', 'srk', 'srl', 'srm', 'srn', 'sro', 'srq', 'srr', 'srs', 'srt', 'sru', 'srv', 'srw', 'srx', 'sry', 'srz', 'ssa', 'ssb', 'ssc', 'ssd', 'sse', 'ssf', 'ssg', 'ssh', 'ssi', 'ssj', 'ssk', 'ssl', 'ssm', 'ssn', 'sso', 'ssp', 'ssq', 'ssr', 'sss', 'sst', 'ssu', 'ssv', 'ssx', 'ssy', 'ssz', 'sta', 'stb', 'std', 'ste', 'stf', 'stg', 'sth', 'sti', 'stj', 'stk', 'stl', 'stm', 'stn', 'sto', 'stp', 'stq', 'str', 'sts', 'stt', 'stu', 'stv', 'stw', 'sty', 'sua', 'sub', 'suc', 'sue', 'sug', 'sui', 'suj', 'suk', 'sul', 'sum', 'suq', 'sur', 'sus', 'sut', 'suv', 'suw', 'sux', 'suy', 'suz', 'sva', 'svb', 'svc', 'sve', 'svk', 'svm', 'svr', 'svs', 'svx', 'swb', 'swc', 'swf', 'swg', 'swh', 'swi', 'swj', 'swk', 'swl', 'swm', 'swn', 'swo', 'swp', 'swq', 'swr', 'sws', 'swt', 'swu', 'swv', 'sww', 'swx', 'swy', 'sxb', 'sxc', 'sxe', 'sxg', 'sxk', 'sxl', 'sxm', 'sxn', 'sxo', 'sxr', 'sxs', 'sxu', 'sxw', 'sya', 'syb', 'syc', 'syd', 'syi', 'syk', 'syl', 'sym', 'syn', 'syo', 'syr', 'sys', 'syw', 'syx', 'syy', 'sza', 'szb', 'szc', 'szd', 'sze', 'szg', 'szl', 'szn', 'szp', 'szs', 'szv', 'szw', 'taa', 'tab', 'tac', 'tad', 'tae', 'taf', 'tag', 'tai', 'taj', 'tak', 'tal', 'tan', 'tao', 'tap', 'taq', 'tar', 'tas', 'tau', 'tav', 'taw', 'tax', 'tay', 'taz', 'tba', 'tbb', 'tbc', 'tbd', 'tbe', 'tbf', 'tbg', 'tbh', 'tbi', 'tbj', 'tbk', 'tbl', 'tbm', 'tbn', 'tbo', 'tbp', 'tbq', 'tbr', 'tbs', 'tbt', 'tbu', 'tbv', 'tbw', 'tbx', 'tby', 'tbz', 'tca', 'tcb', 'tcc', 'tcd', 'tce', 'tcf', 'tcg', 'tch', 'tci', 'tck', 'tcl', 'tcm', 'tcn', 'tco', 'tcp', 'tcq', 'tcs', 'tct', 'tcu', 'tcw', 'tcx', 'tcy', 'tcz', 'tda', 'tdb', 'tdc', 'tdd', 'tde', 'tdf', 'tdg', 'tdh', 'tdi', 'tdj', 'tdk', 'tdl', 'tdm', 'tdn', 'tdo', 'tdq', 'tdr', 'tds', 'tdt', 'tdu', 'tdv', 'tdx', 'tdy', 'tea', 'teb', 'tec', 'ted', 'tee', 'tef', 'teg', 'teh', 'tei', 'tek', 'tem', 'ten', 'teo', 'tep', 'teq', 'ter', 'tes', 'tet', 'teu', 'tev', 'tew', 'tex', 'tey', 'tez', 'tfi', 'tfn', 'tfo', 'tfr', 'tft', 'tga', 'tgb', 'tgc', 'tgd', 'tge', 'tgf', 'tgg', 'tgh', 'tgi', 'tgj', 'tgn', 'tgo', 'tgp', 'tgq', 'tgr', 'tgs', 'tgt', 'tgu', 'tgv', 'tgw', 'tgx', 'tgy', 'tgz', 'thc', 'thd', 'the', 'thf', 'thh', 'thi', 'thk', 'thl', 'thm', 'thn', 'thp', 'thq', 'thr', 'ths', 'tht', 'thu', 'thv', 'thw', 'thx', 'thy', 'thz', 'tia', 'tic', 'tid', 'tie', 'tif', 'tig', 'tih', 'tii', 'tij', 'tik', 'til', 'tim', 'tin', 'tio', 'tip', 'tiq', 'tis', 'tit', 'tiu', 'tiv', 'tiw', 'tix', 'tiy', 'tiz', 'tja', 'tjg', 'tji', 'tjl', 'tjm', 'tjn', 'tjo', 'tjs', 'tju', 'tjw', 'tka', 'tkb', 'tkd', 'tke', 'tkf', 'tkg', 'tkk', 'tkl', 'tkm', 'tkn', 'tkp', 'tkq', 'tkr', 'tks', 'tkt', 'tku', 'tkv', 'tkw', 'tkx', 'tkz', 'tla', 'tlb', 'tlc', 'tld', 'tlf', 'tlg', 'tlh', 'tli', 'tlj', 'tlk', 'tll', 'tlm', 'tln', 'tlo', 'tlp', 'tlq', 'tlr', 'tls', 'tlt', 'tlu', 'tlv', 'tlw', 'tlx', 'tly', 'tma', 'tmb', 'tmc', 'tmd', 'tme', 'tmf', 'tmg', 'tmh', 'tmi', 'tmj', 'tmk', 'tml', 'tmm', 'tmn', 'tmo', 'tmp', 'tmq', 'tmr', 'tms', 'tmt', 'tmu', 'tmv', 'tmw', 'tmy', 'tmz', 'tna', 'tnb', 'tnc', 'tnd', 'tne', 'tnf', 'tng', 'tnh', 'tni', 'tnk', 'tnl', 'tnm', 'tnn', 'tno', 'tnp', 'tnq', 'tnr', 'tns', 'tnt', 'tnu', 'tnv', 'tnw', 'tnx', 'tny', 'tnz', 'tob', 'toc', 'tod', 'toe', 'tof', 'tog', 'toh', 'toi', 'toj', 'tol', 'tom', 'too', 'top', 'toq', 'tor', 'tos', 'tou', 'tov', 'tow', 'tox', 'toy', 'toz', 'tpa', 'tpc', 'tpe', 'tpf', 'tpg', 'tpi', 'tpj', 'tpk', 'tpl', 'tpm', 'tpn', 'tpo', 'tpp', 'tpq', 'tpr', 'tpt', 'tpu', 'tpv', 'tpw', 'tpx', 'tpy', 'tpz', 'tqb', 'tql', 'tqm', 'tqn', 'tqo', 'tqp', 'tqq', 'tqr', 'tqt', 'tqu', 'tqw', 'tra', 'trb', 'trc', 'trd', 'tre', 'trf', 'trg', 'trh', 'tri', 'trj', 'trk', 'trl', 'trm', 'trn', 'tro', 'trp', 'trq', 'trr', 'trs', 'trt', 'tru', 'trv', 'trw', 'trx', 'try', 'trz', 'tsa', 'tsb', 'tsc', 'tsd', 'tse', 'tsf', 'tsg', 'tsh', 'tsi', 'tsj', 'tsk', 'tsl', 'tsm', 'tsp', 'tsq', 'tsr', 'tss', 'tst', 'tsu', 'tsv', 'tsw', 'tsx', 'tsy', 'tsz', 'tta', 'ttb', 'ttc', 'ttd', 'tte', 'ttf', 'ttg', 'tth', 'tti', 'ttj', 'ttk', 'ttl', 'ttm', 'ttn', 'tto', 'ttp', 'ttq', 'ttr', 'tts', 'ttt', 'ttu', 'ttv', 'ttw', 'tty', 'ttz', 'tua', 'tub', 'tuc', 'tud', 'tue', 'tuf', 'tug', 'tuh', 'tui', 'tuj', 'tul', 'tum', 'tun', 'tuo', 'tup', 'tuq', 'tus', 'tut', 'tuu', 'tuv', 'tuw', 'tux', 'tuy', 'tuz', 'tva', 'tvd', 'tve', 'tvk', 'tvl', 'tvm', 'tvn', 'tvo', 'tvs', 'tvt', 'tvu', 'tvw', 'tvy', 'twa', 'twb', 'twc', 'twd', 'twe', 'twf', 'twg', 'twh', 'twl', 'twm', 'twn', 'two', 'twp', 'twq', 'twr', 'twt', 'twu', 'tww', 'twx', 'twy', 'txa', 'txb', 'txc', 'txe', 'txg', 'txh', 'txi', 'txj', 'txm', 'txn', 'txo', 'txq', 'txr', 'txs', 'txt', 'txu', 'txx', 'txy', 'tya', 'tye', 'tyh', 'tyi', 'tyj', 'tyl', 'tyn', 'typ', 'tyr', 'tys', 'tyt', 'tyu', 'tyv', 'tyx', 'tyz', 'tza', 'tzh', 'tzj', 'tzl', 'tzm', 'tzn', 'tzo', 'tzx', 'uam', 'uan', 'uar', 'uba', 'ubi', 'ubl', 'ubr', 'ubu', 'uby', 'uda', 'ude', 'udg', 'udi', 'udj', 'udl', 'udm', 'udu', 'ues', 'ufi', 'uga', 'ugb', 'uge', 'ugn', 'ugo', 'ugy', 'uha', 'uhn', 'uis', 'uiv', 'uji', 'uka', 'ukg', 'ukh', 'ukk', 'ukl', 'ukp', 'ukq', 'uks', 'uku', 'ukw', 'uky', 'ula', 'ulb', 'ulc', 'ule', 'ulf', 'uli', 'ulk', 'ull', 'ulm', 'uln', 'ulu', 'ulw', 'uma', 'umb', 'umc', 'umd', 'umg', 'umi', 'umm', 'umn', 'umo', 'ump', 'umr', 'ums', 'umu', 'una', 'und', 'une', 'ung', 'unk', 'unm', 'unn', 'unp', 'unr', 'unu', 'unx', 'unz', 'uok', 'upi', 'upv', 'ura', 'urb', 'urc', 'ure', 'urf', 'urg', 'urh', 'uri', 'urj', 'urk', 'url', 'urm', 'urn', 'uro', 'urp', 'urr', 'urt', 'uru', 'urv', 'urw', 'urx', 'ury', 'urz', 'usa', 'ush', 'usi', 'usk', 'usp', 'usu', 'uta', 'ute', 'utp', 'utr', 'utu', 'uum', 'uun', 'uur', 'uuu', 'uve', 'uvh', 'uvl', 'uwa', 'uya', 'uzn', 'uzs', 'vaa', 'vae', 'vaf', 'vag', 'vah', 'vai', 'vaj', 'val', 'vam', 'van', 'vao', 'vap', 'var', 'vas', 'vau', 'vav', 'vay', 'vbb', 'vbk', 'vec', 'ved', 'vel', 'vem', 'veo', 'vep', 'ver', 'vgr', 'vgt', 'vic', 'vid', 'vif', 'vig', 'vil', 'vin', 'vis', 'vit', 'viv', 'vka', 'vki', 'vkj', 'vkk', 'vkl', 'vkm', 'vko', 'vkp', 'vkt', 'vku', 'vlp', 'vls', 'vma', 'vmb', 'vmc', 'vmd', 'vme', 'vmf', 'vmg', 'vmh', 'vmi', 'vmj', 'vmk', 'vml', 'vmm', 'vmp', 'vmq', 'vmr', 'vms', 'vmu', 'vmv', 'vmw', 'vmx', 'vmy', 'vmz', 'vnk', 'vnm', 'vnp', 'vor', 'vot', 'vra', 'vro', 'vrs', 'vrt', 'vsi', 'vsl', 'vsv', 'vto', 'vum', 'vun', 'vut', 'vwa', 'waa', 'wab', 'wac', 'wad', 'wae', 'waf', 'wag', 'wah', 'wai', 'waj', 'wak', 'wal', 'wam', 'wan', 'wao', 'wap', 'waq', 'war', 'was', 'wat', 'wau', 'wav', 'waw', 'wax', 'way', 'waz', 'wba', 'wbb', 'wbe', 'wbf', 'wbh', 'wbi', 'wbj', 'wbk', 'wbl', 'wbm', 'wbp', 'wbq', 'wbr', 'wbs', 'wbt', 'wbv', 'wbw', 'wca', 'wci', 'wdd', 'wdg', 'wdj', 'wdk', 'wdu', 'wdy', 'wea', 'wec', 'wed', 'weg', 'weh', 'wei', 'wem', 'wen', 'weo', 'wep', 'wer', 'wes', 'wet', 'weu', 'wew', 'wfg', 'wga', 'wgb', 'wgg', 'wgi', 'wgo', 'wgu', 'wgw', 'wgy', 'wha', 'whg', 'whk', 'whu', 'wib', 'wic', 'wie', 'wif', 'wig', 'wih', 'wii', 'wij', 'wik', 'wil', 'wim', 'win', 'wir', 'wit', 'wiu', 'wiv', 'wiw', 'wiy', 'wja', 'wji', 'wka', 'wkb', 'wkd', 'wkl', 'wku', 'wkw', 'wky', 'wla', 'wlc', 'wle', 'wlg', 'wli', 'wlk', 'wll', 'wlm', 'wlo', 'wlr', 'wls', 'wlu', 'wlv', 'wlw', 'wlx', 'wly', 'wma', 'wmb', 'wmc', 'wmd', 'wme', 'wmh', 'wmi', 'wmm', 'wmn', 'wmo', 'wms', 'wmt', 'wmw', 'wmx', 'wnb', 'wnc', 'wnd', 'wne', 'wng', 'wni', 'wnk', 'wnm', 'wnn', 'wno', 'wnp', 'wnu', 'wnw', 'wny', 'woa', 'wob', 'woc', 'wod', 'woe', 'wof', 'wog', 'woi', 'wok', 'wom', 'won', 'woo', 'wor', 'wos', 'wow', 'woy', 'wpc', 'wra', 'wrb', 'wrd', 'wrg', 'wrh', 'wri', 'wrk', 'wrl', 'wrm', 'wrn', 'wro', 'wrp', 'wrr', 'wrs', 'wru', 'wrv', 'wrw', 'wrx', 'wry', 'wrz', 'wsa', 'wsg', 'wsi', 'wsk', 'wsr', 'wss', 'wsu', 'wsv', 'wtf', 'wth', 'wti', 'wtk', 'wtm', 'wtw', 'wua', 'wub', 'wud', 'wuh', 'wul', 'wum', 'wun', 'wur', 'wut', 'wuu', 'wuv', 'wux', 'wuy', 'wwa', 'wwb', 'wwo', 'wwr', 'www', 'wxa', 'wxw', 'wya', 'wyb', 'wyi', 'wym', 'wyr', 'wyy', 'xaa', 'xab', 'xac', 'xad', 'xae', 'xag', 'xai', 'xaj', 'xak', 'xal', 'xam', 'xan', 'xao', 'xap', 'xaq', 'xar', 'xas', 'xat', 'xau', 'xav', 'xaw', 'xay', 'xba', 'xbb', 'xbc', 'xbd', 'xbe', 'xbg', 'xbi', 'xbj', 'xbm', 'xbn', 'xbo', 'xbp', 'xbr', 'xbw', 'xbx', 'xby', 'xcb', 'xcc', 'xce', 'xcg', 'xch', 'xcl', 'xcm', 'xcn', 'xco', 'xcr', 'xct', 'xcu', 'xcv', 'xcw', 'xcy', 'xda', 'xdc', 'xdk', 'xdm', 'xdo', 'xdy', 'xeb', 'xed', 'xeg', 'xel', 'xem', 'xep', 'xer', 'xes', 'xet', 'xeu', 'xfa', 'xga', 'xgb', 'xgd', 'xgf', 'xgg', 'xgi', 'xgl', 'xgm', 'xgn', 'xgr', 'xgu', 'xgw', 'xha', 'xhc', 'xhd', 'xhe', 'xhr', 'xht', 'xhu', 'xhv', 'xia', 'xib', 'xii', 'xil', 'xin', 'xip', 'xir', 'xis', 'xiv', 'xiy', 'xjb', 'xjt', 'xka', 'xkb', 'xkc', 'xkd', 'xke', 'xkf', 'xkg', 'xkh', 'xki', 'xkj', 'xkk', 'xkl', 'xkn', 'xko', 'xkp', 'xkq', 'xkr', 'xks', 'xkt', 'xku', 'xkv', 'xkw', 'xkx', 'xky', 'xkz', 'xla', 'xlb', 'xlc', 'xld', 'xle', 'xlg', 'xli', 'xln', 'xlo', 'xlp', 'xls', 'xlu', 'xly', 'xma', 'xmb', 'xmc', 'xmd', 'xme', 'xmf', 'xmg', 'xmh', 'xmj', 'xmk', 'xml', 'xmm', 'xmn', 'xmo', 'xmp', 'xmq', 'xmr', 'xms', 'xmt', 'xmu', 'xmv', 'xmw', 'xmx', 'xmy', 'xmz', 'xna', 'xnb', 'xnd', 'xng', 'xnh', 'xni', 'xnk', 'xnn', 'xno', 'xnr', 'xns', 'xnt', 'xnu', 'xny', 'xnz', 'xoc', 'xod', 'xog', 'xoi', 'xok', 'xom', 'xon', 'xoo', 'xop', 'xor', 'xow', 'xpa', 'xpc', 'xpe', 'xpg', 'xpi', 'xpj', 'xpk', 'xpm', 'xpn', 'xpo', 'xpp', 'xpq', 'xpr', 'xps', 'xpt', 'xpu', 'xpy', 'xqa', 'xqt', 'xra', 'xrb', 'xrd', 'xre', 'xrg', 'xri', 'xrm', 'xrn', 'xrq', 'xrr', 'xrt', 'xru', 'xrw', 'xsa', 'xsb', 'xsc', 'xsd', 'xse', 'xsh', 'xsi', 'xsj', 'xsl', 'xsm', 'xsn', 'xso', 'xsp', 'xsq', 'xsr', 'xss', 'xsu', 'xsv', 'xsy', 'xta', 'xtb', 'xtc', 'xtd', 'xte', 'xtg', 'xth', 'xti', 'xtj', 'xtl', 'xtm', 'xtn', 'xto', 'xtp', 'xtq', 'xtr', 'xts', 'xtt', 'xtu', 'xtv', 'xtw', 'xty', 'xtz', 'xua', 'xub', 'xud', 'xug', 'xuj', 'xul', 'xum', 'xun', 'xuo', 'xup', 'xur', 'xut', 'xuu', 'xve', 'xvi', 'xvn', 'xvo', 'xvs', 'xwa', 'xwc', 'xwd', 'xwe', 'xwg', 'xwj', 'xwk', 'xwl', 'xwo', 'xwr', 'xwt', 'xww', 'xxb', 'xxk', 'xxm', 'xxr', 'xxt', 'xya', 'xyb', 'xyj', 'xyk', 'xyl', 'xyt', 'xyy', 'xzh', 'xzm', 'xzp', 'yaa', 'yab', 'yac', 'yad', 'yae', 'yaf', 'yag', 'yah', 'yai', 'yaj', 'yak', 'yal', 'yam', 'yan', 'yao', 'yap', 'yaq', 'yar', 'yas', 'yat', 'yau', 'yav', 'yaw', 'yax', 'yay', 'yaz', 'yba', 'ybb', 'ybd', 'ybe', 'ybh', 'ybi', 'ybj', 'ybk', 'ybl', 'ybm', 'ybn', 'ybo', 'ybx', 'yby', 'ych', 'ycl', 'ycn', 'ycp', 'yda', 'ydd', 'yde', 'ydg', 'ydk', 'yds', 'yea', 'yec', 'yee', 'yei', 'yej', 'yel', 'yen', 'yer', 'yes', 'yet', 'yeu', 'yev', 'yey', 'yga', 'ygi', 'ygl', 'ygm', 'ygp', 'ygr', 'ygs', 'ygu', 'ygw', 'yha', 'yhd', 'yhl', 'yhs', 'yia', 'yif', 'yig', 'yih', 'yii', 'yij', 'yik', 'yil', 'yim', 'yin', 'yip', 'yiq', 'yir', 'yis', 'yit', 'yiu', 'yiv', 'yix', 'yiy', 'yiz', 'yka', 'ykg', 'yki', 'ykk', 'ykl', 'ykm', 'ykn', 'yko', 'ykr', 'ykt', 'yku', 'yky', 'yla', 'ylb', 'yle', 'ylg', 'yli', 'yll', 'ylm', 'yln', 'ylo', 'ylr', 'ylu', 'yly', 'yma', 'ymb', 'ymc', 'ymd', 'yme', 'ymg', 'ymh', 'ymi', 'ymk', 'yml', 'ymm', 'ymn', 'ymo', 'ymp', 'ymq', 'ymr', 'yms', 'ymt', 'ymx', 'ymz', 'yna', 'ynd', 'yne', 'yng', 'ynh', 'ynk', 'ynl', 'ynn', 'yno', 'ynq', 'yns', 'ynu', 'yob', 'yog', 'yoi', 'yok', 'yol', 'yom', 'yon', 'yos', 'yot', 'yox', 'yoy', 'ypa', 'ypb', 'ypg', 'yph', 'ypk', 'ypm', 'ypn', 'ypo', 'ypp', 'ypz', 'yra', 'yrb', 'yre', 'yri', 'yrk', 'yrl', 'yrm', 'yrn', 'yro', 'yrs', 'yrw', 'yry', 'ysc', 'ysd', 'ysg', 'ysl', 'ysn', 'yso', 'ysp', 'ysr', 'yss', 'ysy', 'yta', 'ytl', 'ytp', 'ytw', 'yty', 'yua', 'yub', 'yuc', 'yud', 'yue', 'yuf', 'yug', 'yui', 'yuj', 'yuk', 'yul', 'yum', 'yun', 'yup', 'yuq', 'yur', 'yut', 'yuu', 'yuw', 'yux', 'yuy', 'yuz', 'yva', 'yvt', 'ywa', 'ywg', 'ywl', 'ywn', 'ywq', 'ywr', 'ywt', 'ywu', 'yww', 'yxa', 'yxg', 'yxl', 'yxm', 'yxu', 'yxy', 'yyr', 'yyu', 'yyz', 'yzg', 'yzk', 'zaa', 'zab', 'zac', 'zad', 'zae', 'zaf', 'zag', 'zah', 'zai', 'zaj', 'zak', 'zal', 'zam', 'zao', 'zap', 'zaq', 'zar', 'zas', 'zat', 'zau', 'zav', 'zaw', 'zax', 'zay', 'zaz', 'zbc', 'zbe', 'zbl', 'zbt', 'zbw', 'zca', 'zch', 'zdj', 'zea', 'zeg', 'zeh', 'zen', 'zga', 'zgb', 'zgh', 'zgm', 'zgn', 'zgr', 'zhb', 'zhd', 'zhi', 'zhn', 'zhw', 'zhx', 'zia', 'zib', 'zik', 'zil', 'zim', 'zin', 'zir', 'ziw', 'ziz', 'zka', 'zkb', 'zkd', 'zkg', 'zkh', 'zkk', 'zkn', 'zko', 'zkp', 'zkr', 'zkt', 'zku', 'zkv', 'zkz', 'zle', 'zlj', 'zlm', 'zln', 'zlq', 'zls', 'zlw', 'zma', 'zmb', 'zmc', 'zmd', 'zme', 'zmf', 'zmg', 'zmh', 'zmi', 'zmj', 'zmk', 'zml', 'zmm', 'zmn', 'zmo', 'zmp', 'zmq', 'zmr', 'zms', 'zmt', 'zmu', 'zmv', 'zmw', 'zmx', 'zmy', 'zmz', 'zna', 'znd', 'zne', 'zng', 'znk', 'zns', 'zoc', 'zoh', 'zom', 'zoo', 'zoq', 'zor', 'zos', 'zpa', 'zpb', 'zpc', 'zpd', 'zpe', 'zpf', 'zpg', 'zph', 'zpi', 'zpj', 'zpk', 'zpl', 'zpm', 'zpn', 'zpo', 'zpp', 'zpq', 'zpr', 'zps', 'zpt', 'zpu', 'zpv', 'zpw', 'zpx', 'zpy', 'zpz', 'zqe', 'zra', 'zrg', 'zrn', 'zro', 'zrp', 'zrs', 'zsa', 'zsk', 'zsl', 'zsm', 'zsr', 'zsu', 'zte', 'ztg', 'ztl', 'ztm', 'ztn', 'ztp', 'ztq', 'zts', 'ztt', 'ztu', 'ztx', 'zty', 'zua', 'zuh', 'zum', 'zun', 'zuy', 'zwa', 'zxx', 'zyb', 'zyg', 'zyj', 'zyn', 'zyp', 'zza', 'zzj' ];
14266 16306       axe.utils.validLangs = function() {
14267 16307         'use strict';
14268 16308         return langs;
@@ -14272,7 +16312,7 @@ module.exports = {
14272 16312   });
14273 16313 })(typeof window === 'object' ? window : this);
14274 16314 },{}],13:[function(require,module,exports){
14275    -1 var currentVersion = '2.11';
   -1 16315 var currentVersion = '2.13';
14276 16316 
14277 16317 /*!
14278 16318 CalcNames: The AccName Computation Prototype, compute the Name and Description property values for a DOM node
@@ -14364,6 +16404,17 @@ var calcNames = function(node, fnc, preventVisualARIASelfCSSRef) {
14364 16404 			after: ''
14365 16405 		};
14366 16406 
   -1 16407 		if (ownedBy.ref) {
   -1 16408 			if (isParentHidden(refNode, document.body, true, true)) {
   -1 16409 				// If referenced via aria-labelledby or aria-describedby, do not return a name or description if a parent node is hidden.
   -1 16410 				return fullResult;
   -1 16411 			}
   -1 16412 			else if (isHidden(refNode, document.body)) {
   -1 16413 				// Otherwise, if aria-labelledby or aria-describedby reference a node that is explicitly hidden, then process all children regardless of their individual hidden states.
   -1 16414 				var ignoreHidden = true;
   -1 16415 			}
   -1 16416 		}
   -1 16417 
14367 16418 		if (nodes.indexOf(refNode) === -1) {
14368 16419 			// Store the before and after pseudo element 'content' values for the top level DOM node
14369 16420 			// Note: If the pseudo element includes block level styling, a space will be added, otherwise inline is asumed and no spacing is added.
@@ -14398,16 +16449,16 @@ var calcNames = function(node, fnc, preventVisualARIASelfCSSRef) {
14398 16449 				}
14399 16450 			}
14400 16451 			res.name += fResult.owns || '';
14401    -1 			if (nodeIsBlock) {
14402    -1 				res.name = ' ' + res.name + ' ';
14403    -1 			}
14404 16452 			if (!trim(res.name) && trim(fResult.title)) {
14405    -1 				res.name = fResult.title;
   -1 16453 				res.name = addSpacing(fResult.title);
14406 16454 			} else {
14407    -1 				res.title = fResult.title;
   -1 16455 				res.title = addSpacing(fResult.title);
14408 16456 			}
14409 16457 			if (trim(fResult.desc)) {
14410    -1 				res.title = fResult.desc;
   -1 16458 				res.title = addSpacing(fResult.desc);
   -1 16459 			}
   -1 16460 			if (nodeIsBlock || fResult.isWidget) {
   -1 16461 				res.name = addSpacing(res.name);
14411 16462 			}
14412 16463 			return res;
14413 16464 		};
@@ -14420,7 +16471,7 @@ var calcNames = function(node, fnc, preventVisualARIASelfCSSRef) {
14420 16471 			};
14421 16472 			var isEmbeddedNode = node && node.nodeType === 1 && nodesToIgnoreValues && nodesToIgnoreValues.length && nodesToIgnoreValues.indexOf(node) !== -1 && node === topNode && node !== refNode ? true : false;
14422 16473 
14423    -1 			if ((skip || !node || nodes.indexOf(node) !== -1 || (isHidden(node, ownedBy.top))) && !skipAbort && !isEmbeddedNode) {
   -1 16474 			if ((skip || !node || nodes.indexOf(node) !== -1 || (!ignoreHidden && isHidden(node, ownedBy.top))) && !skipAbort && !isEmbeddedNode) {
14424 16475 				// Abort if algorithm step is already completed, or if node is a hidden child of refNode, or if this node has already been processed, or skip abort if aria-labelledby self references same node.
14425 16476 				return result;
14426 16477 			}
@@ -14469,7 +16520,8 @@ var calcNames = function(node, fnc, preventVisualARIASelfCSSRef) {
14469 16520 				var isEditWidgetRole = editWidgetRoles.indexOf(nRole) !== -1;
14470 16521 				var isSelectWidgetRole = selectWidgetRoles.indexOf(nRole) !== -1;
14471 16522 				var isSimulatedFormField = isRangeWidgetRole || isEditWidgetRole || isSelectWidgetRole || nRole == 'combobox';
14472    -1 				var isWidgetRole = isSimulatedFormField || otherWidgetRoles.indexOf(nRole) !== -1;
   -1 16523 				var isWidgetRole = (isSimulatedFormField || otherWidgetRoles.indexOf(nRole) !== -1) && nRole != 'link';
   -1 16524 				result.isWidget = isNativeFormField || isWidgetRole;
14473 16525 
14474 16526 				var hasName = false;
14475 16527 				var aOwns = node.getAttribute('aria-owns') || '';
@@ -14487,7 +16539,7 @@ var calcNames = function(node, fnc, preventVisualARIASelfCSSRef) {
14487 16539 							parts.push(walk(element, true, skip, [node], element === refNode, {ref: ownedBy, top: element}).name);
14488 16540 						}
14489 16541 						// Check for blank value, since whitespace chars alone are not valid as a name
14490    -1 						name = addSpacing(trim(parts.join(' ')));
   -1 16542 						name = trim(parts.join(' '));
14491 16543 
14492 16544 						if (trim(name)) {
14493 16545 							hasName = true;
@@ -14507,7 +16559,7 @@ var calcNames = function(node, fnc, preventVisualARIASelfCSSRef) {
14507 16559 							parts.push(walk(element, true, false, [node], false, {ref: ownedBy, top: element}).name);
14508 16560 						}
14509 16561 						// Check for blank value, since whitespace chars alone are not valid as a name
14510    -1 						desc = addSpacing(trim(parts.join(' ')));
   -1 16562 						desc = trim(parts.join(' '));
14511 16563 
14512 16564 						if (trim(desc)) {
14513 16565 							result.desc = desc;
@@ -14546,7 +16598,7 @@ var calcNames = function(node, fnc, preventVisualARIASelfCSSRef) {
14546 16598 						}
14547 16599 
14548 16600 						// Check for blank value, since whitespace chars alone are not valid as a name
14549    -1 						name = addSpacing(trim(name));
   -1 16601 						name = trim(name);
14550 16602 
14551 16603 					}
14552 16604 
@@ -14556,12 +16608,9 @@ var calcNames = function(node, fnc, preventVisualARIASelfCSSRef) {
14556 16608 				}
14557 16609 
14558 16610 				// Otherwise, if current node has a non-empty aria-label then set as name and process no deeper within the branch.
14559    -1 				if (!hasName && trim(aLabel) && !isSeparatChildFormField) {
14560    -1 					if (node === refNode) {
14561    -1 						name = addSpacing(trim(aLabel));
14562    -1 					} else {
14563    -1 						name = aLabel;
14564    -1 					}
   -1 16611 					if (!hasName && trim(aLabel) && !isSeparatChildFormField) {
   -1 16612 					name = aLabel;
   -1 16613 
14565 16614 					// Check for blank value, since whitespace chars alone are not valid as a name
14566 16615 					if (trim(name)) {
14567 16616 						hasName = true;
@@ -14594,19 +16643,19 @@ var calcNames = function(node, fnc, preventVisualARIASelfCSSRef) {
14594 16643 
14595 16644 					if (implicitLabel && explicitLabel && isImplicitFirst) {
14596 16645 						// Check for blank value, since whitespace chars alone are not valid as a name
14597    -1 						name = addSpacing(trim(walk(implicitLabel, true, skip, [node], false, {ref: ownedBy, top: implicitLabel}).name)) + addSpacing(trim(walk(explicitLabel, true, skip, [node], false, {ref: ownedBy, top: explicitLabel}).name));
   -1 16646 						name = trim(walk(implicitLabel, true, skip, [node], false, {ref: ownedBy, top: implicitLabel}).name + ' ' + walk(explicitLabel, true, skip, [node], false, {ref: ownedBy, top: explicitLabel}).name);
14598 16647 					}
14599 16648 					else if (explicitLabel && implicitLabel) {
14600 16649 						// Check for blank value, since whitespace chars alone are not valid as a name
14601    -1 						name = addSpacing(trim(walk(explicitLabel, true, skip, [node], false, {ref: ownedBy, top: explicitLabel}).name)) + addSpacing(trim(walk(implicitLabel, true, skip, [node], false, {ref: ownedBy, top: implicitLabel}).name));
   -1 16650 						name = trim(walk(explicitLabel, true, skip, [node], false, {ref: ownedBy, top: explicitLabel}).name + ' ' + walk(implicitLabel, true, skip, [node], false, {ref: ownedBy, top: implicitLabel}).name);
14602 16651 					}
14603 16652 					else if (explicitLabel) {
14604 16653 						// Check for blank value, since whitespace chars alone are not valid as a name
14605    -1 						name = addSpacing(trim(walk(explicitLabel, true, skip, [node], false, {ref: ownedBy, top: explicitLabel}).name));
   -1 16654 						name = trim(walk(explicitLabel, true, skip, [node], false, {ref: ownedBy, top: explicitLabel}).name);
14606 16655 					}
14607 16656 					else if (implicitLabel) {
14608 16657 						// Check for blank value, since whitespace chars alone are not valid as a name
14609    -1 						name = addSpacing(trim(walk(implicitLabel, true, skip, [node], false, {ref: ownedBy, top: implicitLabel}).name));
   -1 16658 						name = trim(walk(implicitLabel, true, skip, [node], false, {ref: ownedBy, top: implicitLabel}).name);
14610 16659 					}
14611 16660 
14612 16661 					if (trim(name)) {
@@ -14620,16 +16669,16 @@ var calcNames = function(node, fnc, preventVisualARIASelfCSSRef) {
14620 16669 				// Otherwise, if name is still empty and current node is a standard non-presentational img or image button with a non-empty alt attribute, set alt attribute value as the accessible name.
14621 16670 				if (!hasName && !rolePresentation && (nTag == 'img' || (nTag == 'input' && node.getAttribute('type') == 'image')) && nAlt) {
14622 16671 					// Check for blank value, since whitespace chars alone are not valid as a name
14623    -1 					name = addSpacing(nAlt);
   -1 16672 					name = trim(nAlt);
14624 16673 					if (trim(name)) {
14625 16674 						hasName = true;
14626 16675 					}
14627 16676 				}
14628 16677 
14629    -1 				// Otherwise, if current node is non-presentational and includes a non-empty title attribute and is not another form field, store title attribute value as the accessible name if name is still empty, or the description if not.
   -1 16678 				// Otherwise, if current node is non-presentational and includes a non-empty title attribute and is not a separate embedded form field, store title attribute value as the accessible name if name is still empty, or the description if not.
14630 16679 				if (!rolePresentation && trim(nTitle) && !isSeparatChildFormField) {
14631 16680 					// Check for blank value, since whitespace chars alone are not valid as a name
14632    -1 					result.title = addSpacing(trim(nTitle));
   -1 16681 					result.title = trim(nTitle);
14633 16682 				}
14634 16683 
14635 16684 				// Check for non-empty value of aria-owns, follow each ID ref, then process with same naming computation.
@@ -14648,7 +16697,7 @@ var calcNames = function(node, fnc, preventVisualARIASelfCSSRef) {
14648 16697 								node: node,
14649 16698 target: element
14650 16699 							};
14651    -1 							if (!isHidden(element, refNode)) {
   -1 16700 							if (!isParentHidden(element, document.body, true)) {
14652 16701 								parts.push(walk(element, true, skip, [], false, oBy).name);
14653 16702 							}
14654 16703 						}
@@ -14667,7 +16716,7 @@ target: element
14667 16716 			// Prepend and append the current CSS pseudo element text, plus normalize all whitespace such as newline characters and others into flat spaces.
14668 16717 			name = cssO.before + name.replace(/\s+/g, ' ') + cssO.after;
14669 16718 
14670    -1 			if (name.length && !hasParentLabel(node, false, ownedBy.top, ownedBy)) {
   -1 16719 			if (name.length && !hasParentLabelOrHidden(node, ownedBy.top, ownedBy, ignoreHidden)) {
14671 16720 				result.name = name;
14672 16721 			}
14673 16722 
@@ -14735,7 +16784,7 @@ role = roles[i];
14735 16784 		tags: ['dl', 'ul', 'ol', 'dd', 'details', 'output', 'table', 'thead', 'tbody', 'tfoot', 'tr']
14736 16785 	};
14737 16786 
14738    -1 	var nativeFormFields = ['input', 'select', 'textarea'];
   -1 16787 	var nativeFormFields = ['button', 'input', 'select', 'textarea'];
14739 16788 	var rangeWidgetRoles = ['scrollbar', 'slider', 'spinbutton'];
14740 16789 	var editWidgetRoles = ['searchbox', 'textbox'];
14741 16790 	var selectWidgetRoles = ['grid', 'listbox', 'tablist', 'tree', 'treegrid'];
@@ -14768,12 +16817,23 @@ role = roles[i];
14768 16817 			if (style['display'] === 'none' || style['visibility'] === 'hidden') {
14769 16818 				return true;
14770 16819 			}
14771    -1 		}
14772    -1 		while (node && node.nodeType === 1) {
14773    -1 			if (hidden(node)) {
   -1 16820 			return false;
   -1 16821 		};
   -1 16822 		return hidden(node);
   -1 16823 	};
   -1 16824 
   -1 16825 	var isParentHidden = function(node, refNode, skipOwned, skipCurrent) {
   -1 16826 		var trackNodes = [];
   -1 16827 		while (node && node !== refNode) {
   -1 16828 			if (!skipCurrent && node.nodeType === 1 && isHidden(node, refNode)) {
14774 16829 				return true;
   -1 16830 			} else skipCurrent = false;
   -1 16831 			if (!skipOwned && node.id && ownedBy && ownedBy[node.id] && ownedBy[node.id].node && trackNodes.indexOf(node) === -1) {
   -1 16832 				trackNodes.push(node);
   -1 16833 				node = ownedBy[node.id].node;
   -1 16834 			} else {
   -1 16835 				node = node.parentNode;
14775 16836 			}
14776    -1 			node = node.parentNode;
14777 16837 		}
14778 16838 		return false;
14779 16839 	};
@@ -14880,8 +16940,8 @@ role = roles[i];
14880 16940 		return val;
14881 16941 	};
14882 16942 
14883    -1 	var addSpacing = function(str) {
14884    -1 		return str.length ? ' ' + str + ' ' : '';
   -1 16943 	var addSpacing = function(s) {
   -1 16944 		return trim(s).length ? ' ' + s + ' ' : ' ';
14885 16945 	};
14886 16946 
14887 16947 	var joinSelectedParts = function(node, nOA, isNative, childRoles) {
@@ -14952,7 +17012,7 @@ role = roles[i];
14952 17012 		return {};
14953 17013 	};
14954 17014 
14955    -1 	var hasParentLabel = function(node, noLabel, refNode, ownedBy) {
   -1 17015 	var hasParentLabelOrHidden = function(node, refNode, ownedBy, ignoreHidden) {
14956 17016 		var trackNodes = [];
14957 17017 		while (node && node !== refNode) {
14958 17018 				if (node.id && ownedBy && ownedBy[node.id] && ownedBy[node.id].node && trackNodes.indexOf(node) === -1) {
@@ -14962,10 +17022,7 @@ role = roles[i];
14962 17022 				node = node.parentNode;
14963 17023 			}
14964 17024 			if (node && node.getAttribute) {
14965    -1 				if (!noLabel && node.getAttribute('aria-label')) {
14966    -1 					return true;
14967    -1 				}
14968    -1 				if (isHidden(node, refNode)) {
   -1 17025 				if (trim(node.getAttribute('aria-label')) || (!ignoreHidden && isHidden(node, refNode))) {
14969 17026 					return true;
14970 17027 				}
14971 17028 			}
@@ -14980,7 +17037,7 @@ role = roles[i];
14980 17037 		return str.replace(/^\s+|\s+$/g, '');
14981 17038 	};
14982 17039 
14983    -1 	if (isHidden(node, document.body) || hasParentLabel(node, true, document.body)) {
   -1 17040 	if (isParentHidden(node, document.body, true)) {
14984 17041 		return props;
14985 17042 	}
14986 17043 
@@ -15079,7 +17136,10 @@ var implementations = {
15079 17136 	'accdc': accdc.calcNames,
15080 17137 	'axe': function(el) {
15081 17138 		return {
15082    -1 			name: ex(axe.commons.text.accessibleText, [el]),
   -1 17139 			name: ex(function(el) {
   -1 17140 				axe._tree = axe.utils.getFlattenedTree(document.body);
   -1 17141 				return axe.commons.text.accessibleText(el);
   -1 17142 			}, [el]),
15083 17143 			desc: '-',
15084 17144 			role: el.getAttribute('role') || ex(axe.commons.aria.implicitRole, [el]),
15085 17145 		};