tslint-consistent-codestyle
Version:
Additional rules to enforce constistent code style with tslint
569 lines • 54.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var ts = require("typescript");
var Lint = require("tslint");
var utils = require("tsutils");
var rules_1 = require("../src/rules");
var PASCAL_OPTION = 'PascalCase';
var CAMEL_OPTION = 'camelCase';
var SNAKE_OPTION = 'snake_case';
var UPPER_OPTION = 'UPPER_CASE';
var FORMAT_FAIL = ' name must be in ';
var LEADING_FAIL = ' name must not have leading underscore';
var TRAILING_FAIL = ' name must not have trailing underscore';
var NO_LEADING_FAIL = ' name must have leading underscore';
var NO_TRAILING_FAIL = ' name must have trailing underscore';
var REGEX_FAIL = ' name did not match required regex';
var PREFIX_FAIL = ' name must start with ';
var SUFFIX_FAIL = ' name must end with ';
var PREFIX_FAIL_ARR = ' name must start with one of ';
var SUFFIX_FAIL_ARR = ' name must end with one of ';
var Types;
(function (Types) {
Types[Types["default"] = -1] = "default";
Types[Types["variable"] = 1] = "variable";
Types[Types["function"] = 2] = "function";
Types[Types["parameter"] = 4] = "parameter";
Types[Types["member"] = 8] = "member";
Types[Types["property"] = 16] = "property";
Types[Types["method"] = 32] = "method";
Types[Types["type"] = 64] = "type";
Types[Types["class"] = 128] = "class";
Types[Types["interface"] = 256] = "interface";
Types[Types["typeAlias"] = 512] = "typeAlias";
Types[Types["genericTypeParameter"] = 1024] = "genericTypeParameter";
Types[Types["enum"] = 2048] = "enum";
Types[Types["enumMember"] = 4096] = "enumMember";
})(Types || (Types = {}));
var TypeSelector;
(function (TypeSelector) {
TypeSelector[TypeSelector["variable"] = 1] = "variable";
TypeSelector[TypeSelector["function"] = 3] = "function";
TypeSelector[TypeSelector["parameter"] = 5] = "parameter";
TypeSelector[TypeSelector["property"] = 24] = "property";
TypeSelector[TypeSelector["parameterProperty"] = 29] = "parameterProperty";
TypeSelector[TypeSelector["method"] = 40] = "method";
TypeSelector[TypeSelector["class"] = 192] = "class";
TypeSelector[TypeSelector["interface"] = 320] = "interface";
TypeSelector[TypeSelector["typeAlias"] = 576] = "typeAlias";
TypeSelector[TypeSelector["genericTypeParameter"] = 1088] = "genericTypeParameter";
TypeSelector[TypeSelector["enum"] = 2112] = "enum";
TypeSelector[TypeSelector["enumMember"] = 4120] = "enumMember";
})(TypeSelector || (TypeSelector = {}));
var Modifiers;
(function (Modifiers) {
Modifiers[Modifiers["const"] = 1] = "const";
Modifiers[Modifiers["readonly"] = 1] = "readonly";
Modifiers[Modifiers["static"] = 2] = "static";
Modifiers[Modifiers["public"] = 4] = "public";
Modifiers[Modifiers["protected"] = 8] = "protected";
Modifiers[Modifiers["private"] = 16] = "private";
Modifiers[Modifiers["global"] = 32] = "global";
Modifiers[Modifiers["local"] = 64] = "local";
Modifiers[Modifiers["abstract"] = 128] = "abstract";
Modifiers[Modifiers["export"] = 256] = "export";
Modifiers[Modifiers["import"] = 512] = "import";
Modifiers[Modifiers["rename"] = 1024] = "rename";
})(Modifiers || (Modifiers = {}));
var Specifity;
(function (Specifity) {
Specifity[Specifity["const"] = 1] = "const";
Specifity[Specifity["readonly"] = 1] = "readonly";
Specifity[Specifity["static"] = 2] = "static";
Specifity[Specifity["global"] = 2] = "global";
Specifity[Specifity["local"] = 2] = "local";
Specifity[Specifity["public"] = 4] = "public";
Specifity[Specifity["protected"] = 4] = "protected";
Specifity[Specifity["private"] = 4] = "private";
Specifity[Specifity["abstract"] = 8] = "abstract";
Specifity[Specifity["export"] = 16] = "export";
Specifity[Specifity["import"] = 32] = "import";
Specifity[Specifity["rename"] = 64] = "rename";
Specifity[Specifity["filter"] = 128] = "filter";
Specifity[Specifity["default"] = 256] = "default";
Specifity[Specifity["variable"] = 512] = "variable";
Specifity[Specifity["function"] = 768] = "function";
Specifity[Specifity["parameter"] = 1024] = "parameter";
Specifity[Specifity["member"] = 1280] = "member";
Specifity[Specifity["property"] = 1536] = "property";
Specifity[Specifity["method"] = 1536] = "method";
Specifity[Specifity["enumMember"] = 1792] = "enumMember";
Specifity[Specifity["type"] = 2048] = "type";
Specifity[Specifity["class"] = 2304] = "class";
Specifity[Specifity["interface"] = 2304] = "interface";
Specifity[Specifity["typeAlias"] = 2304] = "typeAlias";
Specifity[Specifity["genericTypeParameter"] = 2304] = "genericTypeParameter";
Specifity[Specifity["enum"] = 2304] = "enum";
})(Specifity || (Specifity = {}));
var Rule = (function (_super) {
tslib_1.__extends(Rule, _super);
function Rule() {
return _super !== null && _super.apply(this, arguments) || this;
}
Rule.prototype.apply = function (sourceFile) {
return this.applyWithWalker(new IdentifierNameWalker(sourceFile, this.ruleName, this.ruleArguments.map(function (rule) { return new NormalizedConfig(rule); }).sort(NormalizedConfig.sort)));
};
return Rule;
}(rules_1.AbstractConfigDependentRule));
exports.Rule = Rule;
var NormalizedConfig = (function () {
function NormalizedConfig(raw) {
this._type = Types[raw.type];
this._final = !!raw.final;
this._specifity = Specifity[raw.type];
this._modifiers = 0;
if (raw.modifiers !== undefined) {
if (Array.isArray(raw.modifiers)) {
for (var _i = 0, _a = raw.modifiers; _i < _a.length; _i++) {
var modifier = _a[_i];
this._modifiers |= Modifiers[modifier];
this._specifity |= Specifity[modifier];
}
}
else {
this._modifiers = Modifiers[raw.modifiers];
this._specifity |= Specifity[raw.modifiers];
}
}
if (raw.filter !== undefined) {
this._filter = new RegExp(raw.filter);
this._specifity |= Specifity.filter;
}
else {
this._filter = undefined;
}
this._format = raw;
}
NormalizedConfig.prototype.matches = function (type, modifiers, name) {
if (this._final && type > this._type << 1)
return [false, false];
if ((this._type & type) === 0 || (this._modifiers & ~modifiers) !== 0)
return [false, false];
if (this._filter === undefined)
return [true, false];
return [this._filter.test(name), true];
};
NormalizedConfig.prototype.getFormat = function () {
return this._format;
};
NormalizedConfig.sort = function (first, second) {
return first._specifity - second._specifity;
};
return NormalizedConfig;
}());
var NameChecker = (function () {
function NameChecker(_type, format) {
this._type = _type;
this._leadingUnderscore = format.leadingUnderscore;
this._trailingUnderscore = format.trailingUnderscore;
this._format = parseOptionArray(format.format);
this._prefix = parseOptionArray(format.prefix);
this._suffix = parseOptionArray(format.suffix);
this._regex = format.regex ? new RegExp(format.regex) : undefined;
}
NameChecker.prototype._failMessage = function (message) {
return TypeSelector[this._type] + message;
};
NameChecker.prototype.check = function (name, walker) {
var identifier = name.text;
if (this._regex !== undefined && !this._regex.test(identifier))
walker.addFailureAtNode(name, this._failMessage(REGEX_FAIL));
if (this._leadingUnderscore) {
if (identifier[0] === '_') {
if (this._leadingUnderscore === 'forbid')
walker.addFailureAtNode(name, this._failMessage(LEADING_FAIL));
identifier = identifier.slice(1);
}
else if (this._leadingUnderscore === 'require') {
walker.addFailureAtNode(name, this._failMessage(NO_LEADING_FAIL));
}
}
if (this._trailingUnderscore) {
if (identifier[identifier.length - 1] === '_') {
if (this._trailingUnderscore === 'forbid')
walker.addFailureAtNode(name, this._failMessage(TRAILING_FAIL));
identifier = identifier.slice(0, -1);
}
else if (this._trailingUnderscore === 'require') {
walker.addFailureAtNode(name, this._failMessage(NO_TRAILING_FAIL));
}
}
if (this._prefix) {
if (Array.isArray(this._prefix)) {
identifier = this._checkPrefixes(identifier, name, this._prefix, walker);
}
else if (identifier.startsWith(this._prefix)) {
identifier = identifier.slice(this._prefix.length);
}
else {
walker.addFailureAtNode(name, this._failMessage(PREFIX_FAIL + this._prefix));
}
}
if (this._suffix) {
if (Array.isArray(this._suffix)) {
identifier = this._checkSuffixes(identifier, name, this._suffix, walker);
}
else if (identifier.endsWith(this._suffix)) {
identifier = identifier.slice(0, -this._suffix.length);
}
else {
walker.addFailureAtNode(name, this._failMessage(SUFFIX_FAIL + this._suffix));
}
}
if (this._format) {
if (Array.isArray(this._format)) {
if (!matchesAnyFormat(identifier, this._format))
walker.addFailureAtNode(name, this._failMessage(FORMAT_FAIL + formatFormatList(this._format)));
}
else if (!matchesFormat(identifier, this._format)) {
walker.addFailureAtNode(name, this._failMessage(FORMAT_FAIL + this._format));
}
}
};
NameChecker.prototype._checkPrefixes = function (identifier, name, prefixes, walker) {
for (var _i = 0, prefixes_1 = prefixes; _i < prefixes_1.length; _i++) {
var prefix = prefixes_1[_i];
if (identifier.startsWith(prefix))
return identifier.slice(prefix.length);
}
walker.addFailureAtNode(name, this._failMessage(PREFIX_FAIL_ARR + prefixes.toString()));
return identifier;
};
NameChecker.prototype._checkSuffixes = function (identifier, name, suffixes, walker) {
for (var _i = 0, suffixes_1 = suffixes; _i < suffixes_1.length; _i++) {
var suffix = suffixes_1[_i];
if (identifier.endsWith(suffix))
return identifier.slice(-suffix.length);
}
walker.addFailureAtNode(name, this._failMessage(SUFFIX_FAIL_ARR + suffixes.toString()));
return identifier;
};
return NameChecker;
}());
var IdentifierNameWalker = (function (_super) {
tslib_1.__extends(IdentifierNameWalker, _super);
function IdentifierNameWalker() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this._depth = 0;
_this._cache = new Map();
return _this;
}
IdentifierNameWalker.prototype._checkTypeParameters = function (node, modifiers) {
if (node.typeParameters !== undefined)
for (var _i = 0, _a = node.typeParameters; _i < _a.length; _i++) {
var name = _a[_i].name;
this._checkName(name, TypeSelector.genericTypeParameter, modifiers);
}
};
IdentifierNameWalker.prototype.visitEnumDeclaration = function (node) {
var modifiers = this._getModifiers(node, TypeSelector.enum);
this._checkName(node.name, TypeSelector.enum, modifiers);
modifiers |= Modifiers.static | Modifiers.public | Modifiers.readonly;
for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
var name = _a[_i].name;
if (utils.isIdentifier(name))
this._checkName(name, TypeSelector.enumMember, modifiers);
}
};
IdentifierNameWalker.prototype.visitTypeAliasDeclaration = function (node) {
this._checkDeclaration(node, TypeSelector.typeAlias);
this._checkTypeParameters(node, Modifiers.global);
};
IdentifierNameWalker.prototype.visitClassExpression = function (node) {
if (node.name !== undefined)
this._checkDeclaration(node, TypeSelector.class);
this._checkTypeParameters(node, Modifiers.global);
};
IdentifierNameWalker.prototype.visitClassDeclaration = function (node) {
if (node.name !== undefined)
this._checkDeclaration(node, TypeSelector.class);
this._checkTypeParameters(node, Modifiers.global);
};
IdentifierNameWalker.prototype.visitMethodDeclaration = function (node) {
if (isNameIdentifier(node))
this._checkDeclaration(node, TypeSelector.method);
this._checkTypeParameters(node, Modifiers.local);
};
IdentifierNameWalker.prototype.visitInterfaceDeclaration = function (node) {
this._checkDeclaration(node, TypeSelector.interface);
this._checkTypeParameters(node, Modifiers.global);
};
IdentifierNameWalker.prototype.visitParameterDeclaration = function (node) {
var _this = this;
if (isNameIdentifier(node)) {
if (node.name.originalKeywordKind === ts.SyntaxKind.ThisKeyword)
return;
this._checkDeclaration(node, utils.isParameterProperty(node) ? TypeSelector.parameterProperty
: TypeSelector.parameter);
}
else {
utils.forEachDestructuringIdentifier(node.name, function (declaration) {
_this._checkName(declaration.name, TypeSelector.parameter, Modifiers.local | (isEqualName(declaration.name, declaration.propertyName) ? 0 : Modifiers.rename));
});
}
};
IdentifierNameWalker.prototype.visitPropertyDeclaration = function (node) {
if (isNameIdentifier(node))
this._checkDeclaration(node, TypeSelector.property);
};
IdentifierNameWalker.prototype.visitSetAccessor = function (node) {
if (isNameIdentifier(node))
this._checkDeclaration(node, TypeSelector.property);
};
IdentifierNameWalker.prototype.visitGetAccessor = function (node) {
if (isNameIdentifier(node))
this._checkDeclaration(node, TypeSelector.property);
};
IdentifierNameWalker.prototype._checkVariableDeclarationList = function (list, modifiers) {
var _this = this;
if ((list.flags & ts.NodeFlags.Const) !== 0)
modifiers |= Modifiers.const;
utils.forEachDeclaredVariable(list, function (declaration) {
_this._checkName(declaration.name, TypeSelector.variable, modifiers | (isEqualName(declaration.name, declaration.propertyName) ? 0 : Modifiers.rename));
});
};
IdentifierNameWalker.prototype.visitForStatement = function (node) {
if (node.initializer !== undefined && utils.isVariableDeclarationList(node.initializer))
this._checkVariableDeclarationList(node.initializer, this._getModifiers(node.initializer, TypeSelector.variable));
};
IdentifierNameWalker.prototype.visitForOfStatement = function (node) {
if (utils.isVariableDeclarationList(node.initializer))
this._checkVariableDeclarationList(node.initializer, this._getModifiers(node.initializer, TypeSelector.variable));
};
IdentifierNameWalker.prototype.visitForInStatement = function (node) {
if (utils.isVariableDeclarationList(node.initializer))
this._checkVariableDeclarationList(node.initializer, this._getModifiers(node.initializer, TypeSelector.variable));
};
IdentifierNameWalker.prototype.visitVariableStatement = function (node) {
if (!utils.hasModifier(node.modifiers, ts.SyntaxKind.DeclareKeyword))
this._checkVariableDeclarationList(node.declarationList, this._getModifiers(node, TypeSelector.variable));
};
IdentifierNameWalker.prototype.visitFunctionDeclaration = function (node) {
if (node.name !== undefined)
this._checkDeclaration(node, TypeSelector.function);
this._checkTypeParameters(node, Modifiers.local);
};
IdentifierNameWalker.prototype.visitFuncitonExpression = function (node) {
if (node.name !== undefined)
this._checkDeclaration(node, TypeSelector.function);
this._checkTypeParameters(node, Modifiers.local);
};
IdentifierNameWalker.prototype.visitArrowFunction = function (node) {
this._checkTypeParameters(node, Modifiers.local);
};
IdentifierNameWalker.prototype._checkDeclaration = function (node, type) {
this._checkName(node.name, type, this._getModifiers(node, type));
};
IdentifierNameWalker.prototype._checkName = function (name, type, modifiers) {
var matchingChecker = this._getMatchingChecker(type, modifiers, name.text);
if (matchingChecker !== null)
matchingChecker.check(name, this);
};
IdentifierNameWalker.prototype._getMatchingChecker = function (type, modifiers, name) {
var key = type + "," + modifiers;
var cached = this._cache.get(key);
if (cached !== undefined)
return cached;
var _a = this._createChecker(type, modifiers, name), checker = _a[0], hasFilter = _a[1];
if (!hasFilter)
this._cache.set(key, checker);
return checker;
};
IdentifierNameWalker.prototype._createChecker = function (type, modifiers, name) {
var hasFilter = false;
var config = this.options.reduce(function (format, rule) {
var _a = rule.matches(type, modifiers, name), matches = _a[0], filterUsed = _a[1];
if (!matches)
return format;
if (filterUsed)
hasFilter = true;
return Object.assign(format, rule.getFormat());
}, {
leadingUnderscore: undefined,
trailingUnderscore: undefined,
format: undefined,
prefix: undefined,
regex: undefined,
suffix: undefined,
});
if (!config.leadingUnderscore &&
!config.trailingUnderscore &&
!config.format &&
!config.prefix &&
!config.regex &&
!config.suffix)
return [null, hasFilter];
return [new NameChecker(type, config), hasFilter];
};
IdentifierNameWalker.prototype._getModifiers = function (node, type) {
var modifiers = 0;
if (node.modifiers !== undefined) {
if (type | Types.member) {
if (utils.hasModifier(node.modifiers, ts.SyntaxKind.PrivateKeyword)) {
modifiers |= Modifiers.private;
}
else if (utils.hasModifier(node.modifiers, ts.SyntaxKind.ProtectedKeyword)) {
modifiers |= Modifiers.protected;
}
else {
modifiers |= Modifiers.public;
}
if (utils.hasModifier(node.modifiers, ts.SyntaxKind.ReadonlyKeyword))
modifiers |= Modifiers.const;
if (utils.hasModifier(node.modifiers, ts.SyntaxKind.StaticKeyword))
modifiers |= Modifiers.static;
}
if (utils.hasModifier(node.modifiers, ts.SyntaxKind.ConstKeyword))
modifiers |= Modifiers.const;
if (utils.hasModifier(node.modifiers, ts.SyntaxKind.ExportKeyword))
modifiers |= Modifiers.export;
if (utils.hasModifier(node.modifiers, ts.SyntaxKind.AbstractKeyword))
modifiers |= Modifiers.abstract;
}
if (type !== TypeSelector.property && type !== TypeSelector.method)
modifiers |= this._depth !== 0 ? Modifiers.local : Modifiers.global;
return modifiers;
};
IdentifierNameWalker.prototype.walk = function (sourceFile) {
var _this = this;
var cb = function (node) {
_this.visitNode(node);
if (utils.isScopeBoundary(node)) {
++_this._depth;
ts.forEachChild(node, cb);
--_this._depth;
}
else {
return ts.forEachChild(node, cb);
}
};
return ts.forEachChild(sourceFile, cb);
};
IdentifierNameWalker.prototype.visitNode = function (node) {
switch (node.kind) {
case ts.SyntaxKind.VariableStatement:
return this.visitVariableStatement(node);
case ts.SyntaxKind.FunctionDeclaration:
return this.visitFunctionDeclaration(node);
case ts.SyntaxKind.FunctionExpression:
return this.visitFuncitonExpression(node);
case ts.SyntaxKind.ForStatement:
return this.visitForStatement(node);
case ts.SyntaxKind.ForInStatement:
return this.visitForInStatement(node);
case ts.SyntaxKind.ForOfStatement:
return this.visitForOfStatement(node);
case ts.SyntaxKind.Parameter:
return this.visitParameterDeclaration(node);
case ts.SyntaxKind.ClassDeclaration:
return this.visitClassDeclaration(node);
case ts.SyntaxKind.ClassExpression:
return this.visitClassExpression(node);
case ts.SyntaxKind.InterfaceDeclaration:
return this.visitInterfaceDeclaration(node);
case ts.SyntaxKind.EnumDeclaration:
return this.visitEnumDeclaration(node);
case ts.SyntaxKind.TypeAliasDeclaration:
return this.visitTypeAliasDeclaration(node);
case ts.SyntaxKind.PropertyDeclaration:
return this.visitPropertyDeclaration(node);
case ts.SyntaxKind.MethodDeclaration:
return this.visitMethodDeclaration(node);
case ts.SyntaxKind.GetAccessor:
return this.visitGetAccessor(node);
case ts.SyntaxKind.SetAccessor:
return this.visitSetAccessor(node);
case ts.SyntaxKind.ArrowFunction:
return this.visitArrowFunction(node);
}
};
return IdentifierNameWalker;
}(Lint.AbstractWalker));
function parseOptionArray(option) {
if (!Array.isArray(option) || option.length > 1)
return option;
return option[0];
}
function matchesFormat(identifier, format) {
switch (format) {
case PASCAL_OPTION:
return isPascalCase(identifier);
case CAMEL_OPTION:
return isCamelCase(identifier);
case SNAKE_OPTION:
return isSnakeCase(identifier);
case UPPER_OPTION:
return isUpperCase(identifier);
}
}
function matchesAnyFormat(identifier, formats) {
for (var _i = 0, formats_1 = formats; _i < formats_1.length; _i++) {
var format = formats_1[_i];
if (matchesFormat(identifier, format))
return true;
}
return false;
}
function formatFormatList(formats) {
var result = formats[0];
var lastIndex = formats.length - 1;
for (var i = 1; i < lastIndex; ++i)
result += ', ' + formats[i];
return result + ' or ' + formats[lastIndex];
}
function isPascalCase(name) {
return name.length === 0 || name[0] === name[0].toUpperCase() && hasStrictCamelHumps(name, true);
}
function isCamelCase(name) {
return name.length === 0 || name[0] === name[0].toLowerCase() && hasStrictCamelHumps(name, false);
}
function hasStrictCamelHumps(name, isUpper) {
if (name[0] === '_')
return false;
for (var i = 1; i < name.length; ++i) {
if (name[i] === '_')
return false;
if (isUpper === isUppercaseChar(name[i])) {
if (isUpper)
return false;
}
else {
isUpper = !isUpper;
}
}
return true;
}
function isUppercaseChar(char) {
return char === char.toUpperCase() && char !== char.toLowerCase();
}
function isSnakeCase(name) {
return name === name.toLowerCase() && validateUnderscores(name);
}
function isUpperCase(name) {
return name === name.toUpperCase() && validateUnderscores(name);
}
function validateUnderscores(name) {
if (name[0] === '_')
return false;
var wasUnderscore = false;
for (var i = 1; i < name.length; ++i) {
if (name[i] === '_') {
if (wasUnderscore)
return false;
wasUnderscore = true;
}
else {
wasUnderscore = false;
}
}
return !wasUnderscore;
}
function isNameIdentifier(node) {
return node.name.kind === ts.SyntaxKind.Identifier;
}
function isEqualName(name, propertyName) {
return propertyName === undefined ||
(propertyName.kind === ts.SyntaxKind.Identifier && propertyName.text === name.text);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtaW5nQ29udmVudGlvblJ1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJuYW1pbmdDb252ZW50aW9uUnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBaUM7QUFDakMsNkJBQStCO0FBQy9CLCtCQUFpQztBQUVqQyxzQ0FBMkQ7QUFRM0QsSUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDO0FBQ25DLElBQU0sWUFBWSxHQUFJLFdBQVcsQ0FBQztBQUNsQyxJQUFNLFlBQVksR0FBSSxZQUFZLENBQUM7QUFDbkMsSUFBTSxZQUFZLEdBQUksWUFBWSxDQUFDO0FBRW5DLElBQU0sV0FBVyxHQUFLLG1CQUFtQixDQUFDO0FBQzFDLElBQU0sWUFBWSxHQUFJLHdDQUF3QyxDQUFDO0FBQy9ELElBQU0sYUFBYSxHQUFHLHlDQUF5QyxDQUFDO0FBQ2hFLElBQU0sZUFBZSxHQUFJLG9DQUFvQyxDQUFDO0FBQzlELElBQU0sZ0JBQWdCLEdBQUcscUNBQXFDLENBQUM7QUFDL0QsSUFBTSxVQUFVLEdBQU0sb0NBQW9DLENBQUM7QUFDM0QsSUFBTSxXQUFXLEdBQUssd0JBQXdCLENBQUM7QUFDL0MsSUFBTSxXQUFXLEdBQUssc0JBQXNCLENBQUM7QUFDN0MsSUFBTSxlQUFlLEdBQUksK0JBQStCLENBQUM7QUFDekQsSUFBTSxlQUFlLEdBQUksNkJBQTZCLENBQUM7QUFJdkQsSUFBSyxLQWlCSjtBQWpCRCxXQUFLLEtBQUs7SUFFTix3Q0FBWSxDQUFBO0lBQ1oseUNBQVksQ0FBQTtJQUNaLHlDQUFpQixDQUFBO0lBQ2pCLDJDQUFrQixDQUFBO0lBQ2xCLHFDQUFlLENBQUE7SUFDZiwwQ0FBaUIsQ0FBQTtJQUNqQixzQ0FBZSxDQUFBO0lBQ2Ysa0NBQWEsQ0FBQTtJQUNiLHFDQUFjLENBQUE7SUFDZCw2Q0FBa0IsQ0FBQTtJQUNsQiw2Q0FBa0IsQ0FBQTtJQUNsQixvRUFBOEIsQ0FBQTtJQUM5QixvQ0FBYyxDQUFBO0lBQ2QsZ0RBQW9CLENBQUE7QUFFeEIsQ0FBQyxFQWpCSSxLQUFLLEtBQUwsS0FBSyxRQWlCVDtBQUVELElBQUssWUFlSjtBQWZELFdBQUssWUFBWTtJQUViLHVEQUF5QixDQUFBO0lBQ3pCLHVEQUFvQyxDQUFBO0lBQ3BDLHlEQUFzQyxDQUFBO0lBQ3RDLHdEQUF3QyxDQUFBO0lBQ3hDLDBFQUF3QyxDQUFBO0lBQ3hDLG9EQUFvQyxDQUFBO0lBQ3BDLG1EQUFnQyxDQUFBO0lBQ2hDLDJEQUF3QyxDQUFBO0lBQ3hDLDJEQUF3QyxDQUFBO0lBQ3hDLGtGQUE4RCxDQUFBO0lBQzlELGtEQUE4QixDQUFBO0lBQzlCLDhEQUF3QyxDQUFBO0FBRTVDLENBQUMsRUFmSSxZQUFZLEtBQVosWUFBWSxRQWVoQjtBQUVELElBQUssU0FlSjtBQWZELFdBQUssU0FBUztJQUVWLDJDQUFTLENBQUE7SUFDVCxpREFBMEIsQ0FBQTtJQUMxQiw2Q0FBZSxDQUFBO0lBQ2YsNkNBQWUsQ0FBQTtJQUNmLG1EQUFrQixDQUFBO0lBQ2xCLGdEQUFnQixDQUFBO0lBQ2hCLDhDQUFlLENBQUE7SUFDZiw0Q0FBYyxDQUFBO0lBQ2QsbURBQWlCLENBQUE7SUFDakIsK0NBQWUsQ0FBQTtJQUNmLCtDQUFlLENBQUE7SUFDZixnREFBZ0IsQ0FBQTtBQUVwQixDQUFDLEVBZkksU0FBUyxLQUFULFNBQVMsUUFlYjtBQUVELElBQUssU0E4Qko7QUE5QkQsV0FBSyxTQUFTO0lBRVYsMkNBQVMsQ0FBQTtJQUNULGlEQUEwQixDQUFBO0lBQzFCLDZDQUFlLENBQUE7SUFDZiw2Q0FBeUIsQ0FBQTtJQUN6QiwyQ0FBd0IsQ0FBQTtJQUN4Qiw2Q0FBZSxDQUFBO0lBQ2YsbURBQTRCLENBQUE7SUFDNUIsK0NBQTBCLENBQUE7SUFDMUIsaURBQWlCLENBQUE7SUFDakIsOENBQWUsQ0FBQTtJQUNmLDhDQUFlLENBQUE7SUFDZiw4Q0FBZSxDQUFBO0lBQ2YsK0NBQWUsQ0FBQTtJQUNmLGlEQUFnQixDQUFBO0lBQ2hCLG1EQUFpQixDQUFBO0lBQ2pCLG1EQUFpQixDQUFBO0lBQ2pCLHNEQUFrQixDQUFBO0lBQ2xCLGdEQUFlLENBQUE7SUFDZixvREFBaUIsQ0FBQTtJQUNqQixnREFBMkIsQ0FBQTtJQUMzQix3REFBbUIsQ0FBQTtJQUNuQiw0Q0FBYSxDQUFBO0lBQ2IsOENBQWMsQ0FBQTtJQUNkLHNEQUEyQixDQUFBO0lBQzNCLHNEQUEyQixDQUFBO0lBQzNCLDRFQUFzQyxDQUFBO0lBQ3RDLDRDQUFzQixDQUFBO0FBRTFCLENBQUMsRUE5QkksU0FBUyxLQUFULFNBQVMsUUE4QmI7QUEwQkQ7SUFBMEIsZ0NBQTJCO0lBQXJEOztJQVFBLENBQUM7SUFQVSxvQkFBSyxHQUFaLFVBQWEsVUFBeUI7UUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxvQkFBb0IsQ0FDaEQsVUFBVSxFQUNWLElBQUksQ0FBQyxRQUFRLEVBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBQyxJQUFJLElBQUssT0FBQSxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUExQixDQUEwQixDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUMzRixDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ0wsV0FBQztBQUFELENBQUMsQUFSRCxDQUEwQixtQ0FBMkIsR0FRcEQ7QUFSWSxvQkFBSTtBQVVqQjtJQVFJLDBCQUFZLEdBQWU7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUM5QixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLEdBQUcsQ0FBQyxDQUFtQixVQUFhLEVBQWIsS0FBQSxHQUFHLENBQUMsU0FBUyxFQUFiLGNBQWEsRUFBYixJQUFhO29CQUEvQixJQUFNLFFBQVEsU0FBQTtvQkFDZixJQUFJLENBQUMsVUFBVSxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxDQUFDLFVBQVUsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQzFDO1lBQ0wsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNKLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLFVBQVUsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hELENBQUM7UUFDTCxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxVQUFVLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUN4QyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztRQUM3QixDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDdkIsQ0FBQztJQUVNLGtDQUFPLEdBQWQsVUFBZSxJQUFrQixFQUFFLFNBQWlCLEVBQUUsSUFBWTtRQUM5RCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUN0QyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEUsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6QixNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU0sb0NBQVMsR0FBaEI7UUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDO0lBRWEscUJBQUksR0FBbEIsVUFBbUIsS0FBdUIsRUFBRSxNQUF3QjtRQUNoRSxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQ2hELENBQUM7SUFDTCx1QkFBQztBQUFELENBQUMsQUFsREQsSUFrREM7QUFFRDtJQU9JLHFCQUE2QixLQUFtQixFQUFFLE1BQWU7UUFBcEMsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUM1QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDO1FBQ25ELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUM7UUFDckQsSUFBSSxDQUFDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBUyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUM7SUFDdEUsQ0FBQztJQUVPLGtDQUFZLEdBQXBCLFVBQXFCLE9BQWU7UUFDaEMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDO0lBQzlDLENBQUM7SUFFTSwyQkFBSyxHQUFaLFVBQWEsSUFBbUIsRUFBRSxNQUFnQztRQUM5RCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRzNCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDM0QsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFFakUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztZQUMxQixFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixLQUFLLFFBQVEsQ0FBQztvQkFDckMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLFVBQVUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9DLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLENBQUM7UUFDTCxDQUFDO1FBRUQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztZQUMzQixFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEtBQUssUUFBUSxDQUFDO29CQUN0QyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDcEUsVUFBVSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDaEQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUN2RSxDQUFDO1FBQ0wsQ0FBQztRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2YsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDN0UsQ0FBQztZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLFVBQVUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkQsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNKLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDakYsQ0FBQztRQUNMLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNmLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDOUIsVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDSixNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2pGLENBQUM7UUFDTCxDQUFDO1FBR0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDZixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDNUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZHLENBQUM7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDakYsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRU8sb0NBQWMsR0FBdEIsVUFBdUIsVUFBa0IsRUFBRSxJQUFtQixFQUFFLFFBQWtCLEVBQUUsTUFBZ0M7UUFDaEgsR0FBRyxDQUFDLENBQWlCLFVBQVEsRUFBUixxQkFBUSxFQUFSLHNCQUFRLEVBQVIsSUFBUTtZQUF4QixJQUFNLE1BQU0saUJBQUE7WUFDYixFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM5QixNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7U0FBQTtRQUMvQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEYsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRU8sb0NBQWMsR0FBdEIsVUFBdUIsVUFBa0IsRUFBRSxJQUFtQixFQUFFLFFBQWtCLEVBQUUsTUFBZ0M7UUFDaEgsR0FBRyxDQUFDLENBQWlCLFVBQVEsRUFBUixxQkFBUSxFQUFSLHNCQUFRLEVBQVIsSUFBUTtZQUF4QixJQUFNLE1BQU0saUJBQUE7WUFDYixFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM1QixNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUFBO1FBQ2hELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RixNQUFNLENBQUMsVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFTCxrQkFBQztBQUFELENBQUMsQUE3RkQsSUE2RkM7QUFFRDtJQUFtQyxnREFBdUM7SUFBMUU7UUFBQSxxRUF3UUM7UUF2UVcsWUFBTSxHQUFHLENBQUMsQ0FBQztRQUNYLFlBQU0sR0FBRyxJQUFJLEdBQUcsRUFBOEIsQ0FBQzs7SUFzUTNELENBQUM7SUFwUVcsbURBQW9CLEdBQTVCLFVBQTZCLElBQXNDLEVBQUUsU0FBb0I7UUFDckYsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLENBQUM7WUFDbEMsR0FBRyxDQUFDLENBQWlCLFVBQW1CLEVBQW5CLEtBQUEsSUFBSSxDQUFDLGNBQWMsRUFBbkIsY0FBbUIsRUFBbkIsSUFBbUI7Z0JBQTVCLElBQUEsa0JBQUk7Z0JBQ1osSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLG9CQUFvQixFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQUE7SUFDaEYsQ0FBQztJQUVNLG1EQUFvQixHQUEzQixVQUE0QixJQUF3QjtRQUNoRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDekQsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO1FBQ3RFLEdBQUcsQ0FBQyxDQUFpQixVQUFZLEVBQVosS0FBQSxJQUFJLENBQUMsT0FBTyxFQUFaLGNBQVksRUFBWixJQUFZO1lBQXJCLElBQUEsa0JBQUk7WUFDWixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1NBQUE7SUFDdEUsQ0FBQztJQUVNLHdEQUF5QixHQUFoQyxVQUFpQyxJQUE2QjtRQUMxRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU0sbURBQW9CLEdBQTNCLFVBQTRCLElBQXdCO1FBQ2hELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBNkMsSUFBSSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU0sb0RBQXFCLEdBQTVCLFVBQTZCLElBQXlCO1FBQ2xELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBOEMsSUFBSSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU0scURBQXNCLEdBQTdCLFVBQThCLElBQTBCO1FBQ3BELEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFTSx3REFBeUIsR0FBaEMsVUFBaUMsSUFBNkI7UUFDMUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVNLHdEQUF5QixHQUFoQyxVQUFpQyxJQUE2QjtRQUE5RCxpQkFpQkM7UUFoQkcsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7Z0JBRTVELE1BQU0sQ0FBQztZQUVYLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQyxpQkFBaUI7a0JBQzlCLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzRixDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFFSixLQUFLLENBQUMsOEJBQThCLENBQW9CLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBQyxXQUFXO2dCQUMzRSxLQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQ2hCLFlBQVksQ0FBQyxTQUFTLEVBQ3RCLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3hILENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUVMLENBQUM7SUFFTSx1REFBd0IsR0FBL0IsVUFBZ0MsSUFBNEI7UUFDeEQsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVNLCtDQUFnQixHQUF2QixVQUF3QixJQUErQjtRQUNuRCxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU0sK0NBQWdCLEdBQXZCLFVBQXdCLElBQStCO1FBQ25ELEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTyw0REFBNkIsR0FBckMsVUFBc0MsSUFBZ0MsRUFBRSxTQUFpQjtRQUF6RixpQkFTQztRQVBHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxTQUFTLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQztRQUNqQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLFVBQUMsV0FBVztZQUM1QyxLQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQ2hCLFlBQVksQ0FBQyxRQUFRLEVBQ3JCLFNBQVMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbEgsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sZ0RBQWlCLEdBQXhCLFVBQXlCLElBQXFCO1FBQzFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEYsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzFILENBQUM7SUFFTSxrREFBbUIsR0FBMUIsVUFBMkIsSUFBdUI7UUFDOUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDMUgsQ0FBQztJQUVNLGtEQUFtQixHQUExQixVQUEyQixJQUF1QjtRQUM5QyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUMxSCxDQUFDO0lBRU0scURBQXNCLEdBQTdCLFVBQThCLElBQTBCO1FBRXBELEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUVNLHVEQUF3QixHQUEvQixVQUFnQyxJQUE0QjtRQUN4RCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQztZQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQWlELElBQUksRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVNLHNEQUF1QixHQUE5QixVQUErQixJQUEyQjtRQUN0RCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQztZQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQWdELElBQUksRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVNLGlEQUFrQixHQUF6QixVQUEwQixJQUFzQjtRQUM1QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU8sZ0RBQWlCLEdBQXpCLFVBQTBCLElBQW1DLEVBQUUsSUFBa0I7UUFDN0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTyx5Q0FBVSxHQUFsQixVQUFtQixJQUFtQixFQUFFLElBQWtCLEVBQUUsU0FBaUI7UUFDekUsSUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdFLEVBQUUsQ0FBQyxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUM7WUFDekIsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVPLGtEQUFtQixHQUEzQixVQUE0QixJQUFrQixFQUFFLFNBQWlCLEVBQUUsSUFBWTtRQUMzRSxJQUFNLEdBQUcsR0FBTSxJQUFJLFNBQUksU0FBVyxDQUFDO1FBQ25DLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUM7WUFDckIsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUVaLElBQUEsK0NBQWlFLEVBQWhFLGVBQU8sRUFBRSxpQkFBUyxDQUErQztRQUN4RSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFTyw2Q0FBYyxHQUF0QixVQUF1QixJQUFrQixFQUFFLFNBQWlCLEVBQUUsSUFBWTtRQUN0RSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQzlCLFVBQUMsTUFBZSxFQUFFLElBQUk7WUFDWixJQUFBLHdDQUEyRCxFQUExRCxlQUFPLEVBQUUsa0JBQVUsQ0FBd0M7WUFDbEUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ1QsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNsQixFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUM7Z0JBQ1gsU0FBUyxHQUFHLElBQUksQ0FBQztZQUNyQixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDbkQsQ0FBQyxFQUNEO1lBQ0ksaUJBQWlCLEVBQUUsU0FBUztZQUM1QixrQkFBa0IsRUFBRSxTQUFTO1lBQzdCLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLEtBQUssRUFBRSxTQUFTO1lBQ2hCLE1BQU0sRUFBRyxTQUFTO1NBQ3JCLENBQUMsQ0FBQztRQUdQLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGlCQUFpQjtZQUN6QixDQUFDLE1BQU0sQ0FBQyxrQkFBa0I7WUFDMUIsQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUNkLENBQUMsTUFBTSxDQUFDLE1BQU07WUFDZCxDQUFDLE1BQU0sQ0FBQyxLQUFLO1lBQ2IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ2YsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU8sNENBQWEsR0FBckIsVUFBc0IsSUFBYSxFQUFFLElBQWtCO1FBQ25ELElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xFLFNBQVMsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUNuQyxDQUFDO2dCQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDM0UsU0FBUyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUM7Z0JBQ3JDLENBQUM7Z0JBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ0osU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xDLENBQUM7Z0JBQ0QsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ2pFLFNBQVMsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDO2dCQUNqQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDL0QsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDdEMsQ0FBQztZQUNELEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM5RCxTQUFTLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQztZQUNqQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDL0QsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDbEMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ2pFLFNBQVMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDO1FBQ3hDLENBQUM7UUFFRCxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLFFBQVEsSUFBSSxJQUFJLEtBQUssWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUMvRCxTQUFTLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBRXhFLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVNLG1DQUFJLEdBQVgsVUFBWSxVQUFtQjtRQUEvQixpQkFZQztRQVhHLElBQU0sRUFBRSxHQUFHLFVBQUMsSUFBYTtZQUNyQixLQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixFQUFFLEtBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQ2QsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzFCLEVBQUUsS0FBSSxDQUFDLE1BQU0sQ0FBQztZQUNsQixDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ0osTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFDRixNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVNLHdDQUFTLEdBQWhCLFVBQWlCLElBQWE7UUFDMUIsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEIsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGlCQUFpQjtnQkFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBdUIsSUFBSSxDQUFDLENBQUM7WUFDbkUsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLG1CQUFtQjtnQkFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBeUIsSUFBSSxDQUFDLENBQUM7WUFDdkUsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGtCQUFrQjtnQkFDakMsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBd0IsSUFBSSxDQUFDLENBQUM7WUFDckUsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVk7Z0JBQzNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQWtCLElBQUksQ0FBQyxDQUFDO1lBQ3pELEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjO2dCQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFvQixJQUFJLENBQUMsQ0FBQztZQUM3RCxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYztnQkFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBb0IsSUFBSSxDQUFDLENBQUM7WUFDN0QsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVM7Z0JBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQTBCLElBQUksQ0FBQyxDQUFDO1lBQ3pFLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0I7Z0JBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQXNCLElBQUksQ0FBQyxDQUFDO1lBQ2pFLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFlO2dCQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFxQixJQUFJLENBQUMsQ0FBQztZQUMvRCxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsb0JBQW9CO2dCQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUEwQixJQUFJLENBQUMsQ0FBQztZQUN6RSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsZUFBZTtnQkFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBcUIsSUFBSSxDQUFDLENBQUM7WUFDL0QsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLG9CQUFvQjtnQkFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBMEIsSUFBSSxDQUFDLENBQUM7WUFDekUsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLG1CQUFtQjtnQkFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBeUIsSUFBSSxDQUFDLENBQUM7WUFDdkUsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGlCQUFpQjtnQkFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBdUIsSUFBSSxDQUFDLENBQUM7WUFDbkUsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVc7Z0JBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQTRCLElBQUksQ0FBQyxDQUFDO1lBQ2xFLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXO2dCQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUE0QixJQUFJ